Juan Lang : crypt32: Correct X509_NAME decoding, and more stringent tests.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 31 06:04:24 CST 2006


Module: wine
Branch: refs/heads/master
Commit: faeac967704e1409a3a250f7838d7f33f8539385
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=faeac967704e1409a3a250f7838d7f33f8539385

Author: Juan Lang <juan at codeweavers.com>
Date:   Tue Jan 31 12:22:15 2006 +0100

crypt32: Correct X509_NAME decoding, and more stringent tests.

---

 dlls/crypt32/encode.c       |    6 +-
 dlls/crypt32/tests/encode.c |  151 ++++++++++++++++++++++++++++++++++---------
 2 files changed, 125 insertions(+), 32 deletions(-)

diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c
index 25f854e..e97c894 100644
--- a/dlls/crypt32/encode.c
+++ b/dlls/crypt32/encode.c
@@ -3554,8 +3554,11 @@ static BOOL WINAPI CRYPT_AsnDecodeRdnAtt
          sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags, NULL,
          attr, pcbStructInfo, attr ? attr->pszObjId : NULL);
         if (attr)
+        {
             TRACE("attr->pszObjId is %p (%s)\n", attr->pszObjId,
              debugstr_a(attr->pszObjId));
+            TRACE("attr->dwValueType is %ld\n", attr->dwValueType);
+        }
         TRACE("returning %d (%08lx)\n", ret, GetLastError());
     }
     __EXCEPT_PAGE_FAULT
