[PATCH 11/16] ncrypt: Implement NCrypt{Get, Set}Property

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


From: Ariel Darshan <abdaandroid at gmail.com>

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

diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c
index d940a49c1e4..e574743430a 100644
--- a/dlls/ncrypt/main.c
+++ b/dlls/ncrypt/main.c
@@ -402,9 +402,35 @@ SECURITY_STATUS WINAPI NCryptFreeObject(NCRYPT_HANDLE object)
 SECURITY_STATUS WINAPI NCryptGetProperty(NCRYPT_HANDLE object, const WCHAR *property, PBYTE output,
                                          DWORD outsize, DWORD *result, DWORD flags)
 {
-    FIXME("(0x%lx, %s, %p, %u, %p, 0x%08x): stub\n", object, wine_dbgstr_w(property), output, outsize,
+    struct ncrypt_base_object *obj;
+    struct ncrypt_key_instance *keyInstance;
+    struct ncrypt_provider_instance *providerInstance;
+
+    TRACE("(0x%lx, %s, %p, %u, %p, 0x%08x)\n", object, wine_dbgstr_w(property), output, outsize,
                                                          result, flags);
-    return NTE_NOT_SUPPORTED;
+
+    if (!object)
+    {
+        return NTE_INVALID_HANDLE;
+    }
+
+    obj = handle2baseObject(object);
+
+    switch(obj->sType)
+    {
+        case NCRYPT_OBJ_TYPE_PROVIDER:
+            providerInstance = handle2provider(object);
+            return providerInstance->functions.GetProviderProperty(providerInstance->kspHandle, property, output, outsize, result, flags);
+
+        case NCRYPT_OBJ_TYPE_KEY:
+            keyInstance = handle2key(object);
+            providerInstance = handle2provider(keyInstance->provider);
+            return providerInstance->functions.GetKeyProperty(providerInstance->kspHandle, keyInstance->kspHandle, property, output, outsize, result, flags);
+
+        default:
+            FIXME("Object type not implemented: 0x%08x\n", obj->sType);
+            return NTE_NOT_SUPPORTED;
+    }
 }
 
 SECURITY_STATUS WINAPI NCryptImportKey(NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_HANDLE decrypt_key,
@@ -526,9 +552,34 @@ SECURITY_STATUS WINAPI NCryptOpenStorageProvider(NCRYPT_PROV_HANDLE *provider, c
 SECURITY_STATUS WINAPI NCryptSetProperty(NCRYPT_HANDLE object, const WCHAR *property,
                                          PBYTE input, DWORD insize, DWORD flags)
 {
-    FIXME("(%lx, %s, %p, %u, 0x%08x): stub\n", object, wine_dbgstr_w(property), input, insize,
+    struct ncrypt_base_object *obj;
+    struct ncrypt_key_instance *keyInstance;
+    struct ncrypt_provider_instance *providerInstance;
+
+    TRACE("(%lx, %s, %p, %u, 0x%08x)\n", object, wine_dbgstr_w(property), input, insize,
                                                flags);
-    return NTE_NOT_SUPPORTED;
+    if (!object)
+    {
+        return NTE_INVALID_HANDLE;
+    }
+
+    obj = handle2baseObject(object);
+
+    switch(obj->sType)
+    {
+        case NCRYPT_OBJ_TYPE_PROVIDER:
+            providerInstance = handle2provider(object);
+            return providerInstance->functions.SetProviderProperty(providerInstance->kspHandle, property, input, insize, flags);
+
+        case NCRYPT_OBJ_TYPE_KEY:
+            keyInstance = handle2key(object);
+            providerInstance = handle2provider(keyInstance->provider);
+            return providerInstance->functions.SetKeyProperty(providerInstance->kspHandle, keyInstance->kspHandle, property, input, insize, flags);
+
+        default:
+            FIXME("Object type not implemented: 0x%08x\n", obj->sType);
+            return NTE_NOT_SUPPORTED;
+    }
 }
 
 static SECURITY_STATUS open_provider(NCRYPT_PROV_HANDLE *providerInstance, const WCHAR *name, const WCHAR *dllName, DWORD flags)
diff --git a/include/ncrypt.h b/include/ncrypt.h
index 3edc069352f..d4ace11c6e8 100644
--- a/include/ncrypt.h
+++ b/include/ncrypt.h
@@ -85,10 +85,12 @@ SECURITY_STATUS WINAPI NCryptExportKey(NCRYPT_PROV_HANDLE, NCRYPT_KEY_HANDLE, co
 SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE, DWORD);
 SECURITY_STATUS WINAPI NCryptFreeBuffer(PVOID);
 SECURITY_STATUS WINAPI NCryptFreeObject(NCRYPT_HANDLE);
+SECURITY_STATUS WINAPI NCryptGetProperty(NCRYPT_HANDLE, const WCHAR *, PBYTE, DWORD, DWORD *, DWORD);
 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);
+SECURITY_STATUS WINAPI NCryptSetProperty(NCRYPT_HANDLE, const WCHAR *, PBYTE, DWORD, DWORD);
 
 #ifdef __cplusplus
 }
-- 
2.28.0




More information about the wine-devel mailing list