From: Hans Leidekker hans@codeweavers.com
--- dlls/rsaenh/implglue.c | 4 ++-- dlls/rsaenh/implglue.h | 2 +- dlls/rsaenh/rsaenh.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/rsaenh/implglue.c b/dlls/rsaenh/implglue.c index b4fe985af9b..636fe4b6ee0 100644 --- a/dlls/rsaenh/implglue.c +++ b/dlls/rsaenh/implglue.c @@ -70,9 +70,9 @@ BOOL update_hash_impl(BCRYPT_HASH_HANDLE hash_handle, const BYTE *pbData, DWORD return TRUE; }
-BOOL finalize_hash_impl(BCRYPT_HASH_HANDLE hash_handle, BYTE *pbHashValue) +BOOL finalize_hash_impl(BCRYPT_HASH_HANDLE hash_handle, BYTE *hash_value, DWORD hash_size) { - BCryptFinishHash(hash_handle, pbHashValue, RSAENH_MAX_HASH_SIZE, 0); + BCryptFinishHash(hash_handle, hash_value, hash_size, 0); BCryptDestroyHash(hash_handle); return TRUE; } diff --git a/dlls/rsaenh/implglue.h b/dlls/rsaenh/implglue.h index 06fa3f4430a..423474dc52e 100644 --- a/dlls/rsaenh/implglue.h +++ b/dlls/rsaenh/implglue.h @@ -41,7 +41,7 @@ typedef union tagKEY_CONTEXT { BOOL init_hash_impl(ALG_ID aiAlgid, BCRYPT_HASH_HANDLE *hash_handle) DECLSPEC_HIDDEN; BOOL update_hash_impl(BCRYPT_HASH_HANDLE hash_handle, const BYTE *pbData, DWORD dwDataLen) DECLSPEC_HIDDEN; -BOOL finalize_hash_impl(BCRYPT_HASH_HANDLE hash_handle, BYTE *pbHashValue) DECLSPEC_HIDDEN; +BOOL finalize_hash_impl(BCRYPT_HASH_HANDLE hash_handle, BYTE *hash_value, DWORD hash_size) DECLSPEC_HIDDEN; BOOL duplicate_hash_impl(BCRYPT_HASH_HANDLE src_hash_handle, BCRYPT_HASH_HANDLE *dest_hash_handle) DECLSPEC_HIDDEN;
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c index beac3c7e850..3a2d7126ca4 100644 --- a/dlls/rsaenh/rsaenh.c +++ b/dlls/rsaenh/rsaenh.c @@ -816,7 +816,7 @@ static inline void finalize_hash(CRYPTHASH *pCryptHash) if (pCryptHash->pHMACInfo) { BYTE abHashValue[RSAENH_MAX_HASH_SIZE];
- finalize_hash_impl(pCryptHash->hash_handle, pCryptHash->abHashValue); + finalize_hash_impl(pCryptHash->hash_handle, pCryptHash->abHashValue, pCryptHash->dwHashSize); memcpy(abHashValue, pCryptHash->abHashValue, pCryptHash->dwHashSize); init_hash_impl(pCryptHash->pHMACInfo->HashAlgid, &pCryptHash->hash_handle); update_hash_impl(pCryptHash->hash_handle, @@ -824,7 +824,7 @@ static inline void finalize_hash(CRYPTHASH *pCryptHash) pCryptHash->pHMACInfo->cbOuterString); update_hash_impl(pCryptHash->hash_handle, abHashValue, pCryptHash->dwHashSize); - finalize_hash_impl(pCryptHash->hash_handle, pCryptHash->abHashValue); + finalize_hash_impl(pCryptHash->hash_handle, pCryptHash->abHashValue, pCryptHash->dwHashSize); pCryptHash->hash_handle = NULL; } break; @@ -842,7 +842,7 @@ static inline void finalize_hash(CRYPTHASH *pCryptHash) break;
default: - finalize_hash_impl(pCryptHash->hash_handle, pCryptHash->abHashValue); + finalize_hash_impl(pCryptHash->hash_handle, pCryptHash->abHashValue, pCryptHash->dwHashSize); pCryptHash->hash_handle = NULL; } }
From: Hans Leidekker hans@codeweavers.com
--- dlls/bcrypt/bcrypt_main.c | 114 +++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 51 deletions(-)
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index 133c674e27c..e2eb8e95057 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -264,6 +264,21 @@ static inline struct algorithm *get_alg_object( BCRYPT_ALG_HANDLE handle ) return (struct algorithm *)get_object( handle, MAGIC_ALG ); }
+static inline struct hash *get_hash_object( BCRYPT_HASH_HANDLE handle ) +{ + return (struct hash *)get_object( handle, MAGIC_HASH ); +} + +static inline struct key *get_key_object( BCRYPT_KEY_HANDLE handle ) +{ + return (struct key *)get_object( handle, MAGIC_KEY ); +} + +static inline struct secret *get_secret_object( BCRYPT_SECRET_HANDLE handle ) +{ + return (struct secret *)get_object( handle, MAGIC_SECRET ); +} + NTSTATUS WINAPI BCryptGenRandom( BCRYPT_ALG_HANDLE handle, UCHAR *buffer, ULONG count, ULONG flags ) { const DWORD supported_flags = BCRYPT_USE_SYSTEM_PREFERRED_RNG; @@ -974,12 +989,12 @@ NTSTATUS WINAPI BCryptCreateHash( BCRYPT_ALG_HANDLE handle, BCRYPT_HASH_HANDLE * NTSTATUS WINAPI BCryptDuplicateHash( BCRYPT_HASH_HANDLE handle, BCRYPT_HASH_HANDLE *handle_copy, UCHAR *object, ULONG objectlen, ULONG flags ) { - struct hash *hash_orig = handle; + struct hash *hash_orig = get_hash_object( handle ); struct hash *hash_copy;
TRACE( "%p, %p, %p, %lu, %#lx\n", handle, handle_copy, object, objectlen, flags );
- if (!hash_orig || hash_orig->hdr.magic != MAGIC_HASH) return STATUS_INVALID_HANDLE; + if (!hash_orig) return STATUS_INVALID_HANDLE; if (!handle_copy) return STATUS_INVALID_PARAMETER; if (object) FIXME( "ignoring object buffer\n" );
@@ -1006,22 +1021,22 @@ static void hash_destroy( struct hash *hash )
NTSTATUS WINAPI BCryptDestroyHash( BCRYPT_HASH_HANDLE handle ) { - struct hash *hash = handle; + struct hash *hash = get_hash_object( handle );
TRACE( "%p\n", handle );
- if (!hash || hash->hdr.magic != MAGIC_HASH) return STATUS_INVALID_PARAMETER; + if (!hash) return STATUS_INVALID_PARAMETER; hash_destroy( hash ); return STATUS_SUCCESS; }
NTSTATUS WINAPI BCryptHashData( BCRYPT_HASH_HANDLE handle, UCHAR *input, ULONG size, ULONG flags ) { - struct hash *hash = handle; + struct hash *hash = get_hash_object( handle );
TRACE( "%p, %p, %lu, %#lx\n", handle, input, size, flags );
- if (!hash || hash->hdr.magic != MAGIC_HASH) return STATUS_INVALID_HANDLE; + if (!hash) return STATUS_INVALID_HANDLE; if (!input) return STATUS_SUCCESS;
return hash_update( &hash->inner, hash->alg_id, input, size ); @@ -1051,11 +1066,11 @@ static NTSTATUS hash_finalize( struct hash *hash, UCHAR *output, ULONG size )
NTSTATUS WINAPI BCryptFinishHash( BCRYPT_HASH_HANDLE handle, UCHAR *output, ULONG size, ULONG flags ) { - struct hash *hash = handle; + struct hash *hash = get_hash_object( handle );
TRACE( "%p, %p, %lu, %#lx\n", handle, output, size, flags );
- if (!hash || hash->hdr.magic != MAGIC_HASH) return STATUS_INVALID_HANDLE; + if (!hash) return STATUS_INVALID_HANDLE; if (!output) return STATUS_INVALID_PARAMETER;
return hash_finalize( hash, output, size ); @@ -1795,11 +1810,11 @@ NTSTATUS WINAPI BCryptGenerateKeyPair( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HAND
NTSTATUS WINAPI BCryptFinalizeKeyPair( BCRYPT_KEY_HANDLE handle, ULONG flags ) { - struct key *key = handle; + struct key *key = get_key_object( handle );
TRACE( "%p, %#lx\n", key, flags ); - if (!key || key->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE;
+ if (!key) return STATUS_INVALID_HANDLE; return UNIX_CALL( key_asymmetric_generate, key ); }
@@ -1823,17 +1838,17 @@ NTSTATUS WINAPI BCryptImportKey( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE dec return key_import( alg, type, ret_handle, object, object_len, input, input_len ); }
-NTSTATUS WINAPI BCryptExportKey( BCRYPT_KEY_HANDLE export_key, BCRYPT_KEY_HANDLE encrypt_key, const WCHAR *type, - UCHAR *output, ULONG output_len, ULONG *size, ULONG flags ) +NTSTATUS WINAPI BCryptExportKey( BCRYPT_KEY_HANDLE export_key_handle, BCRYPT_KEY_HANDLE encrypt_key_handle, + const WCHAR *type, UCHAR *output, ULONG output_len, ULONG *size, ULONG flags ) { - struct key *key = export_key; + struct key *key = get_key_object( export_key_handle );
- TRACE( "%p, %p, %s, %p, %lu, %p, %#lx\n", key, encrypt_key, debugstr_w(type), output, output_len, size, flags ); + TRACE( "%p, %p, %s, %p, %lu, %p, %#lx\n", export_key_handle, encrypt_key_handle, debugstr_w(type), output, + output_len, size, flags );
- if (!key || key->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; + if (!key) return STATUS_INVALID_HANDLE; if (!type || !size) return STATUS_INVALID_PARAMETER; - - if (encrypt_key) + if (encrypt_key_handle) { FIXME( "encryption of key not yet supported\n" ); return STATUS_NOT_IMPLEMENTED; @@ -1881,14 +1896,14 @@ static NTSTATUS key_duplicate( struct key *key_orig, struct key *key_copy ) NTSTATUS WINAPI BCryptDuplicateKey( BCRYPT_KEY_HANDLE handle, BCRYPT_KEY_HANDLE *handle_copy, UCHAR *object, ULONG object_len, ULONG flags ) { - struct key *key_orig = handle; + struct key *key_orig = get_key_object( handle ); struct key *key_copy; NTSTATUS status;
TRACE( "%p, %p, %p, %lu, %#lx\n", handle, handle_copy, object, object_len, flags ); if (object) FIXME( "ignoring object buffer\n" );
- if (!key_orig || key_orig->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; + if (!key_orig) return STATUS_INVALID_HANDLE; if (!handle_copy) return STATUS_INVALID_PARAMETER; if (!(key_copy = malloc( sizeof(*key_copy) ))) return STATUS_NO_MEMORY;
@@ -1930,18 +1945,18 @@ static const WCHAR *resolve_blob_type( const WCHAR *type, UCHAR *input, ULONG in } }
-NTSTATUS WINAPI BCryptImportKeyPair( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE decrypt_key, const WCHAR *type, +NTSTATUS WINAPI BCryptImportKeyPair( BCRYPT_ALG_HANDLE handle, BCRYPT_KEY_HANDLE decrypt_key_handle, const WCHAR *type, BCRYPT_KEY_HANDLE *ret_handle, UCHAR *input, ULONG input_len, ULONG flags ) { struct algorithm *alg = get_alg_object( handle );
- TRACE( "%p, %p, %s, %p, %p, %lu, %#lx\n", handle, decrypt_key, debugstr_w(type), ret_handle, input, + TRACE( "%p, %p, %s, %p, %p, %lu, %#lx\n", handle, decrypt_key_handle, debugstr_w(type), ret_handle, input, input_len, flags );
if (!alg) return STATUS_INVALID_HANDLE; if (!ret_handle || !input || !(type = resolve_blob_type( type, input, input_len ))) return STATUS_INVALID_PARAMETER; - if (decrypt_key) + if (decrypt_key_handle) { FIXME( "decryption of key not yet supported\n" ); return STATUS_NOT_IMPLEMENTED; @@ -1954,12 +1969,12 @@ NTSTATUS WINAPI BCryptSignHash( BCRYPT_KEY_HANDLE handle, void *padding, UCHAR * UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags ) { struct key_asymmetric_sign_params params; - struct key *key = handle; + struct key *key = get_key_object( handle );
TRACE( "%p, %p, %p, %lu, %p, %lu, %p, %#lx\n", handle, padding, input, input_len, output, output_len, ret_len, flags );
- if (!key || key->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; + if (!key) return STATUS_INVALID_HANDLE; if (key_is_symmetric( key )) { FIXME( "signing with symmetric keys not yet supported\n" ); @@ -1981,11 +1996,11 @@ NTSTATUS WINAPI BCryptVerifySignature( BCRYPT_KEY_HANDLE handle, void *padding, UCHAR *signature, ULONG signature_len, ULONG flags ) { struct key_asymmetric_verify_params params; - struct key *key = handle; + struct key *key = get_key_object( handle );
TRACE( "%p, %p, %p, %lu, %p, %lu, %#lx\n", handle, padding, hash, hash_len, signature, signature_len, flags );
- if (!key || key->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; + if (!key) return STATUS_INVALID_HANDLE; if (!hash || !hash_len || !signature || !signature_len) return STATUS_INVALID_PARAMETER; if (key_is_symmetric( key )) return STATUS_NOT_SUPPORTED;
@@ -2001,12 +2016,11 @@ NTSTATUS WINAPI BCryptVerifySignature( BCRYPT_KEY_HANDLE handle, void *padding,
NTSTATUS WINAPI BCryptDestroyKey( BCRYPT_KEY_HANDLE handle ) { - struct key *key = handle; + struct key *key = get_key_object( handle );
TRACE( "%p\n", handle );
- if (!key || key->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; - + if (!key) return STATUS_INVALID_HANDLE; key_destroy( key ); return STATUS_SUCCESS; } @@ -2014,14 +2028,14 @@ NTSTATUS WINAPI BCryptDestroyKey( BCRYPT_KEY_HANDLE handle ) NTSTATUS WINAPI BCryptEncrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG input_len, void *padding, UCHAR *iv, ULONG iv_len, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags ) { - struct key *key = handle; + struct key *key = get_key_object( handle ); struct key_asymmetric_encrypt_params asymmetric_params; NTSTATUS ret;
TRACE( "%p, %p, %lu, %p, %p, %lu, %p, %lu, %p, %#lx\n", handle, input, input_len, padding, iv, iv_len, output, output_len, ret_len, flags );
- if (!key || key->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; + if (!key) return STATUS_INVALID_HANDLE;
if (key_is_symmetric( key )) { @@ -2056,14 +2070,14 @@ NTSTATUS WINAPI BCryptEncrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp NTSTATUS WINAPI BCryptDecrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG input_len, void *padding, UCHAR *iv, ULONG iv_len, UCHAR *output, ULONG output_len, ULONG *ret_len, ULONG flags ) { + struct key *key = get_key_object( handle ); struct key_asymmetric_decrypt_params params; NTSTATUS ret; - struct key *key = handle;
TRACE( "%p, %p, %lu, %p, %p, %lu, %p, %lu, %p, %#lx\n", handle, input, input_len, padding, iv, iv_len, output, output_len, ret_len, flags );
- if (!key || key->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; + if (!key) return STATUS_INVALID_HANDLE;
if (key_is_symmetric( key )) { @@ -2098,7 +2112,7 @@ NTSTATUS WINAPI BCryptDecrypt( BCRYPT_KEY_HANDLE handle, UCHAR *input, ULONG inp
NTSTATUS WINAPI BCryptSetProperty( BCRYPT_HANDLE handle, const WCHAR *prop, UCHAR *value, ULONG size, ULONG flags ) { - struct object *object = handle; + struct object *object = get_object( handle, 0 );
TRACE( "%p, %s, %p, %lu, %#lx\n", handle, debugstr_w(prop), value, size, flags );
@@ -2126,17 +2140,16 @@ NTSTATUS WINAPI BCryptSetProperty( BCRYPT_HANDLE handle, const WCHAR *prop, UCHA #define HMAC_PAD_LEN 64 NTSTATUS WINAPI BCryptDeriveKeyCapi( BCRYPT_HASH_HANDLE handle, BCRYPT_ALG_HANDLE halg, UCHAR *key, ULONG keylen, ULONG flags ) { - struct hash *hash = handle; + struct hash *hash = get_hash_object( handle ); UCHAR buf[MAX_HASH_OUTPUT_BYTES * 2]; NTSTATUS status; ULONG len;
TRACE( "%p, %p, %p, %lu, %#lx\n", handle, halg, key, keylen, flags );
+ if (!hash) return STATUS_INVALID_HANDLE; if (!key || !keylen) return STATUS_INVALID_PARAMETER; - if (!hash || hash->hdr.magic != MAGIC_HASH) return STATUS_INVALID_HANDLE; if (keylen > builtin_algorithms[hash->alg_id].hash_length * 2) return STATUS_INVALID_PARAMETER; - if (halg) { FIXME( "algorithm handle not supported\n" ); @@ -2275,33 +2288,32 @@ NTSTATUS WINAPI BCryptDeriveKeyPBKDF2( BCRYPT_ALG_HANDLE handle, UCHAR *pwd, ULO return derive_key_pbkdf2( alg, pwd, pwd_len, salt, salt_len, iterations, dk, dk_len ); }
-NTSTATUS WINAPI BCryptSecretAgreement( BCRYPT_KEY_HANDLE privatekey, BCRYPT_KEY_HANDLE publickey, - BCRYPT_SECRET_HANDLE *handle, ULONG flags ) +NTSTATUS WINAPI BCryptSecretAgreement( BCRYPT_KEY_HANDLE privkey_handle, BCRYPT_KEY_HANDLE pubkey_handle, + BCRYPT_SECRET_HANDLE *ret_handle, ULONG flags ) { - struct key *privkey = privatekey; - struct key *pubkey = publickey; + struct key *privkey = get_key_object( privkey_handle ); + struct key *pubkey = get_key_object( pubkey_handle ); struct secret *secret;
- FIXME( "%p, %p, %p, %#lx\n", privatekey, publickey, handle, flags ); + FIXME( "%p, %p, %p, %#lx\n", privkey_handle, pubkey_handle, ret_handle, flags );
- if (!privkey || privkey->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; - if (!pubkey || pubkey->hdr.magic != MAGIC_KEY) return STATUS_INVALID_HANDLE; - if (!handle) return STATUS_INVALID_PARAMETER; + if (!privkey || !pubkey) return STATUS_INVALID_HANDLE; + if (!ret_handle) return STATUS_INVALID_PARAMETER;
if (!(secret = calloc( 1, sizeof(*secret) ))) return STATUS_NO_MEMORY; secret->hdr.magic = MAGIC_SECRET;
- *handle = secret; + *ret_handle = secret; return STATUS_SUCCESS; }
-NTSTATUS WINAPI BCryptDestroySecret(BCRYPT_SECRET_HANDLE handle) +NTSTATUS WINAPI BCryptDestroySecret( BCRYPT_SECRET_HANDLE handle ) { - struct secret *secret = handle; + struct secret *secret = get_secret_object( handle );
FIXME( "%p\n", handle );
- if (!secret || secret->hdr.magic != MAGIC_SECRET) return STATUS_INVALID_HANDLE; + if (!secret) return STATUS_INVALID_HANDLE; destroy_object( &secret->hdr ); return STATUS_SUCCESS; } @@ -2309,11 +2321,11 @@ NTSTATUS WINAPI BCryptDestroySecret(BCRYPT_SECRET_HANDLE handle) NTSTATUS WINAPI BCryptDeriveKey( BCRYPT_SECRET_HANDLE handle, const WCHAR *kdf, BCryptBufferDesc *parameter, UCHAR *derived, ULONG derived_size, ULONG *result, ULONG flags ) { - struct secret *secret = handle; + struct secret *secret = get_secret_object( handle );
FIXME( "%p, %s, %p, %p, %lu, %p, %#lx\n", secret, debugstr_w(kdf), parameter, derived, derived_size, result, flags );
- if (!secret || secret->hdr.magic != MAGIC_SECRET) return STATUS_INVALID_HANDLE; + if (!secret) return STATUS_INVALID_HANDLE; if (!kdf) return STATUS_INVALID_PARAMETER;
return STATUS_INTERNAL_ERROR;
From: Hans Leidekker hans@codeweavers.com
--- dlls/bcrypt/bcrypt_main.c | 19 ++++++++++++------- dlls/bcrypt/tests/bcrypt.c | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index e2eb8e95057..266c30fa426 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -496,7 +496,7 @@ static NTSTATUS hash_update( struct hash_impl *hash, enum alg_id alg_id, UCHAR * return STATUS_SUCCESS; }
-static NTSTATUS hash_finish( struct hash_impl *hash, enum alg_id alg_id, UCHAR *output, ULONG size ) +static NTSTATUS hash_finish( struct hash_impl *hash, enum alg_id alg_id, UCHAR *output ) { switch (alg_id) { @@ -920,8 +920,7 @@ static NTSTATUS hash_prepare( struct hash *hash ) struct hash_impl temp; if ((status = hash_init( &temp, hash->alg_id ))) return status; if ((status = hash_update( &temp, hash->alg_id, hash->secret, hash->secret_len ))) return status; - if ((status = hash_finish( &temp, hash->alg_id, buffer, - builtin_algorithms[hash->alg_id].hash_length ))) return status; + if ((status = hash_finish( &temp, hash->alg_id, buffer ))) return status; } else memcpy( buffer, hash->secret, hash->secret_len );
@@ -1050,15 +1049,15 @@ static NTSTATUS hash_finalize( struct hash *hash, UCHAR *output, ULONG size )
if (!(hash->flags & HASH_FLAG_HMAC)) { - if ((status = hash_finish( &hash->inner, hash->alg_id, output, size ))) return status; + if ((status = hash_finish( &hash->inner, hash->alg_id, output ))) return status; if (hash->flags & HASH_FLAG_REUSABLE) return hash_prepare( hash ); return STATUS_SUCCESS; }
hash_length = builtin_algorithms[hash->alg_id].hash_length; - if ((status = hash_finish( &hash->inner, hash->alg_id, buffer, hash_length ))) return status; + if ((status = hash_finish( &hash->inner, hash->alg_id, buffer ))) return status; if ((status = hash_update( &hash->outer, hash->alg_id, buffer, hash_length ))) return status; - if ((status = hash_finish( &hash->outer, hash->alg_id, output, size ))) return status; + if ((status = hash_finish( &hash->outer, hash->alg_id, output ))) return status;
if (hash->flags & HASH_FLAG_REUSABLE) return hash_prepare( hash ); return STATUS_SUCCESS; @@ -1071,7 +1070,7 @@ NTSTATUS WINAPI BCryptFinishHash( BCRYPT_HASH_HANDLE handle, UCHAR *output, ULON TRACE( "%p, %p, %lu, %#lx\n", handle, output, size, flags );
if (!hash) return STATUS_INVALID_HANDLE; - if (!output) return STATUS_INVALID_PARAMETER; + if (!output || size != builtin_algorithms[hash->alg_id].hash_length) return STATUS_INVALID_PARAMETER;
return hash_finalize( hash, output, size ); } @@ -1086,8 +1085,14 @@ NTSTATUS WINAPI BCryptHash( BCRYPT_ALG_HANDLE handle, UCHAR *secret, ULONG secre TRACE( "%p, %p, %lu, %p, %lu, %p, %lu\n", handle, secret, secret_len, input, input_len, output, output_len );
if (!alg) return STATUS_INVALID_HANDLE; + if (!output) return STATUS_INVALID_PARAMETER;
if ((status = hash_create( alg, secret, secret_len, 0, &hash ))) return status; + if (output_len != builtin_algorithms[hash->alg_id].hash_length) + { + hash_destroy( hash ); + return STATUS_INVALID_PARAMETER; + } if ((status = hash_update( &hash->inner, hash->alg_id, input, input_len ))) { hash_destroy( hash ); diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index d30e8888e49..2035ce346e6 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -330,8 +330,23 @@ static void test_hash(const struct hash_test *test)
if (pBCryptHash) { + ret = pBCryptHash(BCRYPT_SHA1_ALG_HANDLE, NULL, 0, NULL, 0, hash_buf, 20); + ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); + ret = pBCryptHash(BCRYPT_SHA1_ALG_HANDLE, NULL, 0, (UCHAR *)"test", sizeof("test"), NULL, 20); + ok(ret == STATUS_INVALID_PARAMETER, "got %#lx\n", ret); + ret = pBCryptHash(BCRYPT_SHA1_ALG_HANDLE, NULL, 0, (UCHAR *)"test", sizeof("test"), hash_buf, 21); + ok(ret == STATUS_INVALID_PARAMETER, "got %#lx\n", ret); + ret = pBCryptHash(BCRYPT_SHA1_ALG_HANDLE, NULL, 0, (UCHAR *)"test", sizeof("test"), hash_buf, 20); + ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); + ret = BCryptCreateHash(BCRYPT_SHA1_ALG_HANDLE, &hash, NULL, 0, NULL, 0, 0); ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); + ret = BCryptHashData(hash, (UCHAR *)"test", sizeof("test"), 0); + ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); + ret = BCryptFinishHash(hash, hash_buf, 21, 0); + ok(ret == STATUS_INVALID_PARAMETER, "got %#lx\n", ret); + ret = BCryptFinishHash(hash, hash_buf, 20, 0); + ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); ret = BCryptDestroyHash(hash); ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); }