From f0e499f292173fdd40aee2f11934e7e679f26bad Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 29 Jan 2016 14:25:23 +0100 Subject: [PATCH] bcrypt: Make BCRYPT_HASH_LENGTH implementation more generic. Signed-off-by: Jacek Caban Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/bcrypt/bcrypt_main.c | 118 ++++++++++++-------------------------- 1 file changed, 37 insertions(+), 81 deletions(-) diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index e6da3794c12..9afd3bc2d8c 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -174,10 +174,19 @@ struct object enum alg_id { - ALG_ID_SHA1 = 1, - ALG_ID_SHA256 = 2, - ALG_ID_SHA384 = 3, - ALG_ID_SHA512 = 4 + ALG_ID_SHA1, + ALG_ID_SHA256, + ALG_ID_SHA384, + ALG_ID_SHA512 +}; + +static const struct { + ULONG hash_length; +} alg_props[] = { + /* ALG_ID_SHA1 */ { 20 }, + /* ALG_ID_SHA256 */ { 32 }, + /* ALG_ID_SHA384 */ { 48 }, + /* ALG_ID_SHA512 */ { 64 } }; struct algorithm @@ -421,15 +430,30 @@ static NTSTATUS hash_finish( struct hash *hash, UCHAR *output, ULONG size ) #define OBJECT_LENGTH_SHA384 382 #define OBJECT_LENGTH_SHA512 382 -#define HASH_DIGEST_LENGTH_SHA1 20 -#define HASH_DIGEST_LENGTH_SHA256 32 -#define HASH_DIGEST_LENGTH_SHA384 48 -#define HASH_DIGEST_LENGTH_SHA512 64 +static NTSTATUS generic_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size ) +{ + if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) + { + *ret_size = sizeof(ULONG); + if (size < sizeof(ULONG)) + return STATUS_BUFFER_TOO_SMALL; + if(buf) + *(ULONG*)buf = alg_props[id].hash_length; + return STATUS_SUCCESS; + } + + return STATUS_NOT_IMPLEMENTED; +} static NTSTATUS get_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size ) { + NTSTATUS status; ULONG value; + status = generic_alg_property( id, prop, buf, size, ret_size ); + if (status != STATUS_NOT_IMPLEMENTED) + return status; + switch (id) { case ALG_ID_SHA1: @@ -438,11 +462,6 @@ static NTSTATUS get_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, value = OBJECT_LENGTH_SHA1; break; } - else if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA1; - break; - } FIXME( "unsupported sha1 algorithm property %s\n", debugstr_w(prop) ); return STATUS_NOT_IMPLEMENTED; @@ -452,11 +471,6 @@ static NTSTATUS get_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, value = OBJECT_LENGTH_SHA256; break; } - else if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA256; - break; - } FIXME( "unsupported sha256 algorithm property %s\n", debugstr_w(prop) ); return STATUS_NOT_IMPLEMENTED; @@ -466,11 +480,6 @@ static NTSTATUS get_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, value = OBJECT_LENGTH_SHA384; break; } - else if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA384; - break; - } FIXME( "unsupported sha384 algorithm property %s\n", debugstr_w(prop) ); return STATUS_NOT_IMPLEMENTED; @@ -480,11 +489,6 @@ static NTSTATUS get_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, value = OBJECT_LENGTH_SHA512; break; } - else if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA512; - break; - } FIXME( "unsupported sha512 algorithm property %s\n", debugstr_w(prop) ); return STATUS_NOT_IMPLEMENTED; @@ -506,60 +510,12 @@ static NTSTATUS get_alg_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, static NTSTATUS get_hash_property( enum alg_id id, const WCHAR *prop, UCHAR *buf, ULONG size, ULONG *ret_size ) { - ULONG value; + NTSTATUS status; - switch (id) - { - case ALG_ID_SHA1: - if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA1; - break; - } - FIXME( "unsupported sha1 hash property %s\n", debugstr_w(prop) ); - return STATUS_NOT_IMPLEMENTED; - - case ALG_ID_SHA256: - if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA256; - break; - } - FIXME( "unsupported sha256 hash property %s\n", debugstr_w(prop) ); - return STATUS_NOT_IMPLEMENTED; - - case ALG_ID_SHA384: - if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA384; - break; - } - FIXME( "unsupported sha384 hash property %s\n", debugstr_w(prop) ); - return STATUS_NOT_IMPLEMENTED; - - case ALG_ID_SHA512: - if (!strcmpW( prop, BCRYPT_HASH_LENGTH )) - { - value = HASH_DIGEST_LENGTH_SHA512; - break; - } - FIXME( "unsupported sha512 hash property %s\n", debugstr_w(prop) ); - return STATUS_NOT_IMPLEMENTED; - - default: - FIXME( "unsupported hash %u\n", id ); - return STATUS_NOT_IMPLEMENTED; - } - - if (size < sizeof(ULONG)) - { - *ret_size = sizeof(ULONG); - return STATUS_BUFFER_TOO_SMALL; - } - if (buf) *(ULONG *)buf = value; - *ret_size = sizeof(ULONG); - - return STATUS_SUCCESS; + 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; } NTSTATUS WINAPI BCryptGetProperty( BCRYPT_HANDLE handle, LPCWSTR prop, UCHAR *buffer, ULONG count, ULONG *res, ULONG flags )