📄 cacertwizardsheet.cpp
字号:
if(!pfc)
{
AddMsg(MiniCT_0128,M_ERROR); //MiniCT_0128 "保存公钥文件失败"
return;
}
fwrite(cert,sizeof(char),certl,pfc);
fclose(pfc);
pfc = fopen(outKey,"wb");
if(!pfc)
{
AddMsg(MiniCT_0127,M_ERROR); //MiniCT_0127 "保存私钥文件失败"
return;
}
fwrite(key,sizeof(char),keyl,pfc);
fclose(pfc);
AddMsg(MiniCT_0124); //MiniCT_0124 "生成证书成功"
if(CERTINFO.bCertP12)
{
pfc = fopen(p12path,"wb");
if(!pfc)
{
AddMsg(MiniCT_0126,M_ERROR); //MiniCT_0126 "保存PFX文件失败"
return;
}
fwrite(p12,sizeof(char),p12l,pfc);
fclose(pfc);
AddMsg(MiniCT_0125); //MiniCT_0125 "证书PFX包制作成功"
}
}
else//CSP
{
ImportCSP(p12,p12l,CERTINFO.cCertCsp,CERTINFO.cCertCon);
//GetCspCertInfo(CERTINFO.cCertCsp,CERTINFO.cCertCon,0);
}
//证书信息保存进数据库
m_PageMan.SaveDb(pCERT, CERTINFO.uCertLen, type,
CERTINFO.uCertDay, p12, p12l, pwd.GetBuffer(0));
}
else
AddMsg(out,M_ERROR);
}
else
AddMsg(MiniCT_0123,M_ERROR); //MiniCT_0123 "加载根证书失败"
}
void CCaCertWizardSheet::AddMsg(CString info, DWORD type)
{
((CMiniMainDlg *)GetParent())->AddMsg(MiniCT_0000,info, type); //MiniCT_0000 "数证向导"
}
void CCaCertWizardSheet::ShowError()
{
char Buffer[200];
memset(Buffer,0,200);
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM, // source and processing options
NULL, // pointer to message source
GetLastError(), // requested message identifier
0, // language identifier for requested message
Buffer, // pointer to message buffer
200, // maximum size of message buffer
NULL // pointer to array of message inserts
);
AddMsg(Buffer,M_ERROR);
}
BOOL CCaCertWizardSheet::ImportCSP(char * memP12,UINT lenP12,CString szCSPName,CString szKeycon)
{
// TODO: Add your control notification handler code here
long ret = 0;
HCRYPTPROV hCryptProv = NULL; //指定CSP句柄
BYTE *szContainerName = NULL; //CONTAINER名称
HCRYPTKEY hCryptKey = NULL ; //密钥句柄
PCCERT_CONTEXT pCertContext = NULL; //证书上下文
DWORD dwKeySpec;
CRYPT_DATA_BLOB pPFX;
HCERTSTORE hStore;
HCRYPTKEY hUser;
BYTE bData[10240];
DWORD cbData = 10240;
pPFX.cbData = lenP12;
pPFX.pbData = (UCHAR *)memP12;
// //new 改为动态调用
//从PFX BLOB导入到指定证书库
hStore = PFXImportCertStore(
&pPFX,
L"", //Password
CRYPT_EXPORTABLE); //得到证书库句柄
if (hStore == NULL)
{
ShowError();
return FALSE;
}
// search any certificate 通过证书库得到证书上下文 --- 也就是察看上面的文件中是否有证书信息
if (!(pCertContext=CertFindCertificateInStore(
hStore,
X509_ASN_ENCODING,
0,
CERT_FIND_ANY,
NULL,
NULL)))
{
ShowError();
return FALSE;
}
//new 改为动态调用
// 对于指定证书上下文得到一个HCRYPTPROV句柄和 dwKeySpec
ret = CryptAcquireCertificatePrivateKey(//通过证书上下文得到CSP句柄
pCertContext,
CRYPT_ACQUIRE_CACHE_FLAG,
NULL,
&hCryptProv,//CSP句柄
&dwKeySpec,//加密还是签名 AT_KEYEXCHANGE 1 AT_SIGNATURE 2
NULL
);
// CString strType;
// strType.Format("密钥类型%d",dwKeySpec);
// AfxMessageBox(strType);
if (!ret)
{
ShowError();
return FALSE;
}
ret = CryptGetUserKey(//得到密钥对句柄
hCryptProv,
dwKeySpec,
&hUser
);
if (!ret)
{
ShowError();
return FALSE;
}
ret = CryptExportKey( //将CSP中的密钥导出
hUser,
0,
PUBLICKEYBLOB,
0,
bData,
&cbData
); //PUBLICKEYBLOB -148 PRIVATEKEYBLOB - 596
if (!ret)
{
ShowError();
return FALSE;
}
CryptDestroyKey(hUser);
CryptReleaseContext(hCryptProv, 0);
hCryptProv = 0;
if (RCRYPT_FAILED(CryptAcquireContext(&hCryptProv, szKeycon,
szCSPName, PROV_RSA_FULL, CRYPT_NEWKEYSET)))
{
long err = GetLastError();
if(0x8009000f == err)//对象已经存在
{
if(::MessageBox(this->m_hWnd,MiniCT_0211, MiniCT_0212,MB_ICONQUESTION | MB_YESNO)==IDYES)
//MiniCT_0211 "证书对象已经存在,是否覆盖"
//MiniCT_0212 ,"CSP提示"
{
if (CryptAcquireContext(&hCryptProv, szKeycon,
szCSPName, PROV_RSA_FULL, CRYPT_DELETEKEYSET))//删除对象
{
if (RCRYPT_FAILED(CryptAcquireContext(&hCryptProv, szKeycon,
szCSPName, PROV_RSA_FULL, CRYPT_NEWKEYSET)))//重新创建
{
ShowError();
return FALSE;
}
}
}
else
{
return FALSE;
}
}
else
{
ShowError();
return FALSE;
}
}
if (RCRYPT_FAILED(CryptImportKey(
hCryptProv,
bData,
cbData,
0,
0,
&hUser)))
{
ShowError();
return FALSE;
}
CryptDestroyKey(hUser);
/* if (RCRYPT_FAILED(CryptGetUserKey(hCryptProv,
dwKeySpec,
&hUser)))
{
if (GetLastError() == ERROR_INVALID_PARAMETER)
{
}
else
{
}
}
if (RCRYPT_FAILED(CryptSetKeyParam(
hUser,
KP_CERTIFICATE,
pCertContext->pbCertEncoded,
0)))
{
ShowError();
return FALSE;
}
CryptDestroyKey(hUser);
*/
if (RCRYPT_FAILED(CryptReleaseContext(hCryptProv, 0)))
{
ShowError();
return FALSE;
}
CertFreeCertificateContext(pCertContext);
CertCloseStore(hStore,0);
AddMsg(MiniCT_0213); //MiniCT_0213 "证书导入CSP成功"
return TRUE;
}
long CCaCertWizardSheet::GetCspCertInfo(LPTSTR szCSPName, LPTSTR ContainerName, DWORD KeySpec)
{
long ret = 0;
HCRYPTPROV hCryptProv = NULL; //指定CSP句柄
BYTE *szContainerName = NULL; //CONTAINER名称
/// DWORD cbContainerName, maxcbContainerName;//CONTAINER长度
BYTE CertBuff[4096]; //证书信息
HCRYPTKEY hCryptKey = NULL; //密钥句柄
PCCERT_CONTEXT pCertContext = NULL; //证书上下文
// DWORD dwKeySpec;
// DWORD dwFlags;
DWORD dwCertLength;
// char PIN[10];
__try
{
//取得指定CSP的访问句柄
ret = CryptAcquireContext(&hCryptProv,
ContainerName,
szCSPName,
PROV_RSA_FULL,
0);
if (ret == 0)
{
ShowError();
__leave;
}
//取得CONTAINER的名字列表中最大长度
/* ret = CryptGetProvParam(hCryptProv,
PP_ENUMCONTAINERS,
NULL, //取得最大的名称长度
&cbContainerName,
0);
if (ret == 0)
{
ShowError();
__leave;
}
maxcbContainerName = cbContainerName;
szContainerName = (BYTE*)malloc(cbContainerName);
// 读取第一个CONTAINER名字
dwFlags = CRYPT_FIRST;
cbContainerName = maxcbContainerName;
ret = CryptGetProvParam(hCryptProv,
PP_ENUMCONTAINERS,
szContainerName,
&cbContainerName,
dwFlags);
if (ret == 0)
{
ShowError();
__leave;
}
memset(PIN, 0, 10);
PIN[0]='0';
PIN[1]='0';
PIN[2]='0';
PIN[3]='0';
//设置PIN值
ret = CryptSetProvParam(hCryptProv,
PP_KEYEXCHANGE_PIN,
(unsigned char *)PIN,
0);
if (ret == 0)
{
ShowError();
__leave;
}
*/
//读取CONTAINER中的KEY
ret = CryptGetUserKey(hCryptProv,
AT_KEYEXCHANGE,
&hCryptKey);
if (ret == 0)
{
ShowError();
__leave;
}
//取得指定密钥相关的证书
dwCertLength = sizeof(CertBuff);
ret = CryptGetKeyParam(hCryptKey,
KP_CERTIFICATE,
CertBuff,
&dwCertLength,
0);
if (ret == 0)
{
ShowError();
__leave;
}
char temp[100] = {0};
pCertContext = CertCreateCertificateContext(
X509_ASN_ENCODING, // The encoding type.
CertBuff, // The encoded data from
// the certificate retrieved.
dwCertLength );
if (pCertContext == NULL)
{//Not X.509 Certification
__leave;
}
//new 改为动态调用
/* CertGetNameString(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
(char *)temp,
128);
CertGetNameString(
pCertContext,
CERT_NAME_EMAIL_TYPE,
0,
NULL,
(char *)temp,
128);
CertGetNameString(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
CERT_NAME_ISSUER_FLAG,
NULL,
(char *)temp,
128);*/
/* CryptUIDlgViewContext(
CERT_STORE_CERTIFICATE_CONTEXT, // Display a certificate.
pCertContext, // Pointer to the certificate
m_hWnd,
L"MiniCA 证书预览",
0,
NULL);*/
__leave;
}
__finally
{
if(pCertContext)
CertFreeCertificateContext(pCertContext);
if (hCryptKey)
CryptDestroyKey(hCryptKey);
if (hCryptProv)
CryptReleaseContext(hCryptProv,0);
if (szContainerName)
free(szContainerName);
return ret;
}
}
void CCaCertWizardSheet::OnSelchangeTabSheet(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
//NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
int iSelect = m_CaWizardSheet.GetCurSel();
if(iSelect > 3)//屏蔽
{
GetDlgItem(IDC_B_LAST)->EnableWindow(FALSE);
GetDlgItem(IDC_B_NEXT)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_B_LAST)->EnableWindow(TRUE);
GetDlgItem(IDC_B_NEXT)->EnableWindow(TRUE);
}
m_PageReport.ViewWizardInfo();
*pResult = 0;
}
void CCaCertWizardSheet::OnBLast()
{
// TODO: Add your control notification handler code here
int iSelect = m_CaWizardSheet.GetCurSel();
if(iSelect >= 4)
{
return;
}
m_CaWizardSheet.SetCurSel(iSelect - 1);
m_PageReport.ViewWizardInfo();
}
void CCaCertWizardSheet::OnBNext()
{
// TODO: Add your control notification handler code here
int iSelect = m_CaWizardSheet.GetCurSel();
if(iSelect >= 3)
return;
m_CaWizardSheet.SetCurSel(iSelect + 1);
m_PageReport.ViewWizardInfo();
}
//通过类名,返回制定属性页的对象指针
CWnd * CCaCertWizardSheet::GetPage(CString strPageName)
{
//枚举属性页
CRuntimeClass * prt = NULL;
prt = m_PageType.GetRuntimeClass();
if(strcmp( prt->m_lpszClassName, strPageName ) == 0 )
return &m_PageType;
prt = m_PageInfo.GetRuntimeClass();
if(strcmp( prt->m_lpszClassName, strPageName ) == 0 )
return &m_PageInfo;
prt = m_PageExt.GetRuntimeClass();
if(strcmp( prt->m_lpszClassName, strPageName ) == 0 )
return &m_PageExt;
prt = m_PageReport.GetRuntimeClass();
if(strcmp( prt->m_lpszClassName, strPageName ) == 0 )
return &m_PageReport;
prt = m_PageIniSet.GetRuntimeClass();
if(strcmp( prt->m_lpszClassName, strPageName ) == 0 )
return &m_PageIniSet;
prt = m_PageMan.GetRuntimeClass();
if(strcmp( prt->m_lpszClassName, strPageName ) == 0 )
return &m_PageMan;
return NULL;
}
void CCaCertWizardSheet::OnDestroy()
{
CPropertyPage::OnDestroy();
// TODO: Add your message handler code here
m_PageType.DestroyWindow();
m_PageInfo.DestroyWindow();
m_PageExt.DestroyWindow();
m_PageMan.DestroyWindow();
m_PageReport.DestroyWindow();
m_PageIniSet.DestroyWindow();
}
void CCaCertWizardSheet::Language()
{
CLanguage::TranslateDialog(m_PageType.m_hWnd, MAKEINTRESOURCE(IDD_PROPPAGE_CATYPE));
m_PageType.TranslateCT();
CLanguage::TranslateDialog(m_PageInfo.m_hWnd, MAKEINTRESOURCE(IDD_PROPPAGE_CAINFO));
m_PageInfo.TranslateCT();
CLanguage::TranslateDialog(m_PageExt.m_hWnd, MAKEINTRESOURCE(IDD_PROPPAGE_CAEXT));
m_PageExt.TranslateCT();
CLanguage::TranslateDialog(m_PageReport.m_hWnd, MAKEINTRESOURCE(IDD_PROPPAGE_CAREPORT));
m_PageReport.ViewWizardInfo();
CLanguage::TranslateDialog(m_PageMan.m_hWnd, MAKEINTRESOURCE(IDD_PROPPAGE_CAMAN));
m_PageMan.TranslateCT();
CLanguage::TranslateDialog(m_PageIniSet.m_hWnd, MAKEINTRESOURCE(IDD_PROPPAGE_CAINI));
m_PageIniSet.TranslateCT();
CLanguage::TranslateDialog(this->m_hWnd, MAKEINTRESOURCE(IDD_PROPPAGE_CASHEET));
m_CaWizardSheet.SetPageName(0, MiniCT_0200);
m_CaWizardSheet.SetPageName(1, MiniCT_0201);
m_CaWizardSheet.SetPageName(2, MiniCT_0202);
m_CaWizardSheet.SetPageName(3, MiniCT_0203);
m_CaWizardSheet.SetPageName(4, MiniCT_0204);
m_CaWizardSheet.SetPageName(5, MiniCT_0205);
//翻译STATIC
SetDlgItemText(IDC_B_NEXT, MiniCT_10701);
SetDlgItemText(IDC_B_LAST, MiniCT_10702);
SetDlgItemText(IDC_B_MADE, MiniCT_10703);
SetDlgItemText(IDC_B_V, MiniCT_10704);
}
BOOL CCaCertWizardSheet::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
m_toolTip.RelayEvent(pMsg);
return CPropertyPage::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -