[PATCH 09/16] ncrypt: Implement NCrypt{Export, Import}Key

abdaandroid at gmail.com abdaandroid at gmail.com
Sun Oct 11 10:45:28 CDT 2020


From: Ariel Darshan <abdaandroid at gmail.com>

Signed-off-by: Ariel Darshan <abdaandroid at gmail.com>
---
 dlls/ncrypt/main.c      | 54 +++++++++++++++++++++++++++++++++++++++--
 dlls/ncrypt/ncrypt.spec |  2 +-
 include/ncrypt.h        |  2 ++
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c
index 606cd1b8401..a183eb00bb3 100644
--- a/dlls/ncrypt/main.c
+++ b/dlls/ncrypt/main.c
@@ -317,6 +317,32 @@ cleanup:
     return ret;
 }
 
+SECURITY_STATUS WINAPI NCryptExportKey(NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_HANDLE enc_key, const WCHAR *blobType,
+                                       NCryptBufferDesc *parameterList, PBYTE output, DWORD outsize, DWORD *result, DWORD flags)
+{
+    struct ncrypt_provider_instance *providerInstance;
+    struct ncrypt_key_instance *encryptKeyInstance;
+    NCRYPT_KEY_HANDLE kspEncryptKeyHandle;
+
+    TRACE("(0x%lx, 0x%lx, %s, %p, %p, 0x%08x, %p, 0x%08x)\n", provider, enc_key, wine_dbgstr_w(blobType),
+                                                                parameterList, output, outsize, result, flags);
+
+    if (!provider)
+    {
+        return NTE_INVALID_HANDLE;
+    }
+    providerInstance = handle2provider(provider);
+
+    kspEncryptKeyHandle = 0;
+    if (enc_key)
+    {
+        encryptKeyInstance = handle2key(enc_key);
+        kspEncryptKeyHandle = encryptKeyInstance->kspHandle;
+    }
+
+    return providerInstance->functions.ExportKey(providerInstance->kspHandle, kspEncryptKeyHandle, blobType, parameterList, output, outsize, result, flags);
+}
+
 SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE key, DWORD flags)
 {
     FIXME("(0x%lx, 0x%08x): stub\n", key, flags);
@@ -368,10 +394,34 @@ SECURITY_STATUS WINAPI NCryptImportKey(NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_H
                                        const WCHAR *type, NCryptBufferDesc *params, NCRYPT_KEY_HANDLE *key,
                                        PBYTE data, DWORD datasize, DWORD flags)
 {
-    FIXME("(0x%lx, 0x%lx, %s, %p, %p, %p, %u, 0x%08x): stub\n", provider, decrypt_key,
+    struct ncrypt_provider_instance *providerInstance;
+    struct ncrypt_key_instance *decryptKeyInstance;
+    struct ncrypt_key_instance *outKeyInstance;
+    NCRYPT_KEY_HANDLE kspDecryptKeyHandle;
+
+    TRACE("(0x%lx, 0x%lx, %s, %p, %p, %p, %u, 0x%08x)\n", provider, decrypt_key,
                                                                 wine_dbgstr_w(type), params,
                                                                 key, data, datasize, flags);
-    return NTE_NOT_SUPPORTED;
+    if (!provider)
+    {
+        return NTE_INVALID_HANDLE;
+    }
+    providerInstance = handle2provider(provider);
+
+    kspDecryptKeyHandle = 0;
+    if (decrypt_key)
+    {
+        decryptKeyInstance = handle2key(decrypt_key);
+        kspDecryptKeyHandle = decryptKeyInstance->kspHandle;
+    }
+
+    outKeyInstance = create_key(provider, NULL);
+    if (!outKeyInstance)
+    {
+        return NTE_NO_MEMORY;
+    }
+    *key = (NCRYPT_KEY_HANDLE)outKeyInstance;
+    return providerInstance->functions.ImportKey(providerInstance->kspHandle, kspDecryptKeyHandle, type, params, &outKeyInstance->kspHandle, data, datasize, flags);
 }
 
 SECURITY_STATUS WINAPI NCryptIsAlgSupported(NCRYPT_PROV_HANDLE provider, const WCHAR *algid,
diff --git a/dlls/ncrypt/ncrypt.spec b/dlls/ncrypt/ncrypt.spec
index b13354e4bef..3a47f12cfa1 100644
--- a/dlls/ncrypt/ncrypt.spec
+++ b/dlls/ncrypt/ncrypt.spec
@@ -70,7 +70,7 @@
 @ stdcall NCryptEnumAlgorithms(long long ptr ptr long)
 @ stdcall NCryptEnumKeys(long wstr ptr ptr long)
 @ stdcall NCryptEnumStorageProviders(ptr ptr long)
-@ stub NCryptExportKey
+@ stdcall NCryptExportKey(long long ptr ptr ptr long ptr long)
 @ stdcall NCryptFinalizeKey(long long)
 @ stdcall NCryptFreeBuffer(ptr)
 @ stdcall NCryptFreeObject(long)
diff --git a/include/ncrypt.h b/include/ncrypt.h
index 2906d47b023..3edc069352f 100644
--- a/include/ncrypt.h
+++ b/include/ncrypt.h
@@ -81,9 +81,11 @@ SECURITY_STATUS WINAPI NCryptEncrypt(NCRYPT_KEY_HANDLE, BYTE *, DWORD, void *, B
 SECURITY_STATUS WINAPI NCryptEnumAlgorithms(NCRYPT_PROV_HANDLE, DWORD, DWORD *, NCryptAlgorithmName **, DWORD);
 SECURITY_STATUS WINAPI NCryptEnumKeys(NCRYPT_PROV_HANDLE, const WCHAR *, NCryptKeyName **, PVOID *, DWORD);
 SECURITY_STATUS WINAPI NCryptEnumStorageProviders(DWORD *, NCryptProviderName **, DWORD);
+SECURITY_STATUS WINAPI NCryptExportKey(NCRYPT_PROV_HANDLE, NCRYPT_KEY_HANDLE, const WCHAR *, NCryptBufferDesc *, PBYTE, DWORD, DWORD *, DWORD);
 SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE, DWORD);
 SECURITY_STATUS WINAPI NCryptFreeBuffer(PVOID);
 SECURITY_STATUS WINAPI NCryptFreeObject(NCRYPT_HANDLE);
+SECURITY_STATUS WINAPI NCryptImportKey(NCRYPT_PROV_HANDLE, NCRYPT_KEY_HANDLE, const WCHAR *, NCryptBufferDesc *, NCRYPT_KEY_HANDLE *, PBYTE, DWORD, DWORD);
 BOOL WINAPI NCryptIsKeyHandle(NCRYPT_HANDLE);
 SECURITY_STATUS WINAPI NCryptOpenKey(NCRYPT_PROV_HANDLE, NCRYPT_KEY_HANDLE *, const WCHAR *, DWORD, DWORD);
 SECURITY_STATUS WINAPI NCryptOpenStorageProvider(NCRYPT_PROV_HANDLE *, const WCHAR *, DWORD);
-- 
2.28.0




More information about the wine-devel mailing list