[PATCH 4/5] dssenh: Implement CPGetHashParam.

Hans Leidekker hans at codeweavers.com
Fri Oct 9 05:45:59 CDT 2020


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/dssenh/main.c         | 40 +++++++++++++++++++++++++++++++++++++-
 dlls/dssenh/tests/dssenh.c |  5 -----
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/dlls/dssenh/main.c b/dlls/dssenh/main.c
index 44912ed4989..a3a4e1b2c37 100644
--- a/dlls/dssenh/main.c
+++ b/dlls/dssenh/main.c
@@ -431,7 +431,45 @@ BOOL WINAPI CPHashData( HCRYPTPROV hprov, HCRYPTHASH hhash, const BYTE *data, DW
 
 BOOL WINAPI CPGetHashParam( HCRYPTPROV hprov, HCRYPTHASH hhash, DWORD param, BYTE *data, DWORD *len, DWORD flags )
 {
-    return FALSE;
+    struct hash *hash = (struct hash *)hhash;
+
+    TRACE( "%p, %p, %08x, %p, %p, %08x\n", (void *)hprov, (void *)hhash, param, data, len, flags );
+
+    if (hash->magic != MAGIC_HASH) return FALSE;
+
+    switch (param)
+    {
+    case HP_HASHSIZE:
+        if (sizeof(hash->len) > *len)
+        {
+            *len = sizeof(hash->len);
+            SetLastError( ERROR_MORE_DATA );
+            return FALSE;
+        }
+        *(DWORD *)data = hash->len;
+        *len = sizeof(hash->len);
+        return TRUE;
+
+    case HP_HASHVAL:
+        if (!hash->finished)
+        {
+            if (BCryptFinishHash( hash->handle, hash->value, hash->len, 0 )) return FALSE;
+            hash->finished = TRUE;
+        }
+        if (hash->len > *len)
+        {
+            *len = hash->len;
+            SetLastError( ERROR_MORE_DATA );
+            return FALSE;
+        }
+        memcpy( data, hash->value, hash->len );
+        *len = hash->len;
+        return TRUE;
+
+    default:
+        SetLastError( NTE_BAD_TYPE );
+        return FALSE;
+    }
 }
 
 BOOL WINAPI CPDeriveKey( HCRYPTPROV hprov, ALG_ID algid, HCRYPTHASH hhash, DWORD flags, HCRYPTKEY *ret_key )
diff --git a/dlls/dssenh/tests/dssenh.c b/dlls/dssenh/tests/dssenh.c
index cc4650b2c83..3bd546524f0 100644
--- a/dlls/dssenh/tests/dssenh.c
+++ b/dlls/dssenh/tests/dssenh.c
@@ -453,11 +453,6 @@ static void test_hash(const struct hash_test *tests, int testLen)
 
         dataLen = sizeof(DWORD);
         result = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE *)&hashLen, &dataLen, 0);
-        if (!result)
-        {
-            skip("skipping hash tests\n");
-            return;
-        }
         ok(result && (hashLen == tests[i].hashLen), "Expected %d hash len, got %d.Error: %x\n",
             tests[i].hashLen, hashLen, GetLastError());
 
-- 
2.28.0




More information about the wine-devel mailing list