Module: wine Branch: master Commit: 35abf3adf3d7daa0914df8d57c19fbaea2a00547 URL: http://source.winehq.org/git/wine.git/?a=commit;h=35abf3adf3d7daa0914df8d57c...
Author: Juan Lang juan.lang@gmail.com Date: Tue Jul 17 07:25:31 2007 -0700
crypt32: 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(CRYPT_DIGESTED_DATA *digestedData, 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_AsnDecodePKCSContent(DWORD dwCertEncodingType, 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_AsnDecodePKCSContentInfo(DWORD dwCertEncodingType,
__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_AsnDecodePKCSContentInfo(DWORD dwCertEncodingType, 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(CDecodeMsg *msg, CRYPT_DER_BLOB *blob, 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);