From: Ariel Darshan abdaandroid@gmail.com
Signed-off-by: Ariel Darshan abdaandroid@gmail.com --- dlls/ncrypt/main.c | 44 ++++++++++++++++++++++++++++++++++++++++---- include/ncrypt.h | 2 ++ 2 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c index 63687850b55..606cd1b8401 100644 --- a/dlls/ncrypt/main.c +++ b/dlls/ncrypt/main.c @@ -153,15 +153,51 @@ SECURITY_STATUS WINAPI NCryptEnumAlgorithms(NCRYPT_PROV_HANDLE provider, DWORD a DWORD *alg_count, NCryptAlgorithmName **alg_list, DWORD flags) { - FIXME("(0x%lx, 0x%08x, %p, %p, 0x%08x): stub\n", provider, alg_ops, alg_count, alg_list, flags); - return NTE_NOT_SUPPORTED; + struct ncrypt_provider_instance *providerInstance; + + TRACE("(0x%lx, 0x%08x, %p, %p, 0x%08x)\n", provider, alg_ops, alg_count, alg_list, flags); + + if (!provider) + { + return NTE_INVALID_HANDLE; + } + providerInstance = handle2provider(provider); + return providerInstance->functions.EnumAlgorithms(providerInstance->kspHandle, alg_ops, alg_count, alg_list, flags); }
SECURITY_STATUS WINAPI NCryptEnumKeys(NCRYPT_PROV_HANDLE provider, const WCHAR *scope, NCryptKeyName **key_name, PVOID *enum_state, DWORD flags) { - FIXME("(0x%lx, %p, %p, %p, 0x%08x): stub\n", provider, scope, key_name, enum_state, flags); - return NTE_NOT_SUPPORTED; + struct ncrypt_provider_instance *providerInstance; + SECURITY_STATUS ret; + BOOL firstRound; + + TRACE("(0x%lx, %p, %p, %p, 0x%08x)\n", provider, scope, key_name, enum_state, flags); + + if (!provider) + { + return NTE_INVALID_HANDLE; + } + providerInstance = handle2provider(provider); + + firstRound = (*enum_state == NULL); + + ret = providerInstance->functions.EnumKeys(providerInstance->kspHandle, scope, key_name, enum_state, flags); + + if (firstRound && *enum_state) + { + /* FIXME: enum_state must be freed with NCryptFreeBuffer, which as it seems should in turn + call the FreeBuffer function that is in the KSP DLL, so provider should live until after that happens */ + providerInstance->refCount++; + } + + if (ret == ERROR_SUCCESS && *key_name) + { + /* FIXME: key_name must be freed with NCryptFreeBuffer, which as it seems should in turn + call the FreeBuffer function that is in the KSP DLL, so provider should live until after that happens */ + providerInstance->refCount++; + } + return ret; }
SECURITY_STATUS WINAPI NCryptEnumStorageProviders(DWORD *providerCount, NCryptProviderName **providerList, DWORD flags) diff --git a/include/ncrypt.h b/include/ncrypt.h index 22f9c67ebb6..2906d47b023 100644 --- a/include/ncrypt.h +++ b/include/ncrypt.h @@ -78,6 +78,8 @@ SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE, NCRYPT_KEY_H SECURITY_STATUS WINAPI NCryptDecrypt(NCRYPT_KEY_HANDLE, BYTE *, DWORD, void *, BYTE *, DWORD, DWORD *, DWORD); SECURITY_STATUS WINAPI NCryptDeleteKey(NCRYPT_KEY_HANDLE, DWORD); SECURITY_STATUS WINAPI NCryptEncrypt(NCRYPT_KEY_HANDLE, BYTE *, DWORD, void *, BYTE *, DWORD, DWORD *, DWORD); +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 NCryptFinalizeKey(NCRYPT_KEY_HANDLE, DWORD); SECURITY_STATUS WINAPI NCryptFreeBuffer(PVOID);