[PATCH 05/10] ncrypt: Implement NCryptFreeObject.

Santino Mazza mazzasantino1206 at gmail.com
Sat Feb 12 15:49:49 CST 2022


Signed-off-by: Santino Mazza <mazzasantino1206 at gmail.com>
---
 dlls/ncrypt/ncrypt_internal.c | 28 ++++++++++++++++++++++++++++
 dlls/ncrypt/ncrypt_internal.h |  2 ++
 dlls/ncrypt/ncrypt_main.c     | 28 ++++++++++++++++++++++++++--
 3 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/dlls/ncrypt/ncrypt_internal.c b/dlls/ncrypt/ncrypt_internal.c
index 370391d8171..2bbbd58af64 100644
--- a/dlls/ncrypt/ncrypt_internal.c
+++ b/dlls/ncrypt/ncrypt_internal.c
@@ -41,3 +41,31 @@ int allocate_key_object(struct ncrypt_object **keyobject)
     (*keyobject)->type = KEY;
     return ERROR_SUCCESS;
 }
+
+int free_key_object(struct ncrypt_object *keyobject)
+{
+    struct ncrypt_key_object *key = &keyobject->object.key;
+    switch (key->algtype)
+    {
+    case RSA:
+    {
+        free(key->payload.rsa_key.modulus);
+        free(key->payload.rsa_key.public_exp);
+        if (key->payload.rsa_key.type == PRIVATE)
+        {
+            free(key->payload.rsa_key.prime1);
+            free(key->payload.rsa_key.prime2);
+        }
+    }
+    break;
+
+    default:
+    {
+        ERR("invalid key object 0x%x\n", keyobject);
+        return NTE_INVALID_HANDLE;
+    }
+    break;
+    }
+
+    return ERROR_SUCCESS;
+}
diff --git a/dlls/ncrypt/ncrypt_internal.h b/dlls/ncrypt/ncrypt_internal.h
index 52029521b3e..9ef5ce593be 100644
--- a/dlls/ncrypt/ncrypt_internal.h
+++ b/dlls/ncrypt/ncrypt_internal.h
@@ -41,6 +41,7 @@ enum key_algorithm_type
 
 struct rsa_key
 {
+    enum asymmetric_key_type type;
     DWORD public_exp_size;
     BYTE *public_exp;
     DWORD modulus_size;
@@ -91,6 +92,7 @@ struct ncrypt_object
 };
 
 int allocate_key_object(struct ncrypt_object **keyobject);
+int free_key_object(struct ncrypt_object *keyobject);
 int set_object_property(struct ncrypt_object *obj, WCHAR property_name, BYTE *value, DWORD value_size);
 int get_object_property_value(struct ncrypt_object *obj, WCHAR property_name, BYTE *buf, DWORD buffer_size);
 
diff --git a/dlls/ncrypt/ncrypt_main.c b/dlls/ncrypt/ncrypt_main.c
index 69b0508b110..c567378c16b 100644
--- a/dlls/ncrypt/ncrypt_main.c
+++ b/dlls/ncrypt/ncrypt_main.c
@@ -90,8 +90,32 @@ SECURITY_STATUS WINAPI NCryptFreeBuffer(PVOID buf)
 
 SECURITY_STATUS WINAPI NCryptFreeObject(NCRYPT_HANDLE object)
 {
-    FIXME("(0x%lx): stub\n", object);
-    return NTE_NOT_SUPPORTED;
+    struct ncrypt_object *ncryptobj = (struct ncrypt_object *)object;
+    if (ncryptobj == NULL) {
+        ERR("invalid handle 0x%x\n", ncryptobj);
+        return NTE_INVALID_HANDLE;
+    }
+
+    switch (ncryptobj->type)
+    {
+    case KEY:
+    {
+        int ret = free_key_object(ncryptobj);
+        if (ret != ERROR_SUCCESS)
+            return ret;
+    }
+    break;
+
+    default:
+    {
+        ERR("invalid handle 0x%x\n", ncryptobj);
+        return NTE_INVALID_HANDLE;
+    }
+    break;
+    }
+
+    free(ncryptobj);
+    return ERROR_SUCCESS;
 }
 
 SECURITY_STATUS WINAPI NCryptGetProperty(NCRYPT_HANDLE object, const WCHAR *property, PBYTE output,
-- 
2.25.1




More information about the wine-devel mailing list