Juan Lang : crypt32: Support the KeyId type of signer in CMSG_SIGNER_INFO_PARAM.
Alexandre Julliard
julliard at winehq.org
Thu Aug 21 10:02:13 CDT 2008
Module: wine
Branch: master
Commit: 51b16fb85724c783f1afc109fc0e387a006315dd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=51b16fb85724c783f1afc109fc0e387a006315dd
Author: Juan Lang <juan.lang at gmail.com>
Date: Wed Aug 20 12:02:25 2008 -0700
crypt32: Support the KeyId type of signer in CMSG_SIGNER_INFO_PARAM.
---
dlls/crypt32/msg.c | 82 ++++++++++++++++++++++++++++++++++++++--------
dlls/crypt32/tests/msg.c | 1 -
2 files changed, 68 insertions(+), 15 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 44e8a1f..0ec75af 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -1977,10 +1977,58 @@ static DWORD CRYPT_SizeOfAttributes(const CRYPT_ATTRIBUTES *attr)
return size;
}
+static DWORD CRYPT_SizeOfKeyIdAsIssuerAndSerial(const CRYPT_DATA_BLOB *keyId)
+{
+ static char oid_key_rdn[] = szOID_KEYID_RDN;
+ DWORD size = 0;
+ CERT_RDN_ATTR attr;
+ CERT_RDN rdn = { 1, &attr };
+ CERT_NAME_INFO name = { 1, &rdn };
+
+ attr.pszObjId = oid_key_rdn;
+ attr.dwValueType = CERT_RDN_OCTET_STRING;
+ attr.Value.cbData = keyId->cbData;
+ attr.Value.pbData = keyId->pbData;
+ if (CryptEncodeObject(X509_ASN_ENCODING, X509_NAME, &name, NULL, &size))
+ size++; /* Only include size of special zero serial number on success */
+ return size;
+}
+
+static BOOL CRYPT_CopyKeyIdAsIssuerAndSerial(CERT_NAME_BLOB *issuer,
+ CRYPT_INTEGER_BLOB *serialNumber, const CRYPT_DATA_BLOB *keyId, DWORD encodedLen,
+ LPBYTE *nextData)
+{
+ static char oid_key_rdn[] = szOID_KEYID_RDN;
+ CERT_RDN_ATTR attr;
+ CERT_RDN rdn = { 1, &attr };
+ CERT_NAME_INFO name = { 1, &rdn };
+ BOOL ret;
+
+ /* Encode special zero serial number */
+ serialNumber->cbData = 1;
+ serialNumber->pbData = *nextData;
+ **nextData = 0;
+ (*nextData)++;
+ /* Encode issuer */
+ issuer->pbData = *nextData;
+ attr.pszObjId = oid_key_rdn;
+ attr.dwValueType = CERT_RDN_OCTET_STRING;
+ attr.Value.cbData = keyId->cbData;
+ attr.Value.pbData = keyId->pbData;
+ ret = CryptEncodeObject(X509_ASN_ENCODING, X509_NAME, &name, *nextData,
+ &encodedLen);
+ if (ret)
+ {
+ *nextData += encodedLen;
+ issuer->cbData = encodedLen;
+ }
+ return ret;
+}
+
static BOOL CRYPT_CopySignerInfo(void *pvData, DWORD *pcbData,
const CMSG_CMS_SIGNER_INFO *in)
{
- DWORD size = sizeof(CMSG_SIGNER_INFO);
+ DWORD size = sizeof(CMSG_SIGNER_INFO), rdnSize;
BOOL ret;
TRACE("(%p, %d, %p)\n", pvData, pvData ? *pcbData : 0, in);
@@ -1992,8 +2040,8 @@ static BOOL CRYPT_CopySignerInfo(void *pvData, DWORD *pcbData,
}
else
{
- FIXME("unsupported for key id\n");
- return FALSE;
+ rdnSize = CRYPT_SizeOfKeyIdAsIssuerAndSerial(&in->SignerId.KeyId);
+ size += rdnSize;
}
if (in->HashAlgorithm.pszObjId)
size += strlen(in->HashAlgorithm.pszObjId) + 1;
@@ -2023,6 +2071,7 @@ static BOOL CRYPT_CopySignerInfo(void *pvData, DWORD *pcbData,
LPBYTE nextData = (BYTE *)pvData + sizeof(CMSG_SIGNER_INFO);
CMSG_SIGNER_INFO *out = (CMSG_SIGNER_INFO *)pvData;
+ ret = TRUE;
out->dwVersion = in->dwVersion;
if (in->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER)
{
@@ -2031,17 +2080,22 @@ static BOOL CRYPT_CopySignerInfo(void *pvData, DWORD *pcbData,
CRYPT_CopyBlob(&out->SerialNumber,
&in->SignerId.IssuerSerialNumber.SerialNumber, &nextData);
}
- CRYPT_CopyAlgorithmId(&out->HashAlgorithm, &in->HashAlgorithm,
- &nextData);
- CRYPT_CopyAlgorithmId(&out->HashEncryptionAlgorithm,
- &in->HashEncryptionAlgorithm, &nextData);
- CRYPT_CopyBlob(&out->EncryptedHash, &in->EncryptedHash, &nextData);
- /* align pointer */
- if ((nextData - (LPBYTE)0) % sizeof(DWORD_PTR))
- nextData += (nextData - (LPBYTE)0) % sizeof(DWORD_PTR);
- CRYPT_CopyAttributes(&out->AuthAttrs, &in->AuthAttrs, &nextData);
- CRYPT_CopyAttributes(&out->UnauthAttrs, &in->UnauthAttrs, &nextData);
- ret = TRUE;
+ else
+ ret = CRYPT_CopyKeyIdAsIssuerAndSerial(&out->Issuer, &out->SerialNumber,
+ &in->SignerId.KeyId, rdnSize, &nextData);
+ if (ret)
+ {
+ CRYPT_CopyAlgorithmId(&out->HashAlgorithm, &in->HashAlgorithm,
+ &nextData);
+ CRYPT_CopyAlgorithmId(&out->HashEncryptionAlgorithm,
+ &in->HashEncryptionAlgorithm, &nextData);
+ CRYPT_CopyBlob(&out->EncryptedHash, &in->EncryptedHash, &nextData);
+ /* align pointer */
+ if ((nextData - (LPBYTE)0) % sizeof(DWORD_PTR))
+ nextData += (nextData - (LPBYTE)0) % sizeof(DWORD_PTR);
+ CRYPT_CopyAttributes(&out->AuthAttrs, &in->AuthAttrs, &nextData);
+ CRYPT_CopyAttributes(&out->UnauthAttrs, &in->UnauthAttrs, &nextData);
+ }
}
TRACE("returning %d\n", ret);
return ret;
diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c
index 8df7c69..410a180 100644
--- a/dlls/crypt32/tests/msg.c
+++ b/dlls/crypt32/tests/msg.c
@@ -2469,7 +2469,6 @@ static void test_decode_msg_get_param(void)
*/
size = 0;
ret = CryptMsgGetParam(msg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &size);
- todo_wine
ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError());
if (ret)
buf = CryptMemAlloc(size);
More information about the wine-cvs
mailing list