From e27cd22f8fab1cae0cdabe72c9778845d2f04802 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 6 Sep 2010 17:57:49 +0400 Subject: [eterwine 6/7] crypt32: Find a provider for used algorithm (eterbug #5694). --- dlls/crypt32/msg.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 files changed, 34 insertions(+), 8 deletions(-) diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c index a927d1c..7d86cb7 100644 --- a/dlls/crypt32/msg.c +++ b/dlls/crypt32/msg.c @@ -2075,7 +2075,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) { @@ -2325,7 +2326,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) { @@ -2371,8 +2380,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; @@ -3245,6 +3265,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) { @@ -3539,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 = 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; -- 1.7.7.3