Juan Lang : crypt32: Fix a fixme, and remove an old comment.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 9 05:47:27 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 02c4956157033896077b4027834f11f8dcdb56f3
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=02c4956157033896077b4027834f11f8dcdb56f3

Author: Juan Lang <juan_lang at 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
     {




More information about the wine-cvs mailing list