From: Sven Püschel <Sven\u2007Pschel@akarisu.de>
Finish the Hash before trying to sign it, as Windows will also allow this behaviour.
Signed-off-by: Sven Püschel <Sven Püschel@akarisu.de> --- dlls/dssenh/main.c | 6 ++++++ dlls/dssenh/tests/dssenh.c | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/dssenh/main.c b/dlls/dssenh/main.c index f6f01772d35..fa6993f9317 100644 --- a/dlls/dssenh/main.c +++ b/dlls/dssenh/main.c @@ -994,6 +994,12 @@ BOOL WINAPI CPSignHash( HCRYPTPROV hprov, HCRYPTHASH hhash, DWORD keyspec, const TRACE( "%p, %p, %lu, %s, %08lx, %p, %p\n", (void *)hprov, (void *)hhash, keyspec, debugstr_w(desc), flags, sig, siglen );
+ if (!hash->finished) + { + if (BCryptFinishHash( hash->handle, hash->value, hash->len, 0 )) return FALSE; + hash->finished = TRUE; + } + if (container->magic != MAGIC_CONTAINER || !container->sign_key) return FALSE; if (hash->magic != MAGIC_HASH) return FALSE;
diff --git a/dlls/dssenh/tests/dssenh.c b/dlls/dssenh/tests/dssenh.c index 2f9e491c0e0..29125386f79 100644 --- a/dlls/dssenh/tests/dssenh.c +++ b/dlls/dssenh/tests/dssenh.c @@ -937,7 +937,7 @@ static void test_signhash(HCRYPTPROV hProv, const struct signature_test *test)
/* Verify signed hash 1 */ result = CryptVerifySignatureA(hHash, signValue1, sizeof(signValue1), pubKey, NULL, 0); - todo_wine ok(result, "Failed to verify signature, got %lx\n", GetLastError()); + ok(result, "Failed to verify signature, got %lx\n", GetLastError());
result = CryptDestroyHash(hHash); ok(result, "Failed to destroy hash, got %lx\n", GetLastError()); @@ -951,7 +951,7 @@ static void test_signhash(HCRYPTPROV hProv, const struct signature_test *test)
/* Verify signed hash 2 */ result = CryptVerifySignatureA(hHash, signValue2, sizeof(signValue2), pubKey, NULL, 0); - todo_wine ok(result, "Failed to verify signature, got %lx\n", GetLastError()); + ok(result, "Failed to verify signature, got %lx\n", GetLastError());
result = CryptDestroyHash(hHash); ok(result, "Failed to destroy hash, got %lx\n", GetLastError());