[PATCH v3 2/2] ncrypt: Implement NCryptFinalizeKey

Santino Mazza mazzasantino1206 at gmail.com
Wed Mar 9 19:41:56 CST 2022


Signed-off-by: Santino Mazza <mazzasantino1206 at gmail.com>
---
 dlls/ncrypt/main.c            | 61 +++++++++++++++++++++++++++++++----
 dlls/ncrypt/ncrypt_internal.h |  1 +
 dlls/ncrypt/tests/ncrypt.c    | 25 ++++++++++++++
 3 files changed, 81 insertions(+), 6 deletions(-)

diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c
index 1cc09cdfc97..c8890306484 100644
--- a/dlls/ncrypt/main.c
+++ b/dlls/ncrypt/main.c
@@ -66,12 +66,6 @@ SECURITY_STATUS WINAPI NCryptEnumKeys(NCRYPT_PROV_HANDLE provider, const WCHAR *
     return NTE_NOT_SUPPORTED;
 }
 
-SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE key, DWORD flags)
-{
-    FIXME("(%#Ix, %#lx): stub\n", key, flags);
-    return NTE_NOT_SUPPORTED;
-}
-
 SECURITY_STATUS WINAPI NCryptFreeBuffer(PVOID buf)
 {
     FIXME("(%p): stub\n", buf);
@@ -369,6 +363,61 @@ SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE provider, NCR
     return ERROR_SUCCESS;
 }
 
+SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE key, DWORD flags)
+{
+    struct object *key_object = (struct object*)key;
+    DWORD key_length;
+    struct object_property *prop;
+    NTSTATUS ret;
+
+    TRACE("(%#Ix, %#lx): stub\n", key, flags);
+
+    if (!key) return NTE_INVALID_HANDLE;
+    if (key_object->key.finalized_key) return NTE_INVALID_HANDLE;
+
+    switch(key_object->key.algid)
+    {
+    case DH:
+    case DSA:
+    case ECDH:
+    case ECDH_P256:
+    case ECDH_P384:
+    case ECDH_P521:
+    case RSA:
+    {
+        prop = get_object_property(key_object, NCRYPT_LENGTH_PROPERTY);
+        if (!prop) return NTE_INVALID_HANDLE;
+
+        key_length = *(DWORD *)prop->value;
+        BCryptSetProperty(key_object->key.bcrypt_key, BCRYPT_KEY_LENGTH, (UCHAR*)&key_length, sizeof(key_length), 0);
+
+        ret = BCryptFinalizeKeyPair(key_object->key.bcrypt_key, 0);
+        if (ret != ERROR_SUCCESS)
+        {
+            ERR("Error finalizing key pair\n");
+            return NTE_INTERNAL_ERROR;
+        }
+        break;
+    }
+    case AES:
+    case DES:
+    case DESX:
+    case RC2:
+    {
+        FIXME("Symmetric keys not implemented\n");
+        return NTE_NOT_SUPPORTED;
+    }
+    default:
+    {
+        ERR("Got handle with invalid key type");
+        return NTE_INVALID_HANDLE;
+    }
+    }
+
+    key_object->key.finalized_key = 1;
+    return ERROR_SUCCESS;
+}
+
 SECURITY_STATUS WINAPI NCryptIsAlgSupported(NCRYPT_PROV_HANDLE provider, const WCHAR *algid, DWORD flags)
 {
     FIXME("(%#Ix, %s, %#lx): stub\n", provider, wine_dbgstr_w(algid), flags);
diff --git a/dlls/ncrypt/ncrypt_internal.h b/dlls/ncrypt/ncrypt_internal.h
index fb4dcd290b6..8aee1dc33c3 100644
--- a/dlls/ncrypt/ncrypt_internal.h
+++ b/dlls/ncrypt/ncrypt_internal.h
@@ -40,6 +40,7 @@ enum algid
 
 struct key
 {
+    DWORD finalized_key;
     enum algid algid;
     BCRYPT_ALG_HANDLE bcrypt_alg;
     BCRYPT_KEY_HANDLE bcrypt_key;
diff --git a/dlls/ncrypt/tests/ncrypt.c b/dlls/ncrypt/tests/ncrypt.c
index ec69b236ac9..fc951fef80a 100644
--- a/dlls/ncrypt/tests/ncrypt.c
+++ b/dlls/ncrypt/tests/ncrypt.c
@@ -306,6 +306,30 @@ static void test_create_persisted_key(void)
     NCryptFreeObject(prov);
 }
 
+static void test_finalize_key(void)
+{
+    NCRYPT_PROV_HANDLE prov;
+    NCRYPT_KEY_HANDLE key;
+    SECURITY_STATUS ret;
+
+    ret = NCryptOpenStorageProvider(&prov, NULL, 0);
+    ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
+
+    ret = NCryptCreatePersistedKey(prov, &key, BCRYPT_RSA_ALGORITHM, NULL, 0, 0);
+    ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
+
+    ret = NCryptFinalizeKey(key, 0);
+    ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
+
+    ret = NCryptFinalizeKey(key, 0);
+    ok(ret == NTE_INVALID_HANDLE, "got %#lx\n", ret);
+
+    ret = NCryptFinalizeKey(0, 0);
+    ok(ret == NTE_INVALID_HANDLE, "got %#lx\n", ret);
+
+    NCryptFreeObject(key);
+}
+
 START_TEST(ncrypt)
 {
     test_key_import_rsa();
@@ -313,4 +337,5 @@ START_TEST(ncrypt)
     test_get_property();
     test_set_property();
     test_create_persisted_key();
+    test_finalize_key();
 }
-- 
2.32.0




More information about the wine-devel mailing list