From bb1246a51c5c8509ebfbcca324b7ad907739a67f Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 12 Jul 2007 14:44:59 -0700 Subject: [PATCH] crypt32: Implement getting a hash message's hash value. --- dlls/crypt32/msg.c | 18 ++++++++++++++++-- dlls/crypt32/tests/msg.c | 41 ++++------------------------------------ 2 files changed, 20 insertions(+), 39 deletions(-) diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c index 1918713fca..2a401b8c98 100644 --- a/dlls/crypt32/msg.c +++ b/dlls/crypt32/msg.c @@ -332,9 +332,23 @@ static void CHashEncodeMsg_Close(HCRYPTMSG hCryptMsg) static BOOL CHashEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType, DWORD dwIndex, void *pvData, DWORD *pcbData) { - FIXME("(%p, %d, %d, %p, %p): stub\n", hCryptMsg, dwParamType, dwIndex, + CHashEncodeMsg *msg = (CHashEncodeMsg *)hCryptMsg; + BOOL ret = FALSE; + + TRACE("(%p, %d, %d, %p, %p)\n", hCryptMsg, dwParamType, dwIndex, pvData, pcbData); - return FALSE; + + switch (dwParamType) + { + case CMSG_COMPUTED_HASH_PARAM: + ret = CryptGetHashParam(msg->hash, HP_HASHVAL, (BYTE *)pvData, pcbData, + 0); + break; + default: + FIXME("%d: stub\n", dwParamType); + ret = FALSE; + } + return ret; } static BOOL CHashEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c index 7f0351674d..96e901b33f 100644 --- a/dlls/crypt32/tests/msg.c +++ b/dlls/crypt32/tests/msg.c @@ -776,24 +776,22 @@ static void test_hash_msg_get_param(void) /* The hash is also available. */ size = 0; ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); - todo_wine { ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); ok(size == sizeof(buf), "Unexpected size %d\n", size); ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); - } if (size == sizeof(buf)) ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); size = 0; ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); - todo_wine { ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); ok(size == sizeof(buf), "Unexpected size %d\n", size); ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - } - /* Oddly, the hash doesn't seem to change even after an update */ + /* The hash doesn't seem to change even after an update, which matches + * how rsaenh behaves - an update can't happen after the has is retrieved. + */ ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); /* So is the version. */ size = 0; @@ -829,61 +827,30 @@ static void test_hash_msg_get_param(void) /* The hash is still available. */ size = 0; ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); - todo_wine { ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); ok(size == sizeof(buf), "Unexpected size %d\n", size); ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - } if (size == sizeof(buf)) ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); /* An empty update has no effect on the hash */ CryptMsgUpdate(msg, NULL, 0, FALSE); size = 0; ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); - todo_wine { ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); ok(size == sizeof(buf), "Unexpected size %d\n", size); ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - } if (size == sizeof(buf)) ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); - /* A non-empty update doesn't appear to either? */ + /* A non-empty update doesn't either - see above comments. */ CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); size = 0; ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); - todo_wine { ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); ok(size == sizeof(buf), "Unexpected size %d\n", size); ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - } - if (size == sizeof(buf)) - ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); - CryptMsgClose(msg); - /* A detached message similarly has a non-updating hash */ - msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, - CMSG_HASHED, &hashInfo, NULL, NULL); - size = 0; - ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); - todo_wine { - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - ok(size == sizeof(buf), "Unexpected size %d\n", size); - ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - } - if (size == sizeof(buf)) - ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); - CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); - size = 0; - ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, NULL, &size); - todo_wine { - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - ok(size == sizeof(buf), "Unexpected size %d\n", size); - ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); - ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); - } if (size == sizeof(buf)) ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); CryptMsgClose(msg);