crypt32: Add stub encoded signed message.
This commit is contained in:
parent
725d440d3c
commit
223bad2312
|
@ -535,6 +535,119 @@ static HCRYPTMSG CHashEncodeMsg_Open(DWORD dwFlags, const void *pvMsgEncodeInfo,
|
||||||
return (HCRYPTMSG)msg;
|
return (HCRYPTMSG)msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct _CMSG_SIGNER_ENCODE_INFO_WITH_CMS
|
||||||
|
{
|
||||||
|
DWORD cbSize;
|
||||||
|
PCERT_INFO pCertInfo;
|
||||||
|
HCRYPTPROV hCryptProv;
|
||||||
|
DWORD dwKeySpec;
|
||||||
|
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
|
||||||
|
void *pvHashAuxInfo;
|
||||||
|
DWORD cAuthAttr;
|
||||||
|
PCRYPT_ATTRIBUTE rgAuthAttr;
|
||||||
|
DWORD cUnauthAttr;
|
||||||
|
PCRYPT_ATTRIBUTE rgUnauthAttr;
|
||||||
|
CERT_ID SignerId;
|
||||||
|
CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;
|
||||||
|
void *pvHashEncryptionAuxInfo;
|
||||||
|
} CMSG_SIGNER_ENCODE_INFO_WITH_CMS, *PCMSG_SIGNER_ENCODE_INFO_WITH_CMS;
|
||||||
|
|
||||||
|
typedef struct _CMSG_SIGNED_ENCODE_INFO_WITH_CMS
|
||||||
|
{
|
||||||
|
DWORD cbSize;
|
||||||
|
DWORD cSigners;
|
||||||
|
PCMSG_SIGNER_ENCODE_INFO_WITH_CMS rgSigners;
|
||||||
|
DWORD cCertEncoded;
|
||||||
|
PCERT_BLOB rgCertEncoded;
|
||||||
|
DWORD cCrlEncoded;
|
||||||
|
PCRL_BLOB rgCrlEncoded;
|
||||||
|
DWORD cAttrCertEncoded;
|
||||||
|
PCERT_BLOB rgAttrCertEncoded;
|
||||||
|
} CMSG_SIGNED_ENCODE_INFO_WITH_CMS, *PCMSG_SIGNED_ENCODE_INFO_WITH_CMS;
|
||||||
|
|
||||||
|
static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
|
||||||
|
{
|
||||||
|
if (!signer->pCertInfo->SerialNumber.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!signer->pCertInfo->Issuer.cbData)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!signer->hCryptProv)
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!CertOIDToAlgId(signer->HashAlgorithm.pszObjId))
|
||||||
|
{
|
||||||
|
SetLastError(CRYPT_E_UNKNOWN_ALGO);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct _CSignedEncodeMsg
|
||||||
|
{
|
||||||
|
CryptMsgBase base;
|
||||||
|
} CSignedEncodeMsg;
|
||||||
|
|
||||||
|
static void CSignedEncodeMsg_Close(HCRYPTMSG hCryptMsg)
|
||||||
|
{
|
||||||
|
FIXME("(%p)\n", hCryptMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL CSignedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType,
|
||||||
|
DWORD dwIndex, void *pvData, DWORD *pcbData)
|
||||||
|
{
|
||||||
|
FIXME("(%p, %d, %d, %p, %p)\n", hCryptMsg, dwParamType, dwIndex, pvData,
|
||||||
|
pcbData);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL CSignedEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData,
|
||||||
|
DWORD cbData, BOOL fFinal)
|
||||||
|
{
|
||||||
|
FIXME("(%p, %p, %d, %d)\n", hCryptMsg, pbData, cbData, fFinal);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags,
|
||||||
|
const void *pvMsgEncodeInfo, LPSTR pszInnerContentObjID,
|
||||||
|
PCMSG_STREAM_INFO pStreamInfo)
|
||||||
|
{
|
||||||
|
const CMSG_SIGNED_ENCODE_INFO_WITH_CMS *info =
|
||||||
|
(const CMSG_SIGNED_ENCODE_INFO_WITH_CMS *)pvMsgEncodeInfo;
|
||||||
|
DWORD i;
|
||||||
|
CSignedEncodeMsg *msg;
|
||||||
|
|
||||||
|
if (info->cbSize != sizeof(CMSG_SIGNED_ENCODE_INFO) &&
|
||||||
|
info->cbSize != sizeof(CMSG_SIGNED_ENCODE_INFO_WITH_CMS))
|
||||||
|
{
|
||||||
|
SetLastError(E_INVALIDARG);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (info->cbSize == sizeof(CMSG_SIGNED_ENCODE_INFO_WITH_CMS))
|
||||||
|
{
|
||||||
|
FIXME("CMSG_SIGNED_ENCODE_INFO with CMS fields unsupported\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (i = 0; i < info->cSigners; i++)
|
||||||
|
if (!CRYPT_IsValidSigner(&info->rgSigners[i]))
|
||||||
|
return NULL;
|
||||||
|
msg = CryptMemAlloc(sizeof(CSignedEncodeMsg));
|
||||||
|
if (msg)
|
||||||
|
{
|
||||||
|
CryptMsgBase_Init((CryptMsgBase *)msg, dwFlags, pStreamInfo,
|
||||||
|
CSignedEncodeMsg_Close, CSignedEncodeMsg_GetParam,
|
||||||
|
CSignedEncodeMsg_Update);
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
static inline const char *MSG_TYPE_STR(DWORD type)
|
static inline const char *MSG_TYPE_STR(DWORD type)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -577,6 +690,9 @@ HCRYPTMSG WINAPI CryptMsgOpenToEncode(DWORD dwMsgEncodingType, DWORD dwFlags,
|
||||||
pszInnerContentObjID, pStreamInfo);
|
pszInnerContentObjID, pStreamInfo);
|
||||||
break;
|
break;
|
||||||
case CMSG_SIGNED:
|
case CMSG_SIGNED:
|
||||||
|
msg = CSignedEncodeMsg_Open(dwFlags, pvMsgEncodeInfo,
|
||||||
|
pszInnerContentObjID, pStreamInfo);
|
||||||
|
break;
|
||||||
case CMSG_ENVELOPED:
|
case CMSG_ENVELOPED:
|
||||||
FIXME("unimplemented for type %s\n", MSG_TYPE_STR(dwMsgType));
|
FIXME("unimplemented for type %s\n", MSG_TYPE_STR(dwMsgType));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -989,13 +989,11 @@ static void test_signed_msg_open(void)
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(!msg && GetLastError() == E_INVALIDARG,
|
ok(!msg && GetLastError() == E_INVALIDARG,
|
||||||
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
||||||
signInfo.cbSize = sizeof(signInfo);
|
signInfo.cbSize = sizeof(signInfo);
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
|
ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
|
||||||
CryptMsgClose(msg);
|
CryptMsgClose(msg);
|
||||||
|
|
||||||
|
@ -1009,7 +1007,6 @@ static void test_signed_msg_open(void)
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(!msg && GetLastError() == E_INVALIDARG,
|
ok(!msg && GetLastError() == E_INVALIDARG,
|
||||||
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
||||||
certInfo.SerialNumber.cbData = sizeof(serialNum);
|
certInfo.SerialNumber.cbData = sizeof(serialNum);
|
||||||
|
@ -1017,7 +1014,6 @@ static void test_signed_msg_open(void)
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(!msg && GetLastError() == E_INVALIDARG,
|
ok(!msg && GetLastError() == E_INVALIDARG,
|
||||||
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
||||||
certInfo.Issuer.cbData = sizeof(encodedCommonName);
|
certInfo.Issuer.cbData = sizeof(encodedCommonName);
|
||||||
|
@ -1025,7 +1021,6 @@ static void test_signed_msg_open(void)
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(!msg && GetLastError() == E_INVALIDARG,
|
ok(!msg && GetLastError() == E_INVALIDARG,
|
||||||
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
"Expected E_INVALIDARG, got %x\n", GetLastError());
|
||||||
|
|
||||||
|
@ -1037,17 +1032,18 @@ static void test_signed_msg_open(void)
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(!msg && GetLastError() == CRYPT_E_UNKNOWN_ALGO,
|
ok(!msg && GetLastError() == CRYPT_E_UNKNOWN_ALGO,
|
||||||
"Expected CRYPT_E_UNKNOWN_ALGO, got %x\n", GetLastError());
|
"Expected CRYPT_E_UNKNOWN_ALGO, got %x\n", GetLastError());
|
||||||
/* The signer's hash algorithm must also be set. */
|
/* The signer's hash algorithm must also be set. */
|
||||||
signer.HashAlgorithm.pszObjId = oid_rsa_md5;
|
signer.HashAlgorithm.pszObjId = oid_rsa_md5;
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
/* Crashes in advapi32 in wine, don't do it */
|
||||||
NULL, NULL);
|
if (0) {
|
||||||
todo_wine
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED,
|
||||||
|
&signInfo, NULL, NULL);
|
||||||
ok(!msg && GetLastError() == ERROR_INVALID_PARAMETER,
|
ok(!msg && GetLastError() == ERROR_INVALID_PARAMETER,
|
||||||
"Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
|
"Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
|
||||||
|
}
|
||||||
/* The signer's hCryptProv must also be valid. */
|
/* The signer's hCryptProv must also be valid. */
|
||||||
ret = CryptAcquireContextW(&signer.hCryptProv, cspNameW, NULL,
|
ret = CryptAcquireContextW(&signer.hCryptProv, cspNameW, NULL,
|
||||||
PROV_RSA_FULL, CRYPT_NEWKEYSET);
|
PROV_RSA_FULL, CRYPT_NEWKEYSET);
|
||||||
|
@ -1057,7 +1053,6 @@ static void test_signed_msg_open(void)
|
||||||
ok(ret, "CryptAcquireContextW failed: %x\n", GetLastError());
|
ok(ret, "CryptAcquireContextW failed: %x\n", GetLastError());
|
||||||
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
todo_wine
|
|
||||||
ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
|
ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
|
||||||
CryptMsgClose(msg);
|
CryptMsgClose(msg);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue