crypt32: Make sure that the provider supports algorithm of the message being decoded.
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
2a356bc102
commit
2ef62f9085
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue