From 72b8f8325f5df78f350137b7189281ef870edbd8 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 12 Jul 2007 14:51:40 -0700 Subject: [PATCH] crypt32: Add tests for hash message encoding. --- dlls/crypt32/tests/msg.c | 128 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c index 1205a02680c..03028e4bdd3 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 };