Juan Lang : crypt32: Add tests for hash message encoding.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 13 08:30:26 CDT 2007
Module: wine
Branch: master
Commit: 72b8f8325f5df78f350137b7189281ef870edbd8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=72b8f8325f5df78f350137b7189281ef870edbd8
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Jul 12 14:51:40 2007 -0700
crypt32: Add tests for hash message encoding.
---
dlls/crypt32/tests/msg.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 128 insertions(+), 0 deletions(-)
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 1205a02..03028e4 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -834,11 +834,139 @@ static void test_hash_msg_get_param(void)
CryptMsgClose(msg);
}
+static const BYTE hashEmptyBareContent[] = {
+0x30,0x17,0x02,0x01,0x00,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,
+0x02,0x05,0x05,0x00,0x30,0x02,0x06,0x00,0x04,0x00 };
+static const BYTE hashEmptyContent[] = {
+0x30,0x26,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x05,0xa0,0x19,
+0x30,0x17,0x02,0x01,0x00,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,
+0x02,0x05,0x05,0x00,0x30,0x02,0x06,0x00,0x04,0x00 };
+static const BYTE hashBareContent[] = {
+0x30,0x38,0x02,0x01,0x00,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,
+0x02,0x05,0x05,0x00,0x30,0x13,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,
+0x07,0x01,0xa0,0x06,0x04,0x04,0x01,0x02,0x03,0x04,0x04,0x10,0x08,0xd6,0xc0,
+0x5a,0x21,0x51,0x2a,0x79,0xa1,0xdf,0xeb,0x9d,0x2a,0x8f,0x26,0x2f };
+static const BYTE hashContent[] = {
+0x30,0x47,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x05,0xa0,0x3a,
+0x30,0x38,0x02,0x01,0x00,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,
+0x02,0x05,0x05,0x00,0x30,0x13,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,
+0x07,0x01,0xa0,0x06,0x04,0x04,0x01,0x02,0x03,0x04,0x04,0x10,0x08,0xd6,0xc0,
+0x5a,0x21,0x51,0x2a,0x79,0xa1,0xdf,0xeb,0x9d,0x2a,0x8f,0x26,0x2f };
+
+static const BYTE detachedHashBareContent[] = {
+0x30,0x30,0x02,0x01,0x00,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,
+0x02,0x05,0x05,0x00,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,
+0x07,0x01,0x04,0x10,0x08,0xd6,0xc0,0x5a,0x21,0x51,0x2a,0x79,0xa1,0xdf,0xeb,
+0x9d,0x2a,0x8f,0x26,0x2f };
+static const BYTE detachedHashContent[] = {
+0x30,0x3f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x05,0xa0,0x32,
+0x30,0x30,0x02,0x01,0x00,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,
+0x02,0x05,0x05,0x00,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,
+0x07,0x01,0x04,0x10,0x08,0xd6,0xc0,0x5a,0x21,0x51,0x2a,0x79,0xa1,0xdf,0xeb,
+0x9d,0x2a,0x8f,0x26,0x2f };
+
+static void test_hash_msg_encoding(void)
+{
+ HCRYPTMSG msg;
+ CMSG_HASHED_ENCODE_INFO hashInfo = { sizeof(hashInfo), 0 };
+ BOOL ret;
+ struct update_accum accum = { 0, NULL }, empty_accum = { 0, NULL };
+ CMSG_STREAM_INFO streamInfo = { 0, accumulating_stream_output, &accum };
+ static char oid_rsa_md5[] = szOID_RSA_MD5;
+
+ hashInfo.HashAlgorithm.pszObjId = oid_rsa_md5;
+ msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, &hashInfo,
+ NULL, NULL);
+ todo_wine {
+ check_param("hash empty bare content", msg, CMSG_BARE_CONTENT_PARAM,
+ hashEmptyBareContent, sizeof(hashEmptyBareContent));
+ check_param("hash empty content", msg, CMSG_CONTENT_PARAM,
+ hashEmptyContent, sizeof(hashEmptyContent));
+ }
+ ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
+ ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
+ todo_wine {
+ check_param("hash bare content", msg, CMSG_BARE_CONTENT_PARAM,
+ hashBareContent, sizeof(hashBareContent));
+ check_param("hash content", msg, CMSG_CONTENT_PARAM,
+ hashContent, sizeof(hashContent));
+ }
+ CryptMsgClose(msg);
+ /* Same test, but with CMSG_BARE_CONTENT_FLAG set */
+ msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_BARE_CONTENT_FLAG,
+ CMSG_HASHED, &hashInfo, NULL, NULL);
+ todo_wine {
+ check_param("hash empty bare content", msg, CMSG_BARE_CONTENT_PARAM,
+ hashEmptyBareContent, sizeof(hashEmptyBareContent));
+ check_param("hash empty content", msg, CMSG_CONTENT_PARAM,
+ hashEmptyContent, sizeof(hashEmptyContent));
+ }
+ ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
+ ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
+ todo_wine {
+ check_param("hash bare content", msg, CMSG_BARE_CONTENT_PARAM,
+ hashBareContent, sizeof(hashBareContent));
+ check_param("hash content", msg, CMSG_CONTENT_PARAM,
+ hashContent, sizeof(hashContent));
+ }
+ CryptMsgClose(msg);
+ /* Same test, but with CMSG_DETACHED_FLAG set */
+ msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG,
+ CMSG_HASHED, &hashInfo, NULL, NULL);
+ todo_wine {
+ check_param("detached hash empty bare content", msg,
+ CMSG_BARE_CONTENT_PARAM, hashEmptyBareContent,
+ sizeof(hashEmptyBareContent));
+ check_param("detached hash empty content", msg, CMSG_CONTENT_PARAM,
+ hashEmptyContent, sizeof(hashEmptyContent));
+ }
+ ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
+ ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
+ todo_wine {
+ check_param("detached hash bare content", msg, CMSG_BARE_CONTENT_PARAM,
+ detachedHashBareContent, sizeof(detachedHashBareContent));
+ check_param("detached hash content", msg, CMSG_CONTENT_PARAM,
+ detachedHashContent, sizeof(detachedHashContent));
+ }
+ CryptMsgClose(msg);
+ /* In what appears to be a bug, streamed updates to hash messages don't
+ * call the output function.
+ */
+ msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, &hashInfo,
+ NULL, &streamInfo);
+ ret = CryptMsgUpdate(msg, NULL, 0, FALSE);
+ ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
+ ret = CryptMsgUpdate(msg, NULL, 0, TRUE);
+ ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
+ CryptMsgClose(msg);
+ check_updates("empty hash message", &empty_accum, &accum);
+ free_updates(&accum);
+
+ streamInfo.cbContent = sizeof(msgData);
+ msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, &hashInfo,
+ NULL, &streamInfo);
+ ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
+ ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
+ CryptMsgClose(msg);
+ check_updates("hash message", &empty_accum, &accum);
+ free_updates(&accum);
+
+ streamInfo.cbContent = sizeof(msgData);
+ msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG,
+ CMSG_HASHED, &hashInfo, NULL, &streamInfo);
+ ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
+ ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
+ CryptMsgClose(msg);
+ check_updates("detached hash message", &empty_accum, &accum);
+ free_updates(&accum);
+}
+
static void test_hash_msg(void)
{
test_hash_msg_open();
test_hash_msg_update();
test_hash_msg_get_param();
+ test_hash_msg_encoding();
}
static CRYPT_DATA_BLOB b4 = { 0, NULL };
More information about the wine-cvs
mailing list