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..58a4e971f15 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 struct + { + const char *CN; + const char *X500_CN; + } test[] = + { + { "1", "1" }, + { " 1", "" 1"" }, + { "1 ", ""1 "" }, + { ""1"", """"1"""" }, + { "" 1 "", """" 1 """" }, + { """"1"""", """"""""1"""""""" }, + { "1+", ""1+"" }, + { "1=", ""1="" }, + { "1"", ""1"""" }, + { "1<", ""1<"" }, + { "1>", ""1>"" }, + { "1#", ""1#"" }, + { "1+", ""1+"" }, + }; + CERT_RDN_ATTR attr; + CERT_RDN rdn; + CERT_NAME_INFO info; + CERT_NAME_BLOB blob; + BYTE *buf; + char str[256]; + WCHAR strW[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_PRINTABLE_STRING; + attr.Value.cbData = strlen(test[i].CN); + 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_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 = CertNameToStrA(X509_ASN_ENCODING, &blob, 0, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strcmp(str, test[i].X500_CN), "got %s, expected %s\n", str, test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_SIMPLE_NAME_STR, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strcmp(str, test[i].X500_CN), "got %s, expected %s\n", str, test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_OID_NAME_STR, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strncmp(str, "2.5.4.3=", 8), "got %s\n", str); + ok(!strcmp(&str[8], test[i].X500_CN), "got %s, expected %s\n", &str[8], test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strncmp(str, "CN=", 3), "got %s\n", str); + ok(!strcmp(&str[3], test[i].X500_CN), "got %s, expected %s\n", &str[3], test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR | CERT_NAME_STR_NO_QUOTING_FLAG, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strncmp(str, "CN=", 3), "got %s\n", str); + todo_wine_if(i != 0) + ok(!strcmp(&str[3], test[i].CN), "got %s, expected %s\n", &str[3], test[i].CN); + + LocalFree(buf); + + winetest_pop_context(); + } + + for (i = 0; i < ARRAY_SIZE(test); i++) + { + winetest_push_context("%lu", i); + + ret = MultiByteToWideChar(CP_ACP, 0, test[i].CN, strlen(test[i].CN), strW, ARRAY_SIZE(strW)); + ok(ret, "MultiByteToWideChar error %lu\n", GetLastError()); + + attr.pszObjId = (LPSTR)szOID_COMMON_NAME; + attr.dwValueType = CERT_RDN_UTF8_STRING; + attr.Value.cbData = ret * sizeof(WCHAR); + attr.Value.pbData = (BYTE *)strW; + rdn.cRDNAttr = 1; + rdn.rgRDNAttr = &attr; + 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 error %08lx\n", GetLastError()); + + blob.pbData = buf; + blob.cbData = size; + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, 0, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strcmp(str, test[i].X500_CN), "got %s, expected %s\n", str, test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_SIMPLE_NAME_STR, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strcmp(str, test[i].X500_CN), "got %s, expected %s\n", str, test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_OID_NAME_STR, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strncmp(str, "2.5.4.3=", 8), "got %s\n", str); + ok(!strcmp(&str[8], test[i].X500_CN), "got %s, expected %s\n", &str[8], test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strncmp(str, "CN=", 3), "got %s\n", str); + ok(!strcmp(&str[3], test[i].X500_CN), "got %s, expected %s\n", &str[3], test[i].X500_CN); + + str[0] = 0; + ret = CertNameToStrA(X509_ASN_ENCODING, &blob, CERT_X500_NAME_STR | CERT_NAME_STR_NO_QUOTING_FLAG, str, sizeof(str)); + ok(ret, "CertNameToStr error %08lx\n", GetLastError()); + ok(!strncmp(str, "CN=", 3), "got %s\n", str); + todo_wine_if(i != 0) + ok(!strcmp(&str[3], test[i].CN), "got %s, expected %s\n", &str[3], test[i].CN); + + LocalFree(buf); + + winetest_pop_context(); + } +} + START_TEST(str) { + test_quoted_RDN(); test_CertRDNValueToStrA(); test_CertRDNValueToStrW(); test_CertNameToStrA();