crypt32(18/20): Use set encoding function for encoding PKCS signed info

Juan Lang juan.lang at gmail.com
Mon Jul 23 20:33:17 CDT 2007


--Juan
-------------- next part --------------
From f7824d1d947a1a5b6db4253d8152acaa3e3be44b Mon Sep 17 00:00:00 2001
From: Juan Lang <juanlang at juan.corp.google.com>
Date: Mon, 23 Jul 2007 18:23:00 -0700
Subject: [PATCH] Use set encoding function for encoding PKCS signed info
---
 dlls/crypt32/encode.c |  131 ++++++++++++++++++-------------------------------
 1 files changed, 49 insertions(+), 82 deletions(-)

diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c
index d63b389..2645715 100644
--- a/dlls/crypt32/encode.c
+++ b/dlls/crypt32/encode.c
@@ -1540,88 +1540,6 @@ BOOL CRYPT_AsnEncodePKCSDigestedData(CRY
      sizeof(items) / sizeof(items[0]), 0, NULL, pvData, pcbData);
 }
 
-BOOL CRYPT_AsnEncodePKCSSignedInfo(CRYPT_SIGNED_INFO *signedInfo, void *pvData,
- DWORD *pcbData)
-{
-    struct AsnEncodeSequenceItem items[7] = {
-     { &signedInfo->version, CRYPT_AsnEncodeInt, 0 },
-    };
-    CRYPT_SET_OF digestAlgorithmsSet = { 0, NULL }, signerSet = { 0, NULL };
-    DWORD i, cItem = 1;
-    BOOL ret = TRUE;
-
-    if (signedInfo->cCertEncoded)
-        FIXME("unimplemented for certs\n");
-    if (signedInfo->cCrlEncoded)
-        FIXME("unimplemented for CRLs\n");
-    if (signedInfo->cAttrCertEncoded)
-        FIXME("unimplemented for attr certs\n");
-    if (signedInfo->cSignerInfo)
-    {
-        digestAlgorithmsSet.cValue = signedInfo->cSignerInfo;
-        digestAlgorithmsSet.rgValue =
-         CryptMemAlloc(digestAlgorithmsSet.cValue * sizeof(CRYPT_DER_BLOB));
-        if (digestAlgorithmsSet.rgValue)
-        {
-            memset(digestAlgorithmsSet.rgValue, 0,
-             digestAlgorithmsSet.cValue * sizeof(CRYPT_DER_BLOB));
-            for (i = 0; ret && i < digestAlgorithmsSet.cValue; i++)
-                ret = CRYPT_AsnEncodeAlgorithmIdWithNullParams(0, NULL,
-                 &signedInfo->rgSignerInfo[i].HashAlgorithm,
-                 CRYPT_ENCODE_ALLOC_FLAG, NULL,
-                 (BYTE *)&digestAlgorithmsSet.rgValue[i].pbData,
-                 &digestAlgorithmsSet.rgValue[i].cbData);
-        }
-        else
-            ret = FALSE;
-        if (ret)
-        {
-            items[cItem].pvStructInfo = &digestAlgorithmsSet;
-            items[cItem].encodeFunc = CRYPT_DEREncodeSet;
-            cItem++;
-        }
-    }
-    items[cItem].pvStructInfo = &signedInfo->content;
-    items[cItem].encodeFunc = CRYPT_AsnEncodePKCSContentInfoInternal;
-    cItem++;
-    if (ret && signedInfo->cSignerInfo)
-    {
-        signerSet.cValue = signedInfo->cSignerInfo;
-        signerSet.rgValue =
-         CryptMemAlloc(signerSet.cValue * sizeof(CRYPT_DER_BLOB));
-        if (signerSet.rgValue)
-        {
-            memset(signerSet.rgValue, 0,
-             signerSet.cValue * sizeof(CRYPT_DER_BLOB));
-            for (i = 0; ret && i < signerSet.cValue; i++)
-                ret = CryptEncodeObjectEx(
-                 X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, PKCS7_SIGNER_INFO,
-                 &signedInfo->rgSignerInfo[i], CRYPT_ENCODE_ALLOC_FLAG, NULL,
-                 &signerSet.rgValue[i].pbData, &signerSet.rgValue[i].cbData);
-        }
-        else
-            ret = FALSE;
-        if (ret)
-        {
-            items[cItem].pvStructInfo = &signerSet;
-            items[cItem].encodeFunc = CRYPT_DEREncodeSet;
-            cItem++;
-        }
-    }
-    if (ret)
-        ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, cItem, 0, NULL,
-         pvData, pcbData);
-
-    for (i = 0; i < digestAlgorithmsSet.cValue; i++)
-        LocalFree(digestAlgorithmsSet.rgValue[i].pbData);
-    CryptMemFree(digestAlgorithmsSet.rgValue);
-    for (i = 0; i < signerSet.cValue; i++)
-        LocalFree(signerSet.rgValue[i].pbData);
-    CryptMemFree(signerSet.rgValue);
-
-    return ret;
-}
-
 static BOOL WINAPI CRYPT_AsnEncodePKCSContentInfo(DWORD dwCertEncodingType,
  LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
  PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
@@ -3315,6 +3233,55 @@ static BOOL WINAPI CRYPT_AsnEncodePKCSSi
     return ret;
 }
 
