CryptoAPI函数测试实例代码(四)

2014-11-23 23:30:16 · 作者: · 浏览: 25
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 }}