From: Ariel Darshan abdaandroid@gmail.com
Signed-off-by: Ariel Darshan abdaandroid@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);