Juan Lang : crypt32: Correct searching the alternate name in CertGetNameStringW if the main name doesn 't contain an appropriate OID.
Alexandre Julliard
julliard at winehq.org
Wed Sep 9 09:57:43 CDT 2009
Module: wine
Branch: master
Commit: c7db5ee6a722d8993bc66adc851660cf2ed57485
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c7db5ee6a722d8993bc66adc851660cf2ed57485
Author: Juan Lang <juan.lang at gmail.com>
Date: Tue Sep 8 21:06:28 2009 -0700
crypt32: Correct searching the alternate name in CertGetNameStringW if the main name doesn't contain an appropriate OID.
---
dlls/crypt32/str.c | 58 ++++++++++++++++++++++++++++++++++------------------
1 files changed, 38 insertions(+), 20 deletions(-)
diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c
index c0b7677..f7821e1 100644
--- a/dlls/crypt32/str.c
+++ b/dlls/crypt32/str.c
@@ -933,7 +933,7 @@ DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType,
DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString)
{
- DWORD ret;
+ DWORD ret = 0;
PCERT_NAME_BLOB name;
LPCSTR altNameOID;
@@ -958,19 +958,22 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
static const LPCSTR simpleAttributeOIDs[] = { szOID_COMMON_NAME,
szOID_ORGANIZATIONAL_UNIT_NAME, szOID_ORGANIZATION_NAME,
szOID_RSA_emailAddr };
- CERT_NAME_INFO *info = NULL;
+ CERT_NAME_INFO *nameInfo = NULL;
PCERT_RDN_ATTR nameAttr = NULL;
DWORD bytes = 0, i;
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))
{
for (i = 0; !nameAttr && i < sizeof(simpleAttributeOIDs) /
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,
pCertContext->pCertInfo->cExtension,
@@ -978,25 +981,40 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
if (ext)
{
- for (i = 0; !nameAttr && i < sizeof(simpleAttributeOIDs) /
- sizeof(simpleAttributeOIDs[0]); i++)
- nameAttr = CertFindRDNAttr(simpleAttributeOIDs[i], info);
- if (!nameAttr)
+ PCERT_ALT_NAME_INFO altInfo;
+
+ bytes = 0;
+ 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.
- * Failing that, look for the first attribute.
- */
- FIXME("CERT_NAME_SIMPLE_DISPLAY_TYPE: stub\n");
+ PCERT_ALT_NAME_ENTRY entry = NULL;
+
+ for (i = 0; !entry && i < altInfo->cAltEntry; i++)
+ 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)
- ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value,
- pszNameString, cchNameString);
- else
- ret = 0;
- if (info)
- LocalFree(info);
+ if (nameInfo)
+ LocalFree(nameInfo);
break;
}
case CERT_NAME_FRIENDLY_DISPLAY_TYPE:
More information about the wine-cvs
mailing list