From b677b58b608212c21fd1f6d2be8b77583988e88b Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Wed, 16 Aug 2017 11:23:42 +0200 Subject: [PATCH] bcrypt: Add a stub AES implementation. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/bcrypt/bcrypt.spec | 2 +- dlls/bcrypt/bcrypt_main.c | 58 ++++++++++++++++++++++++++++++++++---- dlls/bcrypt/tests/bcrypt.c | 33 +++++++++++----------- dlls/ncrypt/ncrypt.spec | 2 +- 4 files changed, 70 insertions(+), 25 deletions(-) diff --git a/dlls/bcrypt/bcrypt.spec b/dlls/bcrypt/bcrypt.spec index a1cce4423dc..e132764a0f8 100644 --- a/dlls/bcrypt/bcrypt.spec +++ b/dlls/bcrypt/bcrypt.spec @@ -26,7 +26,7 @@ @ stub BCryptFreeBuffer @ stdcall BCryptGenRandom(ptr ptr long long) @ stub BCryptGenerateKeyPair -@ stub BCryptGenerateSymmetricKey +@ stdcall BCryptGenerateSymmetricKey(ptr ptr ptr long ptr long long) @ stdcall BCryptGetFipsAlgorithmMode(ptr) @ stdcall BCryptGetProperty(ptr wstr ptr long ptr long) @ stdcall BCryptHash(ptr ptr long ptr long ptr long) diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index 80d7ddb9466..44cd1642bed 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -135,6 +135,7 @@ struct object enum alg_id { + ALG_ID_AES, ALG_ID_MD5, ALG_ID_RNG, ALG_ID_SHA1, @@ -152,6 +153,7 @@ static const struct { ULONG block_bits; const WCHAR *alg_name; } alg_props[] = { + /* ALG_ID_AES */ { 654, 0, 0, BCRYPT_AES_ALGORITHM }, /* ALG_ID_MD5 */ { 274, 16, 512, BCRYPT_MD5_ALGORITHM }, /* ALG_ID_RNG */ { 0, 0, 0, BCRYPT_RNG_ALGORITHM }, /* ALG_ID_SHA1 */ { 278, 20, 512, BCRYPT_SHA1_ALGORITHM }, @@ -210,11 +212,10 @@ NTSTATUS WINAPI BCryptGenRandom(BCRYPT_ALG_HANDLE handle, UCHAR *buffer, ULONG c NTSTATUS WINAPI BCryptOpenAlgorithmProvider( BCRYPT_ALG_HANDLE *handle, LPCWSTR id, LPCWSTR implementation, DWORD flags ) { + const DWORD supported_flags = BCRYPT_ALG_HANDLE_HMAC_FLAG; struct algorithm *alg; enum alg_id alg_id; - const DWORD supported_flags = BCRYPT_ALG_HANDLE_HMAC_FLAG; - TRACE( "%p, %s, %s, %08x\n", handle, wine_dbgstr_w(id), wine_dbgstr_w(implementation), flags ); if (!handle || !id) return STATUS_INVALID_PARAMETER; @@ -224,9 +225,10 @@ NTSTATUS WINAPI BCryptOpenAlgorithmProvider( BCRYPT_ALG_HANDLE *handle, LPCWSTR return STATUS_NOT_IMPLEMENTED; } - if (!strcmpW( id, BCRYPT_SHA1_ALGORITHM )) alg_id = ALG_ID_SHA1; + if (!strcmpW( id, BCRYPT_AES_ALGORITHM )) alg_id = ALG_ID_AES; else if (!strcmpW( id, BCRYPT_MD5_ALGORITHM )) alg_id = ALG_ID_MD5; else if (!strcmpW( id, BCRYPT_RNG_ALGORITHM )) alg_id = ALG_ID_RNG; + else if (!strcmpW( id, BCRYPT_SHA1_ALGORITHM )) alg_id = ALG_ID_SHA1; else if (!strcmpW( id, BCRYPT_SHA256_ALGORITHM )) alg_id = ALG_ID_SHA256; else if (!strcmpW( id, BCRYPT_SHA384_ALGORITHM )) alg_id = ALG_ID_SHA384; else if (!strcmpW( id, BCRYPT_SHA512_ALGORITHM )) alg_id = ALG_ID_SHA512; @@ -388,6 +390,8 @@ struct hash struct hash_impl inner; }; +#define BLOCK_LENGTH_AES 16 + static NTSTATUS generic_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size ) { if (!strcmpW( prop, BCRYPT_OBJECT_LENGTH )) @@ -432,9 +436,43 @@ static NTSTATUS get_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, NTSTATUS status; status = generic_alg_property( id, prop, buf, size, ret_size ); - if (status == STATUS_NOT_IMPLEMENTED) - FIXME( "unsupported property %s\n", debugstr_w(prop) ); - return status; + if (status != STATUS_NOT_IMPLEMENTED) + return status; + + switch (id) + { + case ALG_ID_AES: + if (!strcmpW( prop, BCRYPT_BLOCK_LENGTH )) + { + *ret_size = sizeof(ULONG); + if (size < sizeof(ULONG)) + return STATUS_BUFFER_TOO_SMALL; + if (buf) + *(ULONG *)buf = BLOCK_LENGTH_AES; + return STATUS_SUCCESS; + } + if (!strcmpW( prop, BCRYPT_CHAINING_MODE )) + { + if (size >= sizeof(BCRYPT_CHAIN_MODE_CBC)) + { + 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; + } + } + break; + + default: + break; + } + + FIXME( "unsupported property %s\n", debugstr_w(prop) ); + return STATUS_NOT_IMPLEMENTED; } static NTSTATUS get_hash_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size ) @@ -632,6 +670,14 @@ NTSTATUS WINAPI BCryptHash( BCRYPT_ALG_HANDLE algorithm, UCHAR *secret, ULONG se return BCryptDestroyHash( handle ); } +NTSTATUS WINAPI BCryptGenerateSymmetricKey( BCRYPT_ALG_HANDLE algorithm, BCRYPT_KEY_HANDLE *handle, + UCHAR *object, ULONG object_len, UCHAR *secret, ULONG secret_len, + ULONG flags ) +{ + FIXME( "%p, %p, %p, %u, %p, %u, %08x\n", algorithm, handle, object, object_len, secret, secret_len, flags ); + return STATUS_NOT_IMPLEMENTED; +} + BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) { switch (reason) diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index 42312b45b78..a4d98b28d34 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -704,7 +704,7 @@ static void test_aes(void) ULONG size, len; UCHAR mode[64]; NTSTATUS ret; -todo_wine { + alg = NULL; ret = pBCryptOpenAlgorithmProvider(&alg, BCRYPT_AES_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0); ok(ret == STATUS_SUCCESS, "got %08x\n", ret); @@ -738,7 +738,6 @@ todo_wine { ret = pBCryptCloseAlgorithmProvider(alg, 0); ok(ret == STATUS_SUCCESS, "got %08x\n", ret); } -} static void test_BCryptGenerateSymmetricKey(void) { @@ -757,11 +756,6 @@ static void test_BCryptGenerateSymmetricKey(void) NTSTATUS ret; ret = pBCryptOpenAlgorithmProvider(&aes, BCRYPT_AES_ALGORITHM, NULL, 0); - if (ret != STATUS_SUCCESS) /* remove whole IF when Wine is fixed */ - { - todo_wine ok(0, "AES provider not available\n"); - return; - } ok(ret == STATUS_SUCCESS, "got %08x\n", ret); len = size = 0xdeadbeef; @@ -771,6 +765,11 @@ static void test_BCryptGenerateSymmetricKey(void) key = NULL; buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); ret = pBCryptGenerateSymmetricKey(aes, &key, buf, len, secret, sizeof(secret), 0); + if (ret == STATUS_NOT_IMPLEMENTED) /* remove whole IF when Wine is fixed */ + { + todo_wine ok(0, "BCryptGenerateSymmetricKey not implemented\n"); + return; + } ok(ret == STATUS_SUCCESS, "got %08x\n", ret); ok(key != NULL, "key not set\n"); @@ -846,11 +845,6 @@ static void test_BCryptEncrypt(void) NTSTATUS ret; ret = pBCryptOpenAlgorithmProvider(&aes, BCRYPT_AES_ALGORITHM, NULL, 0); - if (ret != STATUS_SUCCESS) /* remove whole IF when Wine is fixed */ - { - todo_wine ok(0, "AES provider not available\n"); - return; - } ok(ret == STATUS_SUCCESS, "got %08x\n", ret); len = 0xdeadbeef; @@ -860,6 +854,11 @@ static void test_BCryptEncrypt(void) buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); ret = pBCryptGenerateSymmetricKey(aes, &key, buf, len, secret, sizeof(secret), 0); + if (ret == STATUS_NOT_IMPLEMENTED) /* remove whole IF when Wine is fixed */ + { + todo_wine ok(0, "BCryptGenerateSymmetricKey not implemented\n"); + return; + } ok(ret == STATUS_SUCCESS, "got %08x\n", ret); /* input size is a multiple of block size */ @@ -937,11 +936,6 @@ static void test_BCryptDecrypt(void) NTSTATUS ret; ret = pBCryptOpenAlgorithmProvider(&aes, BCRYPT_AES_ALGORITHM, NULL, 0); - if (ret != STATUS_SUCCESS) /* remove whole IF when Wine is fixed */ - { - todo_wine ok(0, "AES provider not available\n"); - return; - } ok(ret == STATUS_SUCCESS, "got %08x\n", ret); len = 0xdeadbeef; @@ -951,6 +945,11 @@ static void test_BCryptDecrypt(void) buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); ret = pBCryptGenerateSymmetricKey(aes, &key, buf, len, secret, sizeof(secret), 0); + if (ret == STATUS_NOT_IMPLEMENTED) /* remove whole IF when Wine is fixed */ + { + todo_wine ok(0, "BCryptGenerateSymmetricKey not implemented\n"); + return; + } ok(ret == STATUS_SUCCESS, "got %08x\n", ret); /* input size is a multiple of block size */ diff --git a/dlls/ncrypt/ncrypt.spec b/dlls/ncrypt/ncrypt.spec index 6e871a5d6b8..38c02f41fe7 100644 --- a/dlls/ncrypt/ncrypt.spec +++ b/dlls/ncrypt/ncrypt.spec @@ -28,7 +28,7 @@ @ stub BCryptFreeBuffer @ stdcall BCryptGenRandom(ptr ptr long long) bcrypt.BCryptGenRandom @ stub BCryptGenerateKeyPair -@ stub BCryptGenerateSymmetricKey +@ stdcall BCryptGenerateSymmetricKey(ptr ptr ptr long ptr long long) bcrypt.BCryptGenerateSymmetricKey @ stdcall BCryptGetFipsAlgorithmMode(ptr) bcrypt.BCryptGetFipsAlgorithmMode @ stdcall BCryptGetProperty(ptr wstr ptr long ptr long) bcrypt.BCryptGetProperty @ stdcall BCryptHash(ptr ptr long ptr long ptr long) bcrypt.BCryptHash