From: Piotr Caban piotr@codeweavers.com
--- dlls/bcrypt/bcrypt_main.c | 14 +++++++++++--- dlls/bcrypt/tests/bcrypt.c | 11 +++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index 35474d67125..07475d7f853 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -128,7 +128,8 @@ builtin_algorithms[] =
static inline BOOL is_symmetric_key( const struct key *key ) { - return builtin_algorithms[key->alg_id].class == BCRYPT_CIPHER_INTERFACE; + return builtin_algorithms[key->alg_id].class == BCRYPT_CIPHER_INTERFACE + || builtin_algorithms[key->alg_id].class == BCRYPT_KEY_DERIVATION_INTERFACE; }
static inline BOOL is_asymmetric_encryption_key( struct key *key ) @@ -1209,8 +1210,15 @@ static NTSTATUS key_symmetric_generate( struct algorithm *alg, BCRYPT_KEY_HANDLE struct key *key; NTSTATUS status;
- if (!(block_size = get_block_size( alg ))) return STATUS_INVALID_PARAMETER; - if (!get_alg_property( alg, BCRYPT_KEY_LENGTHS, (UCHAR *)&key_lengths, sizeof(key_lengths), &size )) + if (alg->id == ALG_ID_PBKDF2 && + !get_alg_property( alg, BCRYPT_KEY_LENGTHS, (UCHAR *)&key_lengths, sizeof(key_lengths), &size )) + { + if (secret_len > key_lengths.dwMaxLength / 8 + || secret_len < key_lengths.dwMinLength / 8) return STATUS_INVALID_PARAMETER; + block_size = secret_len; + } + else if (!(block_size = get_block_size( alg ))) return STATUS_INVALID_PARAMETER; + else if (!get_alg_property( alg, BCRYPT_KEY_LENGTHS, (UCHAR *)&key_lengths, sizeof(key_lengths), &size )) { if (secret_len > (size = key_lengths.dwMaxLength / 8)) { diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index 640629c4dee..272819d3335 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -4374,6 +4374,7 @@ static void test_PBKDF2(void) { BCRYPT_KEY_LENGTHS_STRUCT key_lengths; BCRYPT_ALG_HANDLE alg; + BCRYPT_KEY_HANDLE key; NTSTATUS status; ULONG val, size;
@@ -4404,6 +4405,16 @@ static void test_PBKDF2(void) ok(key_lengths.dwMaxLength == 16384, "got %lu\n", key_lengths.dwMaxLength); ok(key_lengths.dwIncrement == 8, "got %lu\n", key_lengths.dwIncrement);
+ key = 0; + status = BCryptGenerateSymmetricKey(alg, &key, NULL, 0, (UCHAR *)"test", 4, 0); + ok(!status, "got %#lx\n", status); + val = size = 0; + status = BCryptGetProperty(key, BCRYPT_KEY_STRENGTH, (UCHAR *)&val, sizeof(val), &size, 0); + ok(!status, "got %#lx\n", status); + ok(val == strlen("test") * 8, "got %lu\n", val); + + status = BCryptDestroyKey(key); + ok(!status, "got %#lx\n", status); status = BCryptCloseAlgorithmProvider(alg, 0); ok(status == STATUS_SUCCESS, "got %#lx\n", status); }