Module: wine Branch: master Commit: f1f231ca40c0815ac130ed1ef1b6a58a7e2f2589 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f1f231ca40c0815ac130ed1ef1...
Author: Juan Lang juan.lang@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;