From: Paul Gofman pgofman@codeweavers.com
--- dlls/crypt32/tests/str.c | 331 +++++++++++++++------------------------ 1 file changed, 127 insertions(+), 204 deletions(-)
diff --git a/dlls/crypt32/tests/str.c b/dlls/crypt32/tests/str.c index a94381591c0..e10d5a4fb29 100644 --- a/dlls/crypt32/tests/str.c +++ b/dlls/crypt32/tests/str.c @@ -429,23 +429,31 @@ static void test_CertNameToStrA(void) test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, ""a\nb"", FALSE); }
-static void test_NameToStrConversionW(PCERT_NAME_BLOB pName, DWORD dwStrType, - LPCWSTR expected, BOOL todo) +#define test_NameToStrConversionW(a, b, c) test_NameToStrConversionW_(__LINE__, a, b, c) +static void test_NameToStrConversionW_(unsigned int line, PCERT_NAME_BLOB pName, DWORD dwStrType, LPCWSTR expected) { - WCHAR buffer[2000] = { 0 }; - DWORD i; + DWORD len, retlen, expected_len; + WCHAR buffer[2000];
- i = CertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, NULL, 0); - todo_wine_if (todo) - ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %ld\n", - lstrlenW(expected) + 1, i); - i = CertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, buffer, ARRAY_SIZE(buffer)); - todo_wine_if (todo) - ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %ld\n", - lstrlenW(expected) + 1, i); - todo_wine_if (todo) - ok(!lstrcmpW(buffer, expected), "Expected %s, got %s\n", - wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); + expected_len = wcslen(expected) + 1; + memset(buffer, 0xcc, sizeof(buffer)); + len = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, NULL, 0); + ok(len == expected_len, "line %u: expected %lu chars, got %lu\n", line, expected_len, len); + retlen = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, buffer, ARRAY_SIZE(buffer)); + ok(retlen == len, "line %u: expected %lu chars, got %lu.\n", line, len, retlen); + ok(!wcscmp(buffer, expected), "Expected %s, got %s\n", wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); + + memset(buffer, 0xcc, sizeof(buffer)); + retlen = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, buffer, len - 1); + todo_wine ok(retlen == len - 1, "line %u: expected %lu chars, got %lu\n", line, len - 1, retlen); + ok(!wcsncmp(buffer, expected, retlen - 1), "line %u: expected %s, got %s\n", + line, wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); + ok(!buffer[retlen - 1], "line %u: string is not zero terminated.\n", line); + + memset(buffer, 0xcc, sizeof(buffer)); + retlen = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, buffer, 0); + todo_wine ok(retlen == len, "line %u: expected %lu chars, got %lu\n", line, len - 1, retlen); + ok(buffer[0] == 0xcccc, "line %u: got %s\n", line, wine_dbgstr_w(buffer)); }
static void test_CertNameToStrW(void) @@ -479,95 +487,79 @@ static void test_CertNameToStrW(void)
test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, - L"US, Minnesota, Minneapolis, CodeWeavers, Wine Development, localhost, aric@codeweavers.com", FALSE); + L"US, Minnesota, Minneapolis, CodeWeavers, Wine Development, localhost, aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - L"US; Minnesota; Minneapolis; CodeWeavers; Wine Development; localhost; aric@codeweavers.com", FALSE); + L"US; Minnesota; Minneapolis; CodeWeavers; Wine Development; localhost; aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - L"US\r\nMinnesota\r\nMinneapolis\r\nCodeWeavers\r\nWine Development\r\nlocalhost\r\naric@codeweavers.com", - FALSE); + L"US\r\nMinnesota\r\nMinneapolis\r\nCodeWeavers\r\nWine Development\r\nlocalhost\r\naric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR, L"2.5.4.6=US, 2.5.4.8=Minnesota, 2.5.4.7=Minneapolis, 2.5.4.10=CodeWeavers, 2.5.4.11=Wine Development," - " 2.5.4.3=localhost, 1.2.840.113549.1.9.1=aric@codeweavers.com", FALSE); + " 2.5.4.3=localhost, 1.2.840.113549.1.9.1=aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, L"2.5.4.6=US; 2.5.4.8=Minnesota; 2.5.4.7=Minneapolis; 2.5.4.10=CodeWeavers; 2.5.4.11=Wine Development;" - " 2.5.4.3=localhost; 1.2.840.113549.1.9.1=aric@codeweavers.com", FALSE); + " 2.5.4.3=localhost; 1.2.840.113549.1.9.1=aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_CRLF_FLAG, L"2.5.4.6=US\r\n2.5.4.8=Minnesota\r\n2.5.4.7=Minneapolis\r\n2.5.4.10=CodeWeavers\r\n2.5.4.11=Wine " - "Development\r\n2.5.4.3=localhost\r\n1.2.840.113549.1.9.1=aric@codeweavers.com", FALSE); + "Development\r\n2.5.4.3=localhost\r\n1.2.840.113549.1.9.1=aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, L"E=aric@codeweavers.com; CN=localhost; OU=Wine Development; O=CodeWeavers; L=Minneapolis; S=Minnesota; " - "C=US", FALSE); + "C=US");
CertFreeCertificateContext(context); } blob.pbData = encodedSimpleCN; blob.cbData = sizeof(encodedSimpleCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=1", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=1"); blob.pbData = encodedSingleQuotedCN; blob.cbData = sizeof(encodedSingleQuotedCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN='1'", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, - L"'1'", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN='1'"); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"'1'"); blob.pbData = encodedSpacedCN; blob.cbData = sizeof(encodedSpacedCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=" 1 "", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"" 1 "", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=" 1 ""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"" 1 ""); blob.pbData = encodedQuotedCN; blob.cbData = sizeof(encodedQuotedCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="""1"""", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""""1"""", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="""1""""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""""1""""); blob.pbData = encodedMultipleAttrCN; blob.cbData = sizeof(encodedMultipleAttrCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="1+2"", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, - L""1+2"", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="1+2""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""1+2""); blob.pbData = encodedCommaCN; blob.cbData = sizeof(encodedCommaCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="a,b"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""a,b"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="a,b""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""a,b""); blob.pbData = encodedEqualCN; blob.cbData = sizeof(encodedEqualCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="a=b"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""a=b"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="a=b""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""a=b""); blob.pbData = encodedLessThanCN; blob.cbData = sizeof(encodedLessThanCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="<"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""<"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="<""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""<""); blob.pbData = encodedGreaterThanCN; blob.cbData = sizeof(encodedGreaterThanCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=">"", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, - L"">"", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=">""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"">""); blob.pbData = encodedHashCN; blob.cbData = sizeof(encodedHashCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="#"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""#"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="#""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""#""); blob.pbData = encodedSemiCN; blob.cbData = sizeof(encodedSemiCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=";"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"";"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=";""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"";""); blob.pbData = encodedNewlineCN; blob.cbData = sizeof(encodedNewlineCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="a\nb"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""a\nb"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN="a\nb""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L""a\nb""); }
struct StrToNameA @@ -747,153 +739,84 @@ static void test_CertStrToNameW(void) } }
-static void test_CertGetNameStringA(void) +#define test_CertGetNameString_value(a, b, c, d) test_CertGetNameString_value_(__LINE__, a, b, c, d) +static void test_CertGetNameString_value_(unsigned int line, PCCERT_CONTEXT context, DWORD type, void *type_para, + const char *expected) +{ + WCHAR expectedW[512]; + DWORD len, retlen; + WCHAR strW[512]; + unsigned int i; + char str[512]; + + for (i = 0; expected[i]; ++i) + expectedW[i] = expected[i]; + expectedW[i] = 0; + + len = CertGetNameStringA(context, type, 0, type_para, NULL, 0); + ok(len == strlen(expected) + 1, "line %u: unexpected length %ld.\n", line, len); + retlen = CertGetNameStringA(context, type, 0, type_para, str, len); + ok(retlen == len, "line %u: unexpected len %lu, expected %lu.\n", line, retlen, len); + ok(!strcmp(str, expected), "line %u: unexpected value %s.\n", line, str); + str[0] = str[1] = 0xcc; + retlen = CertGetNameStringA(context, type, 0, type_para, str, len - 1); + todo_wine ok(retlen == 1, "line %u: Unexpected len %lu, expected 1.\n", line, retlen); + todo_wine ok(!str[0], "line %u: unexpected str[0] %#x.\n", line, str[0]); + ok(str[1] == expected[1], "line %u: unexpected str[1] %#x.\n", line, str[1]); + retlen = CertGetNameStringW(context, type, 0, type_para, strW, len); + ok(retlen == len, "line %u: unexpected len %lu, expected 1.\n", line, retlen); + ok(!wcscmp(strW, expectedW), "line %u: unexpected value %s.\n", line, debugstr_w(strW)); + strW[0] = strW[1] = 0xcccc; + retlen = CertGetNameStringW(context, type, 0, type_para, strW, len - 1); + todo_wine ok(retlen == len - 1, "line %u: unexpected len %lu, expected %lu.\n", line, retlen, len - 1); + ok(!wcsncmp(strW, expectedW, retlen - 1), "line %u: string data mismatch.\n", line); + ok(!strW[retlen - 1], "line %u: string is not zero terminated.\n", line); + retlen = CertGetNameStringA(context, type, 0, type_para, NULL, len - 1); + ok(retlen == len, "line %u: unexpected len %lu, expected %lu\n", line, retlen, len); + retlen = CertGetNameStringW(context, type, 0, type_para, NULL, len - 1); + ok(retlen == len, "line %u: unexpected len %lu, expected %lu\n", line, retlen, len); +} + +static void test_CertGetNameString(void) { + static const char aric[] = "aric@codeweavers.com"; + static const char localhost[] = "localhost"; PCCERT_CONTEXT context; + DWORD len, type;
context = CertCreateCertificateContext(X509_ASN_ENCODING, cert, sizeof(cert)); - ok(context != NULL, "CertCreateCertificateContext failed: %08lx\n", - GetLastError()); - if (context) - { - static const char aric[] = "aric@codeweavers.com"; - static const char localhost[] = "localhost"; - DWORD len, type; - LPSTR str; - - /* Bad string types/types missing from the cert */ - len = CertGetNameStringA(NULL, 0, 0, NULL, NULL, 0); - ok(len == 1, "expected 1, got %ld\n", len); - len = CertGetNameStringA(context, 0, 0, NULL, NULL, 0); - ok(len == 1, "expected 1, got %ld\n", len); - len = CertGetNameStringA(context, CERT_NAME_URL_TYPE, 0, NULL, NULL, - 0); - ok(len == 1, "expected 1, got %ld\n", len); - - len = CertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(aric) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, aric), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(issuerStr) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, issuerStr), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - type = 0; - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL, - 0); - ok(len == strlen(issuerStr) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, - str, len); - ok(!strcmp(str, issuerStr), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - type = CERT_OID_NAME_STR; - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL, - 0); - ok(len == strlen(subjectStr) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, - str, len); - ok(!strcmp(str, subjectStr), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(aric) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, aric), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_RSA_emailAddr, NULL, 0); - ok(len == strlen(aric) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_RSA_emailAddr, str, len); - ok(!strcmp(str, aric), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_COMMON_NAME, NULL, 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_COMMON_NAME, str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, - NULL, NULL, 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, - 0, NULL, str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, - NULL, NULL, 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, - 0, NULL, str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - if (len > 1) - { - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - } - - CertFreeCertificateContext(context); - } + ok(!!context, "CertCreateCertificateContext failed, err %lu\n", GetLastError()); + + /* Bad string types/types missing from the cert */ + len = CertGetNameStringA(NULL, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringA(context, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringA(context, CERT_NAME_URL_TYPE, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + + len = CertGetNameStringW(NULL, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringW(context, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringW(context, CERT_NAME_URL_TYPE, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + + test_CertGetNameString_value(context, CERT_NAME_EMAIL_TYPE, NULL, aric); + test_CertGetNameString_value(context, CERT_NAME_RDN_TYPE, NULL, issuerStr); + type = 0; + test_CertGetNameString_value(context, CERT_NAME_RDN_TYPE, &type, issuerStr); + type = CERT_OID_NAME_STR; + test_CertGetNameString_value(context, CERT_NAME_RDN_TYPE, &type, subjectStr); + test_CertGetNameString_value(context, CERT_NAME_ATTR_TYPE, NULL, aric); + test_CertGetNameString_value(context, CERT_NAME_ATTR_TYPE, (void *)szOID_RSA_emailAddr, aric); + test_CertGetNameString_value(context, CERT_NAME_ATTR_TYPE, (void *)szOID_COMMON_NAME, localhost); + test_CertGetNameString_value(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, NULL, localhost); + test_CertGetNameString_value(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, NULL, localhost); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, NULL, localhost); + + CertFreeCertificateContext(context); }
START_TEST(str) @@ -904,5 +827,5 @@ START_TEST(str) test_CertNameToStrW(); test_CertStrToNameA(); test_CertStrToNameW(); - test_CertGetNameStringA(); + test_CertGetNameString(); }