[PATCH] crypt32: Make sure that the provider supports algorithm of a being decoded message.

Dmitry Timoshkov dmitry at baikal.ru
Fri Nov 16 06:28:07 CST 2018


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/crypt32/msg.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 9fe63e24a7..4132390855 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -926,17 +926,25 @@ typedef struct _CSignedMsgData
  * been constructed.
  */
 static BOOL CSignedMsgData_ConstructSignerHandles(CSignedMsgData *msg_data,
- DWORD signerIndex, HCRYPTPROV crypt_prov)
+ DWORD signerIndex, HCRYPTPROV *crypt_prov, DWORD *flags)
 {
     ALG_ID algID;
     BOOL ret;
 
     algID = CertOIDToAlgId(
      msg_data->info->rgSignerInfo[signerIndex].HashAlgorithm.pszObjId);
-    ret = CryptCreateHash(crypt_prov, algID, 0, 0,
+
+    if (!*crypt_prov)
+    {
+        *crypt_prov = I_CryptGetDefaultCryptProv(algID);
+        if (!*crypt_prov) return FALSE;
+        *flags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG;
+    }
+
+    ret = CryptCreateHash(*crypt_prov, algID, 0, 0,
      &msg_data->signerHandles->contentHash);
     if (ret && msg_data->info->rgSignerInfo[signerIndex].AuthAttrs.cAttr > 0)
-        ret = CryptCreateHash(crypt_prov, algID, 0, 0,
+        ret = CryptCreateHash(*crypt_prov, algID, 0, 0,
          &msg_data->signerHandles->authAttrHash);
     return ret;
 }
@@ -1434,7 +1442,7 @@ static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags,
                         if (ret)
                         {
                             ret = CSignedMsgData_ConstructSignerHandles(
-                             &msg->msg_data, i, info->rgSigners[i].hCryptProv);
+                             &msg->msg_data, i, &info->rgSigners[i].hCryptProv, &dwFlags);
                             if (dwFlags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG)
                                 CryptReleaseContext(info->rgSigners[i].hCryptProv,
                                  0);
@@ -2092,7 +2100,7 @@ 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)
     {
@@ -2343,6 +2351,14 @@ static BOOL CDecodeMsg_FinalizeHashedContent(CDecodeMsg *msg,
      &size);
     if (ret)
         algID = CertOIDToAlgId(hashAlgoID->pszObjId);
+
+    if (!msg->crypt_prov)
+    {
+        msg->crypt_prov = I_CryptGetDefaultCryptProv(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)
     {
@@ -2389,7 +2405,7 @@ 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++)
         ret = CSignedMsgData_ConstructSignerHandles(&msg->u.signed_data, i,
-         msg->crypt_prov);
+         &msg->crypt_prov, &msg->base.open_flags);
     if (ret)
     {
         CRYPT_DATA_BLOB *content;
@@ -3555,13 +3571,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 = I_CryptGetDefaultCryptProv(0);
-            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;
-- 
2.17.1




More information about the wine-devel mailing list