crypt32(2/21): Add tests for CryptMsgControl

Juan Lang juan.lang at gmail.com
Tue Aug 21 09:20:55 CDT 2007


--Juan
-------------- next part --------------
From 522946763aaef4dffab839d9f0bd363f0c14beec Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Mon, 20 Aug 2007 17:26:39 -0700
Subject: [PATCH] Add tests for CryptMsgControl
---
 dlls/crypt32/tests/msg.c |  248 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 248 insertions(+), 0 deletions(-)

diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 471cc17..66b4eca 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -2098,6 +2098,253 @@ static void test_decode_msg(void)
     test_decode_msg_get_param();
 }
 
+static BYTE aKey[] = { 0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf };
+/* aKey encoded as a X509_PUBLIC_KEY_INFO */
+static BYTE encodedPubKey[] = {
+0x30,0x1f,0x30,0x0a,0x06,0x06,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x05,0x00,0x03,
+0x11,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,
+0x0d,0x0e,0x0f };
+/* a weird modulus encoded as RSA_CSP_PUBLICKEYBLOB */
+static BYTE mod_encoded[] = {
+ 0x30,0x10,0x02,0x09,0x00,0x80,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x02,0x03,
+ 0x01,0x00,0x01 };
+
+static void test_msg_control(void)
+{
+    static char oid_rsa_rsa[] = szOID_RSA_RSA;
+    BOOL ret;
+    HCRYPTMSG msg;
+    DWORD i;
+    CERT_INFO certInfo = { 0 };
+    CMSG_HASHED_ENCODE_INFO hashInfo = { 0 };
+    CMSG_SIGNED_ENCODE_INFO signInfo = { sizeof(signInfo), 0 };
+    CMSG_CTRL_DECRYPT_PARA decryptPara = { sizeof(decryptPara), 0 };
+
+    /* Crashes
+    ret = CryptMsgControl(NULL, 0, 0, NULL);
+    */
+
+    /* Data encode messages don't allow any sort of control.. */
+    msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, NULL, NULL,
+     NULL);
+    /* either with no prior update.. */
+    for (i = 1; i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO; i++)
+    {
+        SetLastError(0xdeadbeef);
+        ret = CryptMsgControl(msg, 0, i, NULL);
+        todo_wine
+        ok(!ret && GetLastError() == E_INVALIDARG,
+         "Expected E_INVALIDARG, got %08x\n", GetLastError());
+    }
+    /* or after an update. */
+    for (i = 1; i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO; i++)
+    {
+        SetLastError(0xdeadbeef);
+        ret = CryptMsgControl(msg, 0, i, NULL);
+        todo_wine
+        ok(!ret && GetLastError() == E_INVALIDARG,
+         "Expected E_INVALIDARG, got %08x\n", GetLastError());
+    }
+    CryptMsgClose(msg);
+
+    /* Hash encode messages don't allow any sort of control.. */
+    hashInfo.cbSize = sizeof(hashInfo);
+    hashInfo.HashAlgorithm.pszObjId = oid_rsa_md5;
+    msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, &hashInfo,
+     NULL, NULL);
+    /* either with no prior update.. */
+    for (i = 1; i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO; i++)
+    {
+        SetLastError(0xdeadbeef);
+        ret = CryptMsgControl(msg, 0, i, NULL);
+        todo_wine
+        ok(!ret && GetLastError() == E_INVALIDARG,
+         "Expected E_INVALIDARG, got %08x\n", GetLastError());
+    }
+    ret = CryptMsgUpdate(msg, NULL, 0, TRUE);
+    /* or after an update. */
+    for (i = 1; i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO; i++)
+    {
+        SetLastError(0xdeadbeef);
+        ret = CryptMsgControl(msg, 0, i, NULL);
+        todo_wine
+        ok(!ret && GetLastError() == E_INVALIDARG,
+         "Expected E_INVALIDARG, got %08x\n", GetLastError());
+    }
+    CryptMsgClose(msg);
+
+    /* Signed encode messages likewise don't allow any sort of control.. */
+    signInfo.cbSize = sizeof(signInfo);
+    msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
+     NULL, NULL);
+    /* either before an update.. */
+    for (i = 1; i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO; i++)
+    {
+        SetLastError(0xdeadbeef);
+        ret = CryptMsgControl(msg, 0, i, NULL);
+        todo_wine
+        ok(!ret && GetLastError() == E_INVALIDARG,
+         "Expected E_INVALIDARG, got %08x\n", GetLastError());
+    }
+    ret = CryptMsgUpdate(msg, NULL, 0, TRUE);
+    /* or after an update. */
+    for (i = 1; i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO; i++)
+    {
+        SetLastError(0xdeadbeef);
+        ret = CryptMsgControl(msg, 0, i, NULL);
+        todo_wine
+        ok(!ret && GetLastError() == E_INVALIDARG,
+         "Expected E_INVALIDARG, got %08x\n", GetLastError());
+    }
+    CryptMsgClose(msg);
+
+    /* Decode messages behave a bit differently. */
+    msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL);
+    /* Bad control type */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, 0, NULL);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_CONTROL_TYPE,
+     "Expected CRYPT_E_CONTROL_TYPE, got %08x\n", GetLastError());
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 1, 0, NULL);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_CONTROL_TYPE,
+     "Expected CRYPT_E_CONTROL_TYPE, got %08x\n", GetLastError());
+    /* Can't verify the hash of an indeterminate-type message */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
+     "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError());
+    /* Crashes
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, NULL);
+     */
+    /* Can't decrypt an indeterminate-type message */
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
+     "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError());
+    CryptMsgClose(msg);
+
+    msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL,
+     NULL);
+    /* Can't verify the hash of an empty message */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL);
+    todo_wine
+    ok(!ret && GetLastError() == STATUS_ACCESS_VIOLATION,
+     "Expected STATUS_ACCESS_VIOLATION, got %08x\n", GetLastError());
+    /* Crashes
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, NULL);
+     */
+    /* Can't verify the signature of a hash message */
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
+     "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError());
+    CryptMsgUpdate(msg, hashEmptyBareContent, sizeof(hashEmptyBareContent),
+     TRUE);
+    /* Oddly enough, this fails */
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL);
+    todo_wine
+    ok(!ret, "Expected failure\n");
+    CryptMsgClose(msg);
+    msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL,
+     NULL);
+    CryptMsgUpdate(msg, hashBareContent, sizeof(hashBareContent), TRUE);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL);
+    ok(ret, "CryptMsgControl failed: %08x\n", GetLastError());
+    /* Can't decrypt an indeterminate-type message */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
+     "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError());
+    CryptMsgClose(msg);
+
+    msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, 0, NULL,
+     NULL);
+    /* Can't verify the hash of a signed message */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
+     "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError());
+    /* Can't decrypt a signed message */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
+     "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError());
+    /* Crash
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, NULL);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+     */
+    CryptMsgUpdate(msg, signedWithCertBareContent,
+     sizeof(signedWithCertBareContent), TRUE);
+    /* With an empty cert info, the signer can't be found in the message (and
+     * the signature can't be verified.
+     */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_SIGNER_NOT_FOUND,
+     "Expected CRYPT_E_SIGNER_NOT_FOUND, got %08x\n", GetLastError());
+    /* The cert info is expected to have an issuer, serial number, and public
+     * key info set.
+     */
+    certInfo.SerialNumber.cbData = sizeof(serialNum);
+    certInfo.SerialNumber.pbData = serialNum;
+    certInfo.Issuer.cbData = sizeof(encodedCommonName);
+    certInfo.Issuer.pbData = encodedCommonName;
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
+     "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
+    CryptMsgClose(msg);
+    /* This cert has a public key, but it's not in a usable form */
+    msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, 0, NULL,
+     NULL);
+    CryptMsgUpdate(msg, signedWithCertWithPubKeyBareContent,
+     sizeof(signedWithCertWithPubKeyBareContent), TRUE);
+    /* Again, cert info needs to have a public key set */
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
+     "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
+    /* The public key is supposed to be in encoded form.. */
+    certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = oid_rsa_rsa;
+    certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(aKey);
+    certInfo.SubjectPublicKeyInfo.PublicKey.pbData = aKey;
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
+     "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
+    /* but not as a X509_PUBLIC_KEY_INFO.. */
+    certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = NULL;
+    certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(encodedPubKey);
+    certInfo.SubjectPublicKeyInfo.PublicKey.pbData = encodedPubKey;
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
+     "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
+    /* This decodes successfully, but it doesn't match any key in the message */
+    certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(mod_encoded);
+    certInfo.SubjectPublicKeyInfo.PublicKey.pbData = mod_encoded;
+    SetLastError(0xdeadbeef);
+    ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo);
+    todo_wine
+    ok(!ret && GetLastError() == NTE_BAD_SIGNATURE,
+     "Expected NTE_BAD_SIGNATURE, got %08x\n", GetLastError());
+    CryptMsgClose(msg);
+    /* FIXME: need to test with a message with a valid signature and signer */
+}
+
 START_TEST(msg)
 {
      init_function_pointers();
@@ -2107,6 +2354,7 @@ START_TEST(msg)
     test_msg_open_to_decode();
     test_msg_get_param();
     test_msg_close();
+    test_msg_control();
 
     /* Message-type specific tests */
     test_data_msg();
-- 
1.4.1


More information about the wine-patches mailing list