Juan Lang : crypt32: Allow CMS fields to be set when opening a signed message to encode.
Alexandre Julliard
julliard at winehq.org
Wed Aug 20 08:13:40 CDT 2008
Module: wine
Branch: master
Commit: 4fa4e5a793fa4d48246434c96a3e1381bcfc452c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4fa4e5a793fa4d48246434c96a3e1381bcfc452c
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Aug 14 17:34:07 2008 -0700
crypt32: Allow CMS fields to be set when opening a signed message to encode.
---
dlls/crypt32/msg.c | 72 +++++++++++++++++++++++++++++++++------------
dlls/crypt32/tests/msg.c | 18 +++++++++++
2 files changed, 71 insertions(+), 19 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index ad4ba95..12ee8a3 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -632,15 +632,62 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
SetLastError(E_INVALIDARG);
return FALSE;
}
- if (!signer->pCertInfo->SerialNumber.cbData)
+ if (signer->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO))
{
- SetLastError(E_INVALIDARG);
- return FALSE;
+ if (!signer->pCertInfo->SerialNumber.cbData)
+ {
+ 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);
- return FALSE;
+ switch (signer->SignerId.dwIdChoice)
+ {
+ 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)
{
@@ -652,19 +699,6 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
SetLastError(CRYPT_E_UNKNOWN_ALGO);
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;
}
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 0f69190..00b4bac 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -1106,6 +1106,24 @@ static void test_signed_msg_open(void)
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);
pCryptAcquireContextA(&signer.hCryptProv, cspNameA, MS_DEF_PROV_A,
PROV_RSA_FULL, CRYPT_DELETEKEYSET);
More information about the wine-cvs
mailing list