Juan Lang : cryptnet: Use helper function to get a URL from a CRL distribution points extension.

Alexandre Julliard julliard at winehq.org
Fri Dec 18 10:49:06 CST 2009


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Dec  2 17:07:47 2009 -0800

cryptnet: Use helper function to get a URL from a CRL distribution points extension.

---

 dlls/cryptnet/cryptnet_main.c |  187 +++++++++++++++++++++--------------------
 1 files changed, 97 insertions(+), 90 deletions(-)

diff --git a/dlls/cryptnet/cryptnet_main.c b/dlls/cryptnet/cryptnet_main.c
index ef326f7..bf7a2ab 100644
--- a/dlls/cryptnet/cryptnet_main.c
+++ b/dlls/cryptnet/cryptnet_main.c
@@ -235,34 +235,65 @@ static BOOL WINAPI CRYPT_GetUrlFromCertificateIssuer(LPCSTR pszUrlOid,
     return ret;
 }
 
-static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
- LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
- PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
+static BOOL CRYPT_GetUrlFromCRLDistPointsExt(const CRYPT_DATA_BLOB *value,
+ PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray, PCRYPT_URL_INFO pUrlInfo,
+ DWORD *pcbUrlInfo)
 {
-    PCCERT_CONTEXT cert = pvPara;
-    PCERT_EXTENSION ext;
-    BOOL ret = FALSE;
+    BOOL ret;
+    CRL_DIST_POINTS_INFO *info;
+    DWORD size;
 
-    /* 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_CRL_DIST_POINTS,
-     cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_CRL_DIST_POINTS,
+     value->pbData, value->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size);
+    if (ret)
     {
-        CRL_DIST_POINTS_INFO *info;
-        DWORD size;
+        DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
 
-        ret = CryptDecodeObjectEx(X509_ASN_ENCODING, X509_CRL_DIST_POINTS,
-         ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL,
-         &info, &size);
-        if (ret)
-        {
-            DWORD i, cUrl, bytesNeeded = sizeof(CRYPT_URL_ARRAY);
+        for (i = 0, cUrl = 0; i < info->cDistPoint; i++)
+            if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
+             == CRL_DIST_POINT_FULL_NAME)
+            {
+                DWORD j;
+                CERT_ALT_NAME_INFO *name =
+                 &info->rgDistPoint[i].DistPointName.u.FullName;
 
-            for (i = 0, cUrl = 0; i < info->cDistPoint; i++)
+                for (j = 0; j < name->cAltEntry; j++)
+                    if (name->rgAltEntry[j].dwAltNameChoice ==
+                     CERT_ALT_NAME_URL)
+                    {
+                        if (name->rgAltEntry[j].u.pwszURL)
+                        {
+                            cUrl++;
+                            bytesNeeded += sizeof(LPWSTR) +
+                             (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1)
+                             * sizeof(WCHAR);
+                        }
+                    }
+            }
+        if (!pcbUrlArray)
+        {
+            SetLastError(E_INVALIDARG);
+            ret = FALSE;
+        }
+        else if (!pUrlArray)
+            *pcbUrlArray = bytesNeeded;
+        else if (*pcbUrlArray < bytesNeeded)
+        {
+            SetLastError(ERROR_MORE_DATA);
+            *pcbUrlArray = bytesNeeded;
+            ret = FALSE;
+        }
+        else
+        {
+            LPWSTR nextUrl;
+
+            *pcbUrlArray = bytesNeeded;
+            pUrlArray->cUrl = 0;
+            pUrlArray->rgwszUrl =
+             (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
+            nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
+             + cUrl * sizeof(LPWSTR));
+            for (i = 0; i < info->cDistPoint; i++)
                 if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
                  == CRL_DIST_POINT_FULL_NAME)
                 {
@@ -276,83 +307,59 @@ static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
                         {
                             if (name->rgAltEntry[j].u.pwszURL)
                             {
-                                cUrl++;
-                                bytesNeeded += sizeof(LPWSTR) +
-                                 (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1)
-                                 * sizeof(WCHAR);
+                                lstrcpyW(nextUrl,
+                                 name->rgAltEntry[j].u.pwszURL);
+                                pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
+                                 nextUrl;
+                                nextUrl +=
+                                 (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1);
                             }
                         }
                 }
-            if (!pcbUrlArray)
-            {
-                SetLastError(E_INVALIDARG);
-                ret = FALSE;
-            }
-            else if (!pUrlArray)
-                *pcbUrlArray = bytesNeeded;
-            else if (*pcbUrlArray < bytesNeeded)
-            {
-                SetLastError(ERROR_MORE_DATA);
-                *pcbUrlArray = bytesNeeded;
-                ret = FALSE;
-            }
-            else
-            {
-                LPWSTR nextUrl;
-
-                *pcbUrlArray = bytesNeeded;
-                pUrlArray->cUrl = 0;
-                pUrlArray->rgwszUrl =
-                 (LPWSTR *)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY));
-                nextUrl = (LPWSTR)((BYTE *)pUrlArray + sizeof(CRYPT_URL_ARRAY)
-                 + cUrl * sizeof(LPWSTR));
-                for (i = 0; i < info->cDistPoint; i++)
-                    if (info->rgDistPoint[i].DistPointName.dwDistPointNameChoice
-                     == CRL_DIST_POINT_FULL_NAME)
-                    {
-                        DWORD j;
-                        CERT_ALT_NAME_INFO *name =
-                         &info->rgDistPoint[i].DistPointName.u.FullName;
-
-                        for (j = 0; j < name->cAltEntry; j++)
-                            if (name->rgAltEntry[j].dwAltNameChoice ==
-                             CERT_ALT_NAME_URL)
-                            {
-                                if (name->rgAltEntry[j].u.pwszURL)
-                                {
-                                    lstrcpyW(nextUrl,
-                                     name->rgAltEntry[j].u.pwszURL);
-                                    pUrlArray->rgwszUrl[pUrlArray->cUrl++] =
-                                     nextUrl;
-                                    nextUrl +=
-                                     (lstrlenW(name->rgAltEntry[j].u.pwszURL) + 1);
-                                }
-                            }
-                    }
-            }
-            if (ret)
+        }
+        if (ret)
+        {
+            if (pcbUrlInfo)
             {
-                if (pcbUrlInfo)
+                FIXME("url info: stub\n");
+                if (!pUrlInfo)
+                    *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+                else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
                 {
-                    FIXME("url info: stub\n");
-                    if (!pUrlInfo)
-                        *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
-                    else if (*pcbUrlInfo < sizeof(CRYPT_URL_INFO))
-                    {
-                        *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
-                        SetLastError(ERROR_MORE_DATA);
-                        ret = FALSE;
-                    }
-                    else
-                    {
-                        *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
-                        memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
-                    }
+                    *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+                    SetLastError(ERROR_MORE_DATA);
+                    ret = FALSE;
+                }
+                else
+                {
+                    *pcbUrlInfo = sizeof(CRYPT_URL_INFO);
+                    memset(pUrlInfo, 0, sizeof(CRYPT_URL_INFO));
                 }
             }
-            LocalFree(info);
         }
+        LocalFree(info);
+    }
+    return ret;
+}
+
+static BOOL WINAPI CRYPT_GetUrlFromCertificateCRLDistPoint(LPCSTR pszUrlOid,
+ LPVOID pvPara, DWORD dwFlags, PCRYPT_URL_ARRAY pUrlArray, DWORD *pcbUrlArray,
+ PCRYPT_URL_INFO pUrlInfo, DWORD *pcbUrlInfo, LPVOID pvReserved)
+{
+    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_CRL_DIST_POINTS,
+     cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension)))
+        ret = CRYPT_GetUrlFromCRLDistPointsExt(&ext->Value, pUrlArray,
+         pcbUrlArray, pUrlInfo, pcbUrlInfo);
     else
         SetLastError(CRYPT_E_NOT_FOUND);
     return ret;




More information about the wine-cvs mailing list