Juan Lang : crypt32: Implement encoding cert policy constraints.
Alexandre Julliard
julliard at winehq.org
Mon Nov 9 15:14:17 CST 2009
Module: wine
Branch: master
Commit: 32ad42497295b5c142e70908e41c735d854380bd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=32ad42497295b5c142e70908e41c735d854380bd
Author: Juan Lang <juan.lang at gmail.com>
Date: Fri Nov 6 12:35:49 2009 -0800
crypt32: Implement encoding cert policy constraints.
---
dlls/crypt32/encode.c | 52 +++++++++++++++++++++++++++++++++++++++++++
dlls/crypt32/tests/encode.c | 2 -
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c
index 976cb6f..4d137ce 100644
--- a/dlls/crypt32/encode.c
+++ b/dlls/crypt32/encode.c
@@ -3048,6 +3048,53 @@ static BOOL WINAPI CRYPT_AsnEncodeCertPolicyMappings(DWORD dwCertEncodingType,
return ret;
}
+static BOOL WINAPI CRYPT_AsnEncodeCertPolicyConstraints(
+ DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo,
+ DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded,
+ DWORD *pcbEncoded)
+{
+ BOOL ret = FALSE;
+
+ __TRY
+ {
+ const CERT_POLICY_CONSTRAINTS_INFO *info = pvStructInfo;
+ struct AsnEncodeSequenceItem items[2];
+ struct AsnEncodeTagSwappedItem swapped[2];
+ DWORD cItem = 0, cSwapped = 0;
+
+ if (info->fRequireExplicitPolicy)
+ {
+ swapped[cSwapped].tag = ASN_CONTEXT | 0;
+ swapped[cSwapped].pvStructInfo =
+ &info->dwRequireExplicitPolicySkipCerts;
+ swapped[cSwapped].encodeFunc = CRYPT_AsnEncodeInt;
+ items[cItem].pvStructInfo = &swapped[cSwapped];
+ items[cItem].encodeFunc = CRYPT_AsnEncodeSwapTag;
+ cSwapped++;
+ cItem++;
+ }
+ if (info->fInhibitPolicyMapping)
+ {
+ swapped[cSwapped].tag = ASN_CONTEXT | 1;
+ swapped[cSwapped].pvStructInfo =
+ &info->dwInhibitPolicyMappingSkipCerts;
+ swapped[cSwapped].encodeFunc = CRYPT_AsnEncodeInt;
+ items[cItem].pvStructInfo = &swapped[cSwapped];
+ items[cItem].encodeFunc = CRYPT_AsnEncodeSwapTag;
+ cSwapped++;
+ cItem++;
+ }
+ ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, cItem,
+ dwFlags, NULL, pbEncoded, pcbEncoded);
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ SetLastError(STATUS_ACCESS_VIOLATION);
+ }
+ __ENDTRY
+ return ret;
+}
+
static BOOL WINAPI CRYPT_AsnEncodeRsaPubKey(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
@@ -4413,6 +4460,9 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType,
case LOWORD(X509_POLICY_MAPPINGS):
encodeFunc = CRYPT_AsnEncodeCertPolicyMappings;
break;
+ case LOWORD(X509_POLICY_CONSTRAINTS):
+ encodeFunc = CRYPT_AsnEncodeCertPolicyConstraints;
+ break;
case LOWORD(PKCS7_SIGNER_INFO):
encodeFunc = CRYPT_AsnEncodePKCSSignerInfo;
break;
@@ -4459,6 +4509,8 @@ static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType,
encodeFunc = CRYPT_AsnEncodeCertPolicies;
else if (!strcmp(lpszStructType, szOID_POLICY_MAPPINGS))
encodeFunc = CRYPT_AsnEncodeCertPolicyMappings;
+ else if (!strcmp(lpszStructType, szOID_POLICY_CONSTRAINTS))
+ encodeFunc = CRYPT_AsnEncodeCertPolicyConstraints;
else if (!strcmp(lpszStructType, szOID_ENHANCED_KEY_USAGE))
encodeFunc = CRYPT_AsnEncodeEnhancedKeyUsage;
else if (!strcmp(lpszStructType, szOID_ISSUING_DIST_POINT))
diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c
index 3a1d05b..0ca870a 100644
--- a/dlls/crypt32/tests/encode.c
+++ b/dlls/crypt32/tests/encode.c
@@ -7576,7 +7576,6 @@ static void test_encodeCertPolicyConstraints(DWORD dwEncoding)
*/
ret = pCryptEncodeObjectEx(dwEncoding, X509_POLICY_CONSTRAINTS, &info,
CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
- todo_wine {
ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
if (ret)
{
@@ -7630,7 +7629,6 @@ static void test_encodeCertPolicyConstraints(DWORD dwEncoding)
sizeof(policyConstraintsWithBoth)), "unexpected value\n");
LocalFree(buf);
}
- }
}
static void test_decodeCertPolicyConstraints(DWORD dwEncoding)
More information about the wine-cvs
mailing list