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