crypt32(2/20): Add stub encoded signed message
Juan Lang
juan.lang at gmail.com
Mon Jul 23 20:26:34 CDT 2007
--Juan
-------------- next part --------------
From a51722b7c1071675ce1801358f793a68a32b59b9 Mon Sep 17 00:00:00 2001
From: Juan Lang <juanlang at juan.corp.google.com>
Date: Fri, 20 Jul 2007 17:31:11 -0700
Subject: [PATCH] Add stub encoded signed message
---
dlls/crypt32/msg.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/crypt32/tests/msg.c | 19 +++-----
2 files changed, 123 insertions(+), 12 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 67a4024..08b3ce8 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -535,6 +535,119 @@ static HCRYPTMSG CHashEncodeMsg_Open(DWO
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)
{
switch (type)
@@ -577,6 +690,9 @@ HCRYPTMSG WINAPI CryptMsgOpenToEncode(DW
pszInnerContentObjID, pStreamInfo);
break;
case CMSG_SIGNED:
+ msg = CSignedEncodeMsg_Open(dwFlags, pvMsgEncodeInfo,
+ pszInnerContentObjID, pStreamInfo);
+ break;
case CMSG_ENVELOPED:
FIXME("unimplemented for type %s\n", MSG_TYPE_STR(dwMsgType));
break;
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 893f49d..d2d9488 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -989,13 +989,11 @@ static void test_signed_msg_open(void)
SetLastError(0xdeadbeef);
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
NULL, NULL);
- todo_wine
ok(!msg && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %x\n", GetLastError());
signInfo.cbSize = sizeof(signInfo);
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
NULL, NULL);
- todo_wine
ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
CryptMsgClose(msg);
@@ -1009,7 +1007,6 @@ static void test_signed_msg_open(void)
SetLastError(0xdeadbeef);
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
NULL, NULL);
- todo_wine
ok(!msg && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %x\n", GetLastError());
certInfo.SerialNumber.cbData = sizeof(serialNum);
@@ -1017,7 +1014,6 @@ static void test_signed_msg_open(void)
SetLastError(0xdeadbeef);
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
NULL, NULL);
- todo_wine
ok(!msg && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %x\n", GetLastError());
certInfo.Issuer.cbData = sizeof(encodedCommonName);
@@ -1025,7 +1021,6 @@ static void test_signed_msg_open(void)
SetLastError(0xdeadbeef);
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
NULL, NULL);
- todo_wine
ok(!msg && GetLastError() == E_INVALIDARG,
"Expected E_INVALIDARG, got %x\n", GetLastError());
@@ -1037,17 +1032,18 @@ static void test_signed_msg_open(void)
SetLastError(0xdeadbeef);
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
NULL, NULL);
- todo_wine
ok(!msg && GetLastError() == CRYPT_E_UNKNOWN_ALGO,
"Expected CRYPT_E_UNKNOWN_ALGO, got %x\n", GetLastError());
/* The signer's hash algorithm must also be set. */
signer.HashAlgorithm.pszObjId = oid_rsa_md5;
SetLastError(0xdeadbeef);
- msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
- NULL, NULL);
- todo_wine
- ok(!msg && GetLastError() == ERROR_INVALID_PARAMETER,
- "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+ /* Crashes in advapi32 in wine, don't do it */
+ if (0) {
+ msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED,
+ &signInfo, NULL, NULL);
+ ok(!msg && GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, got %x\n", GetLastError());
+ }
/* The signer's hCryptProv must also be valid. */
ret = CryptAcquireContextW(&signer.hCryptProv, cspNameW, NULL,
PROV_RSA_FULL, CRYPT_NEWKEYSET);
@@ -1057,7 +1053,6 @@ static void test_signed_msg_open(void)
ok(ret, "CryptAcquireContextW failed: %x\n", GetLastError());
msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo,
NULL, NULL);
- todo_wine
ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError());
CryptMsgClose(msg);
--
1.4.1
More information about the wine-patches
mailing list