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

📄 certsetup.cpp

📁 手机智能卡开发
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		memset(subject,0,1024);
		CN_GetAvailContainerName(XMLPath,i,tmpcontainer);	
		sTmpContainer = tmpcontainer;		
		CN_GetCertSubject(XMLPath,tmpcontainer,subject);
		sTmpSubject = subject;
		if((sTmpSubject == sSubject) &&(sTmpContainer != sNewContainerName))//同一个主题
		{
			sTmpcontainers.Add(sTmpContainer);
			//CN_AddCertSelectState(XMLPath,tmpcontainer,"0");
		}
	}
	for(i=0;i<sTmpcontainers.GetSize();i++)
	{
		char *tmpptr;
		sTmpContainer =  sTmpcontainers.GetAt(i);		
		tmpptr = sTmpContainer.GetBuffer(0);
		CN_AddCertSelectState(XMLPath,tmpptr,"0");
	}
	
	return TRUE;
}

BOOL CCertSetup::SetXMLConfigNodeInfo(CString sContainerName)
{
	int rv;
	char XMLPath[256]={0};
	char *containername;
	
	containername = sContainerName.GetBuffer(0);
	if(CN_GetXmlPath(XMLPath))
	{
		ErrMsg = "读取XML配置文件失败!";
		return FALSE;
	}
	rv = CN_IsContainerNoExist(XMLPath,containername);
	if(rv == -1)
	{
		//节点不存在,添加节点
		rv = CN_AddContainerNode(XMLPath,containername);
		if(rv!=0)
		{
			ErrMsg = "添加XML配置文件节点失败!";
			sContainerName.ReleaseBuffer();
			return FALSE;
		}
	}
	rv = CN_AddCertSubject(XMLPath,containername,CERTINFO.subjectname);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书拥有者通用名失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	rv = CN_AddCertDept(XMLPath,containername,CERTINFO.dept);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书拥有者部门失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	rv = CN_AddCertIssue(XMLPath,containername,CERTINFO.issueName);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书颁发者失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	rv = CN_AddCertDeviceType(XMLPath,containername,CERTINFO.devType);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书设备类型失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	rv = CN_AddCertSelectState(XMLPath,containername,CERTINFO.avail);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书有效状态失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	rv = CN_AddUniqueId(XMLPath,containername,CERTINFO.uniqID);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书唯一标示符失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	rv = CN_AddUniqueIdOid(XMLPath,containername,CERTINFO.uniqIdOid);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书唯一标示符OID失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	if(CERTINFO.keyType == 2)
	{
		rv = CN_AddCertKeyType(XMLPath,containername,"2");//单证书 or 双证书
		if(rv)
		{
			ErrMsg = "修改XML配置文件,添加证书密钥类型失败!";
			sContainerName.ReleaseBuffer();
			return FALSE;
		}
		rv = CN_AddSignCertSerialNum(XMLPath,containername,CERTINFO.serialNum_2);
		if(rv)
		{
			ErrMsg = "修改XML配置文件,添加签名证书序列号失败!";
			sContainerName.ReleaseBuffer();
			return FALSE;
		}
		rv = CN_AddExchCertSerialNum(XMLPath,containername,CERTINFO.serialNum_1);
		if(rv)
		{
			ErrMsg = "修改XML配置文件,添加交换证书序列号失败!";
			sContainerName.ReleaseBuffer();
			return FALSE;
		}
	}
	else
	{
		rv = CN_AddCertKeyType(XMLPath,containername,"1");//单证书 or 双证书
		if(rv)
		{
			ErrMsg = "修改XML配置文件,添加证书密钥类型失败!";
			sContainerName.ReleaseBuffer();
			return FALSE;
		}
		if(CERTINFO.keyType == 3)
			rv = CN_AddExchCertSerialNum(XMLPath,containername,CERTINFO.serialNum_2);
		else
			rv = CN_AddExchCertSerialNum(XMLPath,containername,CERTINFO.serialNum_1);
		if(rv)
		{
			ErrMsg = "修改XML配置文件,添加交换证书序列号失败!";
			sContainerName.ReleaseBuffer();
			return FALSE;
		}

	}
	//rv = CN_AddCertTradeType(XMLPath,containername,CERTINFO.tradeType);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书tradeType失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	rv = CN_AddCertCaType(XMLPath,containername,CERTINFO.caType);
	if(rv)
	{
		ErrMsg = "修改XML配置文件,添加证书Ca类型失败!";
		sContainerName.ReleaseBuffer();
		return FALSE;
	}
	sContainerName.ReleaseBuffer();
	return TRUE;
}
	/*
	* 1证书版本
	* 2证书序列号
	* 3证书签名算法
	
	  * 4证书发放者国家名
	  * 5证书发放者组织名
	  * 6证书发放者部门名
	  * 7证书发放者省州名
	  * 8证书发放者通用名
	  * 9证书发放者城市名
	  * 10证书发放者EMAIL地址
	  * 11证书有效期起始
	  * 12证书有效期截止
	  * 13用户国家名
	  * 14用户组织名
	  * 15用户部门名
	  * 16用户省州名
	  * 17用户通用名
	  * 18用户城市名
	  * 19用户EMAIL地址
	  * 20用户DER公钥值
	  * 21用户证书自定义级别	 
*/
BOOL CCertSetup::GetCertInfo(BYTE* cert,DWORD dwCertLen,DWORD dwType,SETUP_CERT_INFO_PTR certInfo)
{
	int rv;
	DWORD infoLen;
	
	rv = BCA_GetCertificateInfo(cert,dwCertLen,8,certInfo->issueName,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书信息失败!";
		return FALSE;
	}
	certInfo->issueName[infoLen] = '\0';
	if(dwType == 1)
		rv = BCA_GetCertificateInfo(cert,dwCertLen,2,certInfo->serialNum_1,&infoLen);
	else
		rv = BCA_GetCertificateInfo(cert,dwCertLen,2,certInfo->serialNum_2,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书信息失败!";
		return FALSE;
	}
	if(dwType == 1)
		certInfo->serialNum_1[infoLen] = '\0';
	else
		certInfo->serialNum_2[infoLen] = '\0';
	rv = BCA_GetCertificateInfo(cert,dwCertLen,17,certInfo->subjectname,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书信息失败!";
		return FALSE;
	}
	certInfo->subjectname[infoLen] = '\0';
	rv = BCA_GetCertificateInfo(cert,dwCertLen,6,certInfo->dept,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书信息失败!";
		return FALSE;
	}
	certInfo->dept[infoLen] = '\0';
	strcpy(certInfo->uniqIdOid,"2.16.840.1.113732.2");
	rv = BCA_GetCertSelfExtByOid(cert,dwCertLen,"2.16.840.1.113732.2",(BYTE *)certInfo->uniqID,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书Oid失败!";
		//return FALSE;
	}
	strcpy(certInfo->avail,"1");
	ErrMsg.Empty();
	return TRUE;
}

