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

📄 certsetup.cpp

📁 手机智能卡开发
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		ErrMsg = "读取文件失败!";
		sCBIFile.ReleaseBuffer();
		return FALSE;
	}
	fread(&ckeyType,1,1,fp);
	if(ckeyType == '2')
		keyType = 2;
	else if(ckeyType == '3')
		keyType = 3;
	else
		keyType = 1;
	if( (keyType == 1)|| (keyType ==2))
	{
		if(fseek(fp,6,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
	}
	else
	{
		if(fseek(fp,14,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
	}
	fread(tmpbuf,1,4,fp);//加密证书pfx长度
	dwExcPfxLen = atoi(tmpbuf);
	ExcPfx = (BYTE *)malloc(dwExcPfxLen);
	if(ExcPfx == NULL)
	{
		ErrMsg = "内存不够!";
		fclose(fp);
		sCBIFile.ReleaseBuffer();
		return FALSE;
	}
	if( (keyType == 1)|| (keyType ==2))
	{
		if(fseek(fp,1024*3,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			sCBIFile.ReleaseBuffer();
			free(ExcPfx);
			return FALSE;
		}
	}
	else
	{
		if(fseek(fp,1024*9,SEEK_SET) != 0)
		{
			ErrMsg = "读取文件失败!";
			fclose(fp);
			sCBIFile.ReleaseBuffer();
			free(ExcPfx);
			return FALSE;
		}
	}
	fread(ExcPfx,1,dwExcPfxLen,fp);
	fclose(fp);
	DWORD dwTmp;
	int rv = BCA_Pfx_GetCert(ExcPfx,dwExcPfxLen,sPass.GetBuffer(0),NULL,&dwTmp);
	if(rv)
	{
		ErrMsg ="密码错误!";
		free(ExcPfx);
		return FALSE;
	}
	free(ExcPfx);
	return TRUE;
}

BOOL CCertSetup::ParseCBIFileAndSaveCertToDisk(CString sCBIFile,CString &sContainerName)
{
	FILE *fp;
	DWORD keyType;
	DWORD dwExcCertLen,dwExcPfxLen;
	DWORD dwSignCertLen,dwSignPfxLen;
	BYTE *ExcCert=NULL;
	BYTE *ExcPfx=NULL;
	BYTE *SignCert=NULL;
	BYTE *SignPfx=NULL;
	BYTE ckeyType;
	char containname[128]={0};
	char *cbifilepath;
	char tmpbuf[128]={0};

	memset(&CERTINFO,0,sizeof(CERTINFO));
	if(sCBIFile.IsEmpty())
	{
		return FALSE;
	}
	cbifilepath = sCBIFile.GetBuffer(0);
	fp = fopen(cbifilepath,"rb");
	if(fp == NULL)
	{
		ErrMsg = "读取文件失败!";
		sCBIFile.ReleaseBuffer();
		return FALSE;
	}
	fread(&ckeyType,1,1,fp);
	if(ckeyType == '2')
		keyType = 2;
	else if(ckeyType == '3')
		keyType = 3;
	else
		keyType = 1;
	
	CERTINFO.keyType = keyType;
	strcpy(CERTINFO.devType,"BJSOFT");
	if(fseek(fp,2,SEEK_SET) != 0)
	{
		ErrMsg = "读取文件失败!";
		fclose(fp);
		sCBIFile.ReleaseBuffer();
		return FALSE;
	}
	if(keyType == 1)
	{
		fread(tmpbuf,1,4,fp);//加密证书长度
		dwExcCertLen = atoi(tmpbuf);
		fread(tmpbuf,1,4,fp);//加密证书pfx长度
		dwExcPfxLen = atoi(tmpbuf);
	}
	if(keyType == 2)//双证书,读取签名证书和pfx
	{
		fread(tmpbuf,1,4,fp);//加密证书长度
		dwExcCertLen = atoi(tmpbuf);
		fread(tmpbuf,1,4,fp);//加密证书pfx长度
		dwExcPfxLen = atoi(tmpbuf);

		fread(tmpbuf,1,4,fp);//签名证书长度
		dwSignCertLen = atoi(tmpbuf);
		fread(tmpbuf,1,4,fp);//签名证书pfx长度
		dwSignPfxLen = atoi(tmpbuf);
	}
	if(keyType == 3)
	{
		fseek(fp,10,SEEK_SET);
		fread(tmpbuf,1,4,fp);//签名证书长度
		dwSignCertLen = atoi(tmpbuf);
		fread(tmpbuf,1,4,fp);//签名证书pfx长度
		dwSignPfxLen = atoi(tmpbuf);
	}

	if(fseek(fp,512,SEEK_SET) != 0)
	{
		ErrMsg = "读取文件失败!";
		fclose(fp);
		sCBIFile.ReleaseBuffer();
		return FALSE;
	}
	
	fread(containname,1,128,fp);//密码信封序列号
	//读取证书和pfx数据
	if((keyType == 1) || (keyType ==2))//jiami
	{
		ExcCert = (BYTE *)malloc(dwExcCertLen);
		if(ExcCert == NULL)
		{
			ErrMsg = "内存不够!";
			fclose(fp);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		ExcPfx = (BYTE *)malloc(dwExcPfxLen);
		if(ExcPfx == NULL)
		{
			ErrMsg = "内存不够!";
			fclose(fp);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}

		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);
			sCBIFile.ReleaseBuffer();
			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);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		fread(ExcPfx,1,dwExcPfxLen,fp);	
	}
	if((keyType == 2) || (keyType == 3))//双证书or 签名证书,读取签名证书和pfx
	{

		SignCert = (BYTE *)malloc(dwSignCertLen);
		if(SignCert == NULL)
		{ 
			ErrMsg = "内存不够!";
			fclose(fp);
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		SignPfx = (BYTE *)malloc(dwSignPfxLen);
		if(SignPfx == NULL)
		{
			ErrMsg = "内存不够!";
			fclose(fp);
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		
		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);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		fread(SignCert,1,dwSignCertLen,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);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		fread(SignPfx,1,dwSignPfxLen,fp);
	}
	fclose(fp);//读取CBI文件完毕
	if((keyType == 1)||(keyType == 2))
	{
		if(!GetCertInfo(ExcCert,dwExcCertLen,1,&CERTINFO))
		{
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
	}
	
	if((keyType == 2) ||  (keyType == 3))
	{
		if(!GetCertInfo(SignCert,dwSignCertLen,2,&CERTINFO))
		{
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
			 
		}
	}
	//save to disk
	sContainerName = containname;
	CString sFilePath;
	
	//dwType :1 加密证书,2:签名证书 3:加密证书pfx,4:签名证书pfx
	if((keyType == 1)||(keyType == 2))
	{
		sFilePath = GetFilePathByContainerName(sContainerName,1);
		if(!WriteFile(sFilePath,ExcCert,dwExcCertLen))
		{
			ErrMsg = "保存加密证书失败!";
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		sFilePath = GetFilePathByContainerName(sContainerName,3);
		if(!WriteFile(sFilePath,ExcPfx,dwExcPfxLen))
		{
			ErrMsg = "保存加密p12证书失败!";
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
	}
	if(keyType == 3)//作为加密证书安装	
	{
		sFilePath = GetFilePathByContainerName(sContainerName,1);
		if(!WriteFile(sFilePath,SignCert,dwSignCertLen))
		{
			ErrMsg = "保存加密证书失败!";
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		sFilePath = GetFilePathByContainerName(sContainerName,3);
		if(!WriteFile(sFilePath,SignPfx,dwSignPfxLen))
		{
			ErrMsg = "保存加密p12证书失败!";
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
	}
	if((keyType == 2))
	{
		sFilePath = GetFilePathByContainerName(sContainerName,2);
		if(!WriteFile(sFilePath,SignCert,dwSignCertLen))
		{
			ErrMsg = "保存签名证书失败!";
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
		sFilePath = GetFilePathByContainerName(sContainerName,4);
		if(!WriteFile(sFilePath,SignPfx,dwSignPfxLen))
		{
			ErrMsg = "保存签名p12证书失败!";
			if(ExcCert != NULL)
				free(ExcCert);
			if(ExcPfx != NULL)
				free(ExcPfx);
			if(SignCert != NULL)
				free(SignCert);
			if(SignPfx != NULL)
				free(SignPfx);
			sCBIFile.ReleaseBuffer();
			return FALSE;
		}
	}
	if(ExcCert != NULL)
		free(ExcCert);
	if(ExcPfx != NULL)
		free(ExcPfx);
	if(SignCert != NULL)
		free(SignCert);
	if(SignPfx != NULL)
		free(SignPfx);
	ErrMsg.Empty();
	sCBIFile.ReleaseBuffer();
	return TRUE;
}

BOOL CCertSetup::WriteFile(CString FileName, BYTE *Data, DWORD dwDataLen)
{
	FILE *fp;
	char *filepath;
	filepath = FileName.GetBuffer(0);
	
	fp = fopen(filepath,"wb");
	if(fp == NULL)
	{
		FileName.ReleaseBuffer();
		return FALSE;
	}
	fwrite(Data,1,dwDataLen,fp);
	fclose(fp);
	FileName.ReleaseBuffer();
	return TRUE;
	
}

//获得智能卡内最后颁发的证书
DWORD CCertSetup::GetLastCert()
{
	
	if(dwCertCount < 1)
	{
		return -1;
	}
	
	CString sTime = sNotBefors.GetAt(0);
	DWORD dwLastCertIndex = 0;
	
	for(DWORD i=1;i<dwCertCount; i++)
	{
		CString sTmp;
		sTmp = sNotBefors.GetAt(i);
		if( sTmp > sTime)
		{
			sTime = sTmp;
			dwLastCertIndex = i;
		}
	}
	return dwLastCertIndex;
}

⌨️ 快捷键说明

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