@@ -3578,9 +3581,10 @@ static BOOL WINAPI CRYPT_AsnDecodeRdn(DW
         struct AsnArrayDescriptor arrayDesc = { ASN_CONSTRUCTOR | ASN_SETOF,
          CRYPT_AsnDecodeRdnAttr, sizeof(CERT_RDN_ATTR), TRUE,
          offsetof(CERT_RDN_ATTR, pszObjId) };
+        PCERT_RDN rdn = (PCERT_RDN)pvStructInfo;
 
         ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags,
-         pDecodePara, pvStructInfo, pcbStructInfo, NULL);
+         pDecodePara, pvStructInfo, pcbStructInfo, rdn ? rdn->rgRDNAttr : NULL);
     }
     __EXCEPT_PAGE_FAULT
     {
diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c
index 86f5347..3c69eb2 100644
--- a/dlls/crypt32/tests/encode.c
+++ b/dlls/crypt32/tests/encode.c
@@ -661,6 +661,54 @@ static const BYTE twoRDNs[] = {
     0x13,0x05,0x4c,0x61,0x6e,0x67,0x00,0x30,0x11,0x06,0x03,0x55,0x04,0x03,
     0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0};
 
+static const BYTE us[] = { 0x55, 0x53 };
+static const BYTE minnesota[] = { 0x4d, 0x69, 0x6e, 0x6e, 0x65, 0x73, 0x6f,
+ 0x74, 0x61 };
+static const BYTE minneapolis[] = { 0x4d, 0x69, 0x6e, 0x6e, 0x65, 0x61, 0x70,
+ 0x6f, 0x6c, 0x69, 0x73 };
+static const BYTE codeweavers[] = { 0x43, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x61,
+ 0x76, 0x65, 0x72, 0x73 };
+static const BYTE wine[] = { 0x57, 0x69, 0x6e, 0x65, 0x20, 0x44, 0x65, 0x76,
+ 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74 };
+static const BYTE localhostAttr[] = { 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f,
+ 0x73, 0x74 };
+static const BYTE aric[] = { 0x61, 0x72, 0x69, 0x63, 0x40, 0x63, 0x6f, 0x64,
+ 0x65, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x73, 0x2e, 0x63, 0x6f, 0x6d };
+
+#define _blob_of(arr) { sizeof(arr), (LPBYTE)arr }
+const CERT_RDN_ATTR rdnAttrs[] = {
+ { "2.5.4.6", CERT_RDN_PRINTABLE_STRING,        _blob_of(us) },
+ { "2.5.4.8", CERT_RDN_PRINTABLE_STRING,        _blob_of(minnesota) },
+ { "2.5.4.7", CERT_RDN_PRINTABLE_STRING,        _blob_of(minneapolis) },
+ { "2.5.4.10", CERT_RDN_PRINTABLE_STRING,       _blob_of(codeweavers) },
+ { "2.5.4.11", CERT_RDN_PRINTABLE_STRING,       _blob_of(wine) },
+ { "2.5.4.3", CERT_RDN_PRINTABLE_STRING,        _blob_of(localhostAttr) },
+ { "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING, _blob_of(aric) },
+};
+const CERT_RDN_ATTR decodedRdnAttrs[] = {
+ { "2.5.4.6", CERT_RDN_PRINTABLE_STRING,        _blob_of(us) },
+ { "2.5.4.3", CERT_RDN_PRINTABLE_STRING,        _blob_of(localhostAttr) },
+ { "2.5.4.8", CERT_RDN_PRINTABLE_STRING,        _blob_of(minnesota) },
+ { "2.5.4.7", CERT_RDN_PRINTABLE_STRING,        _blob_of(minneapolis) },
+ { "2.5.4.10", CERT_RDN_PRINTABLE_STRING,       _blob_of(codeweavers) },
+ { "2.5.4.11", CERT_RDN_PRINTABLE_STRING,       _blob_of(wine) },
+ { "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING, _blob_of(aric) },
+};
+#undef _blob_of
+
+static const BYTE encodedRDNAttrs[] = {
+0x30,0x81,0x96,0x31,0x81,0x93,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,
+0x53,0x30,0x10,0x06,0x03,0x55,0x04,0x03,0x13,0x09,0x6c,0x6f,0x63,0x61,0x6c,0x68,
+0x6f,0x73,0x74,0x30,0x10,0x06,0x03,0x55,0x04,0x08,0x13,0x09,0x4d,0x69,0x6e,0x6e,
+0x65,0x73,0x6f,0x74,0x61,0x30,0x12,0x06,0x03,0x55,0x04,0x07,0x13,0x0b,0x4d,0x69,
+0x6e,0x6e,0x65,0x61,0x70,0x6f,0x6c,0x69,0x73,0x30,0x12,0x06,0x03,0x55,0x04,0x0a,
+0x13,0x0b,0x43,0x6f,0x64,0x65,0x57,0x65,0x61,0x76,0x65,0x72,0x73,0x30,0x17,0x06,
+0x03,0x55,0x04,0x0b,0x13,0x10,0x57,0x69,0x6e,0x65,0x20,0x44,0x65,0x76,0x65,0x6c,
+0x6f,0x70,0x6d,0x65,0x6e,0x74,0x30,0x21,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,
+0x01,0x09,0x01,0x16,0x14,0x61,0x72,0x69,0x63,0x40,0x63,0x6f,0x64,0x65,0x77,0x65,
+0x61,0x76,0x65,0x72,0x73,0x2e,0x63,0x6f,0x6d
+};
+
 static void test_encodeName(DWORD dwEncoding)
 {
     CERT_RDN_ATTR attrs[2];
@@ -770,6 +818,61 @@ static void test_encodeName(DWORD dwEnco
             LocalFree(buf);
         }
     }
+    /* Test a more complex name */
+    rdn.cRDNAttr = sizeof(rdnAttrs) / sizeof(rdnAttrs[0]);
+    rdn.rgRDNAttr = (PCERT_RDN_ATTR)rdnAttrs;
+    info.cRDN = 1;
+    info.rgRDN = &rdn;
+    buf = NULL;
+    size = 0;
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_NAME, &info,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError());
+    if (ret)
+    {
+        ok(size == sizeof(encodedRDNAttrs), "Expected size %d, got %ld\n",
+         sizeof(encodedRDNAttrs), size);
+        ok(!memcmp(buf, encodedRDNAttrs, size), "Unexpected value\n");
+        LocalFree(buf);
+    }
+}
+
+static void compareRDNAttrs(const CERT_RDN_ATTR *expected,
+ const CERT_RDN_ATTR *got)
+{
+    if (expected->pszObjId && strlen(expected->pszObjId))
+    {
+        ok(got->pszObjId != NULL, "Expected OID %s, got NULL\n",
+         expected->pszObjId);
+        if (got->pszObjId)
+        {
+            ok(!strcmp(got->pszObjId, expected->pszObjId),
+             "Got unexpected OID %s, expected %s\n", got->pszObjId,
+             expected->pszObjId);
+        }
+    }
+    ok(got->dwValueType == expected->dwValueType,
+     "Expected string type %ld, got %ld\n", expected->dwValueType,
+     got->dwValueType);
+    ok(got->Value.cbData == expected->Value.cbData,
+     "Unexpected data size, got %ld, expected %ld\n", got->Value.cbData,
+     expected->Value.cbData);
+    if (got->Value.cbData && got->Value.pbData)
+        ok(!memcmp(got->Value.pbData, expected->Value.pbData,
+         min(got->Value.cbData, expected->Value.cbData)), "Unexpected value\n");
+}
+
+static void compareRDNs(const CERT_RDN *expected, const CERT_RDN *got)
+{
+    ok(got->cRDNAttr == expected->cRDNAttr,
+     "Expected %ld RDN attrs, got %ld\n", expected->cRDNAttr, got->cRDNAttr);
+    if (got->cRDNAttr)
+    {
+        DWORD i;
+
+        for (i = 0; i < got->cRDNAttr; i++)
+            compareRDNAttrs(&expected->rgRDNAttr[i], &got->rgRDNAttr[i]);
+    }
 }
 
 static void compareNames(const CERT_NAME_INFO *expected,
@@ -779,37 +882,10 @@ static void compareNames(const CERT_NAME
      expected->cRDN, got->cRDN);
     if (got->cRDN)
     {
-        ok(got->rgRDN[0].cRDNAttr == expected->rgRDN[0].cRDNAttr,
-         "Expected %ld RDN attrs, got %ld\n", expected->rgRDN[0].cRDNAttr,
-         got->rgRDN[0].cRDNAttr);
-        if (got->rgRDN[0].cRDNAttr)
-        {
-            if (expected->rgRDN[0].rgRDNAttr[0].pszObjId &&
-             strlen(expected->rgRDN[0].rgRDNAttr[0].pszObjId))
-            {
-                ok(got->rgRDN[0].rgRDNAttr[0].pszObjId != NULL,
-                 "Expected OID %s, got NULL\n",
-                 expected->rgRDN[0].rgRDNAttr[0].pszObjId);
-                if (got->rgRDN[0].rgRDNAttr[0].pszObjId)
-                    ok(!strcmp(got->rgRDN[0].rgRDNAttr[0].pszObjId,
-                     expected->rgRDN[0].rgRDNAttr[0].pszObjId),
-                     "Got unexpected OID %s, expected %s\n",
-                     got->rgRDN[0].rgRDNAttr[0].pszObjId,
-                     expected->rgRDN[0].rgRDNAttr[0].pszObjId);
-            }
-            ok(got->rgRDN[0].rgRDNAttr[0].Value.cbData ==
-             expected->rgRDN[0].rgRDNAttr[0].Value.cbData,
-             "Unexpected data size, got %ld, expected %ld\n",
-             got->rgRDN[0].rgRDNAttr[0].Value.cbData,
-             expected->rgRDN[0].rgRDNAttr[0].Value.cbData);
-            if (got->rgRDN[0].rgRDNAttr[0].Value.cbData &&
-             got->rgRDN[0].rgRDNAttr[0].Value.pbData)
-                ok(!memcmp(got->rgRDN[0].rgRDNAttr[0].Value.pbData,
-                 expected->rgRDN[0].rgRDNAttr[0].Value.pbData,
-                 min(got->rgRDN[0].rgRDNAttr[0].Value.cbData,
-                 expected->rgRDN[0].rgRDNAttr[0].Value.cbData)),
-                 "Unexpected value\n");
-        }
+        DWORD i;
+
+        for (i = 0; i < got->cRDN; i++)
+            compareRDNs(&expected->rgRDN[i], &got->rgRDN[i]);
     }
 }
 
@@ -899,6 +975,19 @@ static void test_decodeName(DWORD dwEnco
         compareNames(&info, (CERT_NAME_INFO *)buf);
         LocalFree(buf);
     }
+    /* And, a slightly more complicated name */
+    buf = NULL;
+    bufSize = 0;
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_NAME, encodedRDNAttrs,
+     sizeof(encodedRDNAttrs), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize);
+    ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError());
+    if (ret)
+    {
+        rdn.cRDNAttr = sizeof(decodedRdnAttrs) / sizeof(decodedRdnAttrs[0]);
+        rdn.rgRDNAttr = (PCERT_RDN_ATTR)decodedRdnAttrs;
+        compareNames(&info, (CERT_NAME_INFO *)buf);
+        LocalFree(buf);
+    }
 }
 
 static const BYTE emptyAltName[] = { 0x30, 0x00 };




More information about the wine-cvs mailing list