crypt32: Test/correct CertGetNameString with NULL pvTypePara.

This commit is contained in:
Juan Lang 2011-09-08 11:10:08 -07:00 committed by Alexandre Julliard
parent 7ae0b72e2f
commit e8b98b3145
2 changed files with 176 additions and 4 deletions

View File

@ -1209,8 +1209,11 @@ static DWORD cert_get_name_from_rdn_attr(DWORD encodingType,
if (CryptDecodeObjectEx(encodingType, X509_NAME, name->pbData, if (CryptDecodeObjectEx(encodingType, X509_NAME, name->pbData,
name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &nameInfo, &bytes)) name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &nameInfo, &bytes))
{ {
PCERT_RDN_ATTR nameAttr = CertFindRDNAttr(oid, nameInfo); PCERT_RDN_ATTR nameAttr;
if (!oid)
oid = szOID_RSA_emailAddr;
nameAttr = CertFindRDNAttr(oid, nameInfo);
if (nameAttr) if (nameAttr)
ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value, ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value,
pszNameString, cchNameString); pszNameString, cchNameString);
@ -1229,6 +1232,9 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
TRACE("(%p, %d, %08x, %p, %p, %d)\n", pCertContext, dwType, TRACE("(%p, %d, %08x, %p, %p, %d)\n", pCertContext, dwType,
dwFlags, pvTypePara, pszNameString, cchNameString); dwFlags, pvTypePara, pszNameString, cchNameString);
if (!pCertContext)
goto done;
if (dwFlags & CERT_NAME_ISSUER_FLAG) if (dwFlags & CERT_NAME_ISSUER_FLAG)
{ {
name = &pCertContext->pCertInfo->Issuer; name = &pCertContext->pCertInfo->Issuer;
@ -1268,9 +1274,12 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
break; break;
} }
case CERT_NAME_RDN_TYPE: case CERT_NAME_RDN_TYPE:
{
DWORD type = pvTypePara ? *(DWORD *)pvTypePara : 0;
if (name->cbData) if (name->cbData)
ret = CertNameToStrW(pCertContext->dwCertEncodingType, name, ret = CertNameToStrW(pCertContext->dwCertEncodingType, name,
*(DWORD *)pvTypePara, pszNameString, cchNameString); type, pszNameString, cchNameString);
else else
{ {
CERT_ALT_NAME_INFO *info; CERT_ALT_NAME_INFO *info;
@ -1279,12 +1288,12 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
if (entry) if (entry)
ret = CertNameToStrW(pCertContext->dwCertEncodingType, ret = CertNameToStrW(pCertContext->dwCertEncodingType,
&entry->u.DirectoryName, *(DWORD *)pvTypePara, pszNameString, &entry->u.DirectoryName, type, pszNameString, cchNameString);
cchNameString);
if (info) if (info)
LocalFree(info); LocalFree(info);
} }
break; break;
}
case CERT_NAME_ATTR_TYPE: case CERT_NAME_ATTR_TYPE:
ret = cert_get_name_from_rdn_attr(pCertContext->dwCertEncodingType, ret = cert_get_name_from_rdn_attr(pCertContext->dwCertEncodingType,
name, pvTypePara, pszNameString, cchNameString); name, pvTypePara, pszNameString, cchNameString);
@ -1413,6 +1422,7 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
FIXME("unimplemented for type %d\n", dwType); FIXME("unimplemented for type %d\n", dwType);
ret = 0; ret = 0;
} }
done:
if (!ret) if (!ret)
{ {
if (!pszNameString) if (!pszNameString)

View File

@ -199,6 +199,8 @@ typedef BOOL (WINAPI *CertStrToNameAFunc)(DWORD dwCertEncodingType,
typedef BOOL (WINAPI *CertStrToNameWFunc)(DWORD dwCertEncodingType, typedef BOOL (WINAPI *CertStrToNameWFunc)(DWORD dwCertEncodingType,
LPCWSTR pszX500, DWORD dwStrType, void *pvReserved, BYTE *pbEncoded, LPCWSTR pszX500, DWORD dwStrType, void *pvReserved, BYTE *pbEncoded,
DWORD *pcbEncoded, LPCWSTR *ppszError); DWORD *pcbEncoded, LPCWSTR *ppszError);
typedef DWORD (WINAPI *CertGetNameStringAFunc)(PCCERT_CONTEXT cert, DWORD type,
DWORD flags, void *typePara, LPSTR str, DWORD cch);
static HMODULE dll; static HMODULE dll;
static CertNameToStrAFunc pCertNameToStrA; static CertNameToStrAFunc pCertNameToStrA;
@ -208,6 +210,7 @@ static CertRDNValueToStrAFunc pCertRDNValueToStrA;
static CertRDNValueToStrWFunc pCertRDNValueToStrW; static CertRDNValueToStrWFunc pCertRDNValueToStrW;
static CertStrToNameAFunc pCertStrToNameA; static CertStrToNameAFunc pCertStrToNameA;
static CertStrToNameWFunc pCertStrToNameW; static CertStrToNameWFunc pCertStrToNameW;
static CertGetNameStringAFunc pCertGetNameStringA;
static void test_CertRDNValueToStrA(void) static void test_CertRDNValueToStrA(void)
{ {
@ -933,6 +936,162 @@ static void test_CertStrToNameW(void)
} }
} }
static void test_CertGetNameStringA(void)
{
PCCERT_CONTEXT context;
if (!pCertGetNameStringA)
{
win_skip("CertGetNameStringA is not available\n");
return;
}
context = CertCreateCertificateContext(X509_ASN_ENCODING, cert,
sizeof(cert));
ok(context != NULL, "CertCreateCertificateContext failed: %08x\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 = pCertGetNameStringA(NULL, 0, 0, NULL, NULL, 0);
ok(len == 1, "expected 1, got %d\n", len);
len = pCertGetNameStringA(context, 0, 0, NULL, NULL, 0);
ok(len == 1, "expected 1, got %d\n", len);
len = pCertGetNameStringA(context, CERT_NAME_URL_TYPE, 0, NULL, NULL,
0);
ok(len == 1, "expected 1, got %d\n", len);
len = pCertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL, NULL,
0);
ok(len == strlen(aric) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL,
str, len);
ok(!strcmp(str, aric), "unexpected value %s\n", str);
HeapFree(GetProcessHeap(), 0, str);
}
len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, NULL, NULL,
0);
ok(len == strlen(issuerStr) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(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 = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL,
0);
ok(len == strlen(issuerStr) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(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 = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL,
0);
ok(len == strlen(subjectStr) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type,
str, len);
ok(!strcmp(str, subjectStr), "unexpected value %s\n", str);
HeapFree(GetProcessHeap(), 0, str);
}
len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL, NULL,
0);
ok(len == strlen(aric) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL,
str, len);
ok(!strcmp(str, aric), "unexpected value %s\n", str);
HeapFree(GetProcessHeap(), 0, str);
}
len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0,
(void *)szOID_RSA_emailAddr, NULL, 0);
ok(len == strlen(aric) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(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 = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0,
(void *)szOID_COMMON_NAME, NULL, 0);
ok(len == strlen(localhost) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(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 = pCertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0,
NULL, NULL, 0);
ok(len == strlen(localhost) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE,
0, NULL, str, len);
ok(!strcmp(str, localhost), "unexpected value %s\n", str);
HeapFree(GetProcessHeap(), 0, str);
}
len = pCertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0,
NULL, NULL, 0);
ok(len == strlen(localhost) + 1, "unexpected length %d\n", len);
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE,
0, NULL, str, len);
ok(!strcmp(str, localhost), "unexpected value %s\n", str);
HeapFree(GetProcessHeap(), 0, str);
}
len = pCertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL, NULL,
0);
ok(len == strlen(localhost) + 1 || broken(len == 1) /* NT4 */,
"unexpected length %d\n", len);
if (len > 1)
{
str = HeapAlloc(GetProcessHeap(), 0, len);
if (str)
{
len = pCertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL,
str, len);
ok(!strcmp(str, localhost), "unexpected value %s\n", str);
HeapFree(GetProcessHeap(), 0, str);
}
}
CertFreeCertificateContext(context);
}
}
START_TEST(str) START_TEST(str)
{ {
dll = GetModuleHandleA("Crypt32.dll"); dll = GetModuleHandleA("Crypt32.dll");
@ -947,6 +1106,8 @@ START_TEST(str)
"CryptDecodeObject"); "CryptDecodeObject");
pCertStrToNameA = (CertStrToNameAFunc)GetProcAddress(dll,"CertStrToNameA"); pCertStrToNameA = (CertStrToNameAFunc)GetProcAddress(dll,"CertStrToNameA");
pCertStrToNameW = (CertStrToNameWFunc)GetProcAddress(dll,"CertStrToNameW"); pCertStrToNameW = (CertStrToNameWFunc)GetProcAddress(dll,"CertStrToNameW");
pCertGetNameStringA = (CertGetNameStringAFunc)GetProcAddress(dll,
"CertGetNameStringA");
test_CertRDNValueToStrA(); test_CertRDNValueToStrA();
test_CertRDNValueToStrW(); test_CertRDNValueToStrW();
@ -954,4 +1115,5 @@ START_TEST(str)
test_CertNameToStrW(); test_CertNameToStrW();
test_CertStrToNameA(); test_CertStrToNameA();
test_CertStrToNameW(); test_CertStrToNameW();
test_CertGetNameStringA();
} }