From ba1ed4432c98c23ecaa03eebbc3d8309b8fa550f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michael=20M=C3=BCller?= Date: Mon, 19 Mar 2018 11:16:12 +0000 Subject: [PATCH] bcrypt: Implement BCryptGetProperty for BCRYPT_CHAINING_MODE. Signed-off-by: Alistair Leslie-Hughes Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- 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"); -- 2.11.4.GIT