⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cacenterpage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	GetDlgItemText(IDC_EDIT_OU,str);
	pReq->Add(pReq, "OU", str);

	GetDlgItemText(IDC_EDIT_CN,strCN);
	if(strCN.IsEmpty())
	{
		AddMsg(MiniCT_0113,M_WARING);			//MiniCT_0113 "请给出个体信息!"
		pReq->RemoveAll(pReq);	//删除证书结构
		return;
	}
	pReq->Add(pReq, "CN", strCN);


	GetDlgItemText(IDC_EDIT_E,str);
	pReq->Add(pReq, "emailAddress", str);

	GetDlgItemText(IDC_EDIT_T,str);
	pReq->Add(pReq, "title", str);

	GetDlgItemText(IDC_EDIT_G,str);
	pReq->Add(pReq, "givenName", str);

	GetDlgItemText(IDC_EDIT_S,str);
	pReq->Add(pReq, "SN", str);
	
	GetDlgItemText(IDC_EDIT_DAY,str);
	if(str=="")
	{
		AddMsg(MiniCT_0114,M_WARING);		//MiniCT_0114 "请给出有效期!"
		pReq->RemoveAll(pReq);	//删除证书结构
		return;
	}

	CString reqf, key;
	reqf.Format("%s\\%s%s", m_Path, strCN, "Req.csr");

	key.Format("%s\\%s%s%s", m_Path, strCN, "Key", m_ExtName);
	
	CString len;
	GetDlgItemText(IDC_COMBO_L,len);

	CString pwd("");
//	GetDlgItemText(IDC_EDIT_PWD,pwd);

	char reqBuf[10240] = {0};
	char keyBuf[10240] = {0};
	
	UINT reqLen = 10240,
		 keyLen = 10240;

	if(MakeReq(pReq, atoi(len), pwd.GetBuffer(0), reqBuf, &reqLen, keyBuf, &keyLen, out, m_CertFormat))
	{
		FILE * pfc = fopen(reqf,"wb");
		if(pfc != NULL)
		{
			fwrite(reqBuf,sizeof(char),reqLen,pfc);
			fclose(pfc);
			
			pfc = fopen(key,"wb");
			if(pfc != NULL)
			{
				fwrite(keyBuf,sizeof(char),keyLen,pfc);
				fclose(pfc);
			}
		}
		SetDlgItemText(IDC_EDIT4,reqf);
		AddMsg(MiniCT_0120);					//MiniCT_0120 "Req制作成功"
		pReq->RemoveAll(pReq);	//删除证书结构
	}
	else
		AddMsg(out,M_ERROR);
	pwd.ReleaseBuffer();
	pReq->RemoveAll(pReq);	//删除证书结构

}


