List Info

Thread: OpenSSL: openssl/crypto/asn1/ ameth_lib.c asn1_locl.h d2i_pr.c i...




OpenSSL: openssl/crypto/asn1/ ameth_lib.c asn1_locl.h d2i_pr.c i...
user name
2006-03-23 18:02:24
  OpenSSL CVS Repository
  http://cvs.openssl.org/
 
____________________________________________________________
________________

  Server: cvs.openssl.org                  Name:   Dr.
Stephen Henson
  Root:   /v/openssl/cvs                   Email:  steveopenssl.org
  Module: openssl                          Date:  
23-Mar-2006 19:02:24
  Branch: HEAD                             Handle:
2006032318021211

  Modified files:
    openssl/crypto/asn1     ameth_lib.c asn1_locl.h d2i_pr.c
i2d_pr.c
    openssl/crypto/dsa      dsa_ameth.c
    openssl/crypto/ec       ec_ameth.c
    openssl/crypto/evp      evp.h
    openssl/crypto/pem      pem.h pem_all.c pem_err.c
pem_lib.c pem_pkey.c
    openssl/crypto/rsa      rsa_ameth.c

  Log:
    Add support for legacy PEM format private keys in
    EVP_PKEY_ASN1_METHOD.

  Summary:
    Revision    Changes     Path
    1.5         +35 -0      openssl/crypto/asn1/ameth_lib.c
    1.4         +7  -0      openssl/crypto/asn1/asn1_locl.h
    1.18        +7  -37     openssl/crypto/asn1/d2i_pr.c
    1.10        +3  -29     openssl/crypto/asn1/i2d_pr.c
    1.7         +22 -2      openssl/crypto/dsa/dsa_ameth.c
    1.9         +22 -2      openssl/crypto/ec/ec_ameth.c
    1.120       +3  -0      openssl/crypto/evp/evp.h
    1.55        +1  -0      openssl/crypto/pem/pem.h
    1.29        +0  -11     openssl/crypto/pem/pem_all.c
    1.12        +5  -4      openssl/crypto/pem/pem_err.c
    1.57        +24 -17     openssl/crypto/pem/pem_lib.c
    1.10        +45 -6      openssl/crypto/pem/pem_pkey.c
    1.6         +23 -10     openssl/crypto/rsa/rsa_ameth.c
 
____________________________________________________________
________________

  patch -p0 <<' .'
  Index: openssl/crypto/asn1/ameth_lib.c
 
============================================================
================
  $ cvs diff -u -r1.4 -r1.5 ameth_lib.c
  --- openssl/crypto/asn1/ameth_lib.c	23 Mar 2006 11:54:47
-0000	1.4
  +++ openssl/crypto/asn1/ameth_lib.c	23 Mar 2006 18:02:12
-0000	1.5
   -105,6 +105,25 
           return ((*a)->pkey_id - (*b)->pkey_id);
   	}
   
  +int EVP_PKEY_asn1_get_count(void)
  +	{
  +	int num =
sizeof(standard_methods)/sizeof(EVP_PKEY_ASN1_METHOD *);
  +	if (app_methods)
  +		num += sk_num(app_methods);
  +	return num;
  +	}
  +
  +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx)
  +	{
  +	int num =
sizeof(standard_methods)/sizeof(EVP_PKEY_ASN1_METHOD *);
  +	if (idx < 0)
  +		return NULL; 
  +	if (idx < num)
  +		return standard_methods[idx];
  +	idx -= num;
  +	return (const EVP_PKEY_ASN1_METHOD
*)sk_value(app_methods, idx);
  +	}
  +
   const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(int type)
   	{
   	EVP_PKEY_ASN1_METHOD tmp, *t = &tmp, **ret;
   -129,6 +148,22 
   	return *ret;
   	}
   
  +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(const
char *str, int len)
  +	{
  +	int i;
  +	const EVP_PKEY_ASN1_METHOD *ameth;
  +	for (i = 0; i < EVP_PKEY_asn1_get_count(); i++)
  +		{
  +		ameth = EVP_PKEY_asn1_get0(i);
  +		if (ameth->pkey_flags & ASN1_PKEY_ALIAS)
  +			continue;
  +		if ((strlen(ameth->pem_str) == len) && 
  +			!strncasecmp(ameth->pem_str, str, len))
  +			return ameth;
  +		}
  +	return NULL;
  +	}
  +
   int EVP_PKEY_asn1_add(const EVP_PKEY_ASN1_METHOD *ameth)
   	{
   	if (app_methods == NULL)
   .
  patch -p0 <<' .'
  Index: openssl/crypto/asn1/asn1_locl.h
 
============================================================
================
  $ cvs diff -u -r1.3 -r1.4 asn1_locl.h
  --- openssl/crypto/asn1/asn1_locl.h	23 Mar 2006 11:54:47
-0000	1.3
  +++ openssl/crypto/asn1/asn1_locl.h	23 Mar 2006 18:02:12
-0000	1.4
   -107,4 +107,11 
   
   	void (*pkey_free)(EVP_PKEY *pkey);
   	void (*pkey_ctrl)(EVP_PKEY *pkey, int op, long arg1,
void *arg2);
  +
  +	/* Legacy functions for old PEM */
  +
  +	int (*old_priv_decode)(EVP_PKEY *pkey,
  +				const unsigned char **pder, int derlen);
  +	int (*old_priv_encode)(const EVP_PKEY *pkey, unsigned
char **pder);
  +
   	} /* EVP_PKEY_ASN1_METHOD */;
   .
  patch -p0 <<' .'
  Index: openssl/crypto/asn1/d2i_pr.c
 
============================================================
================
  $ cvs diff -u -r1.17 -r1.18 d2i_pr.c
  --- openssl/crypto/asn1/d2i_pr.c	22 Mar 2006 17:59:45
-0000	1.17
  +++ openssl/crypto/asn1/d2i_pr.c	23 Mar 2006 18:02:12
-0000	1.18
   -62,15 +62,7 
   #include <openssl/evp.h>
   #include <openssl/objects.h>
   #include <openssl/asn1.h>
  -#ifndef OPENSSL_NO_RSA
  -#include <openssl/rsa.h>
  -#endif
  -#ifndef OPENSSL_NO_DSA
  -#include <openssl/dsa.h>
  -#endif
  -#ifndef OPENSSL_NO_EC
  -#include <openssl/ec.h>
  -#endif
  +#include "asn1_locl.h"
   
   EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const
unsigned char **pp,
   	     long length)
   -90,39 +82,17 
   	ret->save_type=type;
   	ret->type=EVP_PKEY_type(type);
   	ret->ameth = EVP_PKEY_asn1_find(type);
  -	switch (ret->type)
  +	if (ret->ameth)
   		{
  -#ifndef OPENSSL_NO_RSA
  -	case EVP_PKEY_RSA:
  -		if ((ret->pkey.rsa=d2i_RSAPrivateKey(NULL,
  -			(const unsigned char **)pp,length)) == NULL) /* TMP
UGLY CAST */
  +		if (!ret->ameth->old_priv_decode ||
  +			!ret->ameth->old_priv_decode(ret, pp, length))
   			{
   			ASN1err(ASN1_F_D2I_PRIVATEKEY,ERR_R_ASN1_LIB);
   			goto err;
   			}
  -		break;
  -#endif
  -#ifndef OPENSSL_NO_DSA
  -	case EVP_PKEY_DSA:
  -		if ((ret->pkey.dsa=d2i_DSAPrivateKey(NULL,
  -			(const unsigned char **)pp,length)) == NULL) /* TMP
UGLY CAST */
  -			{
  -			ASN1err(ASN1_F_D2I_PRIVATEKEY,ERR_R_ASN1_LIB);
  -			goto err;
  -			}
  -		break;
  -#endif
  -#ifndef OPENSSL_NO_EC
  -	case EVP_PKEY_EC:
  -		if ((ret->pkey.ec = d2i_ECPrivateKey(NULL, 
  -			(const unsigned char **)pp, length)) == NULL)
  -			{
  -			ASN1err(ASN1_F_D2I_PRIVATEKEY, ERR_R_ASN1_LIB);
  -			goto err;
  -			}
  -		break;
  -#endif
  -	default:
  +		}
  +	else
  +		{
  
		ASN1err(ASN1_F_D2I_PRIVATEKEY,ASN1_R_UNKNOWN_PUBLIC_KEY_TY
PE);
   		goto err;
   		/* break; */
   .
  patch -p0 <<' .'
  Index: openssl/crypto/asn1/i2d_pr.c
 
============================================================
================
  $ cvs diff -u -r1.9 -r1.10 i2d_pr.c
  --- openssl/crypto/asn1/i2d_pr.c	16 May 2005 10:10:58
-0000	1.9
  +++ openssl/crypto/asn1/i2d_pr.c	23 Mar 2006 18:02:12
-0000	1.10
   -58,41 +58,15 
   
   #include <stdio.h>
   #include "cryptlib.h"
  -#include <openssl/bn.h>
   #include <openssl/evp.h>
  -#include <openssl/objects.h>
  -#ifndef OPENSSL_NO_RSA
  -#include <openssl/rsa.h>
  -#endif
  -#ifndef OPENSSL_NO_DSA
  -#include <openssl/dsa.h>
  -#endif
  -#ifndef OPENSSL_NO_EC
  -#include <openssl/ec.h>
  -#endif
  +#include "asn1_locl.h"
   
   int i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp)
   	{
  -#ifndef OPENSSL_NO_RSA
  -	if (a->type == EVP_PKEY_RSA)
  +	if (a->ameth &&
a->ameth->old_priv_encode)
   		{
  -		return(i2d_RSAPrivateKey(a->pkey.rsa,pp));
  +		return a->ameth->old_priv_encode(a, pp);
   		}
  -	else
  -#endif
  -#ifndef OPENSSL_NO_DSA
  -	if (a->type == EVP_PKEY_DSA)
  -		{
  -		return(i2d_DSAPrivateKey(a->pkey.dsa,pp));
  -		}
  -#endif
  -#ifndef OPENSSL_NO_EC
  -	if (a->type == EVP_PKEY_EC)
  -		{
  -		return(i2d_ECPrivateKey(a->pkey.ec, pp));
  -		}
  -#endif
  -
  
	ASN1err(ASN1_F_I2D_PRIVATEKEY,ASN1_R_UNSUPPORTED_PUBLIC_KEY
_TYPE);
   	return(-1);
   	}
   .
  patch -p0 <<' .'
  Index: openssl/crypto/dsa/dsa_ameth.c
 
============================================================
================
  $ cvs diff -u -r1.6 -r1.7 dsa_ameth.c
  --- openssl/crypto/dsa/dsa_ameth.c	23 Mar 2006 14:04:37
-0000	1.6
  +++ openssl/crypto/dsa/dsa_ameth.c	23 Mar 2006 18:02:13
-0000	1.7
   -493,6 +493,24 
   	return do_dsa_print(bp, pkey->pkey.dsa, indent, 2);
   	}
   
  +static int old_dsa_priv_decode(EVP_PKEY *pkey,
  +					const unsigned char **pder, int derlen)
  +	{
  +	DSA *dsa;
  +	if (!(dsa = d2i_DSAPrivateKey (NULL, pder, derlen)))
  +		{
  +		DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
  +		return 0;
  +		}
  +	EVP_PKEY_assign_DSA(pkey, dsa);
  +	return 1;
  +	}
  +
  +static int old_dsa_priv_encode(const EVP_PKEY *pkey,
unsigned char **pder)
  +	{
  +	return i2d_DSAPrivateKey(pkey->pkey.dsa, pder);
  +	}
  +
   /* NB these are sorted in pkey_id order, lowest first */
   
   const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] = 
   -527,7 +545,7 
   		EVP_PKEY_DSA,
   		0,
   
  -		"dsa",
  +		"DSA",
   		"OpenSSL DSA method",
   
   		dsa_pub_decode,
   -549,7 +567,9 
   		dsa_param_print,
   
   		int_dsa_free,
  -		0
  +		0,
  +		old_dsa_priv_decode,
  +		old_dsa_priv_encode
   		}
   	};
   
   .
  patch -p0 <<' .'
  Index: openssl/crypto/ec/ec_ameth.c
 
============================================================
================
  $ cvs diff -u -r1.8 -r1.9 ec_ameth.c
  --- openssl/crypto/ec/ec_ameth.c	23 Mar 2006 14:08:33
-0000	1.8
  +++ openssl/crypto/ec/ec_ameth.c	23 Mar 2006 18:02:16
-0000	1.9
   -534,12 +534,30 
   	return do_EC_KEY_print(bp, pkey->pkey.ec, indent, 2);
   	}
   
  +static int old_ec_priv_decode(EVP_PKEY *pkey,
  +					const unsigned char **pder, int derlen)
  +	{
  +	EC_KEY *ec;
  +	if (!(ec = d2i_ECPrivateKey (NULL, pder, derlen)))
  +		{
  +		ECerr(EC_F_ECKEY_PRIV_DECODE, EC_R_DECODE_ERROR);
  +		return 0;
  +		}
  +	EVP_PKEY_assign_EC_KEY(pkey, ec);
  +	return 1;
  +	}
  +
  +static int old_ec_priv_encode(const EVP_PKEY *pkey,
unsigned char **pder)
  +	{
  +	return i2d_ECPrivateKey(pkey->pkey.ec, pder);
  +	}
  +
   EVP_PKEY_ASN1_METHOD eckey_asn1_meth = 
   	{
   	EVP_PKEY_EC,
   	EVP_PKEY_EC,
   	0,
  -	"ec",
  +	"EC",
   	"OpenSSL EC algorithm",
   
   	eckey_pub_decode,
   -561,5 +579,7 
   	eckey_param_print,
   
   	int_ec_free,
  -	0
  +	0,
  +	old_ec_priv_decode,
  +	old_ec_priv_encode
   	};
   .
  patch -p0 <<' .'
  Index: openssl/crypto/evp/evp.h
 
============================================================
================
  $ cvs diff -u -r1.119 -r1.120 evp.h
  --- openssl/crypto/evp/evp.h	23 Mar 2006 11:54:49
-0000	1.119
  +++ openssl/crypto/evp/evp.h	23 Mar 2006 18:02:17
-0000	1.120
   -855,7 +855,10 
   		    EVP_PBE_KEYGEN *keygen);
   void EVP_PBE_cleanup(void);
   
  +int EVP_PKEY_asn1_get_count(void);
  +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_get0(int idx);
   const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find(int type);
  +const EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_find_str(const
char *str, int len);
   int EVP_PKEY_asn1_add(const EVP_PKEY_ASN1_METHOD *ameth);
   EVP_PKEY_ASN1_METHOD* EVP_PKEY_asn1_new(int id,
   					const char *pem_str, const char *info);
   .
  patch -p0 <<' .'
  Index: openssl/crypto/pem/pem.h
 
============================================================
================
  $ cvs diff -u -r1.54 -r1.55 pem.h
  --- openssl/crypto/pem/pem.h	18 Dec 2005 19:11:32
-0000	1.54
  +++ openssl/crypto/pem/pem.h	23 Mar 2006 18:02:18
