Juan Lang : crypt32: Allow CMS fields to be set when opening a signed message to encode.

Alexandre Julliard julliard at winehq.org
Wed Aug 20 08:13:40 CDT 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Aug 14 17:34:07 2008 -0700

crypt32: Allow CMS fields to be set when opening a signed message to encode.

---

 dlls/crypt32/msg.c       |   72 +++++++++++++++++++++++++++++++++------------
 dlls/crypt32/tests/msg.c |   18 +++++++++++
 2 files changed, 71 insertions(+), 19 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index ad4ba95..12ee8a3 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -632,15 +632,62 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
         SetLastError(E_INVALIDARG);
         return FALSE;
     }
-    if (!signer->pCertInfo->SerialNumber.cbData)
+    if (signer->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO))
     {
-        SetLastError(E_INVALIDARG);
-        return FALSE;
+        if (!signer->pCertInfo->SerialNumber.cbData)
+        {
+            SetLastError(E_INVALIDARG);
+            return FALSE;
+        }
+        if (!signer->pCertInfo->Issuer.cbData)
+        {
+            SetLastError(E_INVALIDARG);
+            return FALSE;
+        }
     }
-    if (!signer->pCertInfo->Issuer.cbData)
+    else if (signer->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO_WITH_CMS))
     {
-        SetLastError(E_INVALIDARG);
-        return FALSE;
+        switch (signer->SignerId.dwIdChoice)
+        {
+        case 0:
+            if (!signer->pCertInfo->SerialNumber.cbData)
+            {
+                SetLastError(E_INVALIDARG);
+                return FALSE;
+            }
+            if (!signer->pCertInfo->Issuer.cbData)
+            {
+                SetLastError(E_INVALIDARG);
+                return FALSE;
+            }
+            break;
+        case CERT_ID_ISSUER_SERIAL_NUMBER:
+            if (!signer->SignerId.IssuerSerialNumber.SerialNumber.cbData)
+            {
+                SetLastError(E_INVALIDARG);
+                return FALSE;
+            }
+            if (!signer->SignerId.IssuerSerialNumber.Issuer.cbData)
+            {
+                SetLastError(E_INVALIDARG);
+                return FALSE;
+            }
+            break;
+        case CERT_ID_KEY_IDENTIFIER:
+            if (!signer->SignerId.KeyId.cbData)
+            {
+                SetLastError(E_INVALIDARG);
+                return FALSE;
+            }
+            break;
+        default:
+            SetLastError(E_INVALIDARG);
+        }
+        if (signer->HashEncryptionAlgorithm.pszObjId)
+        {
+            FIXME("CMSG_SIGNER_ENCODE_INFO with CMS fields unsupported\n");
+            return FALSE;
+        }
     }
     if (!signer->hCryptProv)
     {
@@ -652,19 +699,6 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
         SetLastError(CRYPT_E_UNKNOWN_ALGO);
         return FALSE;
     }
-    if (signer->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO_WITH_CMS))
-    {
-        if (signer->SignerId.dwIdChoice)
-        {
-            FIXME("CMSG_SIGNER_ENCODE_INFO with CMS fields unsupported\n");
-            return FALSE;
-        }
-        if (signer->HashEncryptionAlgorithm.pszObjId)
-        {
-            FIXME("CMSG_SIGNER_ENCODE_INFO with CMS fields unsupported\n");
-            return FALSE;
-        }
-    }
     return TRUE;
 }
 
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 0f69190..00b4bac 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -1106,6 +1106,24 @@ static void test_signed_msg_open(void)
         CryptMsgClose(msg);
     }
 
+    /* pCertInfo must still be set, but can be empty if the SignerId's issuer
+     * and serial number are set.
+     */
+    certInfo.Issuer.cbData = 0;
+    certInfo.SerialNumber.cbData = 0;
+    signer.SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER;
+    signer.SignerId.IssuerSerialNumber.Issuer.cbData =
+     sizeof(encodedCommonName);
+    signer.SignerId.IssuerSerialNumber.Issuer.pbData =
+     (BYTE *)encodedCommonName;
+    signer.SignerId.IssuerSerialNumber.SerialNumber.cbData =
+     sizeof(serialNum);
+    signer.SignerId.IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum;
+    msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
+     NULL, NULL);
+    ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
+    CryptMsgClose(msg);
+
     CryptReleaseContext(signer.hCryptProv, 0);
     pCryptAcquireContextA(&signer.hCryptProv, cspNameA, MS_DEF_PROV_A,
      PROV_RSA_FULL, CRYPT_DELETEKEYSET);




More information about the wine-cvs mailing list