dssenh: Implement CPGetUserKey.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
320b9eb474
commit
248d27ea2d
|
@ -13,7 +13,7 @@
|
||||||
@ stdcall CPGetHashParam(ptr ptr long ptr ptr long)
|
@ stdcall CPGetHashParam(ptr ptr long ptr ptr long)
|
||||||
@ stub CPGetKeyParam
|
@ stub CPGetKeyParam
|
||||||
@ stdcall CPGetProvParam(ptr long ptr ptr long)
|
@ stdcall CPGetProvParam(ptr long ptr ptr long)
|
||||||
@ stub CPGetUserKey
|
@ stdcall CPGetUserKey(ptr long ptr)
|
||||||
@ stdcall CPHashData(ptr ptr ptr long long)
|
@ stdcall CPHashData(ptr ptr ptr long long)
|
||||||
@ stub CPHashSessionKey
|
@ stub CPHashSessionKey
|
||||||
@ stdcall CPImportKey(ptr ptr long ptr long ptr)
|
@ stdcall CPImportKey(ptr ptr long ptr long ptr)
|
||||||
|
|
|
@ -615,6 +615,35 @@ BOOL WINAPI CPDuplicateKey( HCRYPTPROV hprov, HCRYPTKEY hkey, DWORD *reserved, D
|
||||||
return TRUE;
|
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 )
|
BOOL WINAPI CPGenRandom( HCRYPTPROV hprov, DWORD len, BYTE *buffer )
|
||||||
{
|
{
|
||||||
struct container *container = (struct container *)hprov;
|
struct container *container = (struct container *)hprov;
|
||||||
|
|
|
@ -1470,6 +1470,50 @@ static void test_duplicate_hash(void)
|
||||||
ok(result, "got %08x\n", GetLastError());
|
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)
|
START_TEST(dssenh)
|
||||||
{
|
{
|
||||||
test_acquire_context();
|
test_acquire_context();
|
||||||
|
@ -1480,4 +1524,5 @@ START_TEST(dssenh)
|
||||||
test_verify_signature();
|
test_verify_signature();
|
||||||
test_key_exchange();
|
test_key_exchange();
|
||||||
test_duplicate_hash();
|
test_duplicate_hash();
|
||||||
|
test_userkey();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue