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