CString CCertSetup::GetLastErrMsg()
{
	return ErrMsg;
}
BOOL CCertSetup::ParseCBIFileInfo(CString sCBIFile,
								  CString &sContainerName,
								  CString &sSubjectName,
								  CString &sIssueName,
								  CString &sNotBefor,
								  CString &sNotAfter,
								  BYTE &keyType)
{
	FILE *fp;
	DWORD dwExcCertLen,dwExcPfxLen;
	//DWORD dwSignCertLen,dwSignPfxLen;
	BYTE *ExcCert=NULL;
	BYTE *ExcPfx=NULL;
	BYTE *SignCert=NULL;
	BYTE *SignPfx=NULL;
	char containname[128]={0};
	char *cbifilepath;
	char tmpbuf[128]={0};
	BYTE ckeyType;
	memset(&CERTINFO,0,sizeof(CERTINFO));
	if(sCBIFile.IsEmpty())
	{
		return FALSE;
	}
	cbifilepath = sCBIFile.GetBuffer(0);
	fp = fopen(cbifilepath,"rb");
	if(fp == NULL)
	{
		ErrMsg = "读取文件失败,文件没找到!";
		return FALSE;
	}
	
	fread(&ckeyType,1,1,fp);
	if(ckeyType == '2')
		keyType = 2;
	else if(ckeyType == '3')
		keyType = 3;
	else
		keyType = 1;
	if(fseek(fp,2,SEEK_SET) != 0)
	{
		ErrMsg = "读取文件失败!";
		fclose(fp);
		return FALSE;
	}
	if( (keyType == 1)|| (keyType ==2))
	{
		fread(tmpbuf,1,4,fp);//加密证书长度
		dwExcCertLen = atoi(tmpbuf);
		fread(tmpbuf,1,4,fp);//加密证书pfx长度
		dwExcPfxLen = atoi(tmpbuf);
	}
	else 
	{
		fseek(fp,10,SEEK_SET);
		fread(tmpbuf,1,4,fp);//加密证书长度
		dwExcCertLen = atoi(tmpbuf);
		fread(tmpbuf,1,4,fp);//加密证书pfx长度
		dwExcPfxLen = atoi(tmpbuf);
	}
	if(fseek(fp,512,SEEK_SET) != 0)
	{
		ErrMsg = "读取文件失败!";
		fclose(fp);
		return FALSE;
	}
	
	fread(containname,1,128,fp);//密码信封序列号
	sContainerName = containname;
	ExcCert = (BYTE *)malloc(dwExcCertLen);
	if(ExcCert == NULL)
	{
		ErrMsg = "内存不够!";
		fclose(fp);
		return FALSE;
	}
	ExcPfx = (BYTE *)malloc(dwExcPfxLen);
	if(ExcPfx == NULL)
	{
		ErrMsg = "内存不够!";
		fclose(fp);
		return FALSE;
	}
	if( (keyType == 1) || (keyType == 2))//加密证书或双证书
	{
		if(fseek(fp,1024,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			return FALSE;
		}
		fread(ExcCert,1,dwExcCertLen,fp);
		if(fseek(fp,1024*3,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			return FALSE;
		}
		fread(ExcPfx,1,dwExcPfxLen,fp);
	}
	if(keyType == 3)//单签名证书
	{
		if(fseek(fp,1024*7,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			return FALSE;
		}
		fread(ExcCert,1,dwExcCertLen,fp);
		if(fseek(fp,1024*9,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			return FALSE;
		}
		fread(ExcPfx,1,dwExcPfxLen,fp);
	}
	fclose(fp);
	
	/*get info
	CString &sSubjectName,
	CString &sIssueName,
	CString &sNotBefor,
	CString &sNotAfter,
	*/
	int rv;
	DWORD infoLen;
	char issueName[1024]={0};
	
	rv = BCA_GetCertificateInfo(ExcCert,dwExcCertLen,8,issueName,&infoLen);
	if(rv)
	{
		if((rv == -1)||(rv == RV_NotInitializeErr))
		{
			BCA_Initialize(BCA_PROVIDER_SOFT,"",0,"");
			rv = BCA_GetCertificateInfo(ExcCert,dwExcCertLen,8,issueName,&infoLen);
			if(rv)
			{
				ErrMsg = "获取证书信息失败!";
				return FALSE;
			}
		}
		
	}
	sIssueName = issueName;
	char subjectname[1024]={0};
	
	rv = BCA_GetCertificateInfo(ExcCert,dwExcCertLen,17,subjectname,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书信息失败!";
		return FALSE;
	}
	sSubjectName = subjectname;
	char notBefor[128] = {0};
	char notAfter[128] = {0};
	rv = BCA_GetCertificateInfo(ExcCert,dwExcCertLen,11,notBefor,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书有效起始日期失败";
		return FALSE;
	}
	sNotBefor = notBefor;
	rv = BCA_GetCertificateInfo(ExcCert,dwExcCertLen,12,notAfter,&infoLen);
	if(rv)
	{
		ErrMsg = "获取证书有效终止日期失败";
		return FALSE;
	}
	sNotAfter = notAfter;
		//时间格式20061126
	sNotBefor = sNotBefor.Left(8);
	sNotBefor.Insert(4,"年");
	sNotBefor.Insert(8,"月");
	sNotBefor.Insert(12,"日");
	
	sNotAfter = sNotAfter.Left(8);
	sNotAfter.Insert(4,"年");
	sNotAfter.Insert(8,"月");
	sNotAfter.Insert(12,"日");
	ErrMsg.Empty();
	if(ExcCert != NULL)
		free(ExcCert);
	if(ExcPfx != NULL)
		free(ExcPfx);
	if(SignCert != NULL)
		free(SignCert);
	if(SignPfx != NULL)
		free(SignPfx);
	sCBIFile.ReleaseBuffer();
	return TRUE;
}
BOOL CCertSetup::CheckCBIFIlePass(CString sCBIFile,CString sPass)
{
	FILE *fp;
	DWORD dwExcPfxLen;
	BYTE *ExcPfx=NULL;
	char tmpbuf[128]={0};
	BYTE ckeyType;
	BYTE keyType;

	if(sCBIFile.IsEmpty())
	{
		ErrMsg = "打开文件失败!";
		return FALSE;
	}
	char *cbifilepath;
	cbifilepath = sCBIFile.GetBuffer(0);
	fp = fopen(cbifilepath,"rb");
	if(fp == NULL)

⌨️ 快捷键说明

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