From 8ff5c52b14388e2d84f67a3a6c6f17b89d50100d Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 9 Oct 2020 12:45:59 +0200 Subject: [PATCH] dssenh: Implement CPGetHashParam. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- 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());