Hans Leidekker : dssenh: Implement CPGetUserKey.
Alexandre Julliard
julliard at winehq.org
Mon Oct 19 15:54:05 CDT 2020
Module: wine
Branch: master
Commit: 248d27ea2d47d26f9c328adaa8d94fec026d2476
URL: https://source.winehq.org/git/wine.git/?a=commit;h=248d27ea2d47d26f9c328adaa8d94fec026d2476
Author: Hans Leidekker <hans at codeweavers.com>
Date: Mon Oct 19 11:24:13 2020 +0200
dssenh: Implement CPGetUserKey.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dssenh/dssenh.spec | 2 +-
dlls/dssenh/main.c | 29 +++++++++++++++++++++++++++++
dlls/dssenh/tests/dssenh.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/dlls/dssenh/dssenh.spec b/dlls/dssenh/dssenh.spec
index eb9ef06337a..473bd08205f 100644
--- a/dlls/dssenh/dssenh.spec
+++ b/dlls/dssenh/dssenh.spec
@@ -13,7 +13,7 @@
@ stdcall CPGetHashParam(ptr ptr long ptr ptr long)
@ stub CPGetKeyParam
@ stdcall CPGetProvParam(ptr long ptr ptr long)
-@ stub CPGetUserKey
+@ stdcall CPGetUserKey(ptr long ptr)
@ stdcall CPHashData(ptr ptr ptr long long)
@ stub CPHashSessionKey
@ stdcall CPImportKey(ptr ptr long ptr long ptr)
diff --git a/dlls/dssenh/main.c b/dlls/dssenh/main.c
index 4867fef2f59..2d9569672a5 100644
--- a/dlls/dssenh/main.c
+++ b/dlls/dssenh/main.c
@@ -615,6 +615,35 @@ BOOL WINAPI CPDuplicateKey( HCRYPTPROV hprov, HCRYPTKEY hkey, DWORD *reserved, D
return TRUE;
}
+BOOL WINAPI CPGetUserKey( HCRYPTPROV hprov, DWORD keyspec, HCRYPTKEY *ret_key )
+{
+ struct container *container = (struct container *)hprov;
+ BOOL ret = FALSE;
+
+ TRACE( "%p, %08x, %p\n", (void *)hprov, keyspec, ret_key );
+
+ if (container->magic != MAGIC_CONTAINER) return FALSE;
+
+ switch (keyspec)
+ {
+ case AT_KEYEXCHANGE:
+ if (!container->exch_key) SetLastError( NTE_NO_KEY );
+ else if ((*ret_key = (HCRYPTKEY)duplicate_key( container->exch_key ))) ret = TRUE;
+ break;
+
+ case AT_SIGNATURE:
+ if (!container->sign_key) SetLastError( NTE_NO_KEY );
+ else if ((*ret_key = (HCRYPTKEY)duplicate_key( container->sign_key ))) ret = TRUE;
+ break;
+
+ default:
+ SetLastError( NTE_NO_KEY );
+ return FALSE;
+ }
+
+ return ret;
+}
+
BOOL WINAPI CPGenRandom( HCRYPTPROV hprov, DWORD len, BYTE *buffer )
{
struct container *container = (struct container *)hprov;
diff --git a/dlls/dssenh/tests/dssenh.c b/dlls/dssenh/tests/dssenh.c
index 4f401254f52..d3f3172230e 100644
--- a/dlls/dssenh/tests/dssenh.c
+++ b/dlls/dssenh/tests/dssenh.c
@@ -1470,6 +1470,50 @@ static void test_duplicate_hash(void)
ok(result, "got %08x\n", GetLastError());
}
+static void test_userkey(void)
+{
+ HCRYPTPROV hprov;
+ HCRYPTKEY hkey;
+ BOOL result;
+
+ CryptAcquireContextA(&hprov, "winetest", MS_ENH_DSS_DH_PROV_A, PROV_DSS_DH, CRYPT_DELETEKEYSET);
+ result = CryptAcquireContextA(&hprov, "winetest", MS_ENH_DSS_DH_PROV_A, PROV_DSS_DH, CRYPT_NEWKEYSET);
+ ok(result, "got %08x\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ result = CryptGetUserKey(hprov, AT_KEYEXCHANGE, &hkey);
+ ok(!result, "success\n");
+ ok(GetLastError() == NTE_NO_KEY, "got %08x\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ result = CryptGetUserKey(hprov, AT_SIGNATURE, &hkey);
+ ok(!result, "success\n");
+ ok(GetLastError() == NTE_NO_KEY, "got %08x\n", GetLastError());
+
+ result = CryptGenKey(hprov, AT_SIGNATURE, 1024 << 16, &hkey);
+ ok(result, "got %08x\n", GetLastError());
+ result = CryptDestroyKey(hkey);
+ ok(result, "got %08x\n", GetLastError());
+
+ result = CryptGetUserKey(hprov, AT_SIGNATURE, &hkey);
+ ok(result, "got %08x\n", GetLastError());
+ result = CryptDestroyKey(hkey);
+ ok(result, "got %08x\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ result = CryptGetUserKey(hprov, AT_KEYEXCHANGE, &hkey);
+ ok(!result, "success\n");
+ ok(GetLastError() == NTE_NO_KEY, "got %08x\n", GetLastError());
+
+ result = CryptReleaseContext(hprov, 0);
+ ok(result, "got %08x\n", GetLastError());
+
+ hprov = 0xdeadbeef;
+ result = CryptAcquireContextA(&hprov, "winetest", MS_ENH_DSS_DH_PROV_A, PROV_DSS_DH, CRYPT_DELETEKEYSET);
+ ok(result, "got %08x\n", GetLastError());
+ ok(!hprov, "got %08x\n", (DWORD)hprov);
+}
+
START_TEST(dssenh)
{
test_acquire_context();
@@ -1480,4 +1524,5 @@ START_TEST(dssenh)
test_verify_signature();
test_key_exchange();
test_duplicate_hash();
+ test_userkey();
}
More information about the wine-cvs
mailing list