Juan Lang : crypt32: Rewrite CDecodeMsg_Update for better detached data handling.
Alexandre Julliard
julliard at winehq.org
Thu Aug 21 10:02:14 CDT 2008
Module: wine
Branch: master
Commit: 0a8d14c2e67d8e95c0057da1c996dbf103b047fc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0a8d14c2e67d8e95c0057da1c996dbf103b047fc
Author: Juan Lang <juan.lang at gmail.com>
Date: Wed Aug 20 12:03:37 2008 -0700
crypt32: Rewrite CDecodeMsg_Update for better detached data handling.
---
dlls/crypt32/msg.c | 68 +++++++++++++++++++++++++++-------------------
dlls/crypt32/tests/msg.c | 1 -
2 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index be12218..d657b87 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -1491,6 +1491,7 @@ typedef struct _CDecodeMsg
CSignedMsgData signed_data;
} u;
CRYPT_DATA_BLOB msg_data;
+ CRYPT_DATA_BLOB detached_data;
PCONTEXT_PROPERTY_LIST properties;
} CDecodeMsg;
@@ -1515,6 +1516,7 @@ static void CDecodeMsg_Close(HCRYPTMSG hCryptMsg)
break;
}
CryptMemFree(msg->msg_data.pbData);
+ CryptMemFree(msg->detached_data.pbData);
ContextPropertyList_Free(msg->properties);
}
@@ -1763,30 +1765,38 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
{
FIXME("(%p, %p, %d, %d): streamed update stub\n", hCryptMsg, pbData,
cbData, fFinal);
- if (fFinal)
+ switch (msg->base.state)
{
- if (msg->base.open_flags & CMSG_DETACHED_FLAG &&
- msg->base.state != MsgStateDataFinalized)
+ case MsgStateInit:
+ ret = CDecodeMsg_CopyData(&msg->msg_data, pbData, cbData);
+ if (fFinal)
{
- ret = CDecodeMsg_CopyData(&msg->msg_data, pbData, cbData);
- msg->base.state = MsgStateDataFinalized;
- if (ret)
- ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data,
- msg->type);
+ if (msg->base.open_flags & CMSG_DETACHED_FLAG)
+ msg->base.state = MsgStateDataFinalized;
+ else
+ msg->base.state = MsgStateFinalized;
}
else
+ msg->base.state = MsgStateUpdated;
+ break;
+ case MsgStateUpdated:
+ ret = CDecodeMsg_CopyData(&msg->msg_data, pbData, cbData);
+ if (fFinal)
{
- FIXME("(%p, %p, %d, %d): detached update stub\n", hCryptMsg,
- pbData, cbData, fFinal);
- ret = TRUE;
- msg->base.state = MsgStateFinalized;
+ if (msg->base.open_flags & CMSG_DETACHED_FLAG)
+ msg->base.state = MsgStateDataFinalized;
+ else
+ msg->base.state = MsgStateFinalized;
}
- }
- else
- {
- ret = CDecodeMsg_CopyData(&msg->msg_data, pbData, cbData);
- if (msg->base.state == MsgStateInit)
- msg->base.state = MsgStateUpdated;
+ break;
+ case MsgStateDataFinalized:
+ ret = CDecodeMsg_CopyData(&msg->detached_data, pbData, cbData);
+ if (fFinal)
+ msg->base.state = MsgStateFinalized;
+ break;
+ default:
+ SetLastError(CRYPT_E_MSG_ERROR);
+ break;
}
}
else
@@ -1795,26 +1805,26 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
SetLastError(CRYPT_E_MSG_ERROR);
else
{
- if (msg->base.state == MsgStateInit)
+ switch (msg->base.state)
{
+ case MsgStateInit:
ret = CDecodeMsg_CopyData(&msg->msg_data, pbData, cbData);
- if (ret)
- ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data,
- msg->type);
if (msg->base.open_flags & CMSG_DETACHED_FLAG)
msg->base.state = MsgStateDataFinalized;
else
msg->base.state = MsgStateFinalized;
- }
- else if (msg->base.state == MsgStateDataFinalized)
- {
- FIXME("(%p, %p, %d, %d): detached update stub\n", hCryptMsg,
- pbData, cbData, fFinal);
- ret = TRUE;
+ break;
+ case MsgStateDataFinalized:
+ ret = CDecodeMsg_CopyData(&msg->detached_data, pbData, cbData);
msg->base.state = MsgStateFinalized;
+ break;
+ default:
+ SetLastError(CRYPT_E_MSG_ERROR);
}
}
}
+ if (ret && msg->base.state == MsgStateFinalized)
+ ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data, msg->type);
return ret;
}
@@ -2648,6 +2658,8 @@ HCRYPTMSG WINAPI CryptMsgOpenToDecode(DWORD dwMsgEncodingType, DWORD dwFlags,
memset(&msg->u, 0, sizeof(msg->u));
msg->msg_data.cbData = 0;
msg->msg_data.pbData = NULL;
+ msg->detached_data.cbData = 0;
+ msg->detached_data.pbData = NULL;
msg->properties = ContextPropertyList_Create();
}
return msg;
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 410a180..369576d 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -2080,7 +2080,6 @@ static void test_decode_msg_update(void)
msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo);
SetLastError(0xdeadbeef);
ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
"Expected CRYPT_E_ASN1_BADTAG, got %x\n", GetLastError());
CryptMsgClose(msg);
More information about the wine-cvs
mailing list