From ba1ed4432c98c23ecaa03eebbc3d8309b8fa550f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 19 Mar 2018 11:16:12 +0000
Subject: [PATCH] bcrypt: Implement BCryptGetProperty for BCRYPT_CHAINING_MODE.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
---
 dlls/bcrypt/bcrypt_main.c  | 19 ++++++++++---------
 dlls/bcrypt/tests/bcrypt.c |  2 +-
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index 2f566048738..55901f9beff 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -540,17 +540,18 @@ static NTSTATUS get_alg_property( const struct algorithm *alg, const WCHAR *prop
         }
         if (!strcmpW( prop, BCRYPT_CHAINING_MODE ))
         {
-            if (size >= sizeof(BCRYPT_CHAIN_MODE_CBC) * sizeof(WCHAR))
+            const WCHAR *mode;
+            switch (alg->mode)
             {
-                memcpy(buf, BCRYPT_CHAIN_MODE_CBC, sizeof(BCRYPT_CHAIN_MODE_CBC));
-                *ret_size = sizeof(BCRYPT_CHAIN_MODE_CBC) * sizeof(WCHAR);
-                return STATUS_SUCCESS;
-            }
-            else
-            {
-                *ret_size = sizeof(BCRYPT_CHAIN_MODE_CBC) * sizeof(WCHAR);
-                return STATUS_BUFFER_TOO_SMALL;
+                case MODE_ID_GCM: mode = BCRYPT_CHAIN_MODE_GCM; break;
+                case MODE_ID_CBC: mode = BCRYPT_CHAIN_MODE_CBC; break;
+                default: return STATUS_NOT_IMPLEMENTED;
             }
+
+            *ret_size = 64;
+            if (size < *ret_size) return STATUS_BUFFER_TOO_SMALL;
+            memcpy( buf, mode, (strlenW(mode) + 1) * sizeof(WCHAR) );
+            return STATUS_SUCCESS;
         }
         if (!strcmpW( prop, BCRYPT_KEY_LENGTHS ))
         {
diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c
index f8b63a96030..f235cc7b9ee 100644
--- a/dlls/bcrypt/tests/bcrypt.c
+++ b/dlls/bcrypt/tests/bcrypt.c
@@ -483,7 +483,7 @@ static void test_aes(void)
     memset(mode, 0, sizeof(mode));
     ret = pBCryptGetProperty(alg, BCRYPT_CHAINING_MODE, mode, sizeof(mode), &size, 0);
     ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
-    todo_wine ok(!lstrcmpW((const WCHAR *)mode, BCRYPT_CHAIN_MODE_GCM), "got %s\n", wine_dbgstr_w((const WCHAR *)mode));
+    ok(!lstrcmpW((const WCHAR *)mode, BCRYPT_CHAIN_MODE_GCM), "got %s\n", wine_dbgstr_w((const WCHAR *)mode));
     ok(size == 64, "got %u\n", size);
 
     test_alg_name(alg, "AES");
-- 
GitLab