-0000	1.55
   -731,6 +731,7 
   #define PEM_F_PEM_SIGNFINAL				 112
   #define PEM_F_PEM_WRITE					 113
   #define PEM_F_PEM_WRITE_BIO				 114
  +#define PEM_F_PEM_WRITE_PRIVATEKEY			 139
   #define PEM_F_PEM_X509_INFO_READ			 115
   #define PEM_F_PEM_X509_INFO_READ_BIO			 116
   #define PEM_F_PEM_X509_INFO_WRITE_BIO			 117
   .
  patch -p0 <<' .'
  Index: openssl/crypto/pem/pem_all.c
 
============================================================
================
  $ cvs diff -u -r1.28 -r1.29 pem_all.c
  --- openssl/crypto/pem/pem_all.c	29 Jul 2005 19:46:42
-0000	1.28
  +++ openssl/crypto/pem/pem_all.c	23 Mar 2006 18:02:18
-0000	1.29
   -294,15 +294,4 
   
   #endif
   
  -
  -/* The PrivateKey case is not that straightforward.
  - *   IMPLEMENT_PEM_rw_cb(PrivateKey, EVP_PKEY,
PEM_STRING_EVP_PKEY, PrivateKey)
  - * does not work, RSA and DSA keys have specific strings.
  - * (When reading, parameter PEM_STRING_EVP_PKEY is a
wildcard for anything
  - * appropriate.)
  - */
  -IMPLEMENT_PEM_write_cb(PrivateKey, EVP_PKEY, ((x->type
== EVP_PKEY_DSA)?PEM_STRING_DSA:\
  -			(x->type ==
EVP_PKEY_RSA)?PEM_STRING_RSA:PEM_STRING_ECPRIVATEKEY),
PrivateKey)
  -
   IMPLEMENT_PEM_rw(PUBKEY, EVP_PKEY, PEM_STRING_PUBLIC,
PUBKEY)
  -
   .
  patch -p0 <<' .'
  Index: openssl/crypto/pem/pem_err.c
 
============================================================
================
  $ cvs diff -u -r1.11 -r1.12 pem_err.c
  --- openssl/crypto/pem/pem_err.c	31 Aug 2005 16:37:54
-0000	1.11
  +++ openssl/crypto/pem/pem_err.c	23 Mar 2006 18:02:18
