Module: wine Branch: master Commit: 03e94320c21cabf503a2eae2175d6a1989aebdcc URL: http://source.winehq.org/git/wine.git/?a=commit;h=03e94320c21cabf503a2eae217...
Author: Alexander Morozov amorozov@etersoft.ru Date: Wed Dec 1 14:36:02 2010 +0300
crypt32: Implement updating enveloped messages.
---
dlls/crypt32/msg.c | 66 ++++++++++++++++++++++++++++++++++++++++++++- dlls/crypt32/tests/msg.c | 14 ---------- 2 files changed, 64 insertions(+), 16 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c index 1ca4d0e..2b93a5b 100644 --- a/dlls/crypt32/msg.c +++ b/dlls/crypt32/msg.c @@ -1793,8 +1793,70 @@ static BOOL CEnvelopedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType, static BOOL CEnvelopedEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, DWORD cbData, BOOL fFinal) { - FIXME("(%p, %p, %d, %d): stub\n", hCryptMsg, pbData, cbData, fFinal); - return FALSE; + CEnvelopedEncodeMsg *msg = hCryptMsg; + BOOL ret = FALSE; + + if (msg->base.state == MsgStateFinalized) + SetLastError(CRYPT_E_MSG_ERROR); + else if (msg->base.streamed) + { + FIXME("streamed stub\n"); + msg->base.state = fFinal ? MsgStateFinalized : MsgStateUpdated; + ret = TRUE; + } + else + { + if (!fFinal) + { + if (msg->base.open_flags & CMSG_DETACHED_FLAG) + SetLastError(E_INVALIDARG); + else + SetLastError(CRYPT_E_MSG_ERROR); + } + else + { + if (cbData) + { + DWORD dataLen = cbData; + + msg->data.cbData = cbData; + msg->data.pbData = CryptMemAlloc(cbData); + if (msg->data.pbData) + { + memcpy(msg->data.pbData, pbData, cbData); + ret = CryptEncrypt(msg->key, 0, TRUE, 0, msg->data.pbData, + &dataLen, msg->data.cbData); + msg->data.cbData = dataLen; + if (dataLen > cbData) + { + msg->data.pbData = CryptMemRealloc(msg->data.pbData, + dataLen); + if (msg->data.pbData) + { + dataLen = cbData; + ret = CryptEncrypt(msg->key, 0, TRUE, 0, + msg->data.pbData, &dataLen, msg->data.cbData); + } + else + ret = FALSE; + } + if (!ret) + CryptMemFree(msg->data.pbData); + } + else + ret = FALSE; + if (!ret) + { + msg->data.cbData = 0; + msg->data.pbData = NULL; + } + } + else + ret = TRUE; + msg->base.state = MsgStateFinalized; + } + } + return ret; }
static HCRYPTMSG CEnvelopedEncodeMsg_Open(DWORD dwFlags, diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c index fb7a7c2..9ffae52 100644 --- a/dlls/crypt32/tests/msg.c +++ b/dlls/crypt32/tests/msg.c @@ -2118,16 +2118,13 @@ static void test_enveloped_msg_update(void) { SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, FALSE); - todo_wine ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, TRUE); - todo_wine ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, TRUE); - todo_wine ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); CryptMsgClose(msg); @@ -2142,18 +2139,15 @@ static void test_enveloped_msg_update(void) { SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); - todo_wine ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); - todo_wine ok(ret || broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */ "CryptMsgUpdate failed: %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, TRUE); - todo_wine ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); CryptMsgClose(msg); @@ -2168,12 +2162,10 @@ static void test_enveloped_msg_update(void) { SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, FALSE); - todo_wine ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, TRUE); - todo_wine ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); CryptMsgClose(msg); } @@ -2187,12 +2179,10 @@ static void test_enveloped_msg_update(void) { SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); - todo_wine ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); - todo_wine ok(ret || broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */ "CryptMsgUpdate failed: %08x\n", GetLastError()); @@ -2208,11 +2198,9 @@ static void test_enveloped_msg_update(void) { SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, FALSE); - todo_wine ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, NULL, 0, TRUE); - todo_wine ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); CryptMsgClose(msg); } @@ -2226,11 +2214,9 @@ static void test_enveloped_msg_update(void) { SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); - todo_wine ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); - todo_wine ok(ret || broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */ "CryptMsgUpdate failed: %08x\n", GetLastError());