CryptoAPI函数测试实例代码(四)
do
{
// 读取证书内容
CBufferT certBuf;
if( FALSE == GetFileBuffer( szCertPath, certBuf ) )
{
if( szErrInfo != NULL )
{
_stprintf( szErrInfo, _T("读取证书文件数据失败") );
}
break;
}
// 打开STORE
hCertStore = ::CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, NULL,
CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, wcsImportToWhere );
if( NULL == hCertStore )
{
if( NULL != szErrInfo )
{
_tcscpy( szErrInfo, _T("CertOpenStoren Failed") );
}
break;
}
// 编码判断,如果是DER编码,那么它以 0x30 0x82开头
// 如果是base64,那么将它转换成DER编码
// 如果是base64中前两个字符不是'M''I',那么去掉它的前后格式
CBufferT derCertBuf;
if( certBuf[0] == (char)0x30 && certBuf[1] == (char)0x82 )
{
// 创建证书Context
lpCertContext = CertCreateCertificateContext(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
(const unsigned char*)(char*)certBuf, certBuf.GetBufSize() );
}
else
{
LONG len = 4096;
derCertBuf.malloc( 4096 );
if( certBuf[0] == 'M' && certBuf[1] == 'I' )
{
base64_decode( (char*)certBuf, certBuf.GetBufSize(), (BYTE*)derCertBuf, &len );
}
else
{
base64_decode( (char*)certBuf+27, certBuf.GetBufSize()-25, (BYTE*)derCertBuf, &len );
}
// 创建证书Context
lpCertContext = CertCreateCertificateContext(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
(BYTE*)derCertBuf, derCertBuf.GetBufSize() );
}
if( NULL == lpCertContext )
{
if( NULL != szErrInfo )
{
DWORD dwErrCode = ::GetLastError();
_stprintf( szErrInfo, _T("CertCreateCertificateContext FAILED, Error Code: 0x% "), dwErrCode );
}
break;
}
// 导入
/*
如果向ROOT中导入证书的话,有可能会弹出“安全警告”,而却会阻塞在这里。
如果已经存在该证书再导入的话,还会弹出“根证书存储”
//因此在这里开一个线程来由程序点击“是”那个按钮
*/
if( 0 == wcscmp( L"ROOT", wcsImportToWhere ) )
{
CreateThread( NULL, 0, ImportRootCertAutoClickProc, 0, 0, 0 );
}
if( FALSE == CertAddCertificateContextToStore( hCertStore, lpCertContext, CERT_STORE_ADD_REPLACE_EXISTING, NULL ) )
{
if( NULL != szErrInfo )
{
DWORD dwErrCode = ::GetLastError();
_stprintf( szErrInfo, _T("CertAddCertificateContextToStore FAILED, Error Code: 0x% "), dwErrCode );
}
break;
}
bRet = true;
break;
}
while(false);
if( NULL != hCertStore )
::CertCloseStore( hCertStore, 0 );
if( NULL != lpCertContext )
CertFreeCertificateContext( lpCertContext );
return bRet;
}
#endif
}}