CaCenterPage.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:28k
源码类别:

CA认证

开发平台:

Visual C++

  1. // CaCenterPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MiniCA.h"
  5. #include "CaCenterPage.h"
  6. #include "CaCertIniSetPage.h"
  7. #include "MiniMainDlg.h"
  8. #include ".GenericClassLanguage.h"
  9. #include "MiniCT.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CCaCenterPage property page
  17. IMPLEMENT_DYNCREATE(CCaCenterPage, CPropertyPage)
  18. CCaCenterPage::CCaCenterPage() : CPropertyPage(CCaCenterPage::IDD)
  19. {
  20. //{{AFX_DATA_INIT(CCaCenterPage)
  21. m_C = _T("");
  22. m_ST = _T("");
  23. m_L = _T("");
  24. m_O = _T("");
  25. m_OU = _T("");
  26. m_CN = _T("");
  27. m_E = _T("");
  28. m_S = _T("");
  29. m_G = _T("");
  30. m_T = _T("");
  31. //}}AFX_DATA_INIT
  32. m_CertFormat = PEM;
  33. m_ExtName = ".cer";
  34. m_MadePfx = FALSE;
  35. m_IniPathName = ((CMiniCaApp *)AfxGetApp())->GetAppPath() +  "\MiniCA.ini";
  36. m_NameType = 0;
  37. }
  38. CCaCenterPage::~CCaCenterPage()
  39. {
  40. }
  41. void CCaCenterPage::DoDataExchange(CDataExchange* pDX)
  42. {
  43. CPropertyPage::DoDataExchange(pDX);
  44. //{{AFX_DATA_MAP(CCaCenterPage)
  45. DDX_Control(pDX, IDC_STATIC_CN, m_StaticCN);
  46. DDX_Control(pDX, IDC_B_CRL2, m_Bcrl2);
  47. DDX_Control(pDX, IDC_B_MKREQ, m_Bmkreq);
  48. DDX_Control(pDX, IDC_B_MKCERT2, m_Bmkcert2);
  49. DDX_Control(pDX, IDC_B_MKCERT, m_Bmkcert);
  50. DDX_Control(pDX, IDC_B_CRL, m_Bcrl);
  51. DDX_Control(pDX, IDC_B_MKROOT, m_Bmkroot);
  52. DDX_Text(pDX, IDC_EDIT_C, m_C);
  53. DDV_MaxChars(pDX, m_C, 8);
  54. DDX_Text(pDX, IDC_EDIT_ST, m_ST);
  55. DDV_MaxChars(pDX, m_ST, 8);
  56. DDX_Text(pDX, IDC_EDIT_L, m_L);
  57. DDV_MaxChars(pDX, m_L, 16);
  58. DDX_Text(pDX, IDC_EDIT_O, m_O);
  59. DDV_MaxChars(pDX, m_O, 48);
  60. DDX_Text(pDX, IDC_EDIT_OU, m_OU);
  61. DDV_MaxChars(pDX, m_OU, 48);
  62. DDX_Text(pDX, IDC_EDIT_CN, m_CN);
  63. DDV_MaxChars(pDX, m_CN, 48);
  64. DDX_Text(pDX, IDC_EDIT_E, m_E);
  65. DDV_MaxChars(pDX, m_E, 48);
  66. DDX_Text(pDX, IDC_EDIT_S, m_S);
  67. DDV_MaxChars(pDX, m_S, 16);
  68. DDX_Text(pDX, IDC_EDIT_G, m_G);
  69. DDV_MaxChars(pDX, m_G, 16);
  70. DDX_Text(pDX, IDC_EDIT_T, m_T);
  71. DDV_MaxChars(pDX, m_T, 16);
  72. //}}AFX_DATA_MAP
  73.     DDX_FileEditCtrl(pDX, IDC_EDIT_PATH, m_DirEdit, FEC_FOLDER);
  74.     DDX_FileEditCtrl(pDX, IDC_EDIT4, m_XpEdit4, FEC_FILEOPEN);
  75. //    if (m_validate.GetCheck())
  76.  //       DDV_FileEditCtrl(pDX, IDC_EDIT1);
  77. }
  78. BEGIN_MESSAGE_MAP(CCaCenterPage, CPropertyPage)
  79. //{{AFX_MSG_MAP(CCaCenterPage)
  80. // ON_BN_CLICKED(IDC_B_PATH4, OnBPath4)
  81. ON_BN_CLICKED(IDC_B_CRL, OnBCrl)
  82. ON_BN_CLICKED(IDC_B_MKROOT, OnBMkroot)
  83. ON_BN_CLICKED(IDC_B_MKREQ, OnBMkreq)
  84. ON_BN_CLICKED(IDC_B_MKCERT, OnBMkcert)
  85. ON_BN_CLICKED(IDC_CHECK, OnCheck)
  86. ON_BN_CLICKED(IDC_B_MKCERT2, OnBMkcert2)
  87. ON_BN_CLICKED(IDC_CHECK_P12, OnCheckP12)
  88. ON_BN_CLICKED(IDC_B_CRL2, OnBCrl2)
  89. //}}AFX_MSG_MAP
  90.     ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipNotify)
  91. END_MESSAGE_MAP()
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CCaCenterPage message handlers
  94. BOOL CCaCenterPage::OnToolTipNotify(UINT /*id*/, NMHDR* pTTTStruct, LRESULT* /*pResult*/)
  95. {
  96. TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;    
  97.     UINT nID = pTTTStruct->idFrom;
  98. BOOL bCheckDer = ((CButton * )GetDlgItem(IDC_CHECK))->GetCheck();
  99. BOOL bCheckP12 = ((CButton * )GetDlgItem(IDC_CHECK_P12))->GetCheck();
  100. CString strPwd(""),
  101. strText;
  102. switch(nID)
  103. {
  104. case IDC_B_MKROOT:
  105. strText = CMiniCaApp::NormalCode("制作根证书");
  106. if(bCheckDer)
  107. strText += CMiniCaApp::NormalCode("rDER格式");
  108. else
  109. strText += CMiniCaApp::NormalCode("rPME格式");
  110. if(bCheckP12)
  111. strText += CMiniCaApp::NormalCode(",附带PFX包");
  112. if(!strPwd.IsEmpty())
  113. strText += CMiniCaApp::NormalCode(",私钥加密");
  114. _tcscpy(pTTT->szText,_T(strText));//设置
  115. return TRUE;
  116. case IDC_B_MKCERT2:
  117. strText = CMiniCaApp::NormalCode("制作证书");
  118. if(bCheckDer)
  119. strText += CMiniCaApp::NormalCode("rDER格式");
  120. else
  121. strText += CMiniCaApp::NormalCode("rPME格式");
  122. if(bCheckP12)
  123. strText += CMiniCaApp::NormalCode(",附带PFX包");
  124. if(!strPwd.IsEmpty())
  125. strText += CMiniCaApp::NormalCode(",私钥加密");
  126. _tcscpy(pTTT->szText,strText);//设置
  127. return TRUE;
  128. case IDC_B_MKREQ:
  129. strText = CMiniCaApp::NormalCode("生成证书请求");
  130. if(bCheckDer)
  131. strText += CMiniCaApp::NormalCode("rDER格式");
  132. else
  133. strText += CMiniCaApp::NormalCode("rPME格式");
  134. if(!strPwd.IsEmpty())
  135. strText += CMiniCaApp::NormalCode(",私钥加密");
  136. _tcscpy(pTTT->szText,strText);//设置
  137. return TRUE;
  138. case IDC_B_MKCERT:
  139. strText = CMiniCaApp::NormalCode("通过证书请求制作证书");
  140. if(bCheckDer)
  141. strText += CMiniCaApp::NormalCode("rDER格式");
  142. else
  143. strText += CMiniCaApp::NormalCode("rPME格式");
  144. _tcscpy(pTTT->szText,strText);//设置
  145. return TRUE;
  146. }
  147. return FALSE;
  148. }
  149. BOOL CCaCenterPage::OnInitDialog() 
  150. {
  151. CPropertyPage::OnInitDialog();
  152. // TODO: Add extra initialization here
  153. // m_CheckP12.SetIcon(IDI_ICON14, IDI_ICON15);
  154. // m_CheckP12.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  155. if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
  156. {
  157. ClassXP(GetDlgItem(IDC_CHECK)->m_hWnd,TRUE);
  158. ClassXP(GetDlgItem(IDC_CHECK_P12)->m_hWnd,TRUE);
  159. ClassXP(GetDlgItem(IDC_COMBO_L)->m_hWnd,TRUE);
  160. ClassXP(GetDlgItem(IDC_EDIT_CN)->m_hWnd,TRUE);
  161. ClassXP(GetDlgItem(IDC_EDIT_PWD)->m_hWnd,TRUE);
  162. ClassXP(GetDlgItem(IDC_EDIT_E)->m_hWnd,TRUE);
  163. ClassXP(GetDlgItem(IDC_EDIT_C)->m_hWnd,TRUE);
  164. ClassXP(GetDlgItem(IDC_EDIT_O)->m_hWnd,TRUE);
  165. ClassXP(GetDlgItem(IDC_EDIT_OU)->m_hWnd,TRUE);
  166. ClassXP(GetDlgItem(IDC_EDIT_ST)->m_hWnd,TRUE);
  167. ClassXP(GetDlgItem(IDC_EDIT_L)->m_hWnd,TRUE);
  168. ClassXP(GetDlgItem(IDC_EDIT_T)->m_hWnd,TRUE);
  169. ClassXP(GetDlgItem(IDC_EDIT_G)->m_hWnd,TRUE);
  170. ClassXP(GetDlgItem(IDC_EDIT_S)->m_hWnd,TRUE);
  171. ClassXP(GetDlgItem(IDC_EDIT_DAY)->m_hWnd,TRUE);
  172. ClassXP(GetDlgItem(IDC_EDIT_SN)->m_hWnd,TRUE);
  173. }
  174. // m_DirEdit.ModifyStyleEx(0, WS_EX_ACCEPTFILES);
  175. // m_DirEdit.SetClientTipText("CString text");
  176. // m_DirEdit.ModifyStyleEx(0, FEC_BUTTONTIP);
  177. // m_DirEdit.ModifyStyleEx(0, FEC_CLIENTTIP);
  178. //    m_DirEdit.ModifyFlags(FEC_FILEOPEN, FEC_FOLDER);
  179.     HANDLE handle = ::LoadImage(AfxGetInstanceHandle(),
  180. MAKEINTRESOURCE(IDI_ICON_DIR),
  181. IMAGE_ICON,
  182. 0,
  183. 0,
  184. LR_DEFAULTCOLOR);
  185.     m_DirEdit.SetButtonImage(handle, PJAI_ICON | PJAI_AUTODELETE | PJAI_STRETCHED );
  186. m_DirEdit.SetButtonWidth(18);
  187.     HANDLE handleCsr = ::LoadImage(AfxGetInstanceHandle(),
  188. MAKEINTRESOURCE(IDI_ICON_VIEW),
  189. IMAGE_ICON,
  190. 0,
  191. 0,
  192. LR_DEFAULTCOLOR);
  193.     m_XpEdit4.SetButtonImage(handleCsr, PJAI_ICON | PJAI_AUTODELETE | PJAI_STRETCHED );
  194. m_XpEdit4.SetButtonWidth(18);
  195. m_XpEdit4.SetCaption(MiniCT_0100); //MiniCT_0100 "选择证书请求文件"
  196. m_XpEdit4.SetFilter(MiniCT_0101); //MiniCT_0101 "证书请求(*.csr)|*.csr|所有文件(*.*)|*.*||"
  197. // m_DirEdit.ModifyFlags(0, FEC_FLAT);
  198. // m_DirEdit.ModifyFlags(FEC_FLAT | FEC_GRAYSCALE, 0);
  199. // m_Bpath.SetIcon(IDI_ICON_DIR);//path
  200. // m_Bpath.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  201. CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
  202. // m_Bpath4.SetIcon(IDI_ICON_VIEW);
  203. // m_Bpath4.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  204. m_Bmkreq.SetIcon(IDI_ICON19);
  205. m_Bmkreq.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  206. m_Bmkcert2.SetIcon(IDI_ICON_CERT);
  207. m_Bmkcert2.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  208. m_Bmkcert.SetIcon(IDI_ICON_VCERT, (int)BTNST_AUTO_GRAY);//req - cert
  209. m_Bmkcert.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  210. m_Bcrl.SetIcon(IDI_ICON_MCRL);//CRL
  211. m_Bcrl.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  212. m_Bcrl2.SetIcon(IDI_ICON_EDIT);//CRL
  213. m_Bcrl2.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  214. m_Bmkroot.SetIcon(IDI_ICON_MROOT);
  215. m_Bmkroot.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
  216. ((CButton *)GetDlgItem(IDC_CHECK_P12))->SetCheck(m_MadePfx);
  217. // CG: The following block was added by the ToolTips component. { // Create the ToolTip control. m_toolTip.Create(this); m_toolTip.AddTool(GetDlgItem(IDC_CHECK), CMiniCaApp::NormalCode("证书格式rDER或PEM格式"));
  218. m_toolTip.AddTool(GetDlgItem(IDC_CHECK_P12), CMiniCaApp::NormalCode("附带PFX包r制作证书请求(REQ)时无效"));
  219. m_toolTip.AddTool(GetDlgItem(IDC_EDIT_PATH), CMiniCaApp::NormalCode("证书存放路径"));
  220. m_toolTip.AddTool(GetDlgItem(IDC_EDIT4), CMiniCaApp::NormalCode("证书请求存放路径"));
  221. m_toolTip.AddTool(GetDlgItem(IDC_B_CRL2), CMiniCaApp::NormalCode("选择证书作废信息文件r此文件是记录了作废证n书序号的文本文件"));
  222. m_toolTip.AddTool(GetDlgItem(IDC_EDITCRL), CMiniCaApp::NormalCode("作废证书序号列表r以','分割的一系列证书序号"));
  223. m_toolTip.AddTool(GetDlgItem(IDC_B_CRL), CMiniCaApp::NormalCode("制作黑名单"));
  224. m_toolTip.AddTool(GetDlgItem(IDC_B_MKROOT), LPSTR_TEXTCALLBACK);
  225. m_toolTip.AddTool(GetDlgItem(IDC_B_MKCERT2), LPSTR_TEXTCALLBACK);
  226. m_toolTip.AddTool(GetDlgItem(IDC_B_MKREQ), LPSTR_TEXTCALLBACK);
  227. m_toolTip.AddTool(GetDlgItem(IDC_B_MKCERT), LPSTR_TEXTCALLBACK);
  228. // Change the color of one of the tooltips
  229. /* OXTOOLINFO ToolInfo;
  230. if (m_toolTip.GetToolInfo(ToolInfo, GetDlgItem(IDC_CHECK)))
  231. {
  232. ToolInfo.clrBackColor = RGB(255, 255, 255);
  233. ToolInfo.clrTextColor = RGB(  0,   0, 255);
  234. m_toolTip.SetToolInfo(&ToolInfo);
  235. }*/
  236. // TODO: Use one of the following forms to add controls: }
  237. //加载配置信息
  238. //检测是否已经打开,如果打不开,则重新写入
  239. CFile file;
  240. if(!file.Open(m_IniPathName,CFile::modeRead))
  241. {
  242. /*得到配置*/
  243. HRSRC hRsrc = 0;
  244. if(CMiniCaApp::IsBig())
  245. {
  246. hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_MINICA_INI_BG),"INI");
  247. }
  248. else
  249. hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_MINICA_INI),"INI");
  250. DWORD lenCert = SizeofResource(NULL, hRsrc); 
  251. HGLOBAL hgCert=LoadResource(NULL,hRsrc);
  252. LPSTR lpCert=(LPSTR)LockResource(hgCert);
  253. file.Open(m_IniPathName,CFile::modeCreate|CFile::modeWrite); //存文件
  254. {
  255. file.Write(lpCert,lenCert);
  256. }
  257. }
  258. file.Close();
  259. TranslateCT();
  260. char buf[255]={0};
  261. GetPrivateProfileString("CA", "RSALEN","1024",buf,50, m_IniPathName);
  262. //查找加载项是否有效512 768 1024 1536 2048
  263. int index = ((CComboBox *)GetDlgItem(IDC_COMBO_L))->FindString(-1,buf);
  264. if(index == -1)
  265. index = 2;
  266. ((CComboBox *)GetDlgItem(IDC_COMBO_L))->SetCurSel(index);
  267. GetPrivateProfileString("CA", "DAY","365",buf,50, m_IniPathName);
  268. SetDlgItemText(IDC_EDIT_DAY,buf);
  269. GetPrivateProfileString("CA", "SN","1",buf,50, m_IniPathName);
  270. SetDlgItemText(IDC_EDIT_SN,buf);
  271. GetPrivateProfileString("CRL", "Revoke","1,2,3",buf,50, m_IniPathName);
  272. SetDlgItemText(IDC_EDITCRL,buf);
  273. // m_StaticCN.SetTextColor(RGB(64,128,0));
  274. /* CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
  275. CCertDbPage * pSetup = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));
  276.   if(pSetup) 
  277.   {
  278.   CString m_PathName = pSetup->GetCertPath(0);
  279.   SetDlgItemText(IDC_EDIT_PATH,m_PathName);
  280.   m_Path = m_PathName;
  281. }*/
  282. return TRUE;
  283. }
  284. void CCaCenterPage::OnBMkroot() //制作根证书
  285. {
  286. // TODO: Add your control notification handler code here
  287. GetDlgItemText(IDC_EDIT_PATH, m_Path);
  288. if(m_Path=="") 
  289. {
  290. AddMsg(MiniCT_0112,M_WARING); //MiniCT_0112 " 请选择输出路径!"
  291. return;
  292. }
  293. char out[100]={0};
  294. CString str,strSN;
  295. stuSUBJECT * pRoot = NULL;
  296. GetDlgItemText(IDC_EDIT_C,str);
  297. pRoot->Add(pRoot, "C", str);
  298. GetDlgItemText(IDC_EDIT_ST,str);
  299. pRoot->Add(pRoot, "ST", str);
  300. GetDlgItemText(IDC_EDIT_L,str);
  301. pRoot->Add(pRoot, "L", str);
  302. GetDlgItemText(IDC_EDIT_O,str);
  303. pRoot->Add(pRoot, "O", str);
  304. GetDlgItemText(IDC_EDIT_OU,str);
  305. pRoot->Add(pRoot, "OU", str);
  306. CString strCN;
  307. GetDlgItemText(IDC_EDIT_CN,strCN);
  308. if(strCN.IsEmpty())
  309. {
  310. AddMsg(MiniCT_0113,M_WARING); //MiniCT_0113 "请给出个体信息!"
  311. pRoot->RemoveAll(pRoot); //删除证书结构
  312. return;
  313. }
  314. pRoot->Add(pRoot, "CN", strCN);
  315. GetDlgItemText(IDC_EDIT_E,str);
  316. pRoot->Add(pRoot, "emailAddress", str);
  317. GetDlgItemText(IDC_EDIT_T,str);
  318. pRoot->Add(pRoot, "title", str);
  319. GetDlgItemText(IDC_EDIT_G,str);
  320. pRoot->Add(pRoot, "givenName", str);
  321. GetDlgItemText(IDC_EDIT_S,str);
  322. pRoot->Add(pRoot, "SN", str);
  323. GetDlgItemText(IDC_EDIT_DAY,str);
  324. if(str.IsEmpty())
  325. {
  326. AddMsg(MiniCT_0114,M_WARING); //MiniCT_0114 "请给出有效期!"
  327. pRoot->RemoveAll(pRoot); //删除证书结构
  328. return;
  329. }
  330. char certBuf[10240] = {0};
  331. char keyBuf[10240] = {0};
  332. char p12Buf[10240] = {0};
  333. UINT certLen = 10240,
  334.  keyLen = 10240,
  335.  p12Len = 10240;
  336. GetDlgItemText(IDC_EDIT_SN,strSN);
  337. CString len;
  338. GetDlgItemText(IDC_COMBO_L,len);
  339. CString pwd("");
  340. // GetDlgItemText(IDC_EDIT_PWD,pwd);
  341. CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
  342. CCertDbPage * pDb = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));
  343. if(pDb)
  344. {
  345. m_NameType = pDb->GetNameType();
  346. }
  347. CString strName;
  348. if(0 == m_NameType)//用户名
  349. {
  350. strName.Format("\R%s", strCN);
  351. }
  352. else if(1 == m_NameType)//序号
  353. {
  354. strName.Format("\R%s", strSN);
  355. }
  356. else if(2 == m_NameType)//用户名 + 序号
  357. {
  358. strName.Format("\R%s%s", strCN, strSN);
  359. }
  360. else if(3 == m_NameType)//序号 + 用户名
  361. {
  362. strName.Format("\R%s%s", strSN, strCN);
  363. }
  364. BOOL bRet = MakeRoot(pRoot,"(MiniCA)", atoi(len),atoi(strSN),atoi(str),
  365. pwd.GetBuffer(0),"","",NULL,certBuf,
  366. &certLen,keyBuf,&keyLen,p12Buf,&p12Len,out,m_CertFormat);
  367. pRoot->RemoveAll(pRoot); //删除证书结构
  368. if(bRet)
  369. {
  370. CString outCert = m_Path + strName + "_Cert";
  371. outCert += m_ExtName;
  372. CString outKey = m_Path + strName + "_Key";
  373. outKey += m_ExtName;
  374. CString p12 = m_Path + strName + ".pfx";
  375. FILE * pfc = fopen(outCert,"wb");
  376. if(!pfc)
  377. {
  378. AddMsg(MiniCT_0115,M_ERROR); //MiniCT_0115 "保存根公钥失败"
  379. return;
  380. }
  381. fwrite(certBuf,sizeof(char),certLen,pfc);
  382. fclose(pfc);
  383. pfc = fopen(outKey,"wb");
  384. if(!pfc)
  385. {
  386. AddMsg(MiniCT_0116,M_ERROR); //MiniCT_0116 "保存根私钥失败"
  387. return;
  388. }
  389. fwrite(keyBuf,sizeof(char),keyLen,pfc);
  390. fclose(pfc);
  391. AddMsg(MiniCT_0117); //MiniCT_0117 "根证书制作成功"
  392. if(m_MadePfx)
  393. {
  394. pfc = fopen(p12,"wb");
  395. if(!pfc)
  396. {
  397. AddMsg(MiniCT_0118,M_ERROR); //MiniCT_0118 "保存PFX文件失败"
  398. return;
  399. }
  400. fwrite(p12Buf,sizeof(char),p12Len,pfc);
  401. fclose(pfc);
  402. AddMsg(MiniCT_0119); //MiniCT_0119 "根证书PFX包制作成功"
  403. }
  404. //序号增加一
  405. int iSn = atoi(strSN) + 1;
  406. CString sSn;
  407. sSn.Format("%d",iSn);
  408. WritePrivateProfileString("CA", "SN",sSn,m_IniPathName);
  409. SetDlgItemText(IDC_EDIT_SN,sSn);
  410. }
  411. else
  412. AddMsg(out,M_ERROR);
  413. pwd.ReleaseBuffer();
  414. }
  415. void CCaCenterPage::OnBMkreq() //制作REG
  416. {
  417. // TODO: Add your control notification handler code here
  418. if(m_Path=="") 
  419. {
  420. AddMsg(MiniCT_0112,M_WARING); //MiniCT_0112 "请选择输出路径!"
  421. return;
  422. }
  423. char out[100]="";
  424. CString str,strCN;
  425. stuSUBJECT * pReq = NULL;
  426. GetDlgItemText(IDC_EDIT_C,str);
  427. pReq->Add(pReq, "C", str);
  428. GetDlgItemText(IDC_EDIT_ST,str);
  429. pReq->Add(pReq, "ST", str);
  430. GetDlgItemText(IDC_EDIT_L,str);
  431. pReq->Add(pReq, "L", str);
  432. GetDlgItemText(IDC_EDIT_O,str);
  433. pReq->Add(pReq, "O", str);
  434. GetDlgItemText(IDC_EDIT_OU,str);
  435. pReq->Add(pReq, "OU", str);
  436. GetDlgItemText(IDC_EDIT_CN,strCN);
  437. if(strCN.IsEmpty())
  438. {
  439. AddMsg(MiniCT_0113,M_WARING); //MiniCT_0113 "请给出个体信息!"
  440. pReq->RemoveAll(pReq); //删除证书结构
  441. return;
  442. }
  443. pReq->Add(pReq, "CN", strCN);
  444. GetDlgItemText(IDC_EDIT_E,str);
  445. pReq->Add(pReq, "emailAddress", str);
  446. GetDlgItemText(IDC_EDIT_T,str);
  447. pReq->Add(pReq, "title", str);
  448. GetDlgItemText(IDC_EDIT_G,str);
  449. pReq->Add(pReq, "givenName", str);
  450. GetDlgItemText(IDC_EDIT_S,str);
  451. pReq->Add(pReq, "SN", str);
  452. GetDlgItemText(IDC_EDIT_DAY,str);
  453. if(str=="")
  454. {
  455. AddMsg(MiniCT_0114,M_WARING); //MiniCT_0114 "请给出有效期!"
  456. pReq->RemoveAll(pReq); //删除证书结构
  457. return;
  458. }
  459. CString reqf, key;
  460. reqf.Format("%s\%s%s", m_Path, strCN, "Req.csr");
  461. key.Format("%s\%s%s%s", m_Path, strCN, "Key", m_ExtName);
  462. CString len;
  463. GetDlgItemText(IDC_COMBO_L,len);
  464. CString pwd("");
  465. // GetDlgItemText(IDC_EDIT_PWD,pwd);
  466. char reqBuf[10240] = {0};
  467. char keyBuf[10240] = {0};
  468. UINT reqLen = 10240,
  469.  keyLen = 10240;
  470. if(MakeReq(pReq, atoi(len), pwd.GetBuffer(0), reqBuf, &reqLen, keyBuf, &keyLen, out, m_CertFormat))
  471. {
  472. FILE * pfc = fopen(reqf,"wb");
  473. if(pfc != NULL)
  474. {
  475. fwrite(reqBuf,sizeof(char),reqLen,pfc);
  476. fclose(pfc);
  477. pfc = fopen(key,"wb");
  478. if(pfc != NULL)
  479. {
  480. fwrite(keyBuf,sizeof(char),keyLen,pfc);
  481. fclose(pfc);
  482. }
  483. }
  484. SetDlgItemText(IDC_EDIT4,reqf);
  485. AddMsg(MiniCT_0120); //MiniCT_0120 "Req制作成功"
  486. pReq->RemoveAll(pReq); //删除证书结构
  487. }
  488. else
  489. AddMsg(out,M_ERROR);
  490. pwd.ReleaseBuffer();
  491. pReq->RemoveAll(pReq); //删除证书结构
  492. }
  493. void CCaCenterPage::OnBMkcert() //req 制作证书
  494. {
  495. // TODO: Add your control notification handler code here
  496. if(m_Path=="") 
  497. {
  498. AddMsg(MiniCT_0112,M_WARING); //MiniCT_0112 "请选择输出路径!"
  499. return;
  500. }
  501. CString req,day,outCert,strSN;
  502. GetDlgItemText(IDC_EDIT4,req);
  503. if(req=="")
  504. {
  505. AddMsg(MiniCT_0121,M_WARING); //MiniCT_0121 "请选择证书请求文件!"
  506. return;
  507. }
  508. GetDlgItemText(IDC_EDIT_DAY,day);
  509. if(day=="")
  510. {
  511. AddMsg(MiniCT_0114,M_WARING); //MiniCT_0114 "请给出有效期!"
  512. return;
  513. }
  514. char out[1024]={0};
  515. CString KUSAGE,EKUSAGE;
  516. // GetKeyUsage(KUSAGE,EKUSAGE);//通过配置文件得到密钥用法
  517. CString RootP12,RootPwd;
  518. BOOL ret=FALSE;
  519. DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
  520. CString strPwd;//公私钥路径或内容,p12密钥
  521. char strCert[10240] = {0};
  522. char strKey[10240] = {0};
  523. char certBuf[10240] = {0};
  524. UINT certLen = 10240;
  525. if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
  526. {
  527. GetDlgItemText(IDC_EDIT_SN,strSN);
  528. outCert=m_Path+"\UserCert";
  529. outCert+=m_ExtName;
  530. stuCertPair RootPair(strCert,lenCert,strKey,lenKey,
  531. strPwd.GetBuffer(0));
  532. strPwd.ReleaseBuffer();
  533. if(MakeCert(RootPair,
  534. atoi(strSN),0,atoi(day),
  535. req.GetBuffer(0),
  536. 0,
  537. KUSAGE.GetBuffer(0),
  538. EKUSAGE.GetBuffer(0),
  539. NULL,
  540. certBuf,
  541. &certLen,
  542. out,m_CertFormat))
  543. {
  544. FILE * pfc = fopen(outCert,"wb");
  545. if(pfc != NULL)
  546. {
  547. fwrite(certBuf,sizeof(char),certLen,pfc);
  548. fclose(pfc);
  549. }
  550. AddMsg(MiniCT_0122); //MiniCT_0122 "证书制作成功"
  551. //序号增加一
  552. int iSn = atoi(strSN) + 1;
  553. CString sSn;
  554. sSn.Format("%d",iSn);
  555. WritePrivateProfileString("CA", "SN",sSn,m_IniPathName);
  556. SetDlgItemText(IDC_EDIT_SN,sSn);
  557. }
  558. else
  559. AddMsg(out,M_ERROR);
  560. req.ReleaseBuffer();
  561. KUSAGE.ReleaseBuffer();
  562. EKUSAGE.ReleaseBuffer();
  563. outCert.ReleaseBuffer();
  564. }
  565. else
  566. AddMsg(MiniCT_0123,M_ERROR); //MiniCT_0123 "加载根证书失败"
  567. }
  568. void CCaCenterPage::OnBMkcert2() //直接生成证书
  569. {
  570. // TODO: Add your control notification handler code here
  571. char out[1024] = {0};
  572. char cert[10240] = {0},
  573.  key[10240] = {0},
  574.  p12[10240] = {0};
  575. UINT certl = 10240,
  576. keyl = 10240,
  577. p12l = 10240;
  578. CString str,day,strSN;
  579. stuSUBJECT * pCERT = NULL;
  580. GetDlgItemText(IDC_EDIT_C,str);
  581. pCERT->Add(pCERT, "C", str);
  582. GetDlgItemText(IDC_EDIT_ST,str);
  583. pCERT->Add(pCERT, "ST", str);
  584. GetDlgItemText(IDC_EDIT_L,str);
  585. pCERT->Add(pCERT, "L", str);
  586. GetDlgItemText(IDC_EDIT_O,str);
  587. pCERT->Add(pCERT, "O", str);
  588. GetDlgItemText(IDC_EDIT_OU,str);
  589. pCERT->Add(pCERT, "OU", str);
  590. CString strCN;
  591. GetDlgItemText(IDC_EDIT_CN,strCN);
  592. if(strCN.IsEmpty())
  593. {
  594. AddMsg(MiniCT_0113,M_WARING); //MiniCT_0113 "请给出个体信息!"
  595. return;
  596. }
  597. pCERT->Add(pCERT, "CN", strCN);
  598. GetDlgItemText(IDC_EDIT_E,str);
  599. pCERT->Add(pCERT, "emailAddress", str);
  600. GetDlgItemText(IDC_EDIT_T,str);
  601. pCERT->Add(pCERT, "title", str);
  602. GetDlgItemText(IDC_EDIT_G,str);
  603. pCERT->Add(pCERT, "givenName", str);
  604. GetDlgItemText(IDC_EDIT_S,str);
  605. pCERT->Add(pCERT, "SN", str);
  606. GetDlgItemText(IDC_EDIT_DAY,day);
  607. CString KUSAGE,EKUSAGE;
  608. if(m_Path=="") 
  609. {
  610. AddMsg(MiniCT_0112,M_WARING); //MiniCT_0112 "请选择输出路径!"
  611. pCERT->RemoveAll(pCERT); //删除证书结构
  612. return;
  613. }
  614. if(day=="")
  615. {
  616. AddMsg(MiniCT_0114,M_WARING); //MiniCT_0114 "请给出有效期!"
  617. pCERT->RemoveAll(pCERT); //删除证书结构
  618. return;
  619. }
  620. CMiniMainDlg * pMain = (CMiniMainDlg *)AfxGetMainWnd();
  621. CCertDbPage * pDb = (CCertDbPage *)(pMain->GetPage("CCertDbPage"));
  622. if(pDb)
  623. {
  624. m_NameType = pDb->GetNameType();
  625. }
  626. CString strName;
  627. if(0 == m_NameType)//用户名
  628. {
  629. strName.Format("\%s", strCN);
  630. }
  631. else if(1 == m_NameType)//序号
  632. {
  633. strName.Format("\%s", strSN);
  634. }
  635. else if(2 == m_NameType)//用户名 + 序号
  636. {
  637. strName.Format("\%s%s", strCN, strSN);
  638. }
  639. else if(3 == m_NameType)//序号 + 用户名
  640. {
  641. strName.Format("\%s%s", strSN, strCN);
  642. }
  643. DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
  644. CString strPwd;//公私钥路径或内容,p12密钥
  645. char strCert[10240] = {0};
  646. char strKey[10240] = {0};
  647. if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
  648. {
  649. GetDlgItemText(IDC_EDIT_SN,strSN);
  650. CString len;
  651. GetDlgItemText(IDC_COMBO_L,len);
  652. CString pwd("");
  653. // GetDlgItemText(IDC_EDIT_PWD,pwd);
  654. stuCertPair RootPair(strCert,lenCert,strKey,
  655. lenKey,strPwd.GetBuffer(0));
  656. strPwd.ReleaseBuffer();
  657. BOOL bRet = DirectCert(RootPair,atoi(len),atoi(strSN),
  658. 0,atoi(day),pwd.GetBuffer(0),pCERT,"(MiniCA)",KUSAGE.GetBuffer(0),
  659. EKUSAGE.GetBuffer(0),NULL,
  660. cert,&certl,key,&keyl,p12,&p12l,out,m_CertFormat);
  661. pCERT->RemoveAll(pCERT); //删除证书结构
  662. if(bRet)
  663. {
  664. CString outCert  =m_Path + strName + "Cert.cer" ;
  665. CString outKey = m_Path + strName + "Key.cer";
  666. CString p12path = m_Path + strName + ".pfx";
  667. FILE * pfc = fopen(outCert,"wb");
  668. if(pfc != NULL)
  669. {
  670. fwrite(cert,sizeof(char),certl,pfc);
  671. fclose(pfc);
  672. pfc = fopen(outKey,"wb");
  673. if(pfc != NULL)
  674. {
  675. fwrite(key,sizeof(char),keyl,pfc);
  676. fclose(pfc);
  677. AddMsg(MiniCT_0124); //MiniCT_0124 "生成证书成功"
  678. if(m_MadePfx)
  679. {
  680. pfc = fopen(p12path,"wb");
  681. if(pfc != NULL)
  682. {
  683. fwrite(p12,sizeof(char),p12l,pfc);
  684. fclose(pfc);
  685. AddMsg(MiniCT_0125); //MiniCT_0125 "证书PFX包制作成功"
  686. }
  687. else
  688. AddMsg(MiniCT_0126,M_ERROR); //MiniCT_0126 "证书PFX包保存失败"
  689. }
  690. }
  691. else
  692. AddMsg(MiniCT_0127,M_ERROR); //MiniCT_0127 "保存证书私钥失败"
  693. //序号增加一
  694. int iSn = atoi(strSN) + 1;
  695. CString sSn;
  696. sSn.Format("%d",iSn);
  697. WritePrivateProfileString("CA", "SN",sSn,m_IniPathName);
  698. SetDlgItemText(IDC_EDIT_SN,sSn);
  699. }
  700. else
  701. AddMsg(MiniCT_0128,M_ERROR); //MiniCT_0128 "保存证书公钥失败"
  702. pwd.ReleaseBuffer();
  703. KUSAGE.ReleaseBuffer();
  704. EKUSAGE.ReleaseBuffer();
  705. }
  706. else
  707. AddMsg(out, M_ERROR);
  708. }
  709. else
  710. AddMsg(MiniCT_0123,M_ERROR); //MiniCT_0123 "加载根证书失败"
  711. }
  712. void CCaCenterPage::OnBCrl2() //加载信息文件到文本框
  713. {
  714. // TODO: Add your control notification handler code here
  715. CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  716. MiniCT_0129,NULL); //MiniCT_0129 "证书作废信息文件(*.txt)|*.txt|所有文件(*.*)|*.*||"
  717. CString strTitle = MiniCT_0130; //MiniCT_0130  证书作废信息文件
  718. dlgOpen.m_ofn.lpstrTitle= strTitle;//标题条
  719. if(dlgOpen.DoModal()!=IDOK) return;
  720. CString crlinfo = dlgOpen.GetPathName();
  721. CString info,temp;
  722. if(!crlinfo.IsEmpty())
  723. {
  724. if(CStdioFile stdFile(crlinfo,CFile::modeRead))
  725. {
  726. while(stdFile.ReadString(temp))
  727. {
  728. info += temp;
  729. }
  730. stdFile.Close();
  731. }
  732. }
  733. SetDlgItemText(IDC_EDITCRL,info);
  734. }
  735. void CCaCenterPage::OnBCrl() 
  736. {
  737. // TODO: Add your control notification handler code here
  738. if(m_Path=="") 
  739. {
  740. AddMsg(MiniCT_0112,M_WARING); //MiniCT_0112 "请选择输出路径!"
  741. return;
  742. }
  743. char out[100]={0};
  744. CString outCrl=m_Path+"MiniCA.crl";
  745. CString RootP12,RootPwd;
  746. DWORD lenCert=0,lenKey=0;//公钥长度,私钥长度
  747. CString strPwd;//公私钥路径或内容,p12密钥
  748. char strCert[10240] = {0};
  749. char strKey[10240] = {0};
  750. if(((CMiniCaApp *)AfxGetApp())->GetRootCert(strCert, lenCert, strKey, lenKey,strPwd))
  751. {
  752. time_t t;
  753. time(&t);
  754. char * Crl=NULL;
  755. stuREVOKE * Head = NULL;//构造空链表
  756. CString strRevoke;
  757. strRevoke.Replace(" ",",");
  758. CString strL;
  759. GetDlgItemText(IDC_EDITCRL,strRevoke);
  760. strRevoke += ",";
  761. for(;;)
  762. {
  763. int state=strRevoke.Find(",");
  764. if(state==-1&&strRevoke.GetLength())
  765. strL=strRevoke;
  766. else if(strRevoke.GetLength()==0)
  767. break;
  768. else strL=strRevoke.Left(state);
  769. if(!strL.IsEmpty())
  770. {
  771. ULONG index = atol(strL.GetBuffer(0));
  772. if(index >0)
  773. Head->AddRevoke(Head,index,t);//增加表象
  774. }
  775. strRevoke=strRevoke.Right(strRevoke.GetLength()-state-1);
  776. strRevoke.TrimLeft();
  777. }
  778. stuCertPair RootPair(strCert,lenCert,strKey,lenKey,
  779. strPwd.GetBuffer(0));
  780. if(MakeCrl(RootPair,Head,NULL,Crl,NULL,outCrl.GetBuffer(0),out))
  781. AddMsg(out);
  782. else
  783. AddMsg(out,M_ERROR);
  784. Head->RemoveAll(Head);
  785. }
  786. else
  787. AddMsg(MiniCT_0123,M_ERROR); //MiniCT_0123 "加载根证书失败"
  788. }
  789. void CCaCenterPage::OnCheck() //选择证书格式---〉输出
  790. {
  791. // TODO: Add your control notification handler code here
  792. int check=((CButton *)GetDlgItem(IDC_CHECK))->GetCheck();
  793. if(check)
  794. {
  795. m_CertFormat=DER;
  796. m_ExtName=".cer";
  797. }
  798. else
  799. {
  800. m_CertFormat=PEM;
  801. m_ExtName=".cer";
  802. }
  803. }
  804. void CCaCenterPage::OnCheckP12() 
  805. {
  806. // TODO: Add your control notification handler code here
  807. m_MadePfx=((CButton *)GetDlgItem(IDC_CHECK_P12))->GetCheck();
  808. }
  809. BOOL CCaCenterPage::PreTranslateMessage(MSG* pMsg)
  810. {
  811. // 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.
  812. }
  813. void CCaCenterPage::AddMsg(CString info, DWORD type)
  814. {
  815. CMiniMainDlg * pMain = (CMiniMainDlg *)GetParent();
  816. pMain->AddMsg("MiniCA V2.0",info, type);
  817. }
  818. void CCaCenterPage::SetNamePath(const CString &strPath) //CCertDbPage类中使用
  819. {
  820. if(!strPath.IsEmpty())
  821. {
  822. SetDlgItemText(IDC_EDIT_PATH,strPath);
  823. m_Path = strPath;
  824. }
  825. }
  826. void CCaCenterPage::TranslateCT() //繙譯諸如樹型控件,列錶控件等內容
  827. {
  828. SetDlgItemText(IDC_EDIT_C, MiniCT_0102); //MiniCT_0102 "中国"
  829. SetDlgItemText(IDC_EDIT_ST, MiniCT_0103); //MiniCT_0103 "河北"
  830. SetDlgItemText(IDC_EDIT_L, MiniCT_0104);//MiniCT_0104 
  831. SetDlgItemText(IDC_EDIT_O, MiniCT_0105); //MiniCT_0105 "MiniSoft"
  832. SetDlgItemText(IDC_EDIT_OU, MiniCT_0106); //MiniCT_0106 "MiniCA"
  833. SetDlgItemText(IDC_EDIT_CN, MiniCT_0107); //MiniCT_0107 "MiniCA"
  834. SetDlgItemText(IDC_EDIT_T, MiniCT_0108); //MiniCT_0108 "MiniCA"
  835. SetDlgItemText(IDC_EDIT_G, MiniCT_0109); //MiniCT_0109 "MiniCA"
  836. SetDlgItemText(IDC_EDIT_S, MiniCT_0110); //MiniCT_0110 "MiniCA"
  837. SetDlgItemText(IDC_EDIT_E, MiniCT_0111);//MiniCT_0111 "hpxs@hotmail.com"
  838. //翻译STATIC文字
  839. SetDlgItemText(IDC_STATIC_CA1, MiniCT_10101); 
  840. SetDlgItemText(IDC_STATIC_CN, MiniCT_10102); 
  841. SetDlgItemText(IDC_STATIC_CA2, MiniCT_10103); 
  842. SetDlgItemText(IDC_STATIC_CA3, MiniCT_10104); 
  843. SetDlgItemText(IDC_STATIC_CA4, MiniCT_10105); 
  844. SetDlgItemText(IDC_STATIC_CA5, MiniCT_10106); 
  845. SetDlgItemText(IDC_STATIC_CA6, MiniCT_10107); 
  846. SetDlgItemText(IDC_STATIC_CA7, MiniCT_10108); 
  847. SetDlgItemText(IDC_STATIC_CA8, MiniCT_10109); 
  848. SetDlgItemText(IDC_STATIC_CA9, MiniCT_10110); 
  849. SetDlgItemText(IDC_STATIC_CA10, MiniCT_10111); 
  850. SetDlgItemText(IDC_STATIC_CA11, MiniCT_10112); 
  851. SetDlgItemText(IDC_STATIC_CA12, MiniCT_10113); 
  852. SetDlgItemText(IDC_STATIC_CA13, MiniCT_10114); 
  853. SetDlgItemText(IDC_STATIC_CA14, MiniCT_10115); 
  854. SetDlgItemText(IDC_STATIC_CA15, MiniCT_10116); 
  855. SetDlgItemText(IDC_STATIC_CA16, MiniCT_10117); 
  856. SetDlgItemText(IDC_STATIC_CA17, MiniCT_10118); 
  857. SetDlgItemText(IDC_STATIC_CA18, MiniCT_10119); 
  858. SetDlgItemText(IDC_STATIC_CA19, MiniCT_10120); 
  859. SetDlgItemText(IDC_CHECK, MiniCT_10121); 
  860. SetDlgItemText(IDC_CHECK_P12, MiniCT_10122); 
  861. SetDlgItemText(IDC_B_MKROOT, MiniCT_10123); 
  862. SetDlgItemText(IDC_B_MKCERT2, MiniCT_10124); 
  863. SetDlgItemText(IDC_B_CRL, MiniCT_10125); 
  864. SetDlgItemText(IDC_B_CRL2, MiniCT_10126); 
  865. SetDlgItemText(IDC_B_MKREQ, MiniCT_10127); 
  866. SetDlgItemText(IDC_B_MKCERT, MiniCT_10128);
  867. }