-0000	1.12
   -71,7 +71,7 
   static ERR_STRING_DATA PEM_str_functs[]=
   	{
   {ERR_FUNC(PEM_F_B2I_DSS),	"B2I_DSS"},
  -{ERR_FUNC(PEM_F_B2I_PVK_BIO),	"B2I_PVK_BIO"},
  +{ERR_FUNC(PEM_F_B2I_PVK_BIO),	"b2i_PVK_bio"},
   {ERR_FUNC(PEM_F_B2I_RSA),	"B2I_RSA"},
  
{ERR_FUNC(PEM_F_CHECK_BITLEN_DSA),	"CHECK_BITLEN_DSA&
quot;},
  
{ERR_FUNC(PEM_F_CHECK_BITLEN_RSA),	"CHECK_BITLEN_RSA&
quot;},
   -85,7 +85,7 
   {ERR_FUNC(PEM_F_DO_PVK_BODY),	"DO_PVK_BODY"},
  
{ERR_FUNC(PEM_F_DO_PVK_HEADER),	"DO_PVK_HEADER"}
,
   {ERR_FUNC(PEM_F_I2B_PVK),	"I2B_PVK"},
  -{ERR_FUNC(PEM_F_I2B_PVK_BIO),	"I2B_PVK_BIO"},
  +{ERR_FUNC(PEM_F_I2B_PVK_BIO),	"i2b_PVK_bio"},
   {ERR_FUNC(PEM_F_LOAD_IV),	"LOAD_IV"},
  
{ERR_FUNC(PEM_F_PEM_ASN1_READ),	"PEM_ASN1_read"}
,
  
{ERR_FUNC(PEM_F_PEM_ASN1_READ_BIO),	"PEM_ASN1_read_bio
"},
   -105,8 +105,9 
  
{ERR_FUNC(PEM_F_PEM_SIGNFINAL),	"PEM_SignFinal"}
,
   {ERR_FUNC(PEM_F_PEM_WRITE),	"PEM_write"},
  
{ERR_FUNC(PEM_F_PEM_WRITE_BIO),	"PEM_write_bio"}
,
 
-{ERR_FUNC(PEM_F_PEM_X509_INFO_READ),	"PEM_X509_INFO_r
ead"},
 
-{ERR_FUNC(PEM_F_PEM_X509_INFO_READ_BIO),	"PEM_X509_IN
FO_read_bio"},
 
+{ERR_FUNC(PEM_F_PEM_WRITE_PRIVATEKEY),	"PEM_WRITE_PRI
VATEKEY"},
 
+{ERR_FUNC(PEM_F_PEM_X509_INFO_READ),	"PEM_X509_INFO_R
EAD"},
 
+{ERR_FUNC(PEM_F_PEM_X509_INFO_READ_BIO),	"PEM_X509_IN
FO_READ_BIO"},
  
{ERR_FUNC(PEM_F_PEM_X509_INFO_WRITE_BIO),	"PEM_X509_IN
FO_write_bio"},
   {0,NULL}
   	};
   .
  patch -p0 <<' .'
  Index: openssl/crypto/pem/pem_lib.c
 
============================================================
================
  $ cvs diff -u -r1.56 -r1.57 pem_lib.c
  --- openssl/crypto/pem/pem_lib.c	23 Mar 2006 11:54:50
-0000	1.56
  +++ openssl/crypto/pem/pem_lib.c	23 Mar 2006 18:02:19
-0000	1.57
   -66,6 +66,7 
   #include <openssl/x509.h>
   #include <openssl/pem.h>
   #include <openssl/pkcs12.h>
  +#include "asn1_locl.h"
   #ifndef OPENSSL_NO_DES
   #include <openssl/des.h>
   #endif
   -76,6 +77,7 
   
   static int load_iv(char **fromp,unsigned char *to, int
num);
   static int check_pem(const char *nm, const char *name);
  +int pem_check_suffix(const char *pem_str, const char
*suffix);
   
   int PEM_def_callback(char *buf, int num, int w, void
*key)
   	{
   -184,20 +186,24 
   
   	/* Make PEM_STRING_EVP_PKEY match any private key */
   
  -	if(!strcmp(nm,PEM_STRING_PKCS8) &&
  -		!strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
  -
  -	if(!strcmp(nm,PEM_STRING_PKCS8INF) &&
  -		 !strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
  -
  -	if(!strcmp(nm,PEM_STRING_RSA) &&
  -		!strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
  -
  -	if(!strcmp(nm,PEM_STRING_DSA) &&
  -		 !strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
  +	if(!strcmp(name,PEM_STRING_EVP_PKEY))
  +		{
  +		int slen;
  +		const EVP_PKEY_ASN1_METHOD *ameth;
  +		if(!strcmp(nm,PEM_STRING_PKCS8))
  +			return 1;
  +		if(!strcmp(nm,PEM_STRING_PKCS8INF))
  +			return 1;
  +		slen = pem_check_suffix(nm, "PRIVATE KEY");

  +		if (slen > 0)
  +			{
  +			ameth = EVP_PKEY_asn1_find_str(nm, slen);
  +			if (ameth && ameth->old_priv_decode)
  +				return 1;
  +			}
  +		return 0;
  +		}
   
  - 	if(!strcmp(nm,PEM_STRING_ECPRIVATEKEY) &&
  - 		 !strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
   	/* Permit older strings */
   
   	if(!strcmp(nm,PEM_STRING_X509_OLD) &&
   -783,16 +789,17 
    * the return value is 3 for the string
"RSA".
    */
   
  -int pem_check_suffix(char *pem_str, char *suffix)
  +int pem_check_suffix(const char *pem_str, const char
*suffix)
   	{
   	int pem_len = strlen(pem_str);
   	int suffix_len = strlen(suffix);
  -	char *p;
  +	const char *p;
   	if (suffix_len + 1 >= pem_len)
   		return 0;
  -	if (strcmp(pem_str - suffix_len, suffix))
  +	p = pem_str + pem_len - suffix_len;
  +	if (strcmp(p, suffix))
   		return 0;
  -	p = pem_str - suffix_len - 1;
  +	p--;
   	if (*p != ' ')
   		return 0;
   	return p - pem_str;
   .
  patch -p0 <<' .'
  Index: openssl/crypto/pem/pem_pkey.c
 
============================================================
================
  $ cvs diff -u -r1.9 -r1.10 pem_pkey.c
  --- openssl/crypto/pem/pem_pkey.c	11 May 2005 03:45:31
-0000	1.9
  +++ openssl/crypto/pem/pem_pkey.c	23 Mar 2006 18:02:19
-0000	1.10
   -65,7 +65,9 
   #include <openssl/x509.h>
   #include <openssl/pkcs12.h>
   #include <openssl/pem.h>
  +#include "asn1_locl.h"
   
  +int pem_check_suffix(const char *pem_str, const char
*suffix);
   
   EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x,
pem_password_cb *cb, void *u)
   	{
   -73,18 +75,21 
   	const unsigned char *p=NULL;
   	unsigned char *data=NULL;
   	long len;
  +	int slen;
   	EVP_PKEY *ret=NULL;
   
   	if (!PEM_bytes_read_bio(&data, &len, &nm,
PEM_STRING_EVP_PKEY, bp, cb, u))
   		return NULL;
   	p = data;
   
  -	if (strcmp(nm,PEM_STRING_RSA) == 0)
  -		ret=d2i_PrivateKey(EVP_PKEY_RSA,x,&p,len);
  -	else if (strcmp(nm,PEM_STRING_DSA) == 0)
  -		ret=d2i_PrivateKey(EVP_PKEY_DSA,x,&p,len);
  -	else if (strcmp(nm,PEM_STRING_ECPRIVATEKEY) == 0)
  -		ret=d2i_PrivateKey(EVP_PKEY_EC,x,&p,len);
  +	if ((slen = pem_check_suffix(nm, "PRIVATE
KEY")) > 0)
  +		{
  +		const EVP_PKEY_ASN1_METHOD *ameth;
  +		ameth = EVP_PKEY_asn1_find_str(nm, slen);
  +		if (!ameth || !ameth->old_priv_decode)
  +			goto p8err;
  +		ret=d2i_PrivateKey(ameth->pkey_id,x,&p,len);
  +		}
   	else if (strcmp(nm,PEM_STRING_PKCS8INF) == 0) {
   		PKCS8_PRIV_KEY_INFO *p8inf;
   		p8inf=d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, len);
   -129,6 +134,22 
   	return(ret);
   	}
   
  +int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const
EVP_CIPHER *enc,
  +                                               unsigned
char *kstr, int klen,
  +                                              
pem_password_cb *cb, void *u)
  +	{
  +	char pem_str[80];
  +	if (!x->ameth || !x->ameth->old_priv_encode)
  +		return PEM_write_bio_PKCS8PrivateKey(bp, x, enc,
  +							(char *)kstr, klen,
  +							cb, u);
  +
  +	BIO_snprintf(pem_str, 80, "%s PRIVATE KEY",
x->ameth->pem_str);
  +	return PEM_ASN1_write_bio((i2d_of_void
*)openssl_fcast(i2d_PrivateKey),
  +				pem_str,bp,(char *)x,enc,kstr,klen,cb,u);
  +	}
  +
  +
   #ifndef OPENSSL_NO_FP_API
   EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x,
pem_password_cb *cb, void *u)
   	{
   -145,4 +166,22 
           BIO_free(b);
           return(ret);
   	}
  +
  +int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const
EVP_CIPHER *enc,
  +                                               unsigned
char *kstr, int klen,
  +                                              
pem_password_cb *cb, void *u)
  +	{
  +        BIO *b;
  +        int ret;
  +
  +        if ((b=BIO_new_fp(fp, BIO_NOCLOSE)) == NULL)
  +		{
  +		PEMerr(PEM_F_PEM_WRITE_PRIVATEKEY,ERR_R_BUF_LIB);
  +                return 0;
  +		}
  +        ret=PEM_write_bio_PrivateKey(b, x, enc, kstr,
klen, cb, u);
  +        BIO_free(b);
  +        return ret;
  +	}
  +
   #endif
   .
  patch -p0 <<' .'
  Index: openssl/crypto/rsa/rsa_ameth.c
 
============================================================
================
  $ cvs diff -u -r1.5 -r1.6 rsa_ameth.c
  --- openssl/crypto/rsa/rsa_ameth.c	23 Mar 2006 11:54:51
-0000	1.5
  +++ openssl/crypto/rsa/rsa_ameth.c	23 Mar 2006 18:02:23
-0000	1.6
   -101,22 +101,24 
   	return 1;
   	}
   
  -static int rsa_priv_decode(EVP_PKEY *pkey,
PKCS8_PRIV_KEY_INFO *p8)
  +static int old_rsa_priv_decode(EVP_PKEY *pkey,
  +					const unsigned char **pder, int derlen)
   	{
  -	const unsigned char *p;
  -	int pklen;
  -	RSA *rsa = NULL;
  -	if (!PKCS8_pkey_get0(NULL, &p, &pklen, NULL,
p8))
  -		return 0;
  -	if (!(rsa = d2i_RSAPrivateKey (NULL, &p, pklen)))
  +	RSA *rsa;
  +	if (!(rsa = d2i_RSAPrivateKey (NULL, pder, derlen)))
   		{
   		RSAerr(RSA_F_RSA_PRIV_DECODE, ERR_R_RSA_LIB);
   		return 0;
   		}
  -	EVP_PKEY_assign_RSA (pkey, rsa);
  +	EVP_PKEY_assign_RSA(pkey, rsa);
   	return 1;
   	}
   
  +static int old_rsa_priv_encode(const EVP_PKEY *pkey,
unsigned char **pder)
  +	{
  +	return i2d_RSAPrivateKey(pkey->pkey.rsa, pder);
  +	}
  +
   static int rsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const
EVP_PKEY *pkey)
   	{
   	unsigned char *rk = NULL;
   -139,6 +141,15 
   	return 1;
   	}
   
  +static int rsa_priv_decode(EVP_PKEY *pkey,
PKCS8_PRIV_KEY_INFO *p8)
  +	{
  +	const unsigned char *p;
  +	int pklen;
  +	if (!PKCS8_pkey_get0(NULL, &p, &pklen, NULL,
p8))
  +		return 0;
  +	return old_rsa_priv_decode(pkey, &p, pklen);
  +	}
  +
   static int int_rsa_size(const EVP_PKEY *pkey)
   	{
   	return RSA_size(pkey->pkey.rsa);
   -256,7 +267,7 
   		EVP_PKEY_RSA,
   		0,
   
  -		"rsa",
  +		"RSA",
   		"OpenSSL RSA method",
   
   		rsa_pub_decode,
   -274,7 +285,9 
   		0,0,0,0,0,0,
   
   		int_rsa_free,
  -		0
  +		0,
  +		old_rsa_priv_decode,
  +		old_rsa_priv_encode
   		},
   
   		{
   .
____________________________________________________________
__________
OpenSSL Project                                 http://www.openssl.org
CVS Repository Commit List                    
openssl-cvsopenssl.org
Automated List Manager                          
majordomoopenssl.org
[1]

about | contact  Other archives ( Real Estate discussion Medical topics )