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