Module: wine Branch: master Commit: db6c8e23b6abc13dafcaeae001203d51c9288a76 URL: http://source.winehq.org/git/wine.git/?a=commit;h=db6c8e23b6abc13dafcaeae001...
Author: Juan Lang juan.lang@gmail.com Date: Wed Aug 20 12:11:15 2008 -0700
crypt32: Add support for encoding PKCS_SMIME_CAPABILITIES.
---
dlls/crypt32/encode.c | 95 +++++++++++++++++++++++++++++++++++++++++++ dlls/crypt32/tests/encode.c | 4 -- 2 files changed, 95 insertions(+), 4 deletions(-)
diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c index 5658ba2..c935396 100644 --- a/dlls/crypt32/encode.c +++ b/dlls/crypt32/encode.c @@ -1404,6 +1404,96 @@ static BOOL WINAPI CRYPT_AsnEncodeUnicodeName(DWORD dwCertEncodingType, return ret; }
+static BOOL WINAPI CRYPT_AsnEncodeSMIMECapability(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + BOOL ret = FALSE; + + __TRY + { + const CRYPT_SMIME_CAPABILITY *capability = + (const CRYPT_SMIME_CAPABILITY *)pvStructInfo; + + if (!capability->pszObjId) + SetLastError(E_INVALIDARG); + else + { + struct AsnEncodeSequenceItem items[] = { + { capability->pszObjId, CRYPT_AsnEncodeOid, 0 }, + { &capability->Parameters, CRYPT_CopyEncodedBlob, 0 }, + }; + + ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, + sizeof(items) / sizeof(items[0]), dwFlags, pEncodePara, pbEncoded, + pcbEncoded); + } + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + } + __ENDTRY + return ret; +} + +static BOOL WINAPI CRYPT_AsnEncodeSMIMECapabilities(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + BOOL ret = FALSE; + + __TRY + { + DWORD bytesNeeded, dataLen, lenBytes, i; + const CRYPT_SMIME_CAPABILITIES *capabilities = + (const CRYPT_SMIME_CAPABILITIES *)pvStructInfo; + + ret = TRUE; + for (i = 0, dataLen = 0; ret && i < capabilities->cCapability; i++) + { + DWORD size; + + ret = CRYPT_AsnEncodeSMIMECapability(dwCertEncodingType, NULL, + &capabilities->rgCapability[i], 0, NULL, NULL, &size); + if (ret) + dataLen += size; + } + CRYPT_EncodeLen(dataLen, NULL, &lenBytes); + bytesNeeded = 1 + lenBytes + dataLen; + if (!pbEncoded) + *pcbEncoded = bytesNeeded; + else + { + if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, + pcbEncoded, bytesNeeded))) + { + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + pbEncoded = *(BYTE **)pbEncoded; + *pbEncoded++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); + pbEncoded += lenBytes; + for (i = 0; i < capabilities->cCapability; i++) + { + DWORD size = dataLen; + + ret = CRYPT_AsnEncodeSMIMECapability(dwCertEncodingType, + NULL, &capabilities->rgCapability[i], 0, NULL, pbEncoded, + &size); + pbEncoded += size; + dataLen -= size; + } + } + } + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + } + __ENDTRY + return ret; +} + static BOOL WINAPI CRYPT_AsnEncodePKCSAttribute(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) @@ -3684,6 +3774,9 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType, case LOWORD(X509_ENHANCED_KEY_USAGE): encodeFunc = CRYPT_AsnEncodeEnhancedKeyUsage; break; + case LOWORD(PKCS_SMIME_CAPABILITIES): + encodeFunc = CRYPT_AsnEncodeSMIMECapabilities; + break; case LOWORD(PKCS_ATTRIBUTES): encodeFunc = CRYPT_AsnEncodePKCSAttributes; break; @@ -3705,6 +3798,8 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType, encodeFunc = CRYPT_AsnEncodeExtensions; else if (!strcmp(lpszStructType, szOID_RSA_signingTime)) encodeFunc = CRYPT_AsnEncodeUtcTime; + else if (!strcmp(lpszStructType, szOID_RSA_SMIMECapabilities)) + encodeFunc = CRYPT_AsnEncodeUtcTime; else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER)) encodeFunc = CRYPT_AsnEncodeAuthorityKeyId; else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER2)) diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index efb72f3..9214609 100644 --- a/dlls/crypt32/tests/encode.c +++ b/dlls/crypt32/tests/encode.c @@ -5180,7 +5180,6 @@ static void test_encodePKCSSMimeCapabilities(DWORD dwEncoding) capabilities.cCapability = 0; ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (buf) { @@ -5198,13 +5197,11 @@ static void test_encodePKCSSMimeCapabilities(DWORD dwEncoding) SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); capability[0].pszObjId = oid1; ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (buf) { @@ -5217,7 +5214,6 @@ static void test_encodePKCSSMimeCapabilities(DWORD dwEncoding) capabilities.cCapability = 2; ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (buf) {