crypt32(7/21): Make a signed message data type

Juan Lang juan.lang at gmail.com
Tue Aug 21 09:22:42 CDT 2007


--Juan
-------------- next part --------------
From 3944c28f197c8a1b478d16d50147938d18186d61 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Mon, 20 Aug 2007 17:41:23 -0700
Subject: [PATCH] Make a signed message data type
---
 dlls/crypt32/msg.c |  161 +++++++++++++++++++++++++++++-----------------------
 1 files changed, 91 insertions(+), 70 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 516bc1b..a7e43e4 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -792,12 +792,17 @@ static void CSignerInfo_Free(CMSG_SIGNER
     CryptMemFree(info->UnauthAttrs.rgAttr);
 }
 
+typedef struct _CSignedMsgData
+{
+    CRYPT_SIGNED_INFO *info;
+    CSignerHandles    *signerHandles;
+} CSignedMsgData;
+
 typedef struct _CSignedEncodeMsg
 {
-    CryptMsgBase      base;
-    CRYPT_DATA_BLOB   data;
-    CRYPT_SIGNED_INFO info;
-    CSignerHandles   *signerHandles;
+    CryptMsgBase    base;
+    CRYPT_DATA_BLOB data;
+    CSignedMsgData  msg_data;
 } CSignedEncodeMsg;
 
 static void CSignedEncodeMsg_Close(HCRYPTMSG hCryptMsg)
@@ -806,18 +811,19 @@ static void CSignedEncodeMsg_Close(HCRYP
     DWORD i;
 
     CryptMemFree(msg->data.pbData);
-    CRYPT_FreeBlobArray((BlobArray *)&msg->info.cCertEncoded);
-    CRYPT_FreeBlobArray((BlobArray *)&msg->info.cCrlEncoded);
-    for (i = 0; i < msg->info.cSignerInfo; i++)
-    {
-        CSignerInfo_Free(&msg->info.rgSignerInfo[i]);
-        CryptDestroyKey(msg->signerHandles[i].key);
-        CryptDestroyHash(msg->signerHandles[i].contentHash);
-        CryptDestroyHash(msg->signerHandles[i].authAttrHash);
-        CryptReleaseContext(msg->signerHandles[i].prov, 0);
-    }
-    CryptMemFree(msg->signerHandles);
-    CryptMemFree(msg->info.rgSignerInfo);
+    CRYPT_FreeBlobArray((BlobArray *)&msg->msg_data.info->cCertEncoded);
+    CRYPT_FreeBlobArray((BlobArray *)&msg->msg_data.info->cCrlEncoded);
+    for (i = 0; i < msg->msg_data.info->cSignerInfo; i++)
+    {
+        CSignerInfo_Free(&msg->msg_data.info->rgSignerInfo[i]);
+        CryptDestroyKey(msg->msg_data.signerHandles[i].key);
+        CryptDestroyHash(msg->msg_data.signerHandles[i].contentHash);
+        CryptDestroyHash(msg->msg_data.signerHandles[i].authAttrHash);
+        CryptReleaseContext(msg->msg_data.signerHandles[i].prov, 0);
+    }
+    CryptMemFree(msg->msg_data.signerHandles);
+    CryptMemFree(msg->msg_data.info->rgSignerInfo);
+    CryptMemFree(msg->msg_data.info);
 }
 
 static BOOL CSignedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
