21.03.2013 Views

Problem - Kevin Tafuro

Problem - Kevin Tafuro

Problem - Kevin Tafuro

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

The worker function GetDistributionPoint( ) will look for a cRLDistributionPoints<br />

extension in a certificate that has a URL. If the extension is present, CryptoAPI will<br />

return the data in Unicode, so we need to convert it back down to the single-byte<br />

OEM codepage.<br />

static LPSTR make_thin(LPWSTR wstr) {<br />

int len;<br />

DWORD dwFlags;<br />

LPSTR str;<br />

dwFlags = WC_COMPOSITECHECK | WC_DISCARDNS;<br />

if (!(len = WideCharToMultiByte(CP_OEMCP, dwFlags, wstr, -1, 0, 0, 0, 0)))<br />

return 0;<br />

if (!(str = (LPSTR)LocalAlloc(LMEM_FIXED, len))) return 0;<br />

WideCharToMultiByte(CP_OEMCP, dwFlags, wstr, -1, str, len, 0, 0);<br />

return str;<br />

}<br />

static LPSTR GetDistributionPoint(PCCERT_CONTEXT pCertContext) {<br />

DWORD cbStructInfo, i, j;<br />

LPSTR lpszURL;<br />

LPVOID pvStructInfo;<br />

CERT_EXTENSION *pExtension;<br />

CERT_ALT_NAME_INFO *pNameInfo;<br />

CRL_DIST_POINTS_INFO *pInfo;<br />

pExtension = CertFindExtension(szOID_CRL_DIST_POINTS,<br />

pCertContext->pCertInfo->cExtension,<br />

pCertContext->pCertInfo->rgExtension);<br />

if (!pExtension) return 0;<br />

if (!CryptDecodeObject(X509_ASN_ENCODING, szOID_CRL_DIST_POINTS,<br />

pExtension->Value.pbData, pExtension->Value.cbData, 0, 0, &cbStructInfo))<br />

return 0;<br />

if (!(pvStructInfo = LocalAlloc(LMEM_FIXED, cbStructInfo))) return 0;<br />

CryptDecodeObject(X509_ASN_ENCODING, szOID_CRL_DIST_POINTS,<br />

pExtension->Value.pbData, pExtension->Value.cbData, 0,<br />

pvStructInfo, &cbStructInfo);<br />

pInfo = (CRL_DIST_POINTS_INFO *)pvStructInfo;<br />

for (i = 0; i < pInfo->cDistPoint; i++) {<br />

if (pInfo->rgDistPoint[i].DistPointName.dwDistPointNameChoice = =<br />

CRL_DIST_POINT_FULL_NAME) {<br />

pNameInfo = &pInfo->rgDistPoint[i].DistPointName.FullName;<br />

for (j = 0; j < pNameInfo->cAltEntry; i++) {<br />

if (pNameInfo->rgAltEntry[j].dwAltNameChoice = = CERT_ALT_NAME_URL) {<br />

if (!(lpszURL = make_thin(pNameInfo->rgAltEntry[i].pwszURL))) break;<br />

LocalFree(pvStructInfo);<br />

return lpszURL;<br />

}<br />

}<br />

}<br />

}<br />

558 | Chapter 10: Public Key Infrastructure<br />

This is the Title of the Book, eMatter Edition<br />

Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!