[PATCH 3/5] dssenh: Implement CPDuplicateKey.
Hans Leidekker
hans at codeweavers.com
Mon Oct 12 09:11:10 CDT 2020
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/dssenh/dssenh.spec | 2 +-
dlls/dssenh/main.c | 27 +++++++++++++++++++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/dlls/dssenh/dssenh.spec b/dlls/dssenh/dssenh.spec
index a045a7e04ee..e74650c9bb7 100644
--- a/dlls/dssenh/dssenh.spec
+++ b/dlls/dssenh/dssenh.spec
@@ -5,7 +5,7 @@
@ stdcall CPDestroyHash(ptr ptr)
@ stdcall CPDestroyKey(ptr ptr)
@ stdcall CPDuplicateHash(ptr ptr ptr long ptr)
-@ stub CPDuplicateKey
+@ stdcall CPDuplicateKey(ptr ptr ptr long ptr)
@ stub CPEncrypt
@ stdcall CPExportKey(ptr ptr ptr long long ptr ptr)
@ stdcall CPGenKey(ptr long long ptr)
diff --git a/dlls/dssenh/main.c b/dlls/dssenh/main.c
index d40dedf41b2..38ee325b8ee 100644
--- a/dlls/dssenh/main.c
+++ b/dlls/dssenh/main.c
@@ -471,6 +471,33 @@ BOOL WINAPI CPExportKey( HCRYPTPROV hprov, HCRYPTKEY hkey, HCRYPTKEY hexpkey, DW
return FALSE;
}
+static struct key *duplicate_key( const struct key *key )
+{
+ struct key *ret;
+
+ if (!(ret = create_key( key->algid, key->flags ))) return NULL;
+
+ if (BCryptDuplicateKey( key->handle, &ret->handle, NULL, 0, 0 ))
+ {
+ heap_free( ret );
+ return NULL;
+ }
+ return ret;
+}
+
+BOOL WINAPI CPDuplicateKey( HCRYPTPROV hprov, HCRYPTKEY hkey, DWORD *reserved, DWORD flags, HCRYPTKEY *ret_key )
+{
+ struct key *key = (struct key *)hkey, *ret;
+
+ TRACE( "%p, %p, %p, %08x, %p\n", (void *)hprov, (void *)hkey, reserved, flags, ret_key );
+
+ if (key->magic != MAGIC_KEY) return FALSE;
+
+ if (!(ret = duplicate_key( key ))) return FALSE;
+ *ret_key = (HCRYPTKEY)ret;
+ return TRUE;
+}
+
static struct hash *create_hash( ALG_ID algid )
{
struct hash *ret;
--
2.28.0
More information about the wine-devel
mailing list