Module: wine Branch: refs/heads/master Commit: 02c4956157033896077b4027834f11f8dcdb56f3 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=02c4956157033896077b4027...
Author: Juan Lang juan_lang@yahoo.com Date: Thu Feb 9 12:09:01 2006 +0100
crypt32: Fix a fixme, and remove an old comment.
---
dlls/crypt32/encode.c | 71 ++++++++++++++++++++++++++++++++++--------------- 1 files changed, 49 insertions(+), 22 deletions(-)
diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c index b0a7196..7b4da1c 100644 --- a/dlls/crypt32/encode.c +++ b/dlls/crypt32/encode.c @@ -84,10 +84,6 @@ typedef BOOL (WINAPI *CryptDecodeObjectE * built-in functions, but the parameters are retained to simplify * CryptEncodeObjectEx/CryptDecodeObjectEx, since they must call functions in * external DLLs that follow these signatures. - * FIXME: some built-in functions are suitable to be called directly by - * CryptEncodeObjectEx/CryptDecodeObjectEx (they implement exception handling - * and memory allocation if requested), others are only suitable to be called - * internally. Comment which are which. */ static BOOL WINAPI CRYPT_AsnEncodeOid(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, @@ -126,7 +122,7 @@ static BOOL WINAPI CRYPT_AsnEncodeChoice static BOOL WINAPI CRYPT_AsnDecodeChoiceOfTime(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo); -static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType, +static BOOL WINAPI CRYPT_AsnDecodePubKeyInfoInternal(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo); /* Like CRYPT_AsnDecodeExtensions, except assumes rgExtension is set ahead of @@ -3067,12 +3063,9 @@ static BOOL WINAPI CRYPT_AsnDecodeCertIn { 0, offsetof(CERT_INFO, Subject), CRYPT_AsnDecodeDerBlob, sizeof(CRYPT_DER_BLOB), FALSE, TRUE, offsetof(CERT_INFO, Subject.pbData) }, - /* jil FIXME: shouldn't this have an internal version, which expects - * the pbData to be set? - */ { ASN_SEQUENCEOF, offsetof(CERT_INFO, SubjectPublicKeyInfo), - CRYPT_AsnDecodePubKeyInfo, sizeof(CERT_PUBLIC_KEY_INFO), FALSE, - TRUE, offsetof(CERT_INFO, + CRYPT_AsnDecodePubKeyInfoInternal, sizeof(CERT_PUBLIC_KEY_INFO), + FALSE, TRUE, offsetof(CERT_INFO, SubjectPublicKeyInfo.Algorithm.Parameters.pbData), 0 }, { ASN_BITSTRING, offsetof(CERT_INFO, IssuerUniqueId), CRYPT_AsnDecodeBitsInternal, sizeof(CRYPT_BIT_BLOB), TRUE, TRUE, @@ -3690,6 +3683,29 @@ static BOOL WINAPI CRYPT_AsnDecodeAlgori return ret; }
+static BOOL WINAPI CRYPT_AsnDecodePubKeyInfoInternal(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, + PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) +{ + BOOL ret = TRUE; + struct AsnDecodeSequenceItem items[] = { + { ASN_SEQUENCEOF, offsetof(CERT_PUBLIC_KEY_INFO, Algorithm), + CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER), + FALSE, TRUE, offsetof(CERT_PUBLIC_KEY_INFO, + Algorithm.pszObjId) }, + { ASN_BITSTRING, offsetof(CERT_PUBLIC_KEY_INFO, PublicKey), + CRYPT_AsnDecodeBitsInternal, sizeof(CRYPT_BIT_BLOB), FALSE, TRUE, + offsetof(CERT_PUBLIC_KEY_INFO, PublicKey.pbData) }, + }; + PCERT_PUBLIC_KEY_INFO info = (PCERT_PUBLIC_KEY_INFO)pvStructInfo; + + ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, + sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags, + pDecodePara, pvStructInfo, pcbStructInfo, info ? + info->Algorithm.Parameters.pbData : NULL); + return ret; +} + static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) @@ -3698,19 +3714,30 @@ static BOOL WINAPI CRYPT_AsnDecodePubKey
__TRY { - struct AsnDecodeSequenceItem items[] = { - { ASN_SEQUENCEOF, offsetof(CERT_PUBLIC_KEY_INFO, Algorithm), - CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER), - FALSE, TRUE, offsetof(CERT_PUBLIC_KEY_INFO, - Algorithm.pszObjId) }, - { ASN_BITSTRING, offsetof(CERT_PUBLIC_KEY_INFO, PublicKey), - CRYPT_AsnDecodeBitsInternal, sizeof(CRYPT_BIT_BLOB), FALSE, TRUE, - offsetof(CERT_PUBLIC_KEY_INFO, PublicKey.pbData) }, - }; + DWORD bytesNeeded;
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, - sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags, - pDecodePara, pvStructInfo, pcbStructInfo, NULL); + if ((ret = CRYPT_AsnDecodePubKeyInfoInternal(dwCertEncodingType, + lpszStructType, pbEncoded, cbEncoded, + dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, NULL, &bytesNeeded))) + { + if (!pvStructInfo) + *pcbStructInfo = bytesNeeded; + else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara, + pvStructInfo, pcbStructInfo, bytesNeeded))) + { + PCERT_PUBLIC_KEY_INFO info; + + if (dwFlags & CRYPT_DECODE_ALLOC_FLAG) + pvStructInfo = *(BYTE **)pvStructInfo; + info = (PCERT_PUBLIC_KEY_INFO)pvStructInfo; + info->Algorithm.Parameters.pbData = (BYTE *)pvStructInfo + + sizeof(CERT_PUBLIC_KEY_INFO); + ret = CRYPT_AsnDecodePubKeyInfoInternal(dwCertEncodingType, + lpszStructType, pbEncoded, cbEncoded, + dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, pvStructInfo, + &bytesNeeded); + } + } } __EXCEPT_PAGE_FAULT {