Juan Lang : cryptnet: Improve CryptGetObjectUrl stub for URL_OID_CERTIFICATE_ISSUER.

Alexandre Julliard julliard at winehq.org
Mon Nov 23 08:49:53 CST 2009


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Sun Nov 22 15:48:24 2009 -0800

cryptnet: Improve CryptGetObjectUrl stub for URL_OID_CERTIFICATE_ISSUER.

---

 dlls/cryptnet/cryptnet_main.c |  104 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 98 insertions(+), 6 deletions(-)

diff --git a/dlls/cryptnet/cryptnet_main.c b/dlls/cryptnet/cryptnet_main.c
index a37c0d6..afae942 100644
--- a/dlls/cryptnet/cryptnet_main.c
+++ b/dlls/cryptnet/cryptnet_main.c
@@ -120,16 +120,108 @@ static const char *url_oid_to_str(LPCSTR oid)
 typedef BOOL (WINAPI *UrlDllGetObjectUrlFunc)(LPCSTR, LPVOID, DWORD,
  PCRYPT_URL_ARRAY, DWORD *, PCRYPT_URL_INFO, DWORD *, LPVOID);
 
+static LPWSTR name_value_to_str(CERT_NAME_BLOB *name)
+{
+    DWORD len = CertNameToStrW(X509_ASN_ENCODING, name, CERT_SIMPLE_NAME_STR,
+     NULL, 0);
+    LPWSTR str = NULL;
+
+    if (len)
+    {
+        str = CryptMemAlloc(len * sizeof(WCHAR));
+        if (str)
+            CertNameToStrW(X509_ASN_ENCODING, name, CERT_SIMPLE_NAME_STR,
+             str, len);
+    }
+    return str;
+}
+
+static void dump_alt_name_entry(CERT_ALT_NAME_ENTRY *entry)
+{
+    LPWSTR str;
+
+    switch (entry->dwAltNameChoice)
+    {
+    case CERT_ALT_NAME_OTHER_NAME:
+        TRACE("CERT_ALT_NAME_OTHER_NAME, oid = %s\n",
+         debugstr_a(entry->u.pOtherName->pszObjId));
+         break;
+    case CERT_ALT_NAME_RFC822_NAME:
+        TRACE("CERT_ALT_NAME_RFC822_NAME: %s\n",
+         debugstr_w(entry->u.pwszRfc822Name));
+        break;
+    case CERT_ALT_NAME_DNS_NAME:
+        TRACE("CERT_ALT_NAME_DNS_NAME: %s\n",
+         debugstr_w(entry->u.pwszDNSName));
+        break;
+    case CERT_ALT_NAME_DIRECTORY_NAME:
+        str = name_value_to_str(&entry->u.DirectoryName);
+        TRACE("CERT_ALT_NAME_DIRECTORY_NAME: %s\n", debugstr_w(str));
+        CryptMemFree(str);
+        break;
+    case CERT_ALT_NAME_URL:
+        TRACE("CERT_ALT_NAME_URL: %s\n", debugstr_w(entry->u.pwszURL));
+        break;
+    case CERT_ALT_NAME_IP_ADDRESS:
+        TRACE("CERT_ALT_NAME_IP_ADDRESS: %d bytes\n",
+         entry->u.IPAddress.cbData);
+        break;
+    case CERT_ALT_NAME_REGISTERED_ID:
+        TRACE("CERT_ALT_NAME_REGISTERED_ID: %s\n",
+         debugstr_a(entry->u.pszRegisteredID));
+        break;
+    default:
+        TRACE("dwAltNameChoice = %d\n", entry->dwAltNameChoice);
+    }
+}
+
 static BOOL WINAPI CRYPT_GetUrlFromCertificateIssuer(LPCSTR pszUrlOid,
  LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
  PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
 {
-    /* FIXME: This depends on the AIA (authority info access) extension being
-     * supported in crypt32.
-     */
-    FIXME("\n");
-    SetLastError(CRYPT_E_NOT_FOUND);
-    return FALSE;
+    PCCERT_CONTEXT cert = pvPara;
+    PCERT_EXTENSION ext;
+    BOOL ret = FALSE;
+
+    /* The only applicable flag is CRYPT_GET_URL_FROM_EXTENSION */
+    if (dwFlags && !(dwFlags & CRYPT_GET_URL_FROM_EXTENSION))
+    {
+        SetLastError(CRYPT_E_NOT_FOUND);
+        return FALSE;
+    }
+    if ((ext = CertFindExtension(szOID_AUTHORITY_INFO_ACCESS,
+     cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+    {
+        CERT_AUTHORITY_INFO_ACCESS *aia;
+        DWORD size;
+
+        ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_AUTHORITY_INFO_ACCESS,
+         ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
+         &aia, &size);
+        if (ret)
+        {
+            DWORD i;
+
+            TRACE("%d access descriptions:\n", aia->cAccDescr);
+            for (i = 0; i < aia->cAccDescr; i++)
+            {
+                if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
+                 szOID_PKIX_OCSP))
+                    TRACE("OCSP:\n");
+                else if (!strcmp(aia->rgAccDescr[i].pszAccessMethod,
+                 szOID_PKIX_CA_ISSUERS))
+                    TRACE("CA issuers:\n");
+                dump_alt_name_entry(&aia->rgAccDescr[i].AccessLocation);
+            }
+            LocalFree(aia);
+            FIXME("authority info access unsupported\n");
+            SetLastError(CRYPT_E_NOT_FOUND);
+            ret = FALSE;
+        }
+    }
+    else
+        SetLastError(CRYPT_E_NOT_FOUND);
+    return ret;
 }
 
 static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,




More information about the wine-cvs mailing list