openssl主要流程程序代码(十)
建p12结构失败");
return false;
}
if (!(fp = fopen(strP12, "wb")))
{
strcpy(out,"保存p12文件失败");
}
i2d_PKCS12_fp(fp, p12);
PKCS12_free(p12);
fclose(fp);
strcpy(out,"合并P12成功");
X509_free(cert);
EVP_PKEY_free(key);
EVP_cleanup();//frees all three stacks and sets their pointers to NULL ---- EVP_CIPHER
return true;
}
//修改p12包密码
BOOL ChangePB(char * strP12/*in包文件*/,char * strPwd/*IN原密码*/,char * strPwd2/*IN新密码*/,
char * strOutP12/*in包文件*/,char * out/*返回结果*/)
{
FILE *fp=NULL;
EVP_PKEY *key=NULL;
X509 *cert=NULL;
STACK_OF(X509) *ca = NULL;
PKCS12 *p12=NULL;
int len=0,wlen=0;
SSLeay_add_all_algorithms();
if (!(fp = fopen(strP12, "rb")))
{
strcpy(out,"打开文件错误");
return false;
}
p12 = d2i_PKCS12_fp(fp, NULL);
fclose (fp);
if (!p12)
{
strcpy(out,"读取包文件错误");
return false;
}
if (!PKCS12_parse(p12, strPwd, &key, &cert, &ca))
{
strcpy(out,"解包失败");
return false;
}
PKCS12_free(p12);
fclose(fp);
p12=NULL;
///////////////////////////////////////
p12 = PKCS12_create(strPwd2,"(null)", key, cert, NULL, 0,0,0,0,0);
if(!p12)
{
strcpy(out,"创建p12结构失败");
return false;
}
if (!(fp = fopen(strOutP12, "wb")))
{
strcpy(out,"保存p12文件失败");
}
i2d_PKCS12_fp(fp, p12);
PKCS12_free(p12);
fclose(fp);
strcpy(out,"转换P12密码成功");
X509_free(cert);
EVP_PKEY_free(key);
return true;
}
BOOL CertPairCheck(char * cert,char * key,char * out)//检验公钥、私钥是否配对
{
EVP_PKEY *pkey=NULL;
X509 *x509=NULL;
x509=LoadCert(cert,0,out);
if(x509==NULL)
{
strcpy(out,"不能打开公钥文件");
return FALSE;
}
pkey=LoadKey(key,0,NULL,out);
if(pkey==NULL)
{
strcpy(ou
t,"不能打开私钥文件");
X509_free(x509);
return FALSE;
}
if(X509_check_private_key(x509,pkey))//匹配
{
X509_free(x509);
EVP_PKEY_free(pkey);
return TRUE;
}
else
{
strcpy(out,"公私钥对不匹配");
X509_free(x509);
EVP_PKEY_free(pkey);
return FALSE;
}
}
#include
#define DER 1 //FORMAT_ASN1
#define PEM 3 /*定义格式*/
#define NET 4
#define P12 5
typedef char * (* PNewCrlMem)(UINT len);
struct stuSUBJECT//个体信息
{
UCHAR C[4];//国家
UCHAR ST[4];//省份
UCHAR L[12];//城市
UCHAR O[48];//组织
UCHAR OU[24];//组织部门
UCHAR CN[12];//个人信息
UCHAR MAIL[24];//电子邮件
UCHAR PMAIL[24];//安全电子邮件
UCHAR T[12];//头衔
UCHAR D[12];//描述
UCHAR G[12];//曾用名
UCHAR I[12];//描述
UCHAR NAME[12];//描述
UCHAR S[12];//描述
UCHAR QUAL[12];//描述
UCHAR STN[12];//没有结构的名称
UCHAR PW[12];//挑战密码
UCHAR ADD[12];//无结构地址
stuSUBJECT()
{
memset(this,0,sizeof(stuSUBJECT));
}
};
struct stuKEYUSAGE//密钥用途
{
BOOL DS;//Digital Signature
BOOL NR;//Non-Repudiation
BOOL KE;//Key Encipherment
BOOL DE;//Data Encipherment
BOOL KA;//keyAgreement
BOOL KC;//keyCertSign
BOOL CS;//cRLSign
BOOL EO;//Encipher Only
BOOL DO;//Decipher Only
stuKEYUSAGE()
{
memset(this,0,sizeof(stuKEYUSAGE));
}
};
struct stuEKEYUSAGE//增强型密钥用途
{
BOOL SA;//服务器验证
BOOL CA;//客户端验证
BOOL CS;//代码签名
BOOL EP;//安全电子邮件
BOOL TS;//时间戳
BOOL msCC;//代码完整
BOOL msCTLS;//可签名信任列表
BOOL msSGC;//联机事务处理
BOOL msEFS;//加密磁盘上的数据
BOOL msSC;//智能卡登录
BOOL IP;//Internet
stuEKEYUSAGE()
{
memset(this,0,sizeof(stuEKEYUSAGE));
}
};
struct stuCERT//三者之和
{
stuSUBJECT SUBJECT;
stuKEYUSAGE KUSAGE;
stuEKEYUSAGE EKUSAGE;