Juan Lang : crypt32:
Separate decoding PKCS signer info into internal and external versions.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jul 31 07:54:35 CDT 2007
Module: wine
Branch: master
Commit: 5900ab1437baacde49c2df1300ae08fdb291a80b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5900ab1437baacde49c2df1300ae08fdb291a80b
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Jul 30 12:01:18 2007 -0700
crypt32: Separate decoding PKCS signer info into internal and external versions.
---
dlls/crypt32/decode.c | 94 ++++++++++++++++++++++++++++++++++---------------
1 files changed, 65 insertions(+), 29 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index de4de4a..2f589dc 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -3800,6 +3800,49 @@ static BOOL WINAPI CRYPT_AsnDecodeIssuerSerialNumber(DWORD dwCertEncodingType,
return ret;
}
+static BOOL WINAPI CRYPT_AsnDecodePKCSSignerInfoInternal(
+ DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded,
+ DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara,
+ void *pvStructInfo, DWORD *pcbStructInfo)
+{
+ CMSG_SIGNER_INFO *info = (CMSG_SIGNER_INFO *)pvStructInfo;
+ struct AsnDecodeSequenceItem items[] = {
+ { ASN_INTEGER, offsetof(CMSG_SIGNER_INFO, dwVersion),
+ CRYPT_AsnDecodeInt, sizeof(DWORD), FALSE, FALSE, 0, 0 },
+ { ASN_SEQUENCEOF, offsetof(CMSG_SIGNER_INFO, Issuer),
+ CRYPT_AsnDecodeIssuerSerialNumber, sizeof(CERT_ISSUER_SERIAL_NUMBER),
+ FALSE, TRUE, offsetof(CMSG_SIGNER_INFO, Issuer.pbData), 0 },
+ { ASN_SEQUENCEOF, offsetof(CMSG_SIGNER_INFO, HashAlgorithm),
+ CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER),
+ FALSE, TRUE, offsetof(CMSG_SIGNER_INFO, HashAlgorithm.pszObjId), 0 },
+ { ASN_CONSTRUCTOR | ASN_CONTEXT | 0,
+ offsetof(CMSG_SIGNER_INFO, AuthAttrs),
+ CRYPT_AsnDecodePKCSAttributesInternal, sizeof(CRYPT_ATTRIBUTES),
+ TRUE, TRUE, offsetof(CMSG_SIGNER_INFO, AuthAttrs.rgAttr), 0 },
+ { ASN_SEQUENCEOF, offsetof(CMSG_SIGNER_INFO, HashEncryptionAlgorithm),
+ CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER),
+ FALSE, TRUE, offsetof(CMSG_SIGNER_INFO,
+ HashEncryptionAlgorithm.pszObjId), 0 },
+ { ASN_OCTETSTRING, offsetof(CMSG_SIGNER_INFO, EncryptedHash),
+ CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DER_BLOB),
+ FALSE, TRUE, offsetof(CMSG_SIGNER_INFO, EncryptedHash.pbData), 0 },
+ { ASN_CONSTRUCTOR | ASN_CONTEXT | 1,
+ offsetof(CMSG_SIGNER_INFO, UnauthAttrs),
+ CRYPT_AsnDecodePKCSAttributesInternal, sizeof(CRYPT_ATTRIBUTES),
+ TRUE, TRUE, offsetof(CMSG_SIGNER_INFO, UnauthAttrs.rgAttr), 0 },
+ };
+ BOOL ret;
+
+ TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
+ pDecodePara, pvStructInfo, *pcbStructInfo);
+
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
+ sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded,
+ dwFlags, pDecodePara, pvStructInfo, pcbStructInfo,
+ info ? info->Issuer.pbData : NULL);
+ return ret;
+}
+
static BOOL WINAPI CRYPT_AsnDecodePKCSSignerInfo(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
@@ -3811,35 +3854,28 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSSignerInfo(DWORD dwCertEncodingType,
__TRY
{
- struct AsnDecodeSequenceItem items[] = {
- { ASN_INTEGER, offsetof(CMSG_SIGNER_INFO, dwVersion),
- CRYPT_AsnDecodeInt, sizeof(DWORD), FALSE, FALSE, 0, 0 },
- { ASN_SEQUENCEOF, offsetof(CMSG_SIGNER_INFO, Issuer),
- CRYPT_AsnDecodeIssuerSerialNumber, sizeof(CERT_ISSUER_SERIAL_NUMBER),
- FALSE, TRUE, offsetof(CMSG_SIGNER_INFO, Issuer.pbData), 0 },
- { ASN_SEQUENCEOF, offsetof(CMSG_SIGNER_INFO, HashAlgorithm),
- CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER),
- FALSE, TRUE, offsetof(CMSG_SIGNER_INFO, HashAlgorithm.pszObjId), 0 },
- { ASN_CONSTRUCTOR | ASN_CONTEXT | 0,
- offsetof(CMSG_SIGNER_INFO, AuthAttrs),
- CRYPT_AsnDecodePKCSAttributesInternal, sizeof(CRYPT_ATTRIBUTES),
- TRUE, TRUE, offsetof(CMSG_SIGNER_INFO, AuthAttrs.rgAttr), 0 },
- { ASN_SEQUENCEOF, offsetof(CMSG_SIGNER_INFO, HashEncryptionAlgorithm),
- CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER),
- FALSE, TRUE, offsetof(CMSG_SIGNER_INFO,
- HashEncryptionAlgorithm.pszObjId), 0 },
- { ASN_OCTETSTRING, offsetof(CMSG_SIGNER_INFO, EncryptedHash),
- CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DER_BLOB),
- FALSE, TRUE, offsetof(CMSG_SIGNER_INFO, EncryptedHash.pbData), 0 },
- { ASN_CONSTRUCTOR | ASN_CONTEXT | 1,
- offsetof(CMSG_SIGNER_INFO, UnauthAttrs),
- CRYPT_AsnDecodePKCSAttributesInternal, sizeof(CRYPT_ATTRIBUTES),
- TRUE, TRUE, offsetof(CMSG_SIGNER_INFO, UnauthAttrs.rgAttr), 0 },
- };
+ ret = CRYPT_AsnDecodePKCSSignerInfoInternal(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)
+ {
+ CMSG_SIGNER_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 = (CMSG_SIGNER_INFO *)pvStructInfo;
+ info->Issuer.pbData = ((BYTE *)info +
+ sizeof(CMSG_SIGNER_INFO));
+ ret = CRYPT_AsnDecodePKCSSignerInfoInternal(dwCertEncodingType,
+ lpszStructType, pbEncoded, cbEncoded,
+ dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, pvStructInfo,
+ pcbStructInfo);
+ }
+ }
}
__EXCEPT_PAGE_FAULT
{
@@ -3856,7 +3892,7 @@ static BOOL WINAPI CRYPT_DecodeSignerArray(DWORD dwCertEncodingType,
{
BOOL ret;
struct AsnArrayDescriptor arrayDesc = { ASN_CONSTRUCTOR | ASN_SETOF,
- CRYPT_AsnDecodePKCSSignerInfo, sizeof(CMSG_SIGNER_INFO), TRUE,
+ CRYPT_AsnDecodePKCSSignerInfoInternal, sizeof(CMSG_SIGNER_INFO), TRUE,
offsetof(CMSG_SIGNER_INFO, Issuer.pbData) };
struct GenericArray *array = (struct GenericArray *)pvStructInfo;
More information about the wine-cvs
mailing list