diff --git a/patches/bcrypt-Improvements/0027-bcrypt-Fix-BCryptEncrypt-with-AES_GCM-and-no-input-a.patch b/patches/bcrypt-Improvements/0027-bcrypt-Fix-BCryptEncrypt-with-AES_GCM-and-no-input-a.patch new file mode 100644 index 00000000..85ef56a7 --- /dev/null +++ b/patches/bcrypt-Improvements/0027-bcrypt-Fix-BCryptEncrypt-with-AES_GCM-and-no-input-a.patch @@ -0,0 +1,63 @@ +From 9d4cfb266667d09430c5036ef127d30d5ac5ffbe Mon Sep 17 00:00:00 2001 +From: Andrew Wesie +Date: Mon, 1 May 2017 22:57:43 -0500 +Subject: bcrypt: Fix BCryptEncrypt with AES_GCM and no input and no output. + +Signed-off-by: Andrew Wesie +--- + dlls/bcrypt/bcrypt_main.c | 2 +- + dlls/bcrypt/tests/bcrypt.c | 18 ++++++++++++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c +index c25f1d1e99..d269083eca 100644 +--- a/dlls/bcrypt/bcrypt_main.c ++++ b/dlls/bcrypt/bcrypt_main.c +@@ -1185,7 +1185,7 @@ NTSTATUS WINAPI BCryptEncrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp + + *ret_len = input_len; + if (flags & BCRYPT_BLOCK_PADDING) return STATUS_INVALID_PARAMETER; +- if (!output) return STATUS_SUCCESS; ++ if (input && !output) return STATUS_SUCCESS; + if (output_len < *ret_len) return STATUS_BUFFER_TOO_SMALL; + + if (auth_info->pbAuthData && (status = key_set_auth_data( key, auth_info->pbAuthData, auth_info->cbAuthData ))) +diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c +index 7f01529b3b..9f34a54978 100644 +--- a/dlls/bcrypt/tests/bcrypt.c ++++ b/dlls/bcrypt/tests/bcrypt.c +@@ -913,6 +913,9 @@ static void test_BCryptEncrypt(void) + {0x9a,0x92,0x32,0x2c,0x61,0x2a,0xae,0xef,0x66,0x2a,0xfb,0x55,0xe9,0x48,0xdf,0xbd}; + static UCHAR expected_tag3[] = + {0x17,0x9d,0xc0,0x7a,0xf0,0xcf,0xaa,0xd5,0x1c,0x11,0xc4,0x4b,0xd6,0xa3,0x3e,0x77}; ++ static UCHAR expected_tag4[] = ++ {0x4c,0x42,0x83,0x9e,0x8d,0x40,0xf1,0x19,0xd6,0x2b,0x1c,0x66,0x03,0x2b,0x39,0x63}; ++ + BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO auth_info; + UCHAR *buf, ciphertext[48], ivbuf[16], tag[16]; + BCRYPT_AUTH_TAG_LENGTHS_STRUCT tag_length; +@@ -1104,6 +1107,21 @@ static void test_BCryptEncrypt(void) + for (i = 0; i < 16; i++) + ok(tag[i] == expected_tag3[i], "%u: %02x != %02x\n", i, tag[i], expected_tag3[i]); + ++ memset(tag, 0xff, sizeof(tag)); ++ ret = pBCryptEncrypt(key, data2, 0, &auth_info, ivbuf, 16, NULL, 0, &size, 0); ++ ok(ret == STATUS_SUCCESS, "got %08x\n", ret); ++ ok(size == 0, "got %u\n", size); ++ for (i = 0; i < 16; i++) ++ ok(tag[i] == 0xff, "%u: %02x != %02x\n", i, tag[i], 0xff); ++ ++ memset(tag, 0xff, sizeof(tag)); ++ ret = pBCryptEncrypt(key, NULL, 0, &auth_info, ivbuf, 16, NULL, 0, &size, 0); ++ ok(ret == STATUS_SUCCESS, "got %08x\n", ret); ++ ok(size == 0, "got %u\n", size); ++ ok(!memcmp(tag, expected_tag4, sizeof(expected_tag4)), "wrong tag\n"); ++ for (i = 0; i < 16; i++) ++ ok(tag[i] == expected_tag4[i], "%u: %02x != %02x\n", i, tag[i], expected_tag4[i]); ++ + /* test with padding */ + memcpy(ivbuf, iv, sizeof(iv)); + memset(ciphertext, 0, sizeof(ciphertext)); +-- +2.12.2 + diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index d19c6161..b81e2ce6 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -2944,6 +2944,7 @@ if test "$enable_bcrypt_Improvements" -eq 1; then patch_apply bcrypt-Improvements/0024-bcrypt-tests-Add-tests-for-auth-data-in-AES-GCM-mode.patch patch_apply bcrypt-Improvements/0025-bcrypt-Avoid-crash-in-tests-when-compiling-without-g.patch patch_apply bcrypt-Improvements/0026-bcrypt-Implement-support-for-ECB-chain-mode.patch + patch_apply bcrypt-Improvements/0027-bcrypt-Fix-BCryptEncrypt-with-AES_GCM-and-no-input-a.patch ( printf '%s\n' '+ { "Hans Leidekker", "bcrypt: Add AES provider.", 1 },'; printf '%s\n' '+ { "Michael Müller", "bcrypt: Fix handling of padding when input size equals block size for AES.", 1 },'; @@ -2966,6 +2967,7 @@ if test "$enable_bcrypt_Improvements" -eq 1; then printf '%s\n' '+ { "Sebastian Lackner", "bcrypt/tests: Add tests for auth data in AES GCM mode.", 1 },'; printf '%s\n' '+ { "Sebastian Lackner", "bcrypt: Avoid crash in tests when compiling without gnutls support.", 1 },'; printf '%s\n' '+ { "Sebastian Lackner", "bcrypt: Implement support for ECB chain mode.", 1 },'; + printf '%s\n' '+ { "Andrew Wesie", "bcrypt: Fix BCryptEncrypt with AES_GCM and no input and no output.", 1 },'; ) >> "$patchlist" fi