void CCaCenterPage::OnBMkcert() //req 制作证书
{
	// TODO: Add your control notification handler code here
	if(m_Path=="") 
	{
		AddMsg(MiniCT_0112,M_WARING);		//MiniCT_0112 "请选择输出路径!"
		return;
	}
	
	CString req,day,outCert,strSN;
	GetDlgItemText(IDC_EDIT4,req);
	if(req=="")
	{
		AddMsg(MiniCT_0121,M_WARING);	//MiniCT_0121 "请选择证书请求文件!"
		return;
	}
	GetDlgItemText(IDC_EDIT_DAY,day);
	if(day=="")
	{
		AddMsg(MiniCT_0114,M_WARING);		//MiniCT_0114 "请给出有效期!"
		return;
	}
	char out[1024]={0};
	
	CString KUSAGE,EKUSAGE;
	//	GetKeyUsage(KUSAGE,EKUSAGE);//通过配置文件得到密钥用法
	
	CString RootP12,RootPwd;
	BOOL ret=FALSE;
	DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
	CString strPwd;//公私钥路径或内容,p12密钥
	
	char strCert[10240] = {0};
	char strKey[10240] = {0};

	char certBuf[10240] = {0};
	UINT certLen = 10240;


	if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
	{
		GetDlgItemText(IDC_EDIT_SN,strSN);
		outCert=m_Path+"\\UserCert";
		outCert+=m_ExtName;
		
		stuCertPair RootPair(strCert,lenCert,strKey,lenKey,
			strPwd.GetBuffer(0));
		
		strPwd.ReleaseBuffer();
		
		if(MakeCert(RootPair,
			atoi(strSN),0,atoi(day),
			req.GetBuffer(0),
			0,
			KUSAGE.GetBuffer(0),
			EKUSAGE.GetBuffer(0),
			NULL,
			certBuf,
			&certLen,
			out,m_CertFormat))
		{
			FILE * pfc = fopen(outCert,"wb");
			if(pfc != NULL)
			{
				fwrite(certBuf,sizeof(char),certLen,pfc);
				fclose(pfc);
			}
			AddMsg(MiniCT_0122);		//MiniCT_0122 "证书制作成功"
			//序号增加一
			int iSn = atoi(strSN) + 1;
			CString sSn;
			sSn.Format("%d",iSn);
			WritePrivateProfileString("CA", "SN",sSn,m_IniPathName);
			SetDlgItemText(IDC_EDIT_SN,sSn);
		}
		else
			AddMsg(out,M_ERROR);
		
		req.ReleaseBuffer();
		KUSAGE.ReleaseBuffer();
		EKUSAGE.ReleaseBuffer();
		outCert.ReleaseBuffer();
	}
	else
		AddMsg(MiniCT_0123,M_ERROR);		//MiniCT_0123 "加载根证书失败"
		
}

