[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