crypt32: Allow CMS fields to be set when opening a signed message to encode.
This commit is contained in:
parent
3297080045
commit
4fa4e5a793
@ -632,15 +632,62 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
|
|||||||
SetLastError(E_INVALIDARG);
|
SetLastError(E_INVALIDARG);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (!signer->pCertInfo->SerialNumber.cbData)
|
if (signer->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO))
|
||||||
{
|
{
|
||||||
SetLastError(E_INVALIDARG);
|
if (!signer->pCertInfo->SerialNumber.cbData)
|
||||||
return FALSE;
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!signer->pCertInfo->Issuer.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!signer->pCertInfo->Issuer.cbData)
|
else if (signer->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO_WITH_CMS))
|
||||||
{
|
{
|
||||||
SetLastError(E_INVALIDARG);
|
switch (signer->SignerId.dwIdChoice)
|
||||||
return FALSE;
|
{
|
||||||
|
case 0:
|
||||||
|
if (!signer->pCertInfo->SerialNumber.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!signer->pCertInfo->Issuer.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CERT_ID_ISSUER_SERIAL_NUMBER:
|
||||||
|
if (!signer->SignerId.IssuerSerialNumber.SerialNumber.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!signer->SignerId.IssuerSerialNumber.Issuer.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CERT_ID_KEY_IDENTIFIER:
|
||||||
|
if (!signer->SignerId.KeyId.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
}
|
||||||
|
if (signer->HashEncryptionAlgorithm.pszObjId)
|
||||||
|
{
|
||||||
|
FIXME("CMSG_SIGNER_ENCODE_INFO with CMS fields unsupported\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!signer->hCryptProv)
|
if (!signer->hCryptProv)
|
||||||
{
|
{
|
||||||
@ -652,19 +699,6 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
|
|||||||
SetLastError(CRYPT_E_UNKNOWN_ALGO);
|
SetLastError(CRYPT_E_UNKNOWN_ALGO);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (signer->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO_WITH_CMS))
|
|
||||||
{
|
|
||||||
if (signer->SignerId.dwIdChoice)
|
|
||||||
{
|
|
||||||
FIXME("CMSG_SIGNER_ENCODE_INFO with CMS fields unsupported\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (signer->HashEncryptionAlgorithm.pszObjId)
|
|
||||||
{
|
|
||||||
FIXME("CMSG_SIGNER_ENCODE_INFO with CMS fields unsupported\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1106,6 +1106,24 @@ static void test_signed_msg_open(void)
|
|||||||
CryptMsgClose(msg);
|
CryptMsgClose(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* pCertInfo must still be set, but can be empty if the SignerId's issuer
|
||||||
|
* and serial number are set.
|
||||||
|
*/
|
||||||
|
certInfo.Issuer.cbData = 0;
|
||||||
|
certInfo.SerialNumber.cbData = 0;
|
||||||
|
signer.SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER;
|
||||||
|
signer.SignerId.IssuerSerialNumber.Issuer.cbData =
|
||||||
|
sizeof(encodedCommonName);
|
||||||
|
signer.SignerId.IssuerSerialNumber.Issuer.pbData =
|
||||||
|
(BYTE *)encodedCommonName;
|
||||||
|
signer.SignerId.IssuerSerialNumber.SerialNumber.cbData =
|
||||||
|
sizeof(serialNum);
|
||||||
|
signer.SignerId.IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum;
|
||||||
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
|
NULL, NULL);
|
||||||
|
ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
|
||||||
|
CryptMsgClose(msg);
|
||||||
|
|
||||||
CryptReleaseContext(signer.hCryptProv, 0);
|
CryptReleaseContext(signer.hCryptProv, 0);
|
||||||
pCryptAcquireContextA(&signer.hCryptProv, cspNameA, MS_DEF_PROV_A,
|
pCryptAcquireContextA(&signer.hCryptProv, cspNameA, MS_DEF_PROV_A,
|
||||||
PROV_RSA_FULL, CRYPT_DELETEKEYSET);
|
PROV_RSA_FULL, CRYPT_DELETEKEYSET);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user