void CCaCenterPage::OnBMkcert2() //直接生成证书
{
	// TODO: Add your control notification handler code here
	char out[1024] = {0};
	char cert[10240] = {0},
		 key[10240] = {0},
		 p12[10240] = {0};

	UINT certl = 10240,
		keyl = 10240,
		p12l = 10240;

	CString str,day,strSN;

	stuSUBJECT * pCERT = NULL;

	GetDlgItemText(IDC_EDIT_C,str);
	pCERT->Add(pCERT, "C", str);

	GetDlgItemText(IDC_EDIT_ST,str);
	pCERT->Add(pCERT, "ST", str);

	GetDlgItemText(IDC_EDIT_L,str);
	pCERT->Add(pCERT, "L", str);

	GetDlgItemText(IDC_EDIT_O,str);
	pCERT->Add(pCERT, "O", str);

	GetDlgItemText(IDC_EDIT_OU,str);
	pCERT->Add(pCERT, "OU", str);

	CString strCN;
	GetDlgItemText(IDC_EDIT_CN,strCN);
	if(strCN.IsEmpty())
	{
		AddMsg(MiniCT_0113,M_WARING);		//MiniCT_0113 "请给出个体信息!"
		return;
	}
	pCERT->Add(pCERT, "CN", strCN);


	GetDlgItemText(IDC_EDIT_E,str);
	pCERT->Add(pCERT, "emailAddress", str);

	GetDlgItemText(IDC_EDIT_T,str);
	pCERT->Add(pCERT, "title", str);

	GetDlgItemText(IDC_EDIT_G,str);
	pCERT->Add(pCERT, "givenName", str);

	GetDlgItemText(IDC_EDIT_S,str);
	pCERT->Add(pCERT, "SN", str);

	GetDlgItemText(IDC_EDIT_DAY,day);
	CString KUSAGE,EKUSAGE;

	if(m_Path=="") 
	{
		AddMsg(MiniCT_0112,M_WARING);		//MiniCT_0112 "请选择输出路径!"
		pCERT->RemoveAll(pCERT);	//删除证书结构
		return;
	}

	if(day=="")
	{
		AddMsg(MiniCT_0114,M_WARING);		//MiniCT_0114 "请给出有效期!"
		pCERT->RemoveAll(pCERT);	//删除证书结构
		return;
	}

	CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
	CCertDbPage * pDb = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));

	if(pDb)
	{
		m_NameType = pDb->GetNameType();
	}

	CString strName;
	if(0 == m_NameType)//用户名
	{
		strName.Format("\\%s", strCN);
	}
	else if(1 == m_NameType)//序号
	{
		strName.Format("\\%s", strSN);
	}
	else if(2 == m_NameType)//用户名 + 序号
	{
		strName.Format("\\%s%s", strCN, strSN);
	}
	else if(3 == m_NameType)//序号 + 用户名
	{
		strName.Format("\\%s%s", strSN, strCN);
	}

	DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
	CString strPwd;//公私钥路径或内容,p12密钥

	char strCert[10240] = {0};
	char strKey[10240] = {0};

	if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
	{
		GetDlgItemText(IDC_EDIT_SN,strSN);
		
		CString len;
		GetDlgItemText(IDC_COMBO_L,len);
		
		CString pwd("");
		//			GetDlgItemText(IDC_EDIT_PWD,pwd);
		
		stuCertPair RootPair(strCert,lenCert,strKey,
			lenKey,strPwd.GetBuffer(0));
		
		strPwd.ReleaseBuffer();
		
		BOOL bRet = DirectCert(RootPair,atoi(len),atoi(strSN),
			0,atoi(day),pwd.GetBuffer(0),pCERT,"(MiniCA)",KUSAGE.GetBuffer(0),
			EKUSAGE.GetBuffer(0),NULL,
			cert,&certl,key,&keyl,p12,&p12l,out,m_CertFormat);
		
		pCERT->RemoveAll(pCERT);	//删除证书结构
		
		
		if(bRet)
		{
			CString outCert  =m_Path + strName + "Cert.cer" ;
			CString outKey = m_Path + strName + "Key.cer";
			CString p12path = m_Path + strName + ".pfx";
			
			FILE * pfc = fopen(outCert,"wb");
			if(pfc != NULL)
			{
				fwrite(cert,sizeof(char),certl,pfc);
				fclose(pfc);
				
				pfc = fopen(outKey,"wb");
				if(pfc != NULL)
				{
					fwrite(key,sizeof(char),keyl,pfc);
					fclose(pfc);
					AddMsg(MiniCT_0124);		//MiniCT_0124 "生成证书成功"
					if(m_MadePfx)
					{
						pfc = fopen(p12path,"wb");
						if(pfc != NULL)
						{
							fwrite(p12,sizeof(char),p12l,pfc);
							fclose(pfc);
							AddMsg(MiniCT_0125);		//MiniCT_0125 "证书PFX包制作成功"
						}
						else
							AddMsg(MiniCT_0126,M_ERROR);	//MiniCT_0126 "证书PFX包保存失败"
						
					}
				}
				else
					AddMsg(MiniCT_0127,M_ERROR);		//MiniCT_0127 "保存证书私钥失败"
				
				
				//序号增加一
				int iSn = atoi(strSN) + 1;
				CString sSn;
				sSn.Format("%d",iSn);
				WritePrivateProfileString("CA", "SN",sSn,m_IniPathName);
				SetDlgItemText(IDC_EDIT_SN,sSn);
				
			}
			else
				AddMsg(MiniCT_0128,M_ERROR);		//MiniCT_0128 "保存证书公钥失败"
			
			pwd.ReleaseBuffer();
			KUSAGE.ReleaseBuffer();
			EKUSAGE.ReleaseBuffer();
			
		}
		else
			AddMsg(out, M_ERROR);
		
	}
	else
		AddMsg(MiniCT_0123,M_ERROR);		//MiniCT_0123 "加载根证书失败"
}

