From: Dmitry Timoshkov <dmitry(a)baikal.ru> Signed-off-by: Dmitry Timoshkov <dmitry(a)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(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3729