| Index: openssl/crypto/pem/pem_info.c
|
| ===================================================================
|
| --- openssl/crypto/pem/pem_info.c (revision 105093)
|
| +++ openssl/crypto/pem/pem_info.c (working copy)
|
| @@ -98,8 +98,8 @@
|
| long len,error=0;
|
| int ok=0;
|
| STACK_OF(X509_INFO) *ret=NULL;
|
| - unsigned int i,raw;
|
| - d2i_of_void *d2i;
|
| + unsigned int i,raw,ptype;
|
| + d2i_of_void *d2i = 0;
|
|
|
| if (sk == NULL)
|
| {
|
| @@ -116,6 +116,7 @@
|
| for (;;)
|
| {
|
| raw=0;
|
| + ptype = 0;
|
| i=PEM_read_bio(bp,&name,&header,&data,&len);
|
| if (i == 0)
|
| {
|
| @@ -166,7 +167,6 @@
|
| #ifndef OPENSSL_NO_RSA
|
| if (strcmp(name,PEM_STRING_RSA) == 0)
|
| {
|
| - d2i=(D2I_OF(void))d2i_RSAPrivateKey;
|
| if (xi->x_pkey != NULL)
|
| {
|
| if (!sk_X509_INFO_push(ret,xi)) goto err;
|
| @@ -178,10 +178,8 @@
|
| xi->enc_len=0;
|
|
|
| xi->x_pkey=X509_PKEY_new();
|
| - if ((xi->x_pkey->dec_pkey=EVP_PKEY_new()) == NULL)
|
| - goto err;
|
| - xi->x_pkey->dec_pkey->type=EVP_PKEY_RSA;
|
| - pp=&(xi->x_pkey->dec_pkey->pkey.rsa);
|
| + ptype=EVP_PKEY_RSA;
|
| + pp=&xi->x_pkey->dec_pkey;
|
| if ((int)strlen(header) > 10) /* assume encrypted */
|
| raw=1;
|
| }
|
| @@ -202,10 +200,8 @@
|
| xi->enc_len=0;
|
|
|
| xi->x_pkey=X509_PKEY_new();
|
| - if ((xi->x_pkey->dec_pkey=EVP_PKEY_new()) == NULL)
|
| - goto err;
|
| - xi->x_pkey->dec_pkey->type=EVP_PKEY_DSA;
|
| - pp=&xi->x_pkey->dec_pkey->pkey.dsa;
|
| + ptype = EVP_PKEY_DSA;
|
| + pp=&xi->x_pkey->dec_pkey;
|
| if ((int)strlen(header) > 10) /* assume encrypted */
|
| raw=1;
|
| }
|
| @@ -226,10 +222,8 @@
|
| xi->enc_len=0;
|
|
|
| xi->x_pkey=X509_PKEY_new();
|
| - if ((xi->x_pkey->dec_pkey=EVP_PKEY_new()) == NULL)
|
| - goto err;
|
| - xi->x_pkey->dec_pkey->type=EVP_PKEY_EC;
|
| - pp=&(xi->x_pkey->dec_pkey->pkey.ec);
|
| + ptype = EVP_PKEY_EC;
|
| + pp=&xi->x_pkey->dec_pkey;
|
| if ((int)strlen(header) > 10) /* assume encrypted */
|
| raw=1;
|
| }
|
| @@ -251,8 +245,16 @@
|
| if (!PEM_do_header(&cipher,data,&len,cb,u))
|
| goto err;
|
| p=data;
|
| - if (d2i(pp,&p,len) == NULL)
|
| + if (ptype)
|
| {
|
| + if (!d2i_PrivateKey(ptype, pp, &p, len))
|
| + {
|
| + PEMerr(PEM_F_PEM_X509_INFO_READ_BIO,ERR_R_ASN1_LIB);
|
| + goto err;
|
| + }
|
| + }
|
| + else if (d2i(pp,&p,len) == NULL)
|
| + {
|
| PEMerr(PEM_F_PEM_X509_INFO_READ_BIO,ERR_R_ASN1_LIB);
|
| goto err;
|
| }
|
| @@ -337,6 +339,12 @@
|
| {
|
| if ( (xi->enc_data!=NULL) && (xi->enc_len>0) )
|
| {
|
| + if (enc == NULL)
|
| + {
|
| + PEMerr(PEM_F_PEM_X509_INFO_WRITE_BIO,PEM_R_CIPHER_IS_NULL);
|
| + goto err;
|
| + }
|
| +
|
| /* copy from weirdo names into more normal things */
|
| iv=xi->enc_cipher.iv;
|
| data=(unsigned char *)xi->enc_data;
|
|
|