Commit f44ae748 authored by Alexander Morozov's avatar Alexander Morozov Committed by Alexandre Julliard

crypt32: Implement getting content and some parameters from a decoded enveloped message.

parent dd75ab38
......@@ -2881,6 +2881,89 @@ static BOOL CRYPT_CopySignerCertInfo(void *pvData, DWORD *pcbData,
return ret;
}
static BOOL CRYPT_CopyRecipientInfo(void *pvData, DWORD *pcbData,
const CERT_ISSUER_SERIAL_NUMBER *in)
{
DWORD size = sizeof(CERT_INFO);
BOOL ret;
TRACE("(%p, %d, %p)\n", pvData, pvData ? *pcbData : 0, in);
size += in->SerialNumber.cbData;
size += in->Issuer.cbData;
if (!pvData)
{
*pcbData = size;
ret = TRUE;
}
else if (*pcbData < size)
{
*pcbData = size;
SetLastError(ERROR_MORE_DATA);
ret = FALSE;
}
else
{
LPBYTE nextData = (BYTE *)pvData + sizeof(CERT_INFO);
CERT_INFO *out = pvData;
CRYPT_CopyBlob(&out->SerialNumber, &in->SerialNumber, &nextData);
CRYPT_CopyBlob(&out->Issuer, &in->Issuer, &nextData);
ret = TRUE;
}
TRACE("returning %d\n", ret);
return ret;
}
static BOOL CDecodeEnvelopedMsg_GetParam(CDecodeMsg *msg, DWORD dwParamType,
DWORD dwIndex, void *pvData, DWORD *pcbData)
{
BOOL ret = FALSE;
switch (dwParamType)
{
case CMSG_TYPE_PARAM:
ret = CRYPT_CopyParam(pvData, pcbData, &msg->type, sizeof(msg->type));
break;
case CMSG_CONTENT_PARAM:
if (msg->u.enveloped_data.data)
ret = CRYPT_CopyParam(pvData, pcbData,
msg->u.enveloped_data.content.pbData,
msg->u.enveloped_data.content.cbData);
else
SetLastError(CRYPT_E_INVALID_MSG_TYPE);
break;
case CMSG_RECIPIENT_COUNT_PARAM:
if (msg->u.enveloped_data.data)
ret = CRYPT_CopyParam(pvData, pcbData,
&msg->u.enveloped_data.data->cRecipientInfo, sizeof(DWORD));
else
SetLastError(CRYPT_E_INVALID_MSG_TYPE);
break;
case CMSG_RECIPIENT_INFO_PARAM:
if (msg->u.enveloped_data.data)
{
if (dwIndex < msg->u.enveloped_data.data->cRecipientInfo)
{
PCMSG_KEY_TRANS_RECIPIENT_INFO recipientInfo =
&msg->u.enveloped_data.data->rgRecipientInfo[dwIndex];
ret = CRYPT_CopyRecipientInfo(pvData, pcbData,
&recipientInfo->RecipientId.u.IssuerSerialNumber);
}
else
SetLastError(CRYPT_E_INVALID_INDEX);
}
else
SetLastError(CRYPT_E_INVALID_MSG_TYPE);
break;
default:
FIXME("unimplemented for %d\n", dwParamType);
SetLastError(CRYPT_E_INVALID_MSG_TYPE);
}
return ret;
}
static BOOL CDecodeSignedMsg_GetParam(CDecodeMsg *msg, DWORD dwParamType,
DWORD dwIndex, void *pvData, DWORD *pcbData)
{
......@@ -3073,6 +3156,10 @@ static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
ret = CDecodeHashMsg_GetParam(msg, dwParamType, dwIndex, pvData,
pcbData);
break;
case CMSG_ENVELOPED:
ret = CDecodeEnvelopedMsg_GetParam(msg, dwParamType, dwIndex, pvData,
pcbData);
break;
case CMSG_SIGNED:
ret = CDecodeSignedMsg_GetParam(msg, dwParamType, dwIndex, pvData,
pcbData);
......
......@@ -3057,7 +3057,6 @@ static void test_decode_msg_get_param(void)
NULL);
CryptMsgUpdate(msg, envelopedEmptyBareContent,
sizeof(envelopedEmptyBareContent), TRUE);
todo_wine
check_param("enveloped empty bare content", msg, CMSG_CONTENT_PARAM, NULL,
0);
CryptMsgClose(msg);
......@@ -3065,7 +3064,6 @@ static void test_decode_msg_get_param(void)
msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL);
CryptMsgUpdate(msg, envelopedEmptyContent, sizeof(envelopedEmptyContent),
TRUE);
todo_wine
check_param("enveloped empty content", msg, CMSG_CONTENT_PARAM, NULL, 0);
CryptMsgClose(msg);
......@@ -3080,7 +3078,6 @@ static void test_decode_msg_get_param(void)
msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL);
CryptMsgUpdate(msg, envelopedMessage, sizeof(envelopedMessage), TRUE);
todo_wine
check_param("enveloped message before decrypting", msg, CMSG_CONTENT_PARAM,
envelopedMessage + sizeof(envelopedMessage) - 4, 4);
if (key)
......@@ -3094,7 +3091,6 @@ static void test_decode_msg_get_param(void)
ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara);
ok(!ret && GetLastError() == CRYPT_E_ALREADY_DECRYPTED,
"expected CRYPT_E_ALREADY_DECRYPTED, got %08x\n", GetLastError());
todo_wine
check_param("enveloped message", msg, CMSG_CONTENT_PARAM, msgData,
sizeof(msgData));
}
......@@ -3106,7 +3102,6 @@ static void test_decode_msg_get_param(void)
NULL);
CryptMsgUpdate(msg, envelopedBareMessage, sizeof(envelopedBareMessage),
TRUE);
todo_wine
check_param("enveloped bare message before decrypting", msg,
CMSG_CONTENT_PARAM, envelopedBareMessage +
sizeof(envelopedBareMessage) - 4, 4);
......@@ -3116,7 +3111,6 @@ static void test_decode_msg_get_param(void)
SetLastError(0xdeadbeef);
ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara);
ok(ret, "CryptMsgControl failed: %08x\n", GetLastError());
todo_wine
check_param("enveloped bare message", msg, CMSG_CONTENT_PARAM, msgData,
sizeof(msgData));
}
......@@ -3132,21 +3126,17 @@ static void test_decode_msg_get_param(void)
CryptMsgUpdate(msg, envelopedMessageWith3Recps,
sizeof(envelopedMessageWith3Recps), TRUE);
value = 3;
todo_wine
check_param("recipient count", msg, CMSG_RECIPIENT_COUNT_PARAM,
(const BYTE *)&value, sizeof(value));
size = 0;
SetLastError(0xdeadbeef);
ret = CryptMsgGetParam(msg, CMSG_RECIPIENT_INFO_PARAM, 3, NULL, &size);
todo_wine
ok(!ret && GetLastError() == CRYPT_E_INVALID_INDEX,
"expected CRYPT_E_INVALID_INDEX, got %08x\n", GetLastError());
size = 0;
SetLastError(0xdeadbeef);
ret = CryptMsgGetParam(msg, CMSG_RECIPIENT_INFO_PARAM, 2, NULL, &size);
todo_wine
ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
todo_wine
ok(size >= 142, "unexpected size: %u\n", size);
if (ret)
buf = CryptMemAlloc(size);
......@@ -3158,18 +3148,13 @@ static void test_decode_msg_get_param(void)
SetLastError(0xdeadbeef);
ret = CryptMsgGetParam(msg, CMSG_RECIPIENT_INFO_PARAM, 2, buf, &size);
todo_wine
ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
todo_wine
ok(certInfo->SerialNumber.cbData == sizeof(serialNumber),
"unexpected serial number size: %u\n", certInfo->SerialNumber.cbData);
todo_wine
ok(!memcmp(certInfo->SerialNumber.pbData, serialNumber,
sizeof(serialNumber)), "unexpected serial number\n");
todo_wine
ok(certInfo->Issuer.cbData == sizeof(issuer),
"unexpected issuer size: %u\n", certInfo->Issuer.cbData);
todo_wine
ok(!memcmp(certInfo->Issuer.pbData, issuer, sizeof(issuer)),
"unexpected issuer\n");
CryptMemFree(buf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment