Module: wine Branch: master Commit: 07f9952a2450c7d203a0b1a5c6e501cd870867ed URL: https://gitlab.winehq.org/wine/wine/-/commit/07f9952a2450c7d203a0b1a5c6e501c...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Nov 23 18:49:20 2022 +0100
ncrypt: Implement NCryptExportKey().
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53966
---
dlls/ncrypt/main.c | 27 +++++++++++++++++++++++++++ dlls/ncrypt/ncrypt.spec | 2 +- include/ncrypt.h | 5 ++++- 3 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c index 89fbfcb795a..6f79985108d 100644 --- a/dlls/ncrypt/main.c +++ b/dlls/ncrypt/main.c @@ -413,6 +413,33 @@ SECURITY_STATUS WINAPI NCryptImportKey(NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_H return ERROR_SUCCESS; }
+SECURITY_STATUS WINAPI NCryptExportKey(NCRYPT_KEY_HANDLE key, NCRYPT_KEY_HANDLE encrypt_key, const WCHAR *type, + NCryptBufferDesc *params, BYTE *output, DWORD output_len, DWORD *ret_len, + DWORD flags) +{ + struct object *object = (struct object *)key; + + TRACE("(%#Ix, %#Ix, %s, %p, %p, %lu, %p, %#lx)\n", key, encrypt_key, wine_dbgstr_w(type), params, output, + output_len, ret_len, flags); + + if (encrypt_key) + { + FIXME("Key blob encryption not implemented\n"); + return NTE_NOT_SUPPORTED; + } + if (params) + { + FIXME("Parameter information not implemented\n"); + return NTE_NOT_SUPPORTED; + } + if (flags == NCRYPT_SILENT_FLAG) + { + FIXME("Silent flag not implemented\n"); + } + + return map_ntstatus(BCryptExportKey(object->key.bcrypt_key, NULL, type, output, output_len, ret_len, 0)); +} + SECURITY_STATUS WINAPI NCryptIsAlgSupported(NCRYPT_PROV_HANDLE provider, const WCHAR *algid, DWORD flags) { static const ULONG supported = BCRYPT_CIPHER_OPERATION |\ diff --git a/dlls/ncrypt/ncrypt.spec b/dlls/ncrypt/ncrypt.spec index 60b367260d5..99fb9a59ee4 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) @ stub NCryptEnumStorageProviders -@ stub NCryptExportKey +@ stdcall NCryptExportKey(long long wstr 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 18198fdc5bb..bd77c692fc6 100644 --- a/include/ncrypt.h +++ b/include/ncrypt.h @@ -110,9 +110,12 @@ typedef ULONG_PTR NCRYPT_SECRET_HANDLE; #define NCRYPT_SCARD_PIN_ID L"SmartCardPinId" #define NCRYPT_SCARD_PIN_INFO L"SmartCardPinInfo"
-SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE, NCRYPT_KEY_HANDLE *, const WCHAR *, const WCHAR *, DWORD, DWORD); +SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE, NCRYPT_KEY_HANDLE *, const WCHAR *, const WCHAR *, + DWORD, DWORD); SECURITY_STATUS WINAPI NCryptDecrypt(NCRYPT_KEY_HANDLE, BYTE *, DWORD, void *, BYTE *, DWORD, DWORD *, DWORD); SECURITY_STATUS WINAPI NCryptEncrypt(NCRYPT_KEY_HANDLE, BYTE *, DWORD, void *, BYTE *, DWORD, DWORD *, DWORD); +SECURITY_STATUS WINAPI NCryptExportKey(NCRYPT_KEY_HANDLE, NCRYPT_KEY_HANDLE, const WCHAR *, NCryptBufferDesc *, BYTE *, + DWORD, DWORD *, DWORD); SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE, DWORD); SECURITY_STATUS WINAPI NCryptFreeObject(NCRYPT_HANDLE); SECURITY_STATUS WINAPI NCryptGetProperty(NCRYPT_HANDLE, const WCHAR *, BYTE *, DWORD, DWORD *, DWORD);