Juan Lang : crypt32: Add tests for CMSG_CMS_SIGNER_INFO_PARAM.
Alexandre Julliard
julliard at winehq.org
Thu Aug 21 10:02:12 CDT 2008
Module: wine
Branch: master
Commit: 6d9fc0f59d9b7dabe1b283186adc65e46103c2cd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6d9fc0f59d9b7dabe1b283186adc65e46103c2cd
Author: Juan Lang <juan.lang at gmail.com>
Date: Wed Aug 20 12:01:37 2008 -0700
crypt32: Add tests for CMSG_CMS_SIGNER_INFO_PARAM.
---
dlls/crypt32/tests/msg.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 135 insertions(+), 0 deletions(-)
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 86ce6b1..4b080ee 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -2265,9 +2265,56 @@ static void compare_signer_info(const CMSG_SIGNER_INFO *got,
/* FIXME: check more things */
}
+static void compare_cms_signer_info(const CMSG_CMS_SIGNER_INFO *got,
+ const CMSG_CMS_SIGNER_INFO *expected)
+{
+ ok(got->dwVersion == expected->dwVersion, "Expected version %d, got %d\n",
+ expected->dwVersion, got->dwVersion);
+ ok(got->SignerId.dwIdChoice == expected->SignerId.dwIdChoice,
+ "Expected id choice %d, got %d\n", expected->SignerId.dwIdChoice,
+ got->SignerId.dwIdChoice);
+ if (got->SignerId.dwIdChoice == expected->SignerId.dwIdChoice)
+ {
+ if (got->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER)
+ {
+ ok(got->SignerId.IssuerSerialNumber.Issuer.cbData ==
+ expected->SignerId.IssuerSerialNumber.Issuer.cbData,
+ "Expected issuer size %d, got %d\n",
+ expected->SignerId.IssuerSerialNumber.Issuer.cbData,
+ got->SignerId.IssuerSerialNumber.Issuer.cbData);
+ ok(!memcmp(got->SignerId.IssuerSerialNumber.Issuer.pbData,
+ expected->SignerId.IssuerSerialNumber.Issuer.pbData,
+ got->SignerId.IssuerSerialNumber.Issuer.cbData),
+ "Unexpected issuer\n");
+ ok(got->SignerId.IssuerSerialNumber.SerialNumber.cbData ==
+ expected->SignerId.IssuerSerialNumber.SerialNumber.cbData,
+ "Expected serial number size %d, got %d\n",
+ expected->SignerId.IssuerSerialNumber.SerialNumber.cbData,
+ got->SignerId.IssuerSerialNumber.SerialNumber.cbData);
+ ok(!memcmp(got->SignerId.IssuerSerialNumber.SerialNumber.pbData,
+ expected->SignerId.IssuerSerialNumber.SerialNumber.pbData,
+ got->SignerId.IssuerSerialNumber.SerialNumber.cbData),
+ "Unexpected serial number\n");
+ }
+ else
+ {
+ ok(got->SignerId.KeyId.cbData == expected->SignerId.KeyId.cbData,
+ "expected key id size %d, got %d\n",
+ expected->SignerId.KeyId.cbData, got->SignerId.KeyId.cbData);
+ ok(!memcmp(expected->SignerId.KeyId.pbData,
+ got->SignerId.KeyId.pbData, got->SignerId.KeyId.cbData),
+ "unexpected key id\n");
+ }
+ }
+ /* FIXME: check more things */
+}
+
static const BYTE signedWithCertAndCrlComputedHash[] = {
0x08,0xd6,0xc0,0x5a,0x21,0x51,0x2a,0x79,0xa1,0xdf,0xeb,0x9d,0x2a,0x8f,0x26,
0x2f };
+static BYTE keyIdIssuer[] = {
+0x30,0x13,0x31,0x11,0x30,0x0f,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,
+0x0a,0x07,0x01,0x04,0x01,0x01 };
static void test_decode_msg_get_param(void)
{
@@ -2354,6 +2401,32 @@ static void test_decode_msg_get_param(void)
compare_signer_info((CMSG_SIGNER_INFO *)buf, &signer);
CryptMemFree(buf);
}
+ /* Getting the CMS signer info of a PKCS7 message is possible. */
+ size = 0;
+ ret = CryptMsgGetParam(msg, CMSG_CMS_SIGNER_INFO_PARAM, 0, NULL, &size);
+ todo_wine
+ ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
+ if (ret)
+ buf = CryptMemAlloc(size);
+ else
+ buf = NULL;
+ if (buf)
+ {
+ CMSG_CMS_SIGNER_INFO signer = { 0 };
+
+ signer.dwVersion = 1;
+ signer.SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER;
+ signer.SignerId.IssuerSerialNumber.Issuer.cbData =
+ sizeof(encodedCommonName);
+ signer.SignerId.IssuerSerialNumber.Issuer.pbData = encodedCommonName;
+ signer.SignerId.IssuerSerialNumber.SerialNumber.cbData =
+ sizeof(serialNum);
+ signer.SignerId.IssuerSerialNumber.SerialNumber.pbData = serialNum;
+ signer.HashAlgorithm.pszObjId = oid_rsa_md5;
+ CryptMsgGetParam(msg, CMSG_CMS_SIGNER_INFO_PARAM, 0, buf, &size);
+ compare_cms_signer_info((CMSG_CMS_SIGNER_INFO *)buf, &signer);
+ CryptMemFree(buf);
+ }
/* index is ignored when getting signer count */
size = sizeof(value);
ret = CryptMsgGetParam(msg, CMSG_SIGNER_COUNT_PARAM, 1, &value, &size);
@@ -2383,6 +2456,68 @@ static void test_decode_msg_get_param(void)
CMSG_COMPUTED_HASH_PARAM, signedWithCertAndCrlComputedHash,
sizeof(signedWithCertAndCrlComputedHash));
CryptMsgClose(msg);
+
+ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL);
+ ret = CryptMsgUpdate(msg, signedKeyIdEmptyContent,
+ sizeof(signedKeyIdEmptyContent), TRUE);
+ ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError());
+ size = sizeof(value);
+ ret = CryptMsgGetParam(msg, CMSG_SIGNER_COUNT_PARAM, 0, &value, &size);
+ ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
+ ok(value == 1, "Expected 1 signer, got %d\n", value);
+ /* Getting the regular (non-CMS) signer info from a CMS message is also
+ * possible..
+ */
+ size = 0;
+ ret = CryptMsgGetParam(msg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &size);
+ todo_wine
+ ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
+ if (ret)
+ buf = CryptMemAlloc(size);
+ else
+ buf = NULL;
+ if (buf)
+ {
+ CMSG_SIGNER_INFO signer;
+ BYTE zero = 0;
+
+ /* and here's the little oddity: for a CMS message using the key id
+ * variant of a SignerId, retrieving the CMSG_SIGNER_INFO param yields
+ * a signer with a zero (not empty) serial number, and whose issuer is
+ * an RDN with OID szOID_KEYID_RDN, value type CERT_RDN_OCTET_STRING,
+ * and value of the key id.
+ */
+ signer.dwVersion = CMSG_SIGNED_DATA_V3;
+ signer.Issuer.cbData = sizeof(keyIdIssuer);
+ signer.Issuer.pbData = keyIdIssuer;
+ signer.SerialNumber.cbData = 1;
+ signer.SerialNumber.pbData = &zero;
+ CryptMsgGetParam(msg, CMSG_SIGNER_INFO_PARAM, 0, buf, &size);
+ compare_signer_info((CMSG_SIGNER_INFO *)buf, &signer);
+ CryptMemFree(buf);
+ }
+ size = 0;
+ ret = CryptMsgGetParam(msg, CMSG_CMS_SIGNER_INFO_PARAM, 0, NULL, &size);
+ todo_wine
+ ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
+ if (ret)
+ buf = CryptMemAlloc(size);
+ else
+ buf = NULL;
+ if (buf)
+ {
+ CMSG_CMS_SIGNER_INFO signer = { 0 };
+
+ signer.dwVersion = CMSG_SIGNED_DATA_V3;
+ signer.SignerId.dwIdChoice = CERT_ID_KEY_IDENTIFIER;
+ signer.SignerId.KeyId.cbData = sizeof(serialNum);
+ signer.SignerId.KeyId.pbData = (BYTE *)serialNum;
+ signer.HashAlgorithm.pszObjId = oid_rsa_md5;
+ CryptMsgGetParam(msg, CMSG_CMS_SIGNER_INFO_PARAM, 0, buf, &size);
+ compare_cms_signer_info((CMSG_CMS_SIGNER_INFO *)buf, &signer);
+ CryptMemFree(buf);
+ }
+ CryptMsgClose(msg);
}
static void test_decode_msg(void)
More information about the wine-cvs
mailing list