From: Piotr Caban piotr@codeweavers.com
--- dlls/bcrypt/bcrypt_internal.h | 3 +++ dlls/bcrypt/bcrypt_main.c | 5 ++++- dlls/bcrypt/tests/bcrypt.c | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h index 20c9a2912a5..866232343c6 100644 --- a/dlls/bcrypt/bcrypt_internal.h +++ b/dlls/bcrypt/bcrypt_internal.h @@ -73,6 +73,9 @@ enum alg_id
/* rng */ ALG_ID_RNG, + + /* key derivation */ + ALG_ID_PBKDF2, };
enum chain_mode diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index bb27cfa00e3..353ef081fd1 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -123,6 +123,7 @@ builtin_algorithms[] = { BCRYPT_ECDSA_P384_ALGORITHM, BCRYPT_SIGNATURE_INTERFACE, 0, 0, 0 }, { BCRYPT_DSA_ALGORITHM, BCRYPT_SIGNATURE_INTERFACE, 0, 0, 0 }, { BCRYPT_RNG_ALGORITHM, BCRYPT_RNG_INTERFACE, 0, 0, 0 }, + { BCRYPT_PBKDF2_ALGORITHM, BCRYPT_KEY_DERIVATION_INTERFACE, 618, 0, 0 }, };
static inline BOOL is_symmetric_key( const struct key *key ) @@ -156,6 +157,7 @@ static BOOL match_operation_type( ULONG type, ULONG class ) case BCRYPT_SECRET_AGREEMENT_INTERFACE: return type & BCRYPT_SECRET_AGREEMENT_OPERATION; case BCRYPT_SIGNATURE_INTERFACE: return type & BCRYPT_SIGNATURE_OPERATION; case BCRYPT_RNG_INTERFACE: return type & BCRYPT_RNG_OPERATION; + case BCRYPT_KEY_DERIVATION_INTERFACE: return type & BCRYPT_KEY_DERIVATION_OPERATION; default: break; } return FALSE; @@ -168,7 +170,8 @@ NTSTATUS WINAPI BCryptEnumAlgorithms( ULONG type, ULONG *ret_count, BCRYPT_ALGOR BCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION |\ BCRYPT_SECRET_AGREEMENT_OPERATION |\ BCRYPT_SIGNATURE_OPERATION |\ - BCRYPT_RNG_OPERATION; + BCRYPT_RNG_OPERATION |\ + BCRYPT_KEY_DERIVATION_OPERATION; BCRYPT_ALGORITHM_IDENTIFIER *list; ULONG i, j, count = 0;
diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index af49d76730e..4d65cd26cb2 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -4370,6 +4370,23 @@ static void test_RC4(void) ok(status == STATUS_SUCCESS, "got %#lx\n", status); }
+static void test_PBKDF2(void) +{ + BCRYPT_ALG_HANDLE alg; + NTSTATUS status; + + status = BCryptOpenAlgorithmProvider(&alg, BCRYPT_PBKDF2_ALGORITHM, NULL, 0); + if (status == STATUS_NOT_FOUND) + { + win_skip("PBKDF2 not available\n"); + return; + } + ok(!status, "got %#lx\n", status); + + status = BCryptCloseAlgorithmProvider(alg, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); +} + START_TEST(bcrypt) { HMODULE module; @@ -4408,6 +4425,7 @@ START_TEST(bcrypt) test_SecretAgreement(); test_rsa_encrypt(); test_RC4(); + test_PBKDF2();
FreeLibrary(module); }