crypt32: Find a provider for used algorithm (eterbug #5694).
authorAlexander Morozov <amorozov@etersoft.ru>
Mon, 6 Sep 2010 13:57:49 +0000 (17:57 +0400)
committerAlexander Morozov <amorozov@etersoft.ru>
Mon, 6 Sep 2010 13:57:49 +0000 (17:57 +0400)
dlls/crypt32/msg.c

index cefd838eed57b67227214ae9e81070ac16076bd1..e5cf137e96bf5b948fb8c745367cd0bcfd3f7659 100644 (file)
@@ -2076,7 +2076,8 @@ static void CDecodeMsg_Close(HCRYPTMSG hCryptMsg)
 {
     CDecodeMsg *msg = hCryptMsg;
 
-    if (msg->base.open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG)
+    if (msg->crypt_prov &&
+     (msg->base.open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG))
         CryptReleaseContext(msg->crypt_prov, 0);
     switch (msg->type)
     {
@@ -2328,7 +2329,15 @@ static BOOL CDecodeMsg_FinalizeHashedContent(CDecodeMsg *msg,
     ret = CryptMsgGetParam(msg, CMSG_HASH_ALGORITHM_PARAM, 0, hashAlgoID,
      &size);
     if (ret)
+    {
         algID = CertOIDToAlgId(hashAlgoID->pszObjId);
+        if (!msg->crypt_prov)
+        {
+            msg->crypt_prov = CRYPT_GetProvForAlgId(algID);
+            if (msg->crypt_prov)
+                msg->base.open_flags |= CMSG_CRYPT_RELEASE_CONTEXT_FLAG;
+        }
+    }
     ret = CryptCreateHash(msg->crypt_prov, algID, 0, 0, &msg->u.hash);
     if (ret)
     {
@@ -2374,8 +2383,19 @@ static BOOL CDecodeMsg_FinalizeSignedContent(CDecodeMsg *msg,
 
     ret = CSignedMsgData_AllocateHandles(&msg->u.signed_data);
     for (i = 0; ret && i < msg->u.signed_data.info->cSignerInfo; i++)
+    {
+        if (!msg->crypt_prov)
+        {
+            ALG_ID algID = CertOIDToAlgId(
+             msg->u.signed_data.info->rgSignerInfo[i].HashAlgorithm.pszObjId);
+
+            msg->crypt_prov = CRYPT_GetProvForAlgId(algID);
+            if (msg->crypt_prov)
+                msg->base.open_flags |= CMSG_CRYPT_RELEASE_CONTEXT_FLAG;
+        }
         ret = CSignedMsgData_ConstructSignerHandles(&msg->u.signed_data, i,
          msg->crypt_prov);
+    }
     if (ret)
     {
         CRYPT_DATA_BLOB *content;
@@ -3248,6 +3268,18 @@ static BOOL CDecodeSignedMsg_VerifySignatureWithKey(CDecodeMsg *msg,
 
     if (!prov)
         prov = msg->crypt_prov;
+    if (!prov)
+    {
+        ALG_ID algID;
+
+        algID = CertOIDToAlgId(keyInfo->Algorithm.pszObjId);
+        prov = CRYPT_GetProvForAlgId(algID);
+        if (prov)
+        {
+            msg->crypt_prov = prov;
+            msg->base.open_flags |= CMSG_CRYPT_RELEASE_CONTEXT_FLAG;
+        }
+    }
     ret = CryptImportPublicKeyInfo(prov, X509_ASN_ENCODING, keyInfo, &key);
     if (ret)
     {
@@ -3542,13 +3574,7 @@ HCRYPTMSG WINAPI CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags,
          CDecodeMsg_Close, CDecodeMsg_GetParam, CDecodeMsg_Update,
          CDecodeMsg_Control);
         msg->type = dwMsgType;
-        if (hCryptProv)
-            msg->crypt_prov = hCryptProv;
-        else
-        {
-            msg->crypt_prov = CRYPT_GetDefaultProvider();
-            msg->base.open_flags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG;
-        }
+        msg->crypt_prov = hCryptProv;
         memset(&msg->u, 0, sizeof(msg->u));
         msg->msg_data.cbData = 0;
         msg->msg_data.pbData = NULL;