Santino Mazza : ncrypt: Initial implementation for NCryptEncrypt.

Alexandre Julliard julliard at winehq.org
Wed Aug 3 15:31:40 CDT 2022


Module: wine
Branch: master
Commit: 27cdb54bd890fb3bd57ad7840b77495619e966c8
URL:    https://gitlab.winehq.org/wine/wine/-/commit/27cdb54bd890fb3bd57ad7840b77495619e966c8

Author: Santino Mazza <mazzasantino1206 at gmail.com>
Date:   Sun Jul 31 13:51:05 2022 -0300

ncrypt: Initial implementation for NCryptEncrypt.

Signed-off-by: Santino Mazza <mazzasantino1206 at gmail.com>

---

 dlls/ncrypt/main.c         | 24 ++++++++++++++++++++++--
 dlls/ncrypt/tests/ncrypt.c |  6 ++++--
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c
index 58503338d6e..9f859acfdf9 100644
--- a/dlls/ncrypt/main.c
+++ b/dlls/ncrypt/main.c
@@ -43,6 +43,7 @@ static SECURITY_STATUS map_ntstatus(NTSTATUS status)
     case STATUS_NO_MEMORY:         return NTE_NO_MEMORY;
     case STATUS_NOT_SUPPORTED:     return NTE_NOT_SUPPORTED;
     case NTE_BAD_DATA:             return NTE_BAD_DATA;
+    case STATUS_BUFFER_TOO_SMALL:  return NTE_BUFFER_TOO_SMALL;
     default:
         FIXME("unhandled status %#lx\n", status);
         return NTE_INTERNAL_ERROR;
@@ -227,9 +228,28 @@ SECURITY_STATUS WINAPI NCryptDeleteKey(NCRYPT_KEY_HANDLE key, DWORD flags)
 SECURITY_STATUS WINAPI NCryptEncrypt(NCRYPT_KEY_HANDLE key, BYTE *input, DWORD insize, void *padding,
                                      BYTE *output, DWORD outsize, DWORD *result, DWORD flags)
 {
-    FIXME("(%#Ix, %p, %lu, %p, %p, %lu, %p, %#lx): stub\n", key, input, insize, padding,
+    struct object *key_object = (struct object *)key;
+
+    TRACE("(%#Ix, %p, %lu, %p, %p, %lu, %p, %#lx)\n", key, input, insize, padding,
           output, outsize, result, flags);
-    return NTE_NOT_SUPPORTED;
+
+    if (flags & ~(NCRYPT_NO_PADDING_FLAG | NCRYPT_PAD_OAEP_FLAG
+                | NCRYPT_PAD_PKCS1_FLAG | NCRYPT_SILENT_FLAG))
+    {
+        FIXME("Flags %lx not supported\n", flags);
+        return NTE_BAD_FLAGS;
+    }
+
+    if (flags & NCRYPT_NO_PADDING_FLAG || flags & NCRYPT_PAD_OAEP_FLAG)
+    {
+        FIXME("No padding and oaep padding not supported\n");
+        return NTE_NOT_SUPPORTED;
+    }
+
+    if (key_object->type != KEY) return NTE_INVALID_HANDLE;
+
+    return map_ntstatus(BCryptEncrypt(key_object->key.bcrypt_key, input, insize, padding,
+                                      NULL, 0, output, outsize, result, flags));
 }
 
 SECURITY_STATUS WINAPI NCryptEnumAlgorithms(NCRYPT_PROV_HANDLE provider, DWORD alg_ops,
diff --git a/dlls/ncrypt/tests/ncrypt.c b/dlls/ncrypt/tests/ncrypt.c
index 81b737c9a21..bd2f63bea87 100644
--- a/dlls/ncrypt/tests/ncrypt.c
+++ b/dlls/ncrypt/tests/ncrypt.c
@@ -550,7 +550,6 @@ static void test_NCryptEncrypt(void)
     BYTE *output_b;
     DWORD output_size;
 
-    todo_wine {
     NCryptOpenStorageProvider(&prov, NULL, 0);
     NCryptCreatePersistedKey(prov, &key, BCRYPT_RSA_ALGORITHM, NULL, 0, 0);
 
@@ -562,6 +561,7 @@ static void test_NCryptEncrypt(void)
     /* Test encrypt with a non finalized key */
     ret = NCryptEncrypt(key, data_to_encrypt, sizeof(data_to_encrypt), NULL, NULL, 0,
                         &output_size, NCRYPT_PAD_PKCS1_FLAG);
+    todo_wine
     ok(ret == NTE_BAD_KEY_STATE, "got %lx\n", ret);
 
     NCryptFinalizeKey(key, 0);
@@ -572,6 +572,8 @@ static void test_NCryptEncrypt(void)
     ok(ret == NTE_BAD_FLAGS, "got %lx\n", ret);
 
     /* Test no padding with RSA */
+    todo_wine
+    {
     ret = NCryptEncrypt(key, data_to_encrypt, sizeof(data_to_encrypt), NULL, NULL, 0, &output_size,
                         NCRYPT_NO_PADDING_FLAG);
     ok(ret == ERROR_SUCCESS, "got %lx\n", ret);
@@ -582,6 +584,7 @@ static void test_NCryptEncrypt(void)
                         &output_size, NCRYPT_NO_PADDING_FLAG);
     ok(ret == NTE_INVALID_PARAMETER, "got %lx\n", ret);
     free(output_a);
+    }
 
     /* Test output RSA with PKCS1. PKCS1 should append a random padding to the data, so the output should be different
      * with each call. */
@@ -611,7 +614,6 @@ static void test_NCryptEncrypt(void)
     free(output_b);
 
     NCryptFreeObject(prov);
-    }
 }
 
 START_TEST(ncrypt)




More information about the wine-cvs mailing list