From: Dmitry Timoshkov dmitry@baikal.ru
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/crypt32/tests/str.c | 145 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+)
diff --git a/dlls/crypt32/tests/str.c b/dlls/crypt32/tests/str.c index 9e4ca37bcd6..89611076ab4 100644 --- a/dlls/crypt32/tests/str.c +++ b/dlls/crypt32/tests/str.c @@ -23,6 +23,7 @@ #include <winbase.h> #include <winerror.h> #include <wincrypt.h> +#include <winnls.h>
#include "wine/test.h"
@@ -1079,8 +1080,152 @@ static void test_CertGetNameString(void) CertFreeCertificateContext(context); }
+static void test_quoted_RDN(void) +{ + static const WCHAR str1[] = { '1',0x00a0,0 }; + static const WCHAR str2[] = { '1',0x3000,0 }; + static const struct + { + const WCHAR *CN; + const WCHAR *X500_CN; + } test[] = + { + { L"1", L"1" }, + { L" 1", L"" 1"" }, + { L"1 ", L""1 "" }, + { L""1"", L""""1"""" }, + { L"" 1 "", L"""" 1 """" }, + { L""""1"""", L""""""""1"""""""" }, + { L"1+", L""1+"" }, + { L"1=", L""1="" }, + { L"1"", L""1"""" }, + { L"1<", L""1<"" }, + { L"1>", L""1>"" }, + { L"1#", L""1#"" }, + { L"1+", L""1+"" }, + { str1, str1 }, + { str2, str2 }, + }; + CERT_RDN_ATTR attr; + CERT_RDN rdn; + CERT_NAME_INFO info; + CERT_NAME_BLOB blob; + BYTE *buf; + WCHAR str[256]; + DWORD size, ret, i; + + for (i = 0; i < ARRAY_SIZE(test); i++) + { + winetest_push_context("%lu", i); + + attr.pszObjId = (LPSTR)szOID_COMMON_NAME; + attr.dwValueType = CERT_RDN_UNICODE_STRING; + attr.Value.cbData = wcslen(test[i].CN) * sizeof(WCHAR); + attr.Value.pbData = (BYTE *)test[i].CN; + rdn.cRDNAttr = 1; + rdn.rgRDNAttr = &attr; + info.cRDN = 1; + info.rgRDN = &rdn; + buf = NULL; + size = 0; + ret = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_UNICODE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + ok(ret, "CryptEncodeObjectEx error %08lx\n", GetLastError()); + + blob.pbData = buf; + blob.cbData = size; + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, 0, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcscmp(str, test[i].X500_CN), "got %s, expected %s\n", debugstr_w(str), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_SIMPLE_NAME_STR, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcscmp(str, test[i].X500_CN), "got %s, expected %s\n", debugstr_w(str), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_OID_NAME_STR, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcsncmp(str, L"2.5.4.3=", 8), "got %s\n", debugstr_w(str)); + ok(!wcscmp(&str[8], test[i].X500_CN), "got %s, expected %s\n", debugstr_w(&str[8]), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcsncmp(str, L"CN=", 3), "got %s\n", debugstr_w(str)); + ok(!wcscmp(&str[3], test[i].X500_CN), "got %s, expected %s\n", debugstr_w(&str[3]), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR | CERT_NAME_STR_NO_QUOTING_FLAG, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcsncmp(str, L"CN=", 3), "got %s\n", debugstr_w(str)); + todo_wine_if(i != 0 && i != 13 && i != 14) + ok(!wcscmp(&str[3], test[i].CN), "got %s, expected %s\n", debugstr_w(&str[3]), debugstr_w(test[i].CN)); + + LocalFree(buf); + + winetest_pop_context(); + } + + for (i = 0; i < ARRAY_SIZE(test); i++) + { + winetest_push_context("%lu", i); + + attr.pszObjId = (LPSTR)szOID_COMMON_NAME; + attr.dwValueType = CERT_RDN_UTF8_STRING; + attr.Value.cbData = wcslen(test[i].CN) * sizeof(WCHAR); + attr.Value.pbData = (BYTE *)test[i].CN; + rdn.cRDNAttr = 1; + rdn.rgRDNAttr = &attr; + info.cRDN = 1; + info.rgRDN = &rdn; + buf = NULL; + size = 0; + ret = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_UNICODE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + ok(ret, "CryptEncodeObjectEx error %08lx\n", GetLastError()); + + blob.pbData = buf; + blob.cbData = size; + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, 0, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcscmp(str, test[i].X500_CN), "got %s, expected %s\n", debugstr_w(str), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_SIMPLE_NAME_STR, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcscmp(str, test[i].X500_CN), "got %s, expected %s\n", debugstr_w(str), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_OID_NAME_STR, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcsncmp(str, L"2.5.4.3=", 8), "got %s\n", debugstr_w(str)); + ok(!wcscmp(&str[8], test[i].X500_CN), "got %s, expected %s\n", debugstr_w(&str[8]), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcsncmp(str, L"CN=", 3), "got %s\n", debugstr_w(str)); + ok(!wcscmp(&str[3], test[i].X500_CN), "got %s, expected %s\n", debugstr_w(&str[3]), debugstr_w(test[i].X500_CN)); + + str[0] = 0; + ret = CertNameToStrW(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR | CERT_NAME_STR_NO_QUOTING_FLAG, str, ARRAY_SIZE(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!wcsncmp(str, L"CN=", 3), "got %s\n", debugstr_w(str)); + todo_wine_if(i != 0 && i != 13 && i != 14) + ok(!wcscmp(&str[3], test[i].CN), "got %s, expected %s\n", debugstr_w(&str[3]), debugstr_w(test[i].CN)); + + LocalFree(buf); + + winetest_pop_context(); + } +} + START_TEST(str) { + test_quoted_RDN(); test_CertRDNValueToStrA(); test_CertRDNValueToStrW(); test_CertNameToStrA();