📄 usbcapage.cpp
字号:
// UsbCaPage.cpp : implementation file
//
#include "stdafx.h"
#include "UsbKey.h"
#include "UsbCaPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "ca.h"
/////////////////////////////////////////////////////////////////////////////
// CUsbCaPage property page
IMPLEMENT_DYNCREATE(CUsbCaPage, CPropertyPage)
CUsbCaPage::CUsbCaPage() : CPropertyPage(CUsbCaPage::IDD)
{
//{{AFX_DATA_INIT(CUsbCaPage)
//}}AFX_DATA_INIT
m_CertFormat=PEM;
}
CUsbCaPage::~CUsbCaPage()
{
}
void CUsbCaPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUsbCaPage)
DDX_Control(pDX, IDC_LIST_CA, m_List);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUsbCaPage, CPropertyPage)
//{{AFX_MSG_MAP(CUsbCaPage)
ON_BN_CLICKED(IDC_B_PATH, OnBPath)
ON_BN_CLICKED(IDC_B_PATH4, OnBPath4)
ON_BN_CLICKED(IDC_B_MKROOT, OnBMkroot)
ON_BN_CLICKED(IDC_B_MKREQ, OnBMkreq)
ON_BN_CLICKED(IDC_B_MKCERT, OnBMkcert)
ON_BN_CLICKED(IDC_CHECK, OnCheck)
ON_BN_CLICKED(IDC_B_MKCERT2, OnBMkcert2)
// ON_BN_CLICKED(IDC_B_MKCERT, OnBcrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUsbCaPage message handlers
BOOL CUsbCaPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
SetDlgItemText(IDC_EDIT_C,"CN");
SetDlgItemText(IDC_EDIT_ST,""); //广东
SetDlgItemText(IDC_EDIT_L,""); //广州
SetDlgItemText(IDC_EDIT_O,""); //自信软件
SetDlgItemText(IDC_EDIT_OU,""); //界面设计
SendDlgItemMessage(IDC_COMBO_L,CB_SETCURSEL,1,0);
SendDlgItemMessage(IDC_COMBO_LB,CB_SETCURSEL,0,0);
SetDlgItemText(IDC_EDIT_DAY,"365");
SetDlgItemText(IDC_EDIT_SN,"100");
SendDlgItemMessage(IDC_EDIT_DAY,EM_LIMITTEXT,3,0);
SendDlgItemMessage(IDC_EDIT_SN,EM_LIMITTEXT,10,0);
SetDlgItemText(IDC_EDIT_CN,""); //神童哥
SetDlgItemText(IDC_EDIT_E,""); //webmaster@zxca.net
CheckDlgButton(IDC_CHECK_CSR,BST_CHECKED);
CheckDlgButton(IDC_CHECK_P12,BST_CHECKED);
CheckDlgButton(IDC_CHECK,BST_UNCHECKED);
CString CmdLine=GetCommandLine();
CmdLine.Remove('"');
int Len=CmdLine.ReverseFind('\\'); Len++;
CmdLine=CmdLine.Left(Len)+"rootCA.pfx";
SetDlgItemText(IDC_EDIT4,CmdLine);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CUsbCaPage::OnBPath() //选择文件文件
{
// TODO: Add your control notification handler code here | OFN_EXPLORER OFN_NOREADONLYRETURN | | OFN_OVERWRITEPROMPT
CFileDialog dlgOpen(true,NULL,NULL,OFN_HIDEREADONLY,
"所有文件(*.*)|*.*||",NULL);
dlgOpen.m_ofn.lpstrTitle="选择文件";//标题条
if(dlgOpen.DoModal()!=IDOK) return;
m_Path=dlgOpen.GetPathName();
int Len=m_Path.ReverseFind('\\'); Len++;
m_Path=m_Path.Left(Len)+dlgOpen.GetFileTitle();
// LPITEMIDLIST pidlRoot=NULL;
// SHGetSpecialFolderLocation(m_hWnd,CSIDL_DRIVES ,&pidlRoot);
// BROWSEINFO bi; //必须传入的参数,下面就是这个结构的参数的初始化
// CString strDisplayName; //用来得到,你选择的活页夹路径,相当于提供一个缓冲区
// bi.hwndOwner=GetSafeHwnd(); //得到父窗口Handle值
// bi.pidlRoot=0; //这个变量就是我们在上面得到的.
// bi.pszDisplayName=strDisplayName.GetBuffer(MAX_PATH+1); //得到缓冲区指针,
// bi.lpszTitle="选择文件输出路径,路径下已有的文件将被覆盖!!"; //设置标题
// bi.ulFlags=BIF_RETURNONLYFSDIRS ; //设置标志
// bi.lpfn=NULL;
// bi.lParam=0;
// bi.iImage=0; //上面这个是一些无关的参数的设置,最好设置起来,
// ITEMIDLIST * pidl;
// pidl=SHBrowseForFolder(&bi); //打开对话框
// if(!pidl)
// return;
// SHGetPathFromIDList(pidl,bi.pszDisplayName);
// strDisplayName.ReleaseBuffer(); //和上面的GetBuffer()相对应
// m_Path=strDisplayName;
SetDlgItemText(IDC_EDIT_PATH,m_Path+".*");
}
void CUsbCaPage::OnBMkroot() //制作根证书
{
// TODO: Add your control notification handler code here
if(m_Path=="")
{
m_List.AddMsg("请选择输出文件!",M_WARING);
return;
}
char *out;
stuSUBJECT root;
CString str,strSN;
GetDlgItemText(IDC_EDIT_C,str);
strncpy((char *)root.C,str,sizeof(root.C));
GetDlgItemText(IDC_EDIT_ST,str);
strncpy((char *)root.ST,str,sizeof(root.ST));
GetDlgItemText(IDC_EDIT_L,str);
strncpy((char *)root.L,str,sizeof(root.L));
GetDlgItemText(IDC_EDIT_O,str);
strncpy((char *)root.O,str,sizeof(root.O));
GetDlgItemText(IDC_EDIT_OU,str);
strncpy((char *)root.OU,str,sizeof(root.OU));
GetDlgItemText(IDC_EDIT_CN,str);
strncpy((char *)root.CN,str,sizeof(root.CN));
GetDlgItemText(IDC_EDIT_E,str);
strncpy((char *)root.MAIL,str,sizeof(root.MAIL));
/* strncpy((char *)root.PMAIL,str,sizeof(root.PMAIL));
strncpy((char *)root.T,"T",sizeof(root.T));
strncpy((char *)root.D,"D",sizeof(root.D));
strncpy((char *)root.G,"G",sizeof(root.G));
strncpy((char *)root.I,"I",sizeof(root.I));
strncpy((char *)root.NAME,"NAME",sizeof(root.NAME));
strncpy((char *)root.S,"S",sizeof(root.S));
strncpy((char *)root.QUAL,"QUAL",sizeof(root.QUAL));
strncpy((char *)root.STN,"STN",sizeof(root.STN));
strncpy((char *)root.PW,"PW",sizeof(root.PW));
strncpy((char *)root.ADD,"ADD",sizeof(root.ADD));
*/
int days,bits,sRN;
days=GetDlgItemInt(IDC_EDIT_DAY,NULL,false);
if(days==0)
{
m_List.AddMsg("请给出有效期!",M_WARING);
return;
}
sRN=SendDlgItemMessage(IDC_COMBO_L,CB_GETCURSEL,0,0);
bits=512;if(sRN) bits<<=sRN;
sRN=GetDlgItemInt(IDC_EDIT_SN,NULL,false);
if(sRN==0)
{
m_List.AddMsg("证书序号超出范围!",M_WARING);
return;
}
CString cert=m_Path+".cer";
CString key=m_Path+".prk";
// 制作根证书
// int MakeRoot(stuSUBJECT * rootInfo,int bits,int serial,int days,char * certFile,char * priFile,int type);
if(MakeRoot(&root,bits,sRN,days,cert.GetBuffer(0),key.GetBuffer(0),m_CertFormat))
{
m_List.AddMsg("根证书制作成功");
if(IsDlgButtonChecked(IDC_CHECK_P12)==BST_CHECKED)
{
CString P12F=m_Path+".pfx";
// 生成P12文件
// int P12Pack(char * strP12,char * strPwd,char * NiceName,char * strCert,int plen,char * strkey,int klen);
P12Pack(P12F.GetBuffer(0),NULL,"OurCA",cert.GetBuffer(0),0,key.GetBuffer(0),0);
}
}
else
{
out=(char *)Get_Func_Err(0);
m_List.AddMsg(out,M_ERROR);
}
}
void CUsbCaPage::OnBMkreq()
{
// TODO: Add your control notification handler code here
if(m_Path=="")
{
m_List.AddMsg("请选择输出文件!",M_WARING);
return;
}
char *out;
stuSUBJECT req;
CString str;
GetDlgItemText(IDC_EDIT_C,str);
strncpy((char *)req.C,str,sizeof(req.C));
GetDlgItemText(IDC_EDIT_ST,str);
strncpy((char *)req.ST,str,sizeof(req.ST));
GetDlgItemText(IDC_EDIT_L,str);
strncpy((char *)req.L,str,sizeof(req.L));
GetDlgItemText(IDC_EDIT_O,str);
strncpy((char *)req.O,str,sizeof(req.O));
GetDlgItemText(IDC_EDIT_OU,str);
strncpy((char *)req.OU,str,sizeof(req.OU));
GetDlgItemText(IDC_EDIT_CN,str);
strncpy((char *)req.CN,str,sizeof(req.CN));
GetDlgItemText(IDC_EDIT_E,str);
strncpy((char *)req.MAIL,str,sizeof(req.MAIL));
int bits,sRN;
sRN=SendDlgItemMessage(IDC_COMBO_L,CB_GETCURSEL,0,0);
bits=512;if(sRN) bits<<=sRN;
CString reqf=m_Path+".txt";
CString key=m_Path+".prk";
// 制作申请文件
// int MakeReq(stuSUBJECT * reqInfo,int bits,char * reqFile,char * priFile,int type);
if(MakeReq(&req,bits,reqf.GetBuffer(0),key.GetBuffer(0),m_CertFormat))
{
SetDlgItemText(IDC_EDIT_PATH,reqf);
m_List.AddMsg("申请文件制作成功");
}
else
{
out=(char *)Get_Func_Err(0);
m_List.AddMsg(out,M_ERROR);
}
}
//根据申请文件签发证书
void CUsbCaPage::OnBMkcert()
{
// TODO: Add your control notification handler code here
if(m_Path=="")
{
m_List.AddMsg("请选择输出文件!",M_WARING);
return;
}
CString req,day,outCert,strRoot;
GetDlgItemText(IDC_EDIT4,strRoot);
if(strRoot=="")
{
m_List.AddMsg("请选择根证书文件!",M_WARING);
return;
}
// GetDlgItemText(IDC_EDIT_DAY,day);
int days,sRN;
days=GetDlgItemInt(IDC_EDIT_DAY,NULL,false);
if(days==0)
{
m_List.AddMsg("请给出有效期!",M_WARING);
return;
}
sRN=GetDlgItemInt(IDC_EDIT_SN,NULL,false);
if(sRN==0)
{
m_List.AddMsg("证书序号超出范围!",M_WARING);
return;
}
char *out;
char buf1[4096],buf2[4096];
int len1,len2;
len1=4096,len2=4096;
// 分拆根证书
// int P12Pick(char *P12file,char *passwd,char *certdata,int *certlen,char *keydata,int *keylen,int otype);
if(!P12Pick(strRoot.GetBuffer(0),NULL,buf1,&len1,buf2,&len2,PEM))
{
m_List.AddMsg("读根证书失败!",M_ERROR);
return;
}
req=m_Path+".txt";
outCert=m_Path+".cer";
// if(MakeCert(lpCert,lenCert,lpKey,lenKey,atoi(strSN),0,
// atoi(day),req.GetBuffer(0),&KUSAGE,&EKUSAGE,outCert.GetBuffer(0),out,m_CertFormat))
// int MakeCert(char *certfile,int certlen,char *keyfile,int keylen,int serial,char *enddate,int days,
// char *reqfile,char * OCSP_URI,char * CRL_URI,stuKEYUSAGE * KUSAGE,
// stuEKEYUSAGE * EKUSAGE,char *outfile,int type);
if(MakeCert(buf1,len1,buf2,len2,sRN,0,days,req.GetBuffer(0),NULL,NULL,NULL,NULL,outCert.GetBuffer(0),m_CertFormat))
{
m_List.AddMsg("证书制作成功");
}
else
{
out=(char *)Get_Func_Err(0);
m_List.AddMsg(out,M_ERROR);
}
}
void CUsbCaPage::OnBMkcert2() //"制作证书"按钮相应
{
int ret=SendDlgItemMessage(IDC_COMBO_LB,CB_GETCURSEL,0,0);
switch(ret)
{
case 0://1.直接制证
OnBMkcert3();break;
case 1://2.提交申请
OnBMkreq();break;
case 2://3.签发证书
OnBMkcert();break;
case 3://4.制作根证
OnBMkroot();break;
case 4://5.中级证书
m_List.AddMsg("目前尚未支持",M_WARING);
break;
case 5://6.生成CRL
OnBCrl();break;
}
}
void CUsbCaPage::OnBMkcert3() //直接生成证书
{
// TODO: Add your control notification handler code here
if(m_Path=="")
{
m_List.AddMsg("请选择输出文件!",M_WARING);
return;
}
char *out;
char buf1[4096],buf2[4096];
int len1=4096,len2=4096,len3=4096,len4=4096;
CString day,strRoot;
GetDlgItemText(IDC_EDIT4,strRoot);
if(strRoot=="")
{
m_List.AddMsg("请选择根证书文件!",M_WARING);
return;
}
stuCERT sCERT;
CString str;
GetDlgItemText(IDC_EDIT_C,str);
strncpy((char *)sCERT.SUBJECT.C,str,sizeof(sCERT.SUBJECT.C));
GetDlgItemText(IDC_EDIT_ST,str);
strncpy((char *)sCERT.SUBJECT.ST,str,sizeof(sCERT.SUBJECT.ST));
GetDlgItemText(IDC_EDIT_L,str);
strncpy((char *)sCERT.SUBJECT.L,str,sizeof(sCERT.SUBJECT.L));
GetDlgItemText(IDC_EDIT_O,str);
strncpy((char *)sCERT.SUBJECT.O,str,sizeof(sCERT.SUBJECT.O));
GetDlgItemText(IDC_EDIT_OU,str);
strncpy((char *)sCERT.SUBJECT.OU,str,sizeof(sCERT.SUBJECT.OU));
GetDlgItemText(IDC_EDIT_CN,str);
strncpy((char *)sCERT.SUBJECT.CN,str,sizeof(sCERT.SUBJECT.CN));
GetDlgItemText(IDC_EDIT_E,str);
strncpy((char *)sCERT.SUBJECT.MAIL,str,sizeof(sCERT.SUBJECT.MAIL));
// GetDlgItemText(IDC_EDIT_DAY,day);
int days,bits,sRN;
days=GetDlgItemInt(IDC_EDIT_DAY,NULL,false);
if(days==0)
{
m_List.AddMsg("请给出有效期!",M_WARING);
return;
}
sRN=SendDlgItemMessage(IDC_COMBO_L,CB_GETCURSEL,0,0);
bits=512;if(sRN) bits<<=sRN;
sRN=GetDlgItemInt(IDC_EDIT_SN,NULL,false);
if(sRN==0)
{
m_List.AddMsg("证书序号超出范围!",M_WARING);
return;
}
// 分拆根证书
// int P12Pick(char *P12file,char *passwd,char *certdata,int *certlen,char *keydata,int *keylen,int otype);
if(!P12Pick(strRoot.GetBuffer(0),NULL,buf1,&len1,buf2,&len2,PEM))
{
m_List.AddMsg("读根证书失败!",M_ERROR);
return;
}
// if(DirectCert(lpCert,lenCert,lpKey,lenKey,atoi(strSN),0,atoi(day),&sCERT,1024,
// cert,&certl,key,&keyl,out/*,m_CertFormat*/))
// int CreatePair(char *certfile,int certlen,char *keyfile,int keylen,int serial,char *enddate,
// int days,stuCERT * sCERT,int bits,char * cert,int * certl,char * key,int * keyl,int type);
/* 生成证书 */
if(CreatePair(buf1,len1,buf2,len2,sRN,0,days,&sCERT,bits,buf1,&len3,buf2,&len4,m_CertFormat))
{
CString outCert=m_Path+".cer";
CString outKey=m_Path+".prk";
FILE * pfc=fopen(outCert,"wb");
fwrite(buf1,sizeof(char),len3,pfc);
fclose(pfc);
pfc=fopen(outKey,"wb");
fwrite(buf2,sizeof(char),len4,pfc);
fclose(pfc);
m_List.AddMsg("生成证书成功");
if(IsDlgButtonChecked(IDC_CHECK_P12)==BST_CHECKED)
{
CString P12F=m_Path+".pfx";
// 生成P12文件
// int P12Pack(char * strP12,char * strPwd,char * NiceName,char * strCert,int plen,char * strkey,int klen);
P12Pack(P12F.GetBuffer(0),NULL,"OurCA",buf1,len3,buf2,len4);
}
}
else
{
out=(char *)Get_Func_Err(0);
m_List.AddMsg(out,M_ERROR);
}
}
void CUsbCaPage::OnBPath4() //根证书文件
{
// TODO: Add your control notification handler code here | OFN_OVERWRITEPROMPT OFN_NOREADONLYRETURN
CFileDialog dlgOpen(true,"pfx",NULL,OFN_FILEMUSTEXIST | OFN_READONLY,
"根证书(*.pfx, *.p12)|*.pfx;*.p12||",NULL);
dlgOpen.m_ofn.lpstrTitle="选择根证书文件";//标题条
if(dlgOpen.DoModal()!=IDOK) return;
CString key=dlgOpen.GetPathName();
SetDlgItemText(IDC_EDIT4,key);
}
void CUsbCaPage::OnCheck() //选择证书格式---〉输出
{
// TODO: Add your control notification handler code here
int check=((CButton *)GetDlgItem(IDC_CHECK))->GetCheck();
if(check) m_CertFormat=DER;
else m_CertFormat=PEM;
}
void CUsbCaPage::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CUsbCaPage::OnBCrl()
{
// TODO: Add your control notification handler code here
if(m_Path=="")
{
m_List.AddMsg("请选择输出文件!",M_WARING);
return;
}
char *out;
char buf1[4096],buf2[4096];
int len1=4096,len2=4096,len3=4096,len4=4096;
CString strRoot;
GetDlgItemText(IDC_EDIT4,strRoot);
if(strRoot=="")
{
m_List.AddMsg("请选择根证书文件!",M_WARING);
return;
}
// 分拆根证书
// int P12Pick(char *P12file,char *passwd,char *certdata,int *certlen,char *keydata,int *keylen,int otype);
if(!P12Pick(strRoot.GetBuffer(0),NULL,buf1,&len1,buf2,&len2,PEM))
{
m_List.AddMsg("读根证书失败!",M_ERROR);
return;
}
CString outCrl=m_Path+".crl";
time_t t;
time(&t);
char * Crl=NULL;
stuREVOKE * Head=NULL;//构造空链表
AddRevoke(Head,1,t);//增加表象
AddRevoke(Head,2,t);
AddRevoke(Head,3,t);
// int MakeCrl(char *certfile,int certlen,char *keyfile,int keylen,stuREVOKE * Head,
// PNewCrlMem NewCrlMem,char *& outCrl,int * crll,char * outfile);
if(MakeCrl(buf1,len1,buf2,len2,Head,NULL,Crl,NULL,outCrl.GetBuffer(0)))
{
m_List.AddMsg("生成吊销列表成功");
// m_List.AddMsg(out);
}
else
{
out=(char *)Get_Func_Err(0);
m_List.AddMsg(out,M_ERROR);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -