Juan Lang : crypt32:
Implement CryptMsgUpdate for data messages opened to encode.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jun 29 08:14:39 CDT 2007
Module: wine
Branch: master
Commit: 74bf713be79c40be97c37f2a83257e04447300e7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=74bf713be79c40be97c37f2a83257e04447300e7
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Jun 28 17:14:02 2007 -0700
crypt32: Implement CryptMsgUpdate for data messages opened to encode.
---
dlls/crypt32/msg.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/crypt32/tests/msg.c | 8 -------
2 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index c701107..b88694a 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -58,8 +58,57 @@ static inline void CryptMsgBase_Init(CryptMsgBase *msg, DWORD dwFlags,
typedef struct _CDataEncodeMsg
{
CryptMsgBase base;
+ DWORD bare_content_len;
+ LPBYTE bare_content;
} CDataEncodeMsg;
+static const BYTE empty_data_content[] = { 0x04,0x00 };
+
+static void CDataEncodeMsg_Close(HCRYPTMSG hCryptMsg)
+{
+ CDataEncodeMsg *msg = (CDataEncodeMsg *)hCryptMsg;
+
+ if (msg->bare_content != empty_data_content)
+ LocalFree(msg->bare_content);
+}
+
+static BOOL CDataEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
+ DWORD cbData, BOOL fFinal)
+{
+ CDataEncodeMsg *msg = (CDataEncodeMsg *)hCryptMsg;
+ BOOL ret = FALSE;
+
+ if (msg->base.finalized)
+ SetLastError(CRYPT_E_MSG_ERROR);
+ else if (!fFinal)
+ {
+ if (msg->base.open_flags & CMSG_DETACHED_FLAG)
+ SetLastError(E_INVALIDARG);
+ else
+ SetLastError(CRYPT_E_MSG_ERROR);
+ }
+ else
+ {
+ msg->base.finalized = TRUE;
+ if (!cbData)
+ SetLastError(E_INVALIDARG);
+ else
+ {
+ CRYPT_DATA_BLOB blob = { cbData, (LPBYTE)pbData };
+
+ /* data messages don't allow non-final updates, don't bother
+ * checking whether data already exist, they can't.
+ */
+ ret = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_OCTET_STRING,
+ &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &msg->bare_content,
+ &msg->bare_content_len);
+ if (ret && msg->base.stream_info)
+ FIXME("stream info unimplemented\n");
+ }
+ }
+ return ret;
+}
+
static HCRYPTMSG CDataEncodeMsg_Open(DWORD dwFlags, const void *pvMsgEncodeInfo,
LPSTR pszInnerContentObjID, PCMSG_STREAM_INFO pStreamInfo)
{
@@ -75,6 +124,10 @@ static HCRYPTMSG CDataEncodeMsg_Open(DWORD dwFlags, const void *pvMsgEncodeInfo,
if (msg)
{
CryptMsgBase_Init((CryptMsgBase *)msg, dwFlags, pStreamInfo);
+ msg->base.close = CDataEncodeMsg_Close;
+ msg->base.update = CDataEncodeMsg_Update;
+ msg->bare_content_len = sizeof(empty_data_content);
+ msg->bare_content = (LPBYTE)empty_data_content;
}
return (HCRYPTMSG)msg;
}
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index df5e83f..03d0abf 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -309,17 +309,14 @@ static void test_data_msg_update(void)
/* Can't update a message that wasn't opened detached with final = FALSE */
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, NULL, 0, FALSE);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR,
"Expected CRYPT_E_MSG_ERROR, got %x\n", GetLastError());
/* Updating it with final = TRUE succeeds */
ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
- todo_wine
ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
/* Any subsequent update will fail, as the last was final */
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR,
"Expected CRYPT_E_MSG_ERROR, got %x\n", GetLastError());
CryptMsgClose(msg);
@@ -329,7 +326,6 @@ static void test_data_msg_update(void)
/* Can't update a message with no data */
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, NULL, 0, TRUE);
- todo_wine {
ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %x\n", GetLastError());
/* Curiously, a valid update will now fail as well, presumably because of
@@ -338,7 +334,6 @@ static void test_data_msg_update(void)
ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR,
"Expected CRYPT_E_MSG_ERROR, got %x\n", GetLastError());
- }
CryptMsgClose(msg);
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG,
@@ -346,16 +341,13 @@ static void test_data_msg_update(void)
/* Dont appear to be able to update CMSG-DATA with non-final updates */
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, NULL, 0, FALSE);
- todo_wine
ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %x\n", GetLastError());
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE);
- todo_wine
ok(!ret && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %x\n", GetLastError());
ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
- todo_wine
ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError());
CryptMsgClose(msg);
}
More information about the wine-cvs
mailing list