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

📄 usbcapage.cpp

📁 和MiniCA类似的数字证书工具
💻 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 + -