Juan Lang : crypt32: Use consistent types for storing and encoding signed encode data.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 24 07:06:12 CDT 2007


Module: wine
Branch: master
Commit: 99c475417a75c0137c86cd1c0e95569493f43d78
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=99c475417a75c0137c86cd1c0e95569493f43d78

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Jul 23 18:13:32 2007 -0700

crypt32: Use consistent types for storing and encoding signed encode data.

---

 dlls/crypt32/msg.c |   74 +++++++++++++++++++++------------------------------
 1 files changed, 31 insertions(+), 43 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index bcea3c2..7ba78a9 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -767,13 +767,8 @@ typedef struct _CSignedEncodeMsg
 {
     CryptMsgBase      base;
     CRYPT_DATA_BLOB   data;
-    DWORD             cSigners;
+    CRYPT_SIGNED_INFO info;
     CSignerHandles   *signerHandles;
-    PCMSG_SIGNER_INFO rgSignerInfo;
-    DWORD             cCertEncoded;
-    PCERT_BLOB        rgCertEncoded;
-    DWORD             cCrlEncoded;
-    PCRL_BLOB         rgCrlEncoded;
 } CSignedEncodeMsg;
 
 static void CSignedEncodeMsg_Close(HCRYPTMSG hCryptMsg)
@@ -782,17 +777,17 @@ static void CSignedEncodeMsg_Close(HCRYPTMSG hCryptMsg)
     DWORD i;
 
     CryptMemFree(msg->data.pbData);
-    CRYPT_FreeBlobArray((BlobArray *)&msg->cCertEncoded);
-    CRYPT_FreeBlobArray((BlobArray *)&msg->cCrlEncoded);
-    for (i = 0; i < msg->cSigners; i++)
+    CRYPT_FreeBlobArray((BlobArray *)&msg->info.cCertEncoded);
+    CRYPT_FreeBlobArray((BlobArray *)&msg->info.cCrlEncoded);
+    for (i = 0; i < msg->info.cSignerInfo; i++)
     {
-        CSignerInfo_Free(&msg->rgSignerInfo[i]);
+        CSignerInfo_Free(&msg->info.rgSignerInfo[i]);
         CryptDestroyKey(msg->signerHandles[i].key);
         CryptDestroyHash(msg->signerHandles[i].hash);
         CryptReleaseContext(msg->signerHandles[i].prov, 0);
     }
     CryptMemFree(msg->signerHandles);
-    CryptMemFree(msg->rgSignerInfo);
+    CryptMemFree(msg->info.rgSignerInfo);
 }
 
 static BOOL CSignedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
@@ -836,14 +831,7 @@ static BOOL CSignedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
         CRYPT_SIGNED_INFO info;
         char oid_rsa_data[] = szOID_RSA_data;
 
-        /* Note: needs to change if CMS fields are supported */
-        info.version = CMSG_SIGNED_DATA_V1;
-        info.cCertEncoded = msg->cCertEncoded;
-        info.rgCertEncoded = msg->rgCertEncoded;
-        info.cCrlEncoded = msg->cCrlEncoded;
-        info.rgCrlEncoded = msg->rgCrlEncoded;
-        info.cAttrCertEncoded = 0;
-        info.cSignerInfo = msg->cSigners;
+        memcpy(&info, &msg->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;
@@ -865,14 +853,13 @@ static BOOL CSignedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
         }
         if (ret)
         {
-            info.rgSignerInfo = msg->rgSignerInfo;
-                ret = CRYPT_AsnEncodePKCSSignedInfo(&info, pvData, pcbData);
+            ret = CRYPT_AsnEncodePKCSSignedInfo(&info, pvData, pcbData);
             LocalFree(info.content.Content.pbData);
         }
         break;
     }
     case CMSG_COMPUTED_HASH_PARAM:
-        if (dwIndex >= msg->cSigners)
+        if (dwIndex >= msg->info.cSignerInfo)
             SetLastError(CRYPT_E_INVALID_INDEX);
         else
             ret = CryptGetHashParam(msg->signerHandles[dwIndex].hash,
@@ -893,7 +880,7 @@ static BOOL CSignedEncodeMsg_UpdateHash(CSignedEncodeMsg *msg,
 
     TRACE("(%p, %p, %d)\n", msg, pbData, cbData);
 
-    for (i = 0; ret && i < msg->cSigners; i++)
+    for (i = 0; ret && i < msg->info.cSignerInfo; i++)
         ret = CryptHashData(msg->signerHandles[i].hash, pbData, cbData, 0);
     return ret;
 }
@@ -918,21 +905,21 @@ static BOOL CSignedEncodeMsg_Sign(CSignedEncodeMsg *msg)
 
     TRACE("(%p)\n", msg);
 
-    for (i = 0; ret && i < msg->cSigners; i++)
+    for (i = 0; ret && i < msg->info.cSignerInfo; i++)
     {
         ret = CryptSignHashW(msg->signerHandles[i].hash, AT_SIGNATURE, NULL, 0,
-         NULL, &msg->rgSignerInfo[i].EncryptedHash.cbData);
+         NULL, &msg->info.rgSignerInfo[i].EncryptedHash.cbData);
         if (ret)
         {
-            msg->rgSignerInfo[i].EncryptedHash.pbData =
-             CryptMemAlloc(msg->rgSignerInfo[i].EncryptedHash.cbData);
-            if (msg->rgSignerInfo[i].EncryptedHash.pbData)
+            msg->info.rgSignerInfo[i].EncryptedHash.pbData =
+             CryptMemAlloc(msg->info.rgSignerInfo[i].EncryptedHash.cbData);
+            if (msg->info.rgSignerInfo[i].EncryptedHash.pbData)
             {
                 ret = CryptSignHashW(msg->signerHandles[i].hash, AT_SIGNATURE,
-                 NULL, 0, msg->rgSignerInfo[i].EncryptedHash.pbData,
-                 &msg->rgSignerInfo[i].EncryptedHash.cbData);
+                 NULL, 0, msg->info.rgSignerInfo[i].EncryptedHash.pbData,
+                 &msg->info.rgSignerInfo[i].EncryptedHash.cbData);
                 if (ret)
-                    CRYPT_ReverseBytes(&msg->rgSignerInfo[i].EncryptedHash);
+                    CRYPT_ReverseBytes(&msg->info.rgSignerInfo[i].EncryptedHash);
             }
             else
                 ret = FALSE;
@@ -1017,38 +1004,39 @@ static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags,
          CSignedEncodeMsg_Update);
         msg->data.cbData = 0;
         msg->data.pbData = NULL;
-        msg->cSigners = 0;
+        memset(&msg->info, 0, sizeof(msg->info));
+        msg->info.version = CMSG_SIGNED_DATA_V1;
         if (info->cSigners)
         {
             msg->signerHandles =
              CryptMemAlloc(info->cSigners * sizeof(CSignerHandles));
             if (msg->signerHandles)
-                msg->rgSignerInfo =
+                msg->info.rgSignerInfo =
                  CryptMemAlloc(info->cSigners * sizeof(CMSG_SIGNER_INFO));
             else
             {
                 ret = FALSE;
-                msg->rgSignerInfo = NULL;
+                msg->info.rgSignerInfo = NULL;
             }
-            if (msg->rgSignerInfo)
+            if (msg->info.rgSignerInfo)
             {
-                msg->cSigners = info->cSigners;
+                msg->info.cSignerInfo = info->cSigners;
                 memset(msg->signerHandles, 0,
-                 msg->cSigners * sizeof(CSignerHandles));
-                memset(msg->rgSignerInfo, 0,
-                 msg->cSigners * sizeof(CMSG_SIGNER_INFO));
-                for (i = 0; ret && i < msg->cSigners; i++)
+                 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->rgSignerInfo[i], &info->rgSigners[i], dwFlags);
+                     &msg->info.rgSignerInfo[i], &info->rgSigners[i], dwFlags);
             }
             else
                 ret = FALSE;
         }
         if (ret)
-            ret = CRYPT_CopyBlobArray((BlobArray *)&msg->cCertEncoded,
+            ret = CRYPT_CopyBlobArray((BlobArray *)&msg->info.cCertEncoded,
              (const BlobArray *)&info->cCertEncoded);
         if (ret)
-            ret = CRYPT_CopyBlobArray((BlobArray *)&msg->cCrlEncoded,
+            ret = CRYPT_CopyBlobArray((BlobArray *)&msg->info.cCrlEncoded,
              (const BlobArray *)&info->cCrlEncoded);
         if (!ret)
         {




More information about the wine-cvs mailing list