void CCaCenterPage::OnBCrl2() //加载信息文件到文本框
{
	// TODO: Add your control notification handler code here
	CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		MiniCT_0129,NULL);	//MiniCT_0129 "证书作废信息文件(*.txt)|*.txt|所有文件(*.*)|*.*||"

	CString strTitle = MiniCT_0130;	//MiniCT_0130  证书作废信息文件
	dlgOpen.m_ofn.lpstrTitle= strTitle;//标题条

	if(dlgOpen.DoModal()!=IDOK) return;
	CString crlinfo = dlgOpen.GetPathName();
	CString info,temp;
	if(!crlinfo.IsEmpty())
	{
		if(CStdioFile stdFile(crlinfo,CFile::modeRead))
		{
			while(stdFile.ReadString(temp))
			{
				info += temp;
			}
			
			stdFile.Close();
		}
	}
	SetDlgItemText(IDC_EDITCRL,info);
}

void CCaCenterPage::OnBCrl() 
{
	// TODO: Add your control notification handler code here
	if(m_Path=="") 
	{
		AddMsg(MiniCT_0112,M_WARING);	//MiniCT_0112 "请选择输出路径!"
		return;
	}

	char out[100]={0};
	CString outCrl=m_Path+"MiniCA.crl";
	CString RootP12,RootPwd;
	DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
	CString strPwd;//公私钥路径或内容,p12密钥

	char strCert[10240] = {0};
	char strKey[10240] = {0};

	if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
	{
		time_t t;
		time(&t);
		char * Crl=NULL;
		stuREVOKE * Head = NULL;//构造空链表
		CString strRevoke;
		strRevoke.Replace(" ",",");
		CString strL;
		GetDlgItemText(IDC_EDITCRL,strRevoke);
		strRevoke += ",";
		for(;;)
		{
			int state=strRevoke.Find(",");
			if(state==-1&&strRevoke.GetLength())
				strL=strRevoke;
			else if(strRevoke.GetLength()==0)
				break;
			else strL=strRevoke.Left(state);
			if(!strL.IsEmpty())
			{
				ULONG index = atol(strL.GetBuffer(0));
				if(index >0)
					Head->AddRevoke(Head,index,t);//增加表象
			}
			strRevoke=strRevoke.Right(strRevoke.GetLength()-state-1);
			strRevoke.TrimLeft();
		}
		
		stuCertPair RootPair(strCert,lenCert,strKey,lenKey,
			strPwd.GetBuffer(0));
		
		if(MakeCrl(RootPair,Head,NULL,Crl,NULL,outCrl.GetBuffer(0),out))
			AddMsg(out);
		else
			AddMsg(out,M_ERROR);
		Head->RemoveAll(Head);
	}
	else
		AddMsg(MiniCT_0123,M_ERROR);			//MiniCT_0123 "加载根证书失败"
}

void CCaCenterPage::OnCheck() //选择证书格式---〉输出
{
	// TODO: Add your control notification handler code here
	int check=((CButton *)GetDlgItem(IDC_CHECK))->GetCheck();
	if(check)
	{
		m_CertFormat=DER;
		m_ExtName=".cer";
	}
	else
	{
		m_CertFormat=PEM;
		m_ExtName=".cer";
	}
}

void CCaCenterPage::OnCheckP12() 
{
	// TODO: Add your control notification handler code here
	m_MadePfx=((CButton *)GetDlgItem(IDC_CHECK_P12))->GetCheck();
}

BOOL CCaCenterPage::PreTranslateMessage(MSG* pMsg)
{
	// CG: The following block was added by the ToolTips component.	{		// Let the ToolTip process this message.		m_toolTip.RelayEvent(pMsg);	}	return CPropertyPage::PreTranslateMessage(pMsg);	// CG: This was added by the ToolTips component.
}

void CCaCenterPage::AddMsg(CString info, DWORD type)
{
	CMiniMainDlg * pMain = (CMiniMainDlg *)GetParent();
	pMain->AddMsg("MiniCA V2.0",info, type);
}

void CCaCenterPage::SetNamePath(const CString &strPath)	//CCertDbPage类中使用
{
	if(!strPath.IsEmpty())
	{
		SetDlgItemText(IDC_EDIT_PATH,strPath);
		m_Path = strPath;
	}
}

