crypt32(4/10): Implement decoding hash messages
Juan Lang
juan.lang at gmail.com
Tue Jul 17 10:26:45 CDT 2007
--Juan
-------------- next part --------------
From 312064d23b8e15b36dee4197acc2d0b1951692d5 Mon Sep 17 00:00:00 2001
From: Juan Lang <juanlang at juan.corp.google.com>
Date: Tue, 17 Jul 2007 07:25:31 -0700
Subject: [PATCH] Implement decoding hash messages
---
dlls/crypt32/crypt32_private.h | 4 ++
dlls/crypt32/decode.c | 81 ++++++++++++++++++++++++++++++++++------
dlls/crypt32/msg.c | 13 ++++++
dlls/crypt32/tests/msg.c | 2 -
4 files changed, 86 insertions(+), 14 deletions(-)
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
index d65c4ad..a26b366 100644
--- a/dlls/crypt32/crypt32_private.h
+++ b/dlls/crypt32/crypt32_private.h
@@ -90,6 +90,10 @@ BOOL CRYPT_AsnEncodePKCSDigestedData(CRY
BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara,
BYTE *pbEncoded, DWORD *pcbEncoded, DWORD bytesNeeded);
+BOOL CRYPT_AsnDecodePKCSDigestedData(const BYTE *pbEncoded, DWORD cbEncoded,
+ DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara,
+ CRYPT_DIGESTED_DATA *digestedData, DWORD *pcbDigestedData);
+
/* The following aren't defined in wincrypt.h, as they're "reserved" */
#define CERT_CERT_PROP_ID 32
#define CERT_CRL_PROP_ID 33
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index 22fd06e..deedaf1 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -2308,6 +2308,27 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSCo
return ret;
}
+static BOOL WINAPI CRYPT_AsnDecodePKCSContentInfoInternal(
+ DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded,
+ DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara,
+ void *pvStructInfo, DWORD *pcbStructInfo)
+{
+ CRYPT_CONTENT_INFO *info = (CRYPT_CONTENT_INFO *)pvStructInfo;
+ struct AsnDecodeSequenceItem items[] = {
+ { ASN_OBJECTIDENTIFIER, offsetof(CRYPT_CONTENT_INFO, pszObjId),
+ CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), FALSE, TRUE,
+ offsetof(CRYPT_CONTENT_INFO, pszObjId), 0 },
+ { ASN_CONTEXT | ASN_CONSTRUCTOR | 0,
+ offsetof(CRYPT_CONTENT_INFO, Content), CRYPT_AsnDecodePKCSContent,
+ sizeof(CRYPT_DER_BLOB), TRUE, TRUE,
+ offsetof(CRYPT_CONTENT_INFO, Content.pbData), 0 },
+ };
+
+ return CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
+ sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
+ pDecodePara, pvStructInfo, pcbStructInfo, info ? info->pszObjId : NULL);
+}
+
static BOOL WINAPI CRYPT_AsnDecodePKCSContentInfo(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
@@ -2319,19 +2340,28 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSCo
__TRY
{
- struct AsnDecodeSequenceItem items[] = {
- { ASN_OBJECTIDENTIFIER, offsetof(CRYPT_CONTENT_INFO, pszObjId),
- CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), FALSE, TRUE,
- offsetof(CRYPT_CONTENT_INFO, pszObjId), 0 },
- { ASN_CONTEXT | ASN_CONSTRUCTOR | 0,
- offsetof(CRYPT_CONTENT_INFO, Content), CRYPT_AsnDecodePKCSContent,
- sizeof(CRYPT_DER_BLOB), TRUE, TRUE,
- offsetof(CRYPT_CONTENT_INFO, Content.pbData), 0 },
- };
+ ret = CRYPT_AsnDecodePKCSContentInfoInternal(dwCertEncodingType,
+ lpszStructType, pbEncoded, cbEncoded,
+ dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, NULL, pcbStructInfo);
+ if (ret && pvStructInfo)
+ {
+ ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara, pvStructInfo,
+ pcbStructInfo, *pcbStructInfo);
+ if (ret)
+ {
+ CRYPT_CONTENT_INFO *info;
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pDecodePara, pvStructInfo, pcbStructInfo, NULL);
+ if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
+ pvStructInfo = *(BYTE **)pvStructInfo;
+ info = (CRYPT_CONTENT_INFO *)pvStructInfo;
+ info->pszObjId = (LPSTR)((BYTE *)info +
+ sizeof(CRYPT_CONTENT_INFO));
+ ret = CRYPT_AsnDecodePKCSContentInfoInternal(dwCertEncodingType,
+ lpszStructType, pbEncoded, cbEncoded,
+ dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, pvStructInfo,
+ pcbStructInfo);
+ }
+ }
}
__EXCEPT_PAGE_FAULT
{
@@ -2341,6 +2371,33 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSCo
return ret;
}
+BOOL CRYPT_AsnDecodePKCSDigestedData(const BYTE *pbEncoded, DWORD cbEncoded,
+ DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara,
+ CRYPT_DIGESTED_DATA *digestedData, DWORD *pcbDigestedData)
+{
+ BOOL ret;
+ struct AsnDecodeSequenceItem items[] = {
+ { ASN_INTEGER, offsetof(CRYPT_DIGESTED_DATA, version), CRYPT_AsnDecodeInt,
+ sizeof(DWORD), FALSE, FALSE, 0, 0 },
+ { ASN_SEQUENCEOF, offsetof(CRYPT_DIGESTED_DATA, DigestAlgorithm),
+ CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER),
+ FALSE, TRUE, offsetof(CRYPT_DIGESTED_DATA, DigestAlgorithm.pszObjId),
+ 0 },
+ { ASN_SEQUENCEOF, offsetof(CRYPT_DIGESTED_DATA, ContentInfo),
+ CRYPT_AsnDecodePKCSContentInfoInternal,
+ sizeof(CRYPT_CONTENT_INFO), FALSE, TRUE, offsetof(CRYPT_DIGESTED_DATA,
+ ContentInfo.pszObjId), 0 },
+ { ASN_OCTETSTRING, offsetof(CRYPT_DIGESTED_DATA, hash),
+ CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_HASH_BLOB), FALSE, TRUE,
+ offsetof(CRYPT_DIGESTED_DATA, hash.pbData), 0 },
+ };
+
+ ret = CRYPT_AsnDecodeSequence(X509_ASN_ENCODING, items,
+ sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
+ pDecodePara, digestedData, pcbDigestedData, NULL);
+ return ret;
+}
+
static BOOL WINAPI CRYPT_AsnDecodeAltName(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 81b9cdd..4f2aeaa 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -652,6 +652,19 @@ static BOOL CDecodeMsg_DecodeContent(CDe
msg->type = CMSG_DATA;
break;
case CMSG_HASHED:
+ {
+ CRYPT_DIGESTED_DATA *digestedData;
+
+ ret = CRYPT_AsnDecodePKCSDigestedData(blob->pbData, blob->cbData,
+ CRYPT_DECODE_ALLOC_FLAG, NULL, (CRYPT_DIGESTED_DATA *)&digestedData,
+ &size);
+ if (ret)
+ {
+ FIXME("need to store data for CMSG_HASHED\n");
+ LocalFree(digestedData);
+ }
+ break;
+ }
case CMSG_ENVELOPED:
case CMSG_SIGNED:
FIXME("unimplemented for type %s\n", MSG_TYPE_STR(type));
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 9e8aac5..265205b 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -1138,7 +1138,6 @@ static void test_decode_msg_update(void)
NULL);
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, hashEmptyContent, sizeof(hashEmptyContent), TRUE);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
"Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError());
CryptMsgClose(msg);
@@ -1173,7 +1172,6 @@ static void test_decode_msg_update(void)
NULL);
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, hashContent, sizeof(hashContent), TRUE);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
"Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError());
CryptMsgClose(msg);
--
1.4.1
More information about the wine-patches
mailing list