bcrypt: Implement BCryptHashData.
authorHans Leidekker <hans@codeweavers.com>
Wed, 6 Jan 2016 13:19:18 +0000 (14:19 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 6 Jan 2016 17:08:34 +0000 (18:08 +0100)
Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
dlls/bcrypt/bcrypt.spec
dlls/bcrypt/bcrypt_main.c

index 53db32a38dda4fbd25f26844e295971b608ad43a..5d67516acd068257399ea14e2b55c279f0471156 100644 (file)
@@ -29,7 +29,7 @@
 @ stub BCryptGenerateSymmetricKey
 @ stdcall BCryptGetFipsAlgorithmMode(ptr)
 @ stdcall BCryptGetProperty(ptr wstr ptr long ptr long)
-@ stub BCryptHashData
+@ stdcall BCryptHashData(ptr ptr long long)
 @ stub BCryptImportKey
 @ stub BCryptImportKeyPair
 @ stdcall BCryptOpenAlgorithmProvider(ptr wstr wstr long)
index 9ad3060aa9b6f9c7275e9b21345e4ec603cb1c4b..806fee85fbcdb6269f069a775183586a18b41303 100644 (file)
@@ -202,6 +202,32 @@ static NTSTATUS hash_init( struct hash *hash )
     }
     return STATUS_SUCCESS;
 }
+
+static void hash_update( struct hash *hash, UCHAR *input, ULONG size )
+{
+    switch (hash->alg_id)
+    {
+    case ALG_ID_SHA1:
+        CC_SHA1_Update( &hash->u.sha1_ctx, input, size );
+        break;
+
+    case ALG_ID_SHA256:
+        CC_SHA256_Update( &hash->u.sha256_ctx, input, size );
+        break;
+
+    case ALG_ID_SHA384:
+        CC_SHA384_Update( &hash->u.sha512_ctx, input, size );
+        break;
+
+    case ALG_ID_SHA512:
+        CC_SHA512_Update( &hash->u.sha512_ctx, input, size );
+        break;
+
+    default:
+        ERR( "unhandled id %u\n", hash->alg_id );
+        break;
+    }
+}
 #else
 struct hash
 {
@@ -214,6 +240,11 @@ static NTSTATUS hash_init( struct hash *hash )
     ERR( "support for hashes not available at build time\n" );
     return STATUS_NOT_IMPLEMENTED;
 }
+
+static void hash_update( struct hash *hash, UCHAR *input, ULONG size )
+{
+    ERR( "support for hashes not available at build time\n" );
+}
 #endif
 
 #define OBJECT_LENGTH_SHA1      278
@@ -410,3 +441,16 @@ NTSTATUS WINAPI BCryptDestroyHash( BCRYPT_HASH_HANDLE handle )
     HeapFree( GetProcessHeap(), 0, hash );
     return STATUS_SUCCESS;
 }
+
+NTSTATUS WINAPI BCryptHashData( BCRYPT_HASH_HANDLE handle, UCHAR *input, ULONG size, ULONG flags )
+{
+    struct hash *hash = handle;
+
+    TRACE( "%p, %p, %u, %08x\n", handle, input, size, flags );
+
+    if (!hash || hash->hdr.magic != MAGIC_HASH) return STATUS_INVALID_HANDLE;
+    if (!input) return STATUS_INVALID_PARAMETER;
+
+    hash_update( hash, input, size );
+    return STATUS_SUCCESS;
+}