@@ -861,7 +867,7 @@ static BOOL CSignedEncodeMsg_GetParam(HC
         CRYPT_SIGNED_INFO info;
         char oid_rsa_data[] = szOID_RSA_data;
 
-        memcpy(&info, &msg->info, sizeof(info));
+        memcpy(&info, msg->msg_data.info, sizeof(info));
         /* Quirk:  OID is only encoded messages if an update has happened */
         if (msg->base.state != MsgStateInit)
             info.content.pszObjId = oid_rsa_data;
@@ -889,23 +895,24 @@ static BOOL CSignedEncodeMsg_GetParam(HC
         break;
     }
     case CMSG_COMPUTED_HASH_PARAM:
-        if (dwIndex >= msg->info.cSignerInfo)
+        if (dwIndex >= msg->msg_data.info->cSignerInfo)
             SetLastError(CRYPT_E_INVALID_INDEX);
         else
-            ret = CryptGetHashParam(msg->signerHandles[dwIndex].contentHash,
-             HP_HASHVAL, pvData, pcbData, 0);
+            ret = CryptGetHashParam(
+             msg->msg_data.signerHandles[dwIndex].contentHash, HP_HASHVAL,
+             pvData, pcbData, 0);
         break;
     case CMSG_ENCODED_SIGNER:
-        if (dwIndex >= msg->info.cSignerInfo)
+        if (dwIndex >= msg->msg_data.info->cSignerInfo)
             SetLastError(CRYPT_E_INVALID_INDEX);
         else
             ret = CryptEncodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
-             PKCS7_SIGNER_INFO, &msg->info.rgSignerInfo[dwIndex], 0, NULL,
-             pvData, pcbData);
+             PKCS7_SIGNER_INFO, &msg->msg_data.info->rgSignerInfo[dwIndex], 0,
+             NULL, pvData, pcbData);
         break;
     case CMSG_VERSION_PARAM:
-        ret = CRYPT_CopyParam(pvData, pcbData, &msg->info.version,
-         sizeof(msg->info.version));
+        ret = CRYPT_CopyParam(pvData, pcbData, &msg->msg_data.info->version,
+         sizeof(msg->msg_data.info->version));
         break;
     default:
         SetLastError(CRYPT_E_INVALID_MSG_TYPE);
@@ -921,9 +928,9 @@ static BOOL CSignedEncodeMsg_UpdateHash(
 
     TRACE("(%p, %p, %d)\n", msg, pbData, cbData);
 
-    for (i = 0; ret && i < msg->info.cSignerInfo; i++)
-        ret = CryptHashData(msg->signerHandles[i].contentHash, pbData, cbData,
-         0);
+    for (i = 0; ret && i < msg->msg_data.info->cSignerInfo; i++)
+        ret = CryptHashData(msg->msg_data.signerHandles[i].contentHash, pbData,
+         cbData, 0);
     return ret;
 }
 
@@ -953,13 +960,15 @@ static BOOL CSignedEncodeMsg_AppendMessa
     CRYPT_ATTRIBUTE messageDigestAttr = { messageDigest, 1, &encodedHash };
 
     size = sizeof(DWORD);
-    ret = CryptGetHashParam(msg->signerHandles[signerIndex].contentHash,
-     HP_HASHSIZE, (LPBYTE)&hash.cbData, &size, 0);
+    ret = CryptGetHashParam(
+     msg->msg_data.signerHandles[signerIndex].contentHash, HP_HASHSIZE,
+     (LPBYTE)&hash.cbData, &size, 0);
     if (ret)
     {
         hash.pbData = CryptMemAlloc(hash.cbData);
-        ret = CryptGetHashParam(msg->signerHandles[signerIndex].contentHash,
-         HP_HASHVAL, hash.pbData, &hash.cbData, 0);
+        ret = CryptGetHashParam(
+         msg->msg_data.signerHandles[signerIndex].contentHash, HP_HASHVAL,
+         hash.pbData, &hash.cbData, 0);
         if (ret)
         {
             ret = CRYPT_AsnEncodeOctets(0, NULL, &hash, CRYPT_ENCODE_ALLOC_FLAG,
@@ -967,7 +976,7 @@ static BOOL CSignedEncodeMsg_AppendMessa
             if (ret)
             {
                 ret = CRYPT_AppendAttribute(
-                 &msg->info.rgSignerInfo[signerIndex].AuthAttrs,
+                 &msg->msg_data.info->rgSignerInfo[signerIndex].AuthAttrs,
                  &messageDigestAttr);
                 LocalFree(encodedHash.pbData);
             }
@@ -985,9 +994,9 @@ static BOOL CSignedEncodeMsg_UpdateAuthe
 
     TRACE("(%p)\n", msg);
 
-    for (i = 0; ret && i < msg->info.cSignerInfo; i++)
+    for (i = 0; ret && i < msg->msg_data.info->cSignerInfo; i++)
     {
-        if (msg->info.rgSignerInfo[i].AuthAttrs.cAttr)
+        if (msg->msg_data.info->rgSignerInfo[i].AuthAttrs.cAttr)
         {
             BYTE oid_rsa_data_encoded[] = { 0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,
              0x0d,0x01,0x07,0x01 };
@@ -997,8 +1006,8 @@ static BOOL CSignedEncodeMsg_UpdateAuthe
             CRYPT_ATTRIBUTE contentTypeAttr = { contentType, 1, &content };
 
             /* FIXME: does this depend on inner OID? */
-            ret = CRYPT_AppendAttribute(&msg->info.rgSignerInfo[i].AuthAttrs,
-             &contentTypeAttr);
+            ret = CRYPT_AppendAttribute(
+             &msg->msg_data.info->rgSignerInfo[i].AuthAttrs, &contentTypeAttr);
             if (ret)
                 ret = CSignedEncodeMsg_AppendMessageDigestAttribute(msg, i);
             if (ret)
@@ -1007,12 +1016,13 @@ static BOOL CSignedEncodeMsg_UpdateAuthe
                 DWORD size;
 
                 ret = CryptEncodeObjectEx(X509_ASN_ENCODING, PKCS_ATTRIBUTES,
-                 &msg->info.rgSignerInfo[i].AuthAttrs, CRYPT_ENCODE_ALLOC_FLAG,
-                 NULL, (LPBYTE)&encodedAttrs, &size);
+                 &msg->msg_data.info->rgSignerInfo[i].AuthAttrs,
+                 CRYPT_ENCODE_ALLOC_FLAG, NULL, (LPBYTE)&encodedAttrs, &size);
                 if (ret)
                 {
-                    ret = CryptHashData(msg->signerHandles[i].authAttrHash,
-                     encodedAttrs, size, 0);
+                    ret = CryptHashData(
+                     msg->msg_data.signerHandles[i].authAttrHash, encodedAttrs,
+                     size, 0);
                     LocalFree(encodedAttrs);
                 }
             }
@@ -1042,27 +1052,29 @@ static BOOL CSignedEncodeMsg_Sign(CSigne
 
     TRACE("(%p)\n", msg);
 
-    for (i = 0; ret && i < msg->info.cSignerInfo; i++)
+    for (i = 0; ret && i < msg->msg_data.info->cSignerInfo; i++)
     {
         HCRYPTHASH hash;
 
-        if (msg->info.rgSignerInfo[i].AuthAttrs.cAttr)
-            hash = msg->signerHandles[i].authAttrHash;
+        if (msg->msg_data.info->rgSignerInfo[i].AuthAttrs.cAttr)
+            hash = msg->msg_data.signerHandles[i].authAttrHash;
         else
-            hash = msg->signerHandles[i].contentHash;
+            hash = msg->msg_data.signerHandles[i].contentHash;
         ret = CryptSignHashW(hash, AT_SIGNATURE, NULL, 0, NULL,
-         &msg->info.rgSignerInfo[i].EncryptedHash.cbData);
+         &msg->msg_data.info->rgSignerInfo[i].EncryptedHash.cbData);
         if (ret)
         {
-            msg->info.rgSignerInfo[i].EncryptedHash.pbData =
-             CryptMemAlloc(msg->info.rgSignerInfo[i].EncryptedHash.cbData);
-            if (msg->info.rgSignerInfo[i].EncryptedHash.pbData)
+            msg->msg_data.info->rgSignerInfo[i].EncryptedHash.pbData =
+             CryptMemAlloc(
+             msg->msg_data.info->rgSignerInfo[i].EncryptedHash.cbData);
+            if (msg->msg_data.info->rgSignerInfo[i].EncryptedHash.pbData)
             {
                 ret = CryptSignHashW(hash, AT_SIGNATURE, NULL, 0,
-                 msg->info.rgSignerInfo[i].EncryptedHash.pbData,
-                 &msg->info.rgSignerInfo[i].EncryptedHash.cbData);
+                 msg->msg_data.info->rgSignerInfo[i].EncryptedHash.pbData,
+                 &msg->msg_data.info->rgSignerInfo[i].EncryptedHash.cbData);
                 if (ret)
-                    CRYPT_ReverseBytes(&msg->info.rgSignerInfo[i].EncryptedHash);
+                    CRYPT_ReverseBytes(
+                     &msg->msg_data.info->rgSignerInfo[i].EncryptedHash);
             }
             else
                 ret = FALSE;
@@ -1151,39 +1163,48 @@ static HCRYPTMSG CSignedEncodeMsg_Open(D
          CSignedEncodeMsg_Update, CRYPT_DefaultMsgControl);
         msg->data.cbData = 0;
         msg->data.pbData = NULL;
-        memset(&msg->info, 0, sizeof(msg->info));
-        msg->info.version = CMSG_SIGNED_DATA_V1;
-        if (info->cSigners)
+        msg->msg_data.info = CryptMemAlloc(sizeof(CRYPT_SIGNED_INFO));
+        if (msg->msg_data.info)
+        {
+            memset(msg->msg_data.info, 0, sizeof(CRYPT_SIGNED_INFO));
+            msg->msg_data.info->version = CMSG_SIGNED_DATA_V1;
+        }
+        else
+            ret = FALSE;
+        if (ret && info->cSigners)
         {
-            msg->signerHandles =
+            msg->msg_data.signerHandles =
              CryptMemAlloc(info->cSigners * sizeof(CSignerHandles));
-            if (msg->signerHandles)
-                msg->info.rgSignerInfo =
+            if (msg->msg_data.signerHandles)
+                msg->msg_data.info->rgSignerInfo =
                  CryptMemAlloc(info->cSigners * sizeof(CMSG_SIGNER_INFO));
             else
             {
                 ret = FALSE;
-                msg->info.rgSignerInfo = NULL;
+                msg->msg_data.info->rgSignerInfo = NULL;
             }
-            if (msg->info.rgSignerInfo)
+            if (msg->msg_data.info->rgSignerInfo)
             {
-                msg->info.cSignerInfo = info->cSigners;
-                memset(msg->signerHandles, 0,
-                 msg->info.cSignerInfo * sizeof(CSignerHandles));
-                memset(msg->info.rgSignerInfo, 0,
-                 msg->info.cSignerInfo * sizeof(CMSG_SIGNER_INFO));
-                for (i = 0; ret && i < msg->info.cSignerInfo; i++)
-                    ret = CSignerInfo_Construct(&msg->signerHandles[i],
-                     &msg->info.rgSignerInfo[i], &info->rgSigners[i], dwFlags);
+                msg->msg_data.info->cSignerInfo = info->cSigners;
+                memset(msg->msg_data.signerHandles, 0,
+                 msg->msg_data.info->cSignerInfo * sizeof(CSignerHandles));
+                memset(msg->msg_data.info->rgSignerInfo, 0,
+                 msg->msg_data.info->cSignerInfo * sizeof(CMSG_SIGNER_INFO));
+                for (i = 0; ret && i < msg->msg_data.info->cSignerInfo; i++)
+                    ret = CSignerInfo_Construct(&msg->msg_data.signerHandles[i],
+                     &msg->msg_data.info->rgSignerInfo[i],
+                     &info->rgSigners[i], dwFlags);
             }
             else
                 ret = FALSE;
         }
         if (ret)
-            ret = CRYPT_ConstructBlobArray((BlobArray *)&msg->info.cCertEncoded,
+            ret = CRYPT_ConstructBlobArray(
+             (BlobArray *)&msg->msg_data.info->cCertEncoded,
              (const BlobArray *)&info->cCertEncoded);
         if (ret)
-            ret = CRYPT_ConstructBlobArray((BlobArray *)&msg->info.cCrlEncoded,
+            ret = CRYPT_ConstructBlobArray(
+             (BlobArray *)&msg->msg_data.info->cCrlEncoded,
              (const BlobArray *)&info->cCrlEncoded);
         if (!ret)
         {
-- 
1.4.1


More information about the wine-patches mailing list