{
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)
{
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)
{
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;
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)
{
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;