+BOOL CRYPT_AsnEncodePKCSSignedInfo(CRYPT_SIGNED_INFO *signedInfo, void *pvData,
+ DWORD *pcbData)
+{
+    struct AsnEncodeSequenceItem items[7] = {
+     { &signedInfo->version, CRYPT_AsnEncodeInt, 0 },
+    };
+    struct DERSetDescriptor digestAlgorithmsSet = { 0 }, signerSet = { 0 };
+    DWORD cItem = 1;
+    BOOL ret = TRUE;
+
+    if (signedInfo->cCertEncoded)
+        FIXME("unimplemented for certs\n");
+    if (signedInfo->cCrlEncoded)
+        FIXME("unimplemented for CRLs\n");
+    if (signedInfo->cAttrCertEncoded)
+        FIXME("unimplemented for attr certs\n");
+    if (signedInfo->cSignerInfo)
+    {
+        digestAlgorithmsSet.cItems = signedInfo->cSignerInfo;
+        digestAlgorithmsSet.items = signedInfo->rgSignerInfo;
+        digestAlgorithmsSet.itemSize = sizeof(CMSG_SIGNER_INFO);
+        digestAlgorithmsSet.itemOffset =
+         offsetof(CMSG_SIGNER_INFO, HashAlgorithm);
+        digestAlgorithmsSet.encode = CRYPT_AsnEncodeAlgorithmIdWithNullParams;
+        items[cItem].pvStructInfo = &digestAlgorithmsSet;
+        items[cItem].encodeFunc = CRYPT_DEREncodeItemsAsSet;
+        cItem++;
+    }
+    items[cItem].pvStructInfo = &signedInfo->content;
+    items[cItem].encodeFunc = CRYPT_AsnEncodePKCSContentInfoInternal;
+    cItem++;
+    if (ret && signedInfo->cSignerInfo)
+    {
+        signerSet.cItems = signedInfo->cSignerInfo;
+        signerSet.items = signedInfo->rgSignerInfo;
+        signerSet.itemSize = sizeof(CMSG_SIGNER_INFO);
+        signerSet.itemOffset = 0;
+        signerSet.encode = CRYPT_AsnEncodePKCSSignerInfo;
+        items[cItem].pvStructInfo = &signerSet;
+        items[cItem].encodeFunc = CRYPT_DEREncodeItemsAsSet;
+        cItem++;
+    }
+    if (ret)
+        ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
+         items, cItem, 0, NULL, pvData, pcbData);
+
+    return ret;
+}
+
 BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
  const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara,
  void *pvEncoded, DWORD *pcbEncoded)
-- 
1.4.1


More information about the wine-patches mailing list