void CCaCenterPage::TranslateCT()	//繙譯諸如樹型控件,列錶控件等內容
{
	SetDlgItemText(IDC_EDIT_C, MiniCT_0102); //MiniCT_0102 "中国"
	
	SetDlgItemText(IDC_EDIT_ST, MiniCT_0103);	//MiniCT_0103 "河北"
	
	SetDlgItemText(IDC_EDIT_L, MiniCT_0104);//MiniCT_0104 
	
	SetDlgItemText(IDC_EDIT_O, MiniCT_0105);	//MiniCT_0105 "MiniSoft"
	
	SetDlgItemText(IDC_EDIT_OU, MiniCT_0106);	//MiniCT_0106 "MiniCA"
	
	SetDlgItemText(IDC_EDIT_CN, MiniCT_0107);	//MiniCT_0107 "MiniCA"
	
	SetDlgItemText(IDC_EDIT_T, MiniCT_0108);	//MiniCT_0108 "MiniCA"
	
	SetDlgItemText(IDC_EDIT_G, MiniCT_0109);	//MiniCT_0109 "MiniCA"
	
	SetDlgItemText(IDC_EDIT_S, MiniCT_0110);	//MiniCT_0110 "MiniCA"
	
	SetDlgItemText(IDC_EDIT_E, MiniCT_0111);//MiniCT_0111 "hpxs@hotmail.com"

	//翻译STATIC文字
	SetDlgItemText(IDC_STATIC_CA1,	MiniCT_10101); 
	SetDlgItemText(IDC_STATIC_CN,	MiniCT_10102); 
	SetDlgItemText(IDC_STATIC_CA2,	MiniCT_10103); 
	SetDlgItemText(IDC_STATIC_CA3,	MiniCT_10104); 
	SetDlgItemText(IDC_STATIC_CA4,	MiniCT_10105); 
	SetDlgItemText(IDC_STATIC_CA5,	MiniCT_10106); 
	SetDlgItemText(IDC_STATIC_CA6,	MiniCT_10107); 
	SetDlgItemText(IDC_STATIC_CA7,	MiniCT_10108); 
	SetDlgItemText(IDC_STATIC_CA8,	MiniCT_10109); 
	SetDlgItemText(IDC_STATIC_CA9,	MiniCT_10110); 
	SetDlgItemText(IDC_STATIC_CA10, MiniCT_10111); 
	SetDlgItemText(IDC_STATIC_CA11, MiniCT_10112); 
	SetDlgItemText(IDC_STATIC_CA12, MiniCT_10113); 
	SetDlgItemText(IDC_STATIC_CA13, MiniCT_10114); 
	SetDlgItemText(IDC_STATIC_CA14, MiniCT_10115); 
	SetDlgItemText(IDC_STATIC_CA15, MiniCT_10116); 
	SetDlgItemText(IDC_STATIC_CA16, MiniCT_10117); 
	SetDlgItemText(IDC_STATIC_CA17, MiniCT_10118); 
	SetDlgItemText(IDC_STATIC_CA18, MiniCT_10119); 
	SetDlgItemText(IDC_STATIC_CA19, MiniCT_10120); 
	SetDlgItemText(IDC_CHECK, MiniCT_10121); 
	SetDlgItemText(IDC_CHECK_P12, MiniCT_10122); 
	SetDlgItemText(IDC_B_MKROOT, MiniCT_10123); 
	SetDlgItemText(IDC_B_MKCERT2, MiniCT_10124); 
	SetDlgItemText(IDC_B_CRL, MiniCT_10125); 
	SetDlgItemText(IDC_B_CRL2, MiniCT_10126); 
	SetDlgItemText(IDC_B_MKREQ, MiniCT_10127); 
	SetDlgItemText(IDC_B_MKCERT, MiniCT_10128);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -