Juan Lang : crypt32: Implement getting a hash message's hash value.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 13 08:30:24 CDT 2007


Module: wine
Branch: master
Commit: bb1246a51c5c8509ebfbcca324b7ad907739a67f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bb1246a51c5c8509ebfbcca324b7ad907739a67f

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Jul 12 14:44:59 2007 -0700

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 1918713..2a401b8 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 7f03516..96e901b 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);




More information about the wine-cvs mailing list