crypt32(3/8): Test and implement CryptGetMessageSignerCount

Juan Lang juan.lang at gmail.com
Tue Aug 21 17:19:56 CDT 2007


--Juan
-------------- next part --------------
From 2fce74f33bdb5bc3321f747e66119a9ae36da540 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Tue, 21 Aug 2007 15:12:35 -0700
Subject: [PATCH] Test and implement CryptGetMessageSignerCount
---
 dlls/crypt32/crypt32.spec |    2 +-
 dlls/crypt32/msg.c        |   22 ++++++++++++++++++++++
 dlls/crypt32/tests/msg.c  |   40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec
index 12e1223..7403ca2 100644
--- a/dlls/crypt32/crypt32.spec
+++ b/dlls/crypt32/crypt32.spec
@@ -123,7 +123,7 @@
 @ stdcall CryptGetDefaultOIDDllList(long long ptr ptr)
 @ stdcall CryptGetDefaultOIDFunctionAddress(long long wstr long ptr ptr)
 @ stdcall CryptGetMessageCertificates(long ptr long ptr long)
-@ stub CryptGetMessageSignerCount
+@ stdcall CryptGetMessageSignerCount(long ptr long)
 @ stdcall CryptGetOIDFunctionAddress(long long str long ptr ptr)
 @ stdcall CryptGetOIDFunctionValue(long str str wstr ptr ptr ptr)
 @ stdcall CryptHashCertificate(long long long ptr long ptr ptr)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 97c6b4e..4c2c617 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -2286,3 +2286,25 @@ HCERTSTORE WINAPI CryptGetMessageCertifi
     return CertOpenStore(CERT_STORE_PROV_PKCS7, dwMsgAndCertEncodingType,
      hCryptProv, dwFlags, &blob);
 }
+
+LONG WINAPI CryptGetMessageSignerCount(DWORD dwMsgEncodingType,
+ const BYTE *pbSignedBlob, DWORD cbSignedBlob)
+{
+    HCRYPTMSG msg;
+    LONG count = -1;
+
+    TRACE("(%08x, %p, %d)\n", dwMsgEncodingType, pbSignedBlob, cbSignedBlob);
+
+    msg = CryptMsgOpenToDecode(dwMsgEncodingType, 0, 0, 0, NULL, NULL);
+    if (msg)
+    {
+        if (CryptMsgUpdate(msg, pbSignedBlob, cbSignedBlob, TRUE))
+        {
+            DWORD size = sizeof(count);
+
+            CryptMsgGetParam(msg, CMSG_SIGNER_COUNT_PARAM, 0, &count, &size);
+        }
+        CryptMsgClose(msg);
+    }
+    return count;
+}
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index b1e6c94..860058d 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -2347,6 +2347,43 @@ static void test_msg_control(void)
     /* FIXME: need to test with a message with a valid signature and signer */
 }
 
+static void test_msg_get_signer_count(void)
+{
+    LONG count;
+
+    SetLastError(0xdeadbeef);
+    count = CryptGetMessageSignerCount(0, NULL, 0);
+    ok(count == -1, "Expected -1, got %d\n", count);
+    ok(GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n",
+     GetLastError());
+    SetLastError(0xdeadbeef);
+    count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, NULL, 0);
+    ok(count == -1, "Expected -1, got %d\n", count);
+    ok(GetLastError() == CRYPT_E_ASN1_EOD,
+     "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
+    SetLastError(0xdeadbeef);
+    count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
+     dataEmptyBareContent, sizeof(dataEmptyBareContent));
+    ok(count == -1, "Expected -1, got %d\n", count);
+    ok(GetLastError() == CRYPT_E_ASN1_BADTAG,
+     "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
+    SetLastError(0xdeadbeef);
+    count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
+     dataEmptyContent, sizeof(dataEmptyContent));
+    ok(count == -1, "Expected -1, got %d\n", count);
+    ok(GetLastError() == CRYPT_E_INVALID_MSG_TYPE,
+     "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError());
+    SetLastError(0xdeadbeef);
+    count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
+     signedEmptyBareContent, sizeof(signedEmptyBareContent));
+    ok(count == -1, "Expected -1, got %d\n", count);
+    ok(GetLastError() == CRYPT_E_ASN1_BADTAG,
+     "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
+    count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING,
+     signedEmptyContent, sizeof(signedEmptyContent));
+    ok(count == 1, "Expected 1, got %d\n", count);
+}
+
 START_TEST(msg)
 {
      init_function_pointers();
@@ -2363,4 +2400,7 @@ START_TEST(msg)
     test_hash_msg();
     test_signed_msg();
     test_decode_msg();
+
+    /* simplified message functions */
+    test_msg_get_signer_count();
 }
-- 
1.4.1


More information about the wine-patches mailing list