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

📄 cacertwizardsheet.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -