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