mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
5.0 KiB
146 lines
5.0 KiB
// CertificateExtensions..cpp -- Certificate Extensions class
|
|
|
|
// (c) Copyright Schlumberger Technology Corp., unpublished work, created
|
|
// 2001. This computer program includes Confidential, Proprietary
|
|
// Information and is a Trade Secret of Schlumberger Technology Corp. All
|
|
// use, disclosure, and/or reproduction is prohibited unless authorized
|
|
// in writing. All Rights Reserved.
|
|
|
|
#include <scuOsExc.h>
|
|
#include <scuArrayP.h>
|
|
|
|
#include "CertificateExtensions.h"
|
|
|
|
using namespace std;
|
|
|
|
/////////////////////////// LOCAL/HELPER /////////////////////////////////
|
|
/////////////////////////// PUBLIC /////////////////////////////////
|
|
|
|
// Types
|
|
// C'tors/D'tors
|
|
CertificateExtensions::CertificateExtensions(Blob const &rblbCertificate)
|
|
: m_pCertCtx(CertCreateCertificateContext(X509_ASN_ENCODING |
|
|
PKCS_7_ASN_ENCODING,
|
|
rblbCertificate.data(),
|
|
rblbCertificate.size()))
|
|
{
|
|
if (!m_pCertCtx)
|
|
throw scu::OsException(GetLastError());
|
|
}
|
|
|
|
CertificateExtensions::~CertificateExtensions()
|
|
{
|
|
try
|
|
{
|
|
if (m_pCertCtx)
|
|
{
|
|
CertFreeCertificateContext(m_pCertCtx);
|
|
m_pCertCtx = 0;
|
|
}
|
|
}
|
|
|
|
catch (...)
|
|
{
|
|
}
|
|
}
|
|
|
|
// Operators
|
|
// Operations
|
|
// Access
|
|
// Predicates
|
|
bool
|
|
CertificateExtensions::HasEKU(char *szOID)
|
|
{
|
|
bool fFound = false;
|
|
|
|
CERT_EXTENSION *pExtension = NULL;
|
|
DWORD cbSize = 0;
|
|
DWORD dwIndex = 0;
|
|
|
|
CERT_ENHKEY_USAGE *pEnhKeyUsage=NULL;
|
|
|
|
if (m_pCertCtx->pCertInfo)
|
|
{
|
|
|
|
//find the EKU extension
|
|
pExtension =CertFindExtension(szOID_ENHANCED_KEY_USAGE,
|
|
m_pCertCtx->pCertInfo->cExtension,
|
|
m_pCertCtx->pCertInfo->rgExtension);
|
|
|
|
if(pExtension)
|
|
{
|
|
if(CryptDecodeObject(X509_ASN_ENCODING,
|
|
X509_ENHANCED_KEY_USAGE,
|
|
pExtension->Value.pbData,
|
|
pExtension->Value.cbData,
|
|
0,
|
|
NULL,
|
|
&cbSize))
|
|
|
|
{
|
|
scu::AutoArrayPtr<BYTE> aabEKU(new BYTE[cbSize]);
|
|
pEnhKeyUsage=reinterpret_cast<CERT_ENHKEY_USAGE *>(aabEKU.Get());
|
|
|
|
if(pEnhKeyUsage)
|
|
{
|
|
if(CryptDecodeObject(X509_ASN_ENCODING,
|
|
X509_ENHANCED_KEY_USAGE,
|
|
pExtension->Value.pbData,
|
|
pExtension->Value.cbData,
|
|
0,
|
|
aabEKU.Get(),
|
|
&cbSize))
|
|
{
|
|
for(dwIndex=0; dwIndex < pEnhKeyUsage->cUsageIdentifier; dwIndex++)
|
|
{
|
|
if(0 == strcmp(szOID,
|
|
(pEnhKeyUsage->rgpszUsageIdentifier)[dwIndex]))
|
|
{
|
|
//we find it
|
|
fFound=TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
PCERT_INFO const pCertInfo = m_pCertCtx->pCertInfo;
|
|
for (DWORD dwExtension = 0;
|
|
!fFound && (dwExtension < pCertInfo->cExtension);
|
|
dwExtension++)
|
|
{
|
|
PCERT_EXTENSION const pCertExt =
|
|
&pCertInfo->rgExtension[dwExtension];
|
|
if (0 == strcmp(pCertExt->pszObjId, rsExt.c_str()))
|
|
fFound = true;
|
|
}
|
|
*/
|
|
return fFound;
|
|
}
|
|
|
|
|
|
|
|
// Static Variables
|
|
|
|
/////////////////////////// PROTECTED /////////////////////////////////
|
|
|
|
// C'tors/D'tors
|
|
// Operators
|
|
// Operations
|
|
// Access
|
|
// Predicates
|
|
// Static Variables
|
|
|
|
|
|
/////////////////////////// PRIVATE /////////////////////////////////
|
|
|
|
// C'tors/D'tors
|
|
// Operators
|
|
// Operations
|
|
// Access
|
|
// Predicates
|
|
// Static Variables
|