openssl主要流程程序代码(十)

2014-11-24 00:33:28 · 作者: · 浏览: 57
建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;