Module: wine Branch: master Commit: 7e7e73d0dab42a53d8041b40eaac1434b4c130ee URL: http://source.winehq.org/git/wine.git/?a=commit;h=7e7e73d0dab42a53d8041b40ea...
Author: Juan Lang juan.lang@gmail.com Date: Fri Nov 6 12:26:59 2009 -0800
crypt32: Implement decoding cert policy mappings.
---
dlls/crypt32/decode.c | 60 +++++++++++++++++++++++++++++++++++++++++++ dlls/crypt32/tests/encode.c | 2 - 2 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index aacdcc9..f1da624 100644 --- a/dlls/crypt32/decode.c +++ b/dlls/crypt32/decode.c @@ -3632,6 +3632,59 @@ static BOOL WINAPI CRYPT_AsnDecodeCertPolicies(DWORD dwCertEncodingType, return ret; }
+static BOOL CRYPT_AsnDecodeCertPolicyMapping(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + struct AsnDecodeSequenceItem items[] = { + { ASN_OBJECTIDENTIFIER, offsetof(CERT_POLICY_MAPPING, + pszIssuerDomainPolicy), CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), + FALSE, TRUE, offsetof(CERT_POLICY_MAPPING, pszIssuerDomainPolicy), 0 }, + { ASN_OBJECTIDENTIFIER, offsetof(CERT_POLICY_MAPPING, + pszSubjectDomainPolicy), CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), + FALSE, TRUE, offsetof(CERT_POLICY_MAPPING, pszSubjectDomainPolicy), 0 }, + }; + CERT_POLICY_MAPPING *mapping = pvStructInfo; + BOOL ret; + + TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, pvStructInfo ? *pcbStructInfo : 0); + + ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), + pbEncoded, cbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo, + pcbDecoded, mapping ? mapping->pszIssuerDomainPolicy : NULL); + return ret; +} + +static BOOL WINAPI CRYPT_AsnDecodeCertPolicyMappings(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, + PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) +{ + BOOL ret = FALSE; + + TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags, + pDecodePara, pvStructInfo, pvStructInfo ? *pcbStructInfo : 0); + + __TRY + { + struct AsnArrayDescriptor arrayDesc = { ASN_SEQUENCEOF, + offsetof(CERT_POLICY_MAPPINGS_INFO, cPolicyMapping), + offsetof(CERT_POLICY_MAPPINGS_INFO, rgPolicyMapping), + sizeof(CERT_POLICY_MAPPING), + CRYPT_AsnDecodeCertPolicyMapping, sizeof(CERT_POLICY_MAPPING), TRUE, + offsetof(CERT_POLICY_MAPPING, pszIssuerDomainPolicy) }; + + ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, + dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + } + __ENDTRY + return ret; +} + #define RSA1_MAGIC 0x31415352
struct DECODED_RSA_PUB_KEY @@ -5494,6 +5547,9 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, case LOWORD(X509_NAME_CONSTRAINTS): decodeFunc = CRYPT_AsnDecodeNameConstraints; break; + case LOWORD(X509_POLICY_MAPPINGS): + decodeFunc = CRYPT_AsnDecodeCertPolicyMappings; + break; case LOWORD(PKCS7_SIGNER_INFO): decodeFunc = CRYPT_AsnDecodePKCSSignerInfo; break; @@ -5510,6 +5566,8 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, decodeFunc = CRYPT_AsnDecodeSMIMECapabilities; else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER)) decodeFunc = CRYPT_AsnDecodeAuthorityKeyId; + else if (!strcmp(lpszStructType, szOID_LEGACY_POLICY_MAPPINGS)) + decodeFunc = CRYPT_AsnDecodeCertPolicyMappings; else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER2)) decodeFunc = CRYPT_AsnDecodeAuthorityKeyId2; else if (!strcmp(lpszStructType, szOID_CRL_REASON_CODE)) @@ -5536,6 +5594,8 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, decodeFunc = CRYPT_AsnDecodeCRLDistPoints; else if (!strcmp(lpszStructType, szOID_CERT_POLICIES)) decodeFunc = CRYPT_AsnDecodeCertPolicies; + else if (!strcmp(lpszStructType, szOID_POLICY_MAPPINGS)) + decodeFunc = CRYPT_AsnDecodeCertPolicyMappings; else if (!strcmp(lpszStructType, szOID_ENHANCED_KEY_USAGE)) decodeFunc = CRYPT_AsnDecodeEnhancedKeyUsage; else if (!strcmp(lpszStructType, szOID_ISSUING_DIST_POINT)) diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index 2108431..dd898c6 100644 --- a/dlls/crypt32/tests/encode.c +++ b/dlls/crypt32/tests/encode.c @@ -7506,7 +7506,6 @@ static void test_decodeCertPolicyMappings(DWORD dwEncoding) /* Each of the mapping OIDs is equivalent, so check with all of them */ for (i = 0; i < sizeof(mappingOids) / sizeof(mappingOids[0]); i++) { - todo_wine { ret = pCryptDecodeObjectEx(dwEncoding, mappingOids[i], emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size); @@ -7555,7 +7554,6 @@ static void test_decodeCertPolicyMappings(DWORD dwEncoding) info->rgPolicyMapping[1].pszSubjectDomainPolicy); LocalFree(info); } - } } }