crypt32: Correct searching the alternate name in CertGetNameStringW if the main name doesn't contain an appropriate OID.

This commit is contained in:
Juan Lang 2009-09-08 21:06:28 -07:00 committed by Alexandre Julliard
parent bbab7f2782
commit c7db5ee6a7
1 changed files with 38 additions and 20 deletions

View File

@ -933,7 +933,7 @@ DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType,
DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString) DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString)
{ {
DWORD ret; DWORD ret = 0;
PCERT_NAME_BLOB name; PCERT_NAME_BLOB name;
LPCSTR altNameOID; LPCSTR altNameOID;
@ -958,19 +958,22 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
static const LPCSTR simpleAttributeOIDs[] = { szOID_COMMON_NAME, static const LPCSTR simpleAttributeOIDs[] = { szOID_COMMON_NAME,
szOID_ORGANIZATIONAL_UNIT_NAME, szOID_ORGANIZATION_NAME, szOID_ORGANIZATIONAL_UNIT_NAME, szOID_ORGANIZATION_NAME,
szOID_RSA_emailAddr }; szOID_RSA_emailAddr };
CERT_NAME_INFO *info = NULL; CERT_NAME_INFO *nameInfo = NULL;
PCERT_RDN_ATTR nameAttr = NULL; PCERT_RDN_ATTR nameAttr = NULL;
DWORD bytes = 0, i; DWORD bytes = 0, i;
if (CryptDecodeObjectEx(pCertContext->dwCertEncodingType, X509_NAME, if (CryptDecodeObjectEx(pCertContext->dwCertEncodingType, X509_NAME,
name->pbData, name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, name->pbData, name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &nameInfo,
&bytes)) &bytes))
{ {
for (i = 0; !nameAttr && i < sizeof(simpleAttributeOIDs) / for (i = 0; !nameAttr && i < sizeof(simpleAttributeOIDs) /
sizeof(simpleAttributeOIDs[0]); i++) sizeof(simpleAttributeOIDs[0]); i++)
nameAttr = CertFindRDNAttr(simpleAttributeOIDs[i], info); nameAttr = CertFindRDNAttr(simpleAttributeOIDs[i], nameInfo);
} }
if (!nameAttr) if (nameAttr)
ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value,
pszNameString, cchNameString);
else
{ {
PCERT_EXTENSION ext = CertFindExtension(altNameOID, PCERT_EXTENSION ext = CertFindExtension(altNameOID,
pCertContext->pCertInfo->cExtension, pCertContext->pCertInfo->cExtension,
@ -978,25 +981,40 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
if (ext) if (ext)
{ {
for (i = 0; !nameAttr && i < sizeof(simpleAttributeOIDs) / PCERT_ALT_NAME_INFO altInfo;
sizeof(simpleAttributeOIDs[0]); i++)
nameAttr = CertFindRDNAttr(simpleAttributeOIDs[i], info); bytes = 0;
if (!nameAttr) if (CryptDecodeObjectEx(pCertContext->dwCertEncodingType,
X509_ALTERNATE_NAME, ext->Value.pbData, ext->Value.cbData,
CRYPT_DECODE_ALLOC_FLAG, NULL, &altInfo, &bytes))
{ {
/* FIXME: gotta then look for a rfc822Name choice in ext. PCERT_ALT_NAME_ENTRY entry = NULL;
* Failing that, look for the first attribute.
*/ for (i = 0; !entry && i < altInfo->cAltEntry; i++)
FIXME("CERT_NAME_SIMPLE_DISPLAY_TYPE: stub\n"); if (altInfo->rgAltEntry[i].dwAltNameChoice ==
CERT_ALT_NAME_RFC822_NAME)
entry = &altInfo->rgAltEntry[i];
if (!entry && altInfo->cAltEntry)
entry = &altInfo->rgAltEntry[0];
if (entry)
{
if (!pszNameString)
ret = strlenW(entry->pwszRfc822Name) + 1;
else
{
ret = min(strlenW(entry->pwszRfc822Name),
cchNameString - 1);
memcpy(pszNameString, entry->pwszRfc822Name,
ret * sizeof(WCHAR));
pszNameString[ret++] = 0;
}
}
LocalFree(altInfo);
} }
} }
} }
if (nameAttr) if (nameInfo)
ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value, LocalFree(nameInfo);
pszNameString, cchNameString);
else
ret = 0;
if (info)
LocalFree(info);
break; break;
} }
case CERT_NAME_FRIENDLY_DISPLAY_TYPE: case CERT_NAME_FRIENDLY_DISPLAY_TYPE: