📄 certsetup.cpp
字号:
{
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 + -