Juan Lang : crypt32: Implement CertGetNameStringW for CERT_NAME_ATTR_TYPE.

Alexandre Julliard julliard at winehq.org
Wed Sep 9 09:58:03 CDT 2009


Module: wine
Branch: master
Commit: dfcd8a67c1a8eceaa0000931d1eeb3a7839b8685
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=dfcd8a67c1a8eceaa0000931d1eeb3a7839b8685

Author: Juan Lang <juan.lang at gmail.com>
Date:   Tue Sep  8 22:10:53 2009 -0700

crypt32: Implement CertGetNameStringW for CERT_NAME_ATTR_TYPE.

---

 dlls/crypt32/str.c |   35 +++++++++++++++++++++++++++++++++++
 1 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c
index 6e13426..a30a103 100644
--- a/dlls/crypt32/str.c
+++ b/dlls/crypt32/str.c
@@ -966,6 +966,25 @@ static PCERT_ALT_NAME_ENTRY cert_find_alt_name_entry(PCCERT_CONTEXT cert,
     return entry;
 }
 
+static DWORD cert_get_name_from_rdn_attr(DWORD encodingType,
+ PCERT_NAME_BLOB name, LPCSTR oid, LPWSTR pszNameString, DWORD cchNameString)
+{
+    CERT_NAME_INFO *nameInfo;
+    DWORD bytes = 0, ret = 0;
+
+    if (CryptDecodeObjectEx(encodingType, X509_NAME, name->pbData,
+     name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &nameInfo, &bytes))
+    {
+        PCERT_RDN_ATTR nameAttr = CertFindRDNAttr(oid, nameInfo);
+
+        if (nameAttr)
+            ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value,
+             pszNameString, cchNameString);
+        LocalFree(nameInfo);
+    }
+    return ret;
+}
+
 DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
  DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString)
 {
@@ -989,6 +1008,22 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
 
     switch (dwType)
     {
+    case CERT_NAME_ATTR_TYPE:
+        ret = cert_get_name_from_rdn_attr(pCertContext->dwCertEncodingType,
+         name, pvTypePara, pszNameString, cchNameString);
+        if (!ret)
+        {
+            CERT_ALT_NAME_INFO *altInfo;
+            PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext,
+             altNameOID, CERT_ALT_NAME_DIRECTORY_NAME, &altInfo);
+
+            if (entry)
+                ret = cert_name_to_str_with_indent(X509_ASN_ENCODING, 0,
+                 &entry->DirectoryName, 0, pszNameString, cchNameString);
+            if (altInfo)
+                LocalFree(altInfo);
+        }
+        break;
     case CERT_NAME_SIMPLE_DISPLAY_TYPE:
     {
         static const LPCSTR simpleAttributeOIDs[] = { szOID_COMMON_NAME,




More information about the wine-cvs mailing list