Module: wine Branch: master Commit: e52c80e53b67d00750537dc87238f0e6d51ed281 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e52c80e53b67d00750537dc872...
Author: Juan Lang juan.lang@gmail.com Date: Tue Aug 21 15:12:35 2007 -0700
crypt32: 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 CryptGetMessageCertificates(DWORD dwMsgAndCertEncodingType, 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(); }