Module: wine Branch: master Commit: 215c1718914a3fb32332efb4e69ae98f3d6ce695 URL: https://source.winehq.org/git/wine.git/?a=commit;h=215c1718914a3fb32332efb4e... Author: Hans Leidekker <hans(a)codeweavers.com> Date: Tue Feb 11 10:47:34 2020 +0100 bcrypt: Support BCRYPT_HASH_REUSABLE_FLAG in BCryptOpenAlgorithmProvider. Signed-off-by: Hans Leidekker <hans(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/bcrypt/bcrypt_internal.h | 2 +- dlls/bcrypt/bcrypt_main.c | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h index d026dab729..5cc2c249da 100644 --- a/dlls/bcrypt/bcrypt_internal.h +++ b/dlls/bcrypt/bcrypt_internal.h @@ -154,7 +154,7 @@ struct algorithm struct object hdr; enum alg_id id; enum mode_id mode; - BOOL hmac; + ULONG flags; }; #if defined(HAVE_GNUTLS_CIPHER_INIT) diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index 2ac36d3db0..298bfb4007 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -216,7 +216,7 @@ 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; + const DWORD supported_flags = BCRYPT_ALG_HANDLE_HMAC_FLAG | BCRYPT_HASH_REUSABLE_FLAG; struct algorithm *alg; enum alg_id alg_id; ULONG i; @@ -254,7 +254,7 @@ NTSTATUS WINAPI BCryptOpenAlgorithmProvider( BCRYPT_ALG_HANDLE *handle, LPCWSTR alg->hdr.magic = MAGIC_ALG; alg->id = alg_id; alg->mode = MODE_ID_CBC; - alg->hmac = flags & BCRYPT_ALG_HANDLE_HMAC_FLAG; + alg->flags = flags; *handle = alg; return STATUS_SUCCESS; @@ -692,8 +692,9 @@ NTSTATUS WINAPI BCryptCreateHash( BCRYPT_ALG_HANDLE algorithm, BCRYPT_HASH_HANDL if (!(hash = heap_alloc_zero( sizeof(*hash) ))) return STATUS_NO_MEMORY; hash->hdr.magic = MAGIC_HASH; hash->alg_id = alg->id; - if (alg->hmac) hash->flags = HASH_FLAG_HMAC; - if (flags & BCRYPT_HASH_REUSABLE_FLAG) hash->flags |= HASH_FLAG_REUSABLE; + if (alg->flags & BCRYPT_ALG_HANDLE_HMAC_FLAG) hash->flags = HASH_FLAG_HMAC; + if ((alg->flags & BCRYPT_HASH_REUSABLE_FLAG) || (flags & BCRYPT_HASH_REUSABLE_FLAG)) + hash->flags |= HASH_FLAG_REUSABLE; if (secretlen && !(hash->secret = heap_alloc( secretlen ))) {