Juan Lang : crypt32: Implement quoting of BMP strings.

Alexandre Julliard julliard at winehq.org
Tue Oct 19 13:03:44 CDT 2010


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Oct 18 17:21:43 2010 -0700

crypt32: Implement quoting of BMP strings.

---

 dlls/crypt32/str.c       |   41 +++++++++++++++++++++++++++++++++++++++++
 dlls/crypt32/tests/str.c |   10 +++++-----
 2 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c
index d3a1a36..2f90110 100644
--- a/dlls/crypt32/str.c
+++ b/dlls/crypt32/str.c
@@ -100,6 +100,46 @@ DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
             ret = ptr - psz;
         }
         break;
+    case CERT_RDN_BMP_STRING:
+        len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData,
+         pValue->cbData / sizeof(WCHAR), NULL, 0, NULL, NULL);
+        if (pValue->cbData && isspaceW(((LPCWSTR)pValue->pbData)[0]))
+            needsQuotes = TRUE;
+        if (pValue->cbData &&
+         isspaceW(((LPCWSTR)pValue->pbData)[pValue->cbData / sizeof(WCHAR)-1]))
+            needsQuotes = TRUE;
+        for (i = 0; i < pValue->cbData / sizeof(WCHAR); i++)
+        {
+            if (is_quotable_char(((LPCWSTR)pValue->pbData)[i]))
+                needsQuotes = TRUE;
+            if (((LPCWSTR)pValue->pbData)[i] == '"')
+                len += 1;
+        }
+        if (needsQuotes)
+            len += 2;
+        if (!psz || !csz)
+            ret = len;
+        else
+        {
+            char *dst = psz;
+
+            if (needsQuotes)
+                *dst++ = '"';
+            for (i = 0; i < pValue->cbData / sizeof(WCHAR) &&
+             dst - psz < csz; dst++, i++)
+            {
+                LPCWSTR src = (LPCWSTR)pValue->pbData + i;
+
+                WideCharToMultiByte(CP_ACP, 0, src, 1, dst,
+                 csz - (dst - psz) - 1, NULL, NULL);
+                if (*src == '"' && dst - psz < csz - 1)
+                    *(++dst) = '"';
+            }
+            if (needsQuotes && dst - psz < csz)
+                *dst++ = '"';
+            ret = dst - psz;
+        }
+        break;
     case CERT_RDN_UTF8_STRING:
         if (!psz || !csz)
             ret = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)pValue->pbData,
@@ -146,6 +186,7 @@ DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
     case CERT_RDN_GRAPHIC_STRING:
     case CERT_RDN_VISIBLE_STRING:
     case CERT_RDN_GENERAL_STRING:
+    case CERT_RDN_BMP_STRING:
         len = pValue->cbData;
         if (pValue->cbData && isspace(pValue->pbData[0]))
             needsQuotes = TRUE;
diff --git a/dlls/crypt32/tests/str.c b/dlls/crypt32/tests/str.c
index 3032b93..e59b933 100644
--- a/dlls/crypt32/tests/str.c
+++ b/dlls/crypt32/tests/str.c
@@ -443,7 +443,7 @@ static void test_CertNameToStrA(void)
     blob.pbData = encodedQuotedCN;
     blob.cbData = sizeof(encodedQuotedCN);
     test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"\"\"1\"\"\"",
-     TRUE);
+     FALSE);
     blob.pbData = encodedMultipleAttrCN;
     blob.cbData = sizeof(encodedMultipleAttrCN);
     test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"1+2\"", FALSE);
@@ -455,16 +455,16 @@ static void test_CertNameToStrA(void)
     test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a=b\"", FALSE);
     blob.pbData = encodedLessThanCN;
     blob.cbData = sizeof(encodedLessThanCN);
-    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"<\"", TRUE);
+    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"<\"", FALSE);
     blob.pbData = encodedGreaterThanCN;
     blob.cbData = sizeof(encodedGreaterThanCN);
-    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\">\"", TRUE);
+    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\">\"", FALSE);
     blob.pbData = encodedHashCN;
     blob.cbData = sizeof(encodedHashCN);
-    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"#\"", TRUE);
+    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"#\"", FALSE);
     blob.pbData = encodedSemiCN;
     blob.cbData = sizeof(encodedSemiCN);
-    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\";\"", TRUE);
+    test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\";\"", FALSE);
 }
 
 static void test_NameToStrConversionW(PCERT_NAME_BLOB pName, DWORD dwStrType,




More information about the wine-cvs mailing list