opensslÖ÷ÒªÁ÷³Ì³ÌÐò´úÂë(¾Å)
he extension code if any custom extensions have been added
err:
if(out)
BIO_free_all(out);
if(memcrl)
BIO_free_all(memcrl);
BIO_free(in);
EVP_PKEY_free(pkey);
X509_CRL_free(crl);
X509_free(x509);
EVP_cleanup();//frees all three stacks and sets their pointers to NULL ---- EVP_CIPHER
if(ret==1)
strcpy(outMsg,"CRLÖÆ×÷³É¹¦");
return ret;
}
BOOL CertFormatConver(char * buf/*ÎļþÄÚÈÝ»òÎļþÃû³Æ*/,int len/*Äڴ泤¶ÈΪ0ÔòbufΪÎļþÃû*/,
char * pwd/*p12ÎļþÃÜÂë*/,char * pem/*Êä³öÎļþ*/,
int outformat,char * out/*²Ù×÷½á¹û*/)
{
EVP_PKEY *key=NULL;
X509 *cert=NULL;
BIO *biout=NULL;
int i=0;
//Êä³öÎļþ
if ((biout=BIO_new_file(pem, "w")) == NULL)
{
return false;
}
cert = LoadCert(buf,len,out);//Ê×Ïȳ¢ÊÔ¹«Ô¿,bio±»¸Äд
if(cert)//ÊäÈëÎļþΪ¹«Ô¿Îļþ
{
if (outformat == DER)
i=i2d_X509_bio(biout,cert);
else if (outformat == PEM)
{
// if (trustout) i=PEM_write_bio_X509_AUX(biout,x);
i=PEM_write_bio_X509(biout,cert);
}
if(!i)//ʧ°Ü
strcpy(out,"±£´æ¹«Ô¿Ê§°Ü");
else
strcpy(out,"¹«Ô¿Ö¤Êé¸ñʽת»»³É¹¦");
}
else//ÊäÈëÎļþΪ˽ԿÎļþ
{
key=LoadKey(buf,len,pwd,out);
if(!key)
{
strcpy(out,"²»ÄÜʶ±ðµÄÎļþ¸ñʽ");
return false;
}
if(outformat==PEM)
{
PEM_write_bio_PrivateKey(biout, key, NULL, NULL, 0, 0, NULL);
}
if(outformat==DER)
{
i2d_PrivateKey_bio(biout,key);//µÃµ½½âÃܺóµÄ˽Կ
}
strcpy(out,"˽Կ֤Êé¸ñʽת»»³É¹¦");
}
if (biout != NULL) BIO_free(biout);
X509_free(cert);
EVP_PKEY_free(key);
return true;
}
//·Ö½âp12°ü
BOOL ParseDB(char * strP12/*°üÎļþ*/,char * strPwd/*˽ԿÃÜÂë*/,char * strCert/*¹«Ô¿´æ·Å*/,
char * strkey/*˽Կ´æ·Å*/,int outformat/*Êä³ö¸ñʽ*/,char * out/*·µ»Ø½
á¹û*/)
{
EVP_PKEY *key=NULL;
X509 *cert=NULL;
STACK_OF(X509) *ca = NULL;
BIO * bio=NULL,*bioCert=NULL,*bioKey=NULL;
PKCS12 *p12=NULL;
int i=0,j=0;
if((bio=BIO_new_file(strP12, "r")) == NULL)
{
strcpy(out,"´ò¿ªÎļþ´íÎó");
return false;
}
SSLeay_add_all_algorithms();
p12 = d2i_PKCS12_bio(bio, NULL);
if (!PKCS12_parse(p12, strPwd, &key, &cert/*PEM*/, &ca))
{
strcpy(out,"½â°üʧ°Ü");
return false;
}
PKCS12_free(p12);
//Êä³öÎļþ
if ((bioCert=BIO_new_file(strCert, "w")) == NULL)
{
return false;
}
if ((bioKey=BIO_new_file(strkey, "w")) == NULL)
{
return false;
}
if(outformat == DER)
{
i=i2d_X509_bio(bioCert,cert);
j=i2d_PrivateKey_bio(bioKey,key);
}
else if (outformat == PEM)
{
i=PEM_write_bio_X509(bioCert,cert);
j=PEM_write_bio_PrivateKey(bioKey, key, NULL, NULL, 0, 0, NULL);
}
if (bio != NULL) BIO_free(bio);
if (bioCert != NULL) BIO_free(bioCert);
if (bioKey != NULL) BIO_free(bioKey);
X509_free(cert);
EVP_PKEY_free(key);
EVP_cleanup();//frees all three stacks and sets their pointers to NULL ---- EVP_CIPHER
if(i!=0&&j!=0)
{
strcpy(out,"·Ö½âP12³É¹¦");
return true;
}
return false;
}
//×éºÏp12°ü
BOOL CreateDB(char * strP12/*OUT°üÎļþ*/,char * strPwd/*INÃÜÂë*/,char * strCert/*IN¹«Ô¿*/,
char * strkey/*IN˽Կ*/,char * out/*·µ»Ø½á¹û*/)
{
FILE *fp=NULL;
EVP_PKEY *key=NULL;
X509 *cert=NULL;
PKCS12 *p12;
cert =LoadCert(strCert,0,out);
if(!cert)
{
strcpy(out,"¶ÁÈ¡¹«Ô¿Îļþʧ°Ü");
return false;
}
key=LoadKey(strkey,0,NULL,out);//½âÃܺó˽Կ
if(!key)
{
strcpy(out,"¶Áȡ˽ԿÎļþʧ°Ü");
return false;
}
SSLeay_add_all_algorithms();
p12 = PKCS12_create(strPwd,"(hpxs)", key, cert, NULL, 0,0,0,0,0);
if(!p12)
{
strcpy(out,"´´