List Info

Thread: OpenSSL: openssl/ CHANGES openssl/apps/ pkeyutl.c openssl/crypto...




OpenSSL: openssl/ CHANGES openssl/apps/ pkeyutl.c openssl/crypto...
user name
2006-04-13 20:16:57
  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:  
13-Apr-2006 22:16:56
  Branch: HEAD                             Handle:
2006041321164907

  Modified files:
    openssl                 CHANGES
    openssl/apps            pkeyutl.c
    openssl/crypto/dh       dh.h dh_ameth.c dh_err.c
dh_pmeth.c
    openssl/crypto/evp      evp.h evp_err.c pmeth_fn.c
pmeth_lib.c

  Log:
    Complete key derivation support.

  Summary:
    Revision    Changes     Path
    1.1304      +4  -0      openssl/CHANGES
    1.8         +95 -34     openssl/apps/pkeyutl.c
    1.44        +2  -0      openssl/crypto/dh/dh.h
    1.9         +14 -7      openssl/crypto/dh/dh_ameth.c
    1.18        +2  -0      openssl/crypto/dh/dh_err.c
    1.4         +23 -1      openssl/crypto/dh/dh_pmeth.c
    1.141       +8  -0      openssl/crypto/evp/evp.h
    1.37        +3  -0      openssl/crypto/evp/evp_err.c
    1.6         +60 -0      openssl/crypto/evp/pmeth_fn.c
    1.14        +2  -0      openssl/crypto/evp/pmeth_lib.c
 
____________________________________________________________
________________

  patch -p0 <<' .'
  Index: openssl/CHANGES
 
============================================================
================
  $ cvs diff -u -r1.1303 -r1.1304 CHANGES
  --- openssl/CHANGES	12 Apr 2006 23:51:22 -0000	1.1303
  +++ openssl/CHANGES	13 Apr 2006 20:16:49 -0000	1.1304
   -4,6 +4,10 
   
    Changes between 0.9.8a and 0.9.9  [xx XXX xxxx]
   
  +  *) Add support for key derivation (agreement) in the
API, DH method and
  +     pkeyutl.
  +     [Steve Henson]
  +
     *) Add DSA pkey method and DH pkey methods, extend DH
ASN1 method to support
        public and private key formats. As a side effect
these add additional 
        command line functionality not previously available:
DSA signatures can be
   .
  patch -p0 <<' .'
  Index: openssl/apps/pkeyutl.c
 
============================================================
================
  $ cvs diff -u -r1.7 -r1.8 pkeyutl.c
  --- openssl/apps/pkeyutl.c	13 Apr 2006 12:38:46 -0000	1.7
  +++ openssl/apps/pkeyutl.c	13 Apr 2006 20:16:52 -0000	1.8
   -74,7 +74,10 
   
   static EVP_PKEY_CTX *init_ctx(int *pkeysize,
   				char *keyfile, int keyform, int key_type,
  -				char *passargin, int pkey_op, char *engine);
  +				char *passargin, int pkey_op, ENGINE *e);
  +
  +static int setup_peer(BIO *err, EVP_PKEY_CTX *ctx, int
peerform,
  +							const char *file);
   
   int MAIN(int argc, char **);
   
   -82,9 +85,9 
   {
   	BIO *in = NULL, *out = NULL;
   	char *infile = NULL, *outfile = NULL, *sigfile = NULL;
  -	char *engine = NULL;
  +	ENGINE *e = NULL;
   	int pkey_op = EVP_PKEY_OP_SIGN, key_type = KEY_PRIVKEY;
  -	int keyform = FORMAT_PEM;
  +	int keyform = FORMAT_PEM, peerform = FORMAT_PEM;
   	char badarg = 0, rev = 0;
   	char hexdump = 0, asn1parse = 0;
   	EVP_PKEY_CTX *ctx = NULL;
   -131,7 +134,7 
   				{
   				ctx = init_ctx(&keysize,
   						*(++argv), keyform, key_type,
  -						passargin, pkey_op, engine);
  +						passargin, pkey_op, e);
   				if (!ctx)
   					{
   					BIO_puts(bio_err,
   -141,11 +144,23 
   					}
   				}
   			}
  +		else if (!strcmp(*argv,"-peerkey"))
  +			{
  +			if (--argc < 1)
  +				badarg = 1;
  +			else if (!setup_peer(bio_err, ctx, peerform,
*(++argv)))
  +				badarg = 1;
  +			}
   		else if (!strcmp(*argv,"-passin"))
   			{
   			if (--argc < 1) badarg = 1;
   			passargin= *(++argv);
   			}
  +		else if (strcmp(*argv,"-peerform") == 0)
  +			{
  +			if (--argc < 1) badarg = 1;
  +			peerform=str2fmt(*(++argv));
  +			}
   		else if (strcmp(*argv,"-keyform") == 0)
   			{
   			if (--argc < 1) badarg = 1;
   -157,7 +172,7 
   			if (--argc < 1)
   				badarg = 1;
   			else
  -				engine = *(++argv);
  +				e = setup_engine(bio_err, *(++argv), 0);
   			}
   #endif
   		else if(!strcmp(*argv, "-pubin"))
   -180,14 +195,16 
   			pkey_op = EVP_PKEY_OP_ENCRYPT;
   		else if(!strcmp(*argv, "-decrypt"))
   			pkey_op = EVP_PKEY_OP_DECRYPT;
  +		else if(!strcmp(*argv, "-derive"))
  +			pkey_op = EVP_PKEY_OP_DERIVE;
   		else if (strcmp(*argv,"-pkeyopt") == 0)
   			{
   			if (--argc < 1)
   				badarg = 1;
  -			if (!ctx)
  +			else if (!ctx)
   				{
   				BIO_puts(bio_err,
  -					"-param command before -inkey\n");
  +					"-pkeyopt command before -inkey\n");
   				badarg = 1;
   				}
   			else if (pkey_ctrl_string(ctx, *(++argv)) <= 0)
   -228,17 +245,21 
   /* FIXME: seed PRNG only if needed */
   	app_RAND_load_file(NULL, bio_err, 0);
   
  -	if(infile)
  +	if (pkey_op != EVP_PKEY_OP_DERIVE)
   		{
  -		if(!(in = BIO_new_file(infile, "rb")))
  +		if(infile)
   			{
  -			BIO_printf(bio_err, "Error Reading Input
File\n");
  -			ERR_print_errors(bio_err);	
  -			goto end;
  +			if(!(in = BIO_new_file(infile, "rb")))
  +				{
  +				BIO_puts(bio_err,
  +					"Error Opening Input File\n");
  +				ERR_print_errors(bio_err);	
  +				goto end;
  +				}
   			}
  +		else
  +			in = BIO_new_fp(stdin, BIO_NOCLOSE);
   		}
  -	else
  -		in = BIO_new_fp(stdin, BIO_NOCLOSE);
   
   	if(outfile)
   		{
   -280,24 +301,28 
   	
   	buf_out = OPENSSL_malloc(keysize);
   
  -	/* Read the input data */
  -	buf_inlen = bio_to_mem(&buf_in, keysize * 10, in);
  -	if(buf_inlen <= 0)
  -		{
  -		BIO_printf(bio_err, "Error reading input
Data\n");
  -		exit(1);
  -		}
  -	if(rev)
  -		{
  -		int i;
  -		unsigned char ctmp;
  -		for(i = 0; i < buf_inlen/2; i++)
  -			{
  -			ctmp = buf_in[i];
  -			buf_in[i] = buf_in[buf_inlen - 1 - i];
  -			buf_in[buf_inlen - 1 - i] = ctmp;
  +	if (in)
  +		{
  +		/* Read the input data */
  +		buf_inlen = bio_to_mem(&buf_in, keysize * 10, in);
  +		if(buf_inlen <= 0)
  +			{
  +			BIO_printf(bio_err, "Error reading input
Data\n");
  +			exit(1);
  +			}
  +		if(rev)
  +			{
  +			int i;
  +			unsigned char ctmp;
  +			for(i = 0; i < buf_inlen/2; i++)
  +				{
  +				ctmp = buf_in[i];
  +				buf_in[i] = buf_in[buf_inlen - 1 - i];
  +				buf_in[buf_inlen - 1 - i] = ctmp;
  +				}
   			}
   		}
  +
   	switch(pkey_op)
   		{
   		case EVP_PKEY_OP_VERIFYRECOVER:
   -330,6 +355,10 
   			goto end;
   		break; 
   
  +		case EVP_PKEY_OP_DERIVE:
  +		rv  = EVP_PKEY_derive(ctx, buf_out, &buf_outlen);
  +		break;
  +
   		}
   
   	if(rv <= 0)
   -387,15 +416,15 
   
   static EVP_PKEY_CTX *init_ctx(int *pkeysize,
   				char *keyfile, int keyform, int key_type,
  -				char *passargin, int pkey_op, char *engine)
  +				char *passargin, int pkey_op, ENGINE *e)
   	{
  -	ENGINE *e = NULL;
   	EVP_PKEY *pkey = NULL;
   	EVP_PKEY_CTX *ctx = NULL;
   	char *passin = NULL;
   	int rv = -1;
   	X509 *x;
  -	if(((pkey_op == EVP_PKEY_OP_SIGN) || (pkey_op ==
EVP_PKEY_OP_DECRYPT))
  +	if(((pkey_op == EVP_PKEY_OP_SIGN) || (pkey_op ==
EVP_PKEY_OP_DECRYPT) 
  +		|| (pkey_op == EVP_PKEY_OP_DERIVE))
   		&& (key_type != KEY_PRIVKEY))
   		{
   		BIO_printf(bio_err, "A private key is needed for
this operation\n");
   -435,7 +464,7 
   	if (!pkey)
   		goto end;
   
  -	ctx = EVP_PKEY_CTX_new(pkey, NULL);
  +	ctx = EVP_PKEY_CTX_new(pkey, e);
   
   	EVP_PKEY_free(pkey);
   
   -463,6 +492,10 
   		case EVP_PKEY_OP_DECRYPT:
   		rv = EVP_PKEY_decrypt_init(ctx);
   		break;
  +
  +		case EVP_PKEY_OP_DERIVE:
  +		rv = EVP_PKEY_derive_init(ctx);
  +		break;
   		}
   
   	if (rv <= 0)
   -481,3 +514,31 
   
   	}
   
  +static int setup_peer(BIO *err, EVP_PKEY_CTX *ctx, int
peerform,
  +							const char *file)
  +	{
  +	EVP_PKEY *peer = NULL;
  +	int ret;
  +	if (!ctx)
  +		{
  +		BIO_puts(err, "-peerkey command before
-inkey\n");
  +		return 0;
  +		}
  +		
  +	peer = load_pubkey(bio_err, file, peerform, 0, NULL,
NULL, "Peer Key");
  +
  +	if (!peer)
  +		{
  +		BIO_printf(bio_err, "Error reading peer key
%s\n", file);
  +		ERR_print_errors(err);
  +		return 0;
  +		}
  +
  +	ret = EVP_PKEY_derive_set_peer(ctx, peer);
  +
  +	EVP_PKEY_free(peer);
  +	if (ret <= 0)
  +		ERR_print_errors(err);
  +	return ret;
  +	}
  +			
   .
  patch -p0 <<' .'
  Index: openssl/crypto/dh/dh.h
 
============================================================
================
  $ cvs diff -u -r1.43 -r1.44 dh.h
  --- openssl/crypto/dh/dh.h	13 Apr 2006 00:26:05 -0000	1.43
  +++ openssl/crypto/dh/dh.h	13 Apr 2006 20:16:53 -0000	1.44
   -234,6 +234,7 
   #define DH_F_DH_PUB_ENCODE				 109
   #define DH_F_GENERATE_KEY				 103
   #define DH_F_GENERATE_PARAMETERS			 104
  +#define DH_F_PKEY_DH_DERIVE				 112
   #define DH_F_PKEY_DH_KEYGEN				 113
   
   /* Reason codes. */
   -242,6 +243,7 
   #define DH_R_BN_ERROR					 106
   #define DH_R_DECODE_ERROR				 104
   #define DH_R_INVALID_PUBKEY				 102
  +#define DH_R_KEYS_NOT_SET				 108
   #define DH_R_NO_PARAMETERS_SET				 107
   #define DH_R_NO_PRIVATE_VALUE				 100
   #define DH_R_PARAMETER_ENCODING_ERROR			 105
   .
  patch -p0 <<' .'
  Index: openssl/crypto/dh/dh_ameth.c
 
============================================================
================
  $ cvs diff -u -r1.8 -r1.9 dh_ameth.c
  --- openssl/crypto/dh/dh_ameth.c	12 Apr 2006 23:51:23
-0000	1.8
  +++ openssl/crypto/dh/dh_ameth.c	13 Apr 2006 20:16:53
-0000	1.9
   -397,6 +397,15 
   	return BN_num_bits(pkey->pkey.dh->p);
   	}
   
  +static int dh_cmp_parameters(const EVP_PKEY *a, const
EVP_PKEY *b)
  +	{
  +	if (	BN_cmp(a->pkey.dh->p,b->pkey.dh->p) ||
  +		BN_cmp(a->pkey.dh->g,b->pkey.dh->g))
  +		return 0;
  +	else
  +		return 1;
  +	}
  +
   static int dh_copy_parameters(EVP_PKEY *to, const
EVP_PKEY *from)
   	{
   	BIGNUM *a;
   -409,20 +418,18 
   
   	if ((a=BN_dup(from->pkey.dh->g)) == NULL)
   		return 0;
  -	if (to->pkey.dsa->g != NULL)
  +	if (to->pkey.dh->g != NULL)
   		BN_free(to->pkey.dh->g);
   	to->pkey.dh->g=a;
   
   	return 1;
   	}
   
  -static int dh_cmp_parameters(const EVP_PKEY *a, const
EVP_PKEY *b)
  +static int dh_missing_parameters(const EVP_PKEY *a)
   	{
  -	if (	BN_cmp(a->pkey.dh->p,b->pkey.dsa->p) ||
  -		BN_cmp(a->pkey.dh->g,b->pkey.dsa->g))
  -		return 0;
  -	else
  +	if (!a->pkey.dh->p || !a->pkey.dh->g)
   		return 1;
  +	return 0;
   	}
   
   static int dh_pub_cmp(const EVP_PKEY *a, const EVP_PKEY
*b)
   -481,7 +488,7 
   
   	dh_param_decode,
   	dh_param_encode,
  -	0,
  +	dh_missing_parameters,
   	dh_copy_parameters,
   	dh_cmp_parameters,
   	dh_param_print,
   .
  patch -p0 <<' .'
  Index: openssl/crypto/dh/dh_err.c
 
============================================================
================
  $ cvs diff -u -r1.17 -r1.18 dh_err.c
  --- openssl/crypto/dh/dh_err.c	13 Apr 2006 00:26:05
-0000	1.17
  +++ openssl/crypto/dh/dh_err.c	13 Apr 2006 20:16:53
-0000	1.18
   -82,6 +82,7 
  
{ERR_FUNC(DH_F_DH_PUB_ENCODE),	"DH_PUB_ENCODE"},
  
{ERR_FUNC(DH_F_GENERATE_KEY),	"GENERATE_KEY"},
  
{ERR_FUNC(DH_F_GENERATE_PARAMETERS),	"GENERATE_PARAMET
ERS"},
 
+{ERR_FUNC(DH_F_PKEY_DH_DERIVE),	"PKEY_DH_DERIVE"
;},
  
{ERR_FUNC(DH_F_PKEY_DH_KEYGEN),	"PKEY_DH_KEYGEN"
},
   {0,NULL}
   	};
   -93,6 +94,7 
   {ERR_REASON(DH_R_BN_ERROR)               ,"bn
error"},
   {ERR_REASON(DH_R_DECODE_ERROR)           ,"decode
error"},
   {ERR_REASON(DH_R_INVALID_PUBKEY)         ,"invalid
public key"},
  +{ERR_REASON(DH_R_KEYS_NOT_SET)           ,"keys not
set"},
   {ERR_REASON(DH_R_NO_PARAMETERS_SET)      ,"no
parameters set"},
   {ERR_REASON(DH_R_NO_PRIVATE_VALUE)       ,"no
private value"},
  
{ERR_REASON(DH_R_PARAMETER_ENCODING_ERROR),"parameter
encoding error"},
   .
  patch -p0 <<' .'
  Index: openssl/crypto/dh/dh_pmeth.c
 
============================================================
================
  $ cvs diff -u -r1.3 -r1.4 dh_pmeth.c
  --- openssl/crypto/dh/dh_pmeth.c	13 Apr 2006 12:56:39
-0000	1.3
  +++ openssl/crypto/dh/dh_pmeth.c	13 Apr 2006 20:16:53
-0000	1.4
   -115,11 +115,16 
   		dctx->generator = p1;
   		return 1;
   
  +		case EVP_PKEY_CTRL_PEER_KEY:
  +		/* Default behaviour is OK */
  +		return 1;
  +
   		default:
   		return -2;
   
   		}
   	}
  +
   			
   static int pkey_dh_ctrl_str(EVP_PKEY_CTX *ctx,
   			const char *type, const char *value)
   -182,6 +187,22 
   	return DH_generate_key(pkey->pkey.dh);
   	}
   
  +static int pkey_dh_derive(EVP_PKEY_CTX *ctx, unsigned
char *key, int *keylen)
  +	{
  +	int ret;
  +	if (!ctx->pkey || !ctx->peerkey)
  +		{
  +		DHerr(DH_F_PKEY_DH_DERIVE, DH_R_KEYS_NOT_SET);
  +		return 0;
  +		}
  +	ret = DH_compute_key(key,
ctx->peerkey->pkey.dh->pub_key,
  +							ctx->pkey->pkey.dh);
  +	if (ret < 0)
  +		return ret;
  +	*keylen = ret;
  +	return 1;
  +	}
  +
   const EVP_PKEY_METHOD dh_pkey_meth = 
   	{
   	EVP_PKEY_DH,
   -209,7 +230,8 
   
   	0,0,
   
  -	0,0,
  +	0,
  +	pkey_dh_derive,
   
   	pkey_dh_ctrl,
   	pkey_dh_ctrl_str
   .
  patch -p0 <<' .'
  Index: openssl/crypto/evp/evp.h
 
============================================================
================
  $ cvs diff -u -r1.140 -r1.141 evp.h
  --- openssl/crypto/evp/evp.h	13 Apr 2006 12:56:40
-0000	1.140
  +++ openssl/crypto/evp/evp.h	13 Apr 2006 20:16:55
-0000	1.141
   -933,6 +933,7 
   					EVP_PKEY_CTRL_MD, 0, (void *)md)
   
   #define EVP_PKEY_CTRL_MD		1
  +#define EVP_PKEY_CTRL_PEER_KEY		2
   
   #define EVP_PKEY_ALG_CTRL		0x1000
   
   -972,6 +973,10 
   			unsigned char *out, int *outlen,
   			const unsigned char *in, int inlen);
   
  +int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx);
  +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY
*peer);
  +int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char
*key, int *keylen);
  +
   typedef int EVP_PKEY_gen_cb(EVP_PKEY_CTX *ctx);
   
   int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx);
   -1018,6 +1023,7 
   #define EVP_F_EVP_PKEY_DECRYPT_OLD			 151
   #define EVP_F_EVP_PKEY_DERIVE				 153
   #define EVP_F_EVP_PKEY_DERIVE_INIT			 154
  +#define EVP_F_EVP_PKEY_DERIVE_SET_PEER			 155
   #define EVP_F_EVP_PKEY_ENCRYPT				 105
   #define EVP_F_EVP_PKEY_ENCRYPT_INIT			 139
   #define EVP_F_EVP_PKEY_ENCRYPT_OLD			 152
   -1061,6 +1067,7 
   #define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH		 138
   #define EVP_R_DECODE_ERROR				 114
   #define EVP_R_DIFFERENT_KEY_TYPES			 101
  +#define EVP_R_DIFFERENT_PARAMETERS			 153
   #define EVP_R_ENCODE_ERROR				 115
   #define EVP_R_EVP_PBE_CIPHERINIT_ERROR			 119
   #define EVP_R_EXPECTING_AN_RSA_KEY			 127
   -1080,6 +1087,7 
   #define EVP_R_NO_CIPHER_SET				 131
   #define EVP_R_NO_DIGEST_SET				 139
   #define EVP_R_NO_DSA_PARAMETERS				 116
  +#define EVP_R_NO_KEY_SET				 154
   #define EVP_R_NO_OPERATION_SET				 149
   #define EVP_R_NO_SIGN_FUNCTION_CONFIGURED		 104
   #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED		 105
   .
  patch -p0 <<' .'
  Index: openssl/crypto/evp/evp_err.c
 
============================================================
================
  $ cvs diff -u -r1.36 -r1.37 evp_err.c
  --- openssl/crypto/evp/evp_err.c	13 Apr 2006 12:56:40
-0000	1.36
  +++ openssl/crypto/evp/evp_err.c	13 Apr 2006 20:16:55
-0000	1.37
   -97,6 +97,7 
  
{ERR_FUNC(EVP_F_EVP_PKEY_DECRYPT_OLD),	"EVP_PKEY_decry
pt_old"},
  
{ERR_FUNC(EVP_F_EVP_PKEY_DERIVE),	"EVP_PKEY_DERIVE&qu
ot;},
  
{ERR_FUNC(EVP_F_EVP_PKEY_DERIVE_INIT),	"EVP_PKEY_DERIV
E_INIT"},
 
+{ERR_FUNC(EVP_F_EVP_PKEY_DERIVE_SET_PEER),	"EVP_PKEY_
DERIVE_SET_PEER"},
  
{ERR_FUNC(EVP_F_EVP_PKEY_ENCRYPT),	"EVP_PKEY_encrypt&
quot;},
  
{ERR_FUNC(EVP_F_EVP_PKEY_ENCRYPT_INIT),	"EVP_PKEY_encr
ypt_init"},
  
{ERR_FUNC(EVP_F_EVP_PKEY_ENCRYPT_OLD),	"EVP_PKEY_encry
pt_old"},
   -143,6 +144,7 
  
{ERR_REASON(EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH),"
data not multiple of block length"},
   {ERR_REASON(EVP_R_DECODE_ERROR)          ,"decode
error"},
   {ERR_REASON(EVP_R_DIFFERENT_KEY_TYPES)  
,"different key types"},
  +{ERR_REASON(EVP_R_DIFFERENT_PARAMETERS) 
,"different parameters"},
   {ERR_REASON(EVP_R_ENCODE_ERROR)          ,"encode
error"},
   {ERR_REASON(EVP_R_EVP_PBE_CIPHERINIT_ERROR),"evp
pbe cipherinit error"},
   {ERR_REASON(EVP_R_EXPECTING_AN_RSA_KEY) 
,"expecting an rsa key"},
   -162,6 +164,7 
   {ERR_REASON(EVP_R_NO_CIPHER_SET)         ,"no
cipher set"},
   {ERR_REASON(EVP_R_NO_DIGEST_SET)         ,"no
digest set"},
   {ERR_REASON(EVP_R_NO_DSA_PARAMETERS)     ,"no dsa
parameters"},
  +{ERR_REASON(EVP_R_NO_KEY_SET)            ,"no key
set"},
   {ERR_REASON(EVP_R_NO_OPERATION_SET)      ,"no
operation set"},
   {ERR_REASON(EVP_R_NO_SIGN_FUNCTION_CONFIGURED),"no
sign function configured"},
  
{ERR_REASON(EVP_R_NO_VERIFY_FUNCTION_CONFIGURED),"no
verify function configured"},
   .
  patch -p0 <<' .'
  Index: openssl/crypto/evp/pmeth_fn.c
 
============================================================
================
  $ cvs diff -u -r1.5 -r1.6 pmeth_fn.c
  --- openssl/crypto/evp/pmeth_fn.c	13 Apr 2006 12:56:40
-0000	1.5
  +++ openssl/crypto/evp/pmeth_fn.c	13 Apr 2006 20:16:56
-0000	1.6
   -262,6 +262,66 
   	return ret;
   	}
   
  +int EVP_PKEY_derive_set_peer(EVP_PKEY_CTX *ctx, EVP_PKEY
*peer)
  +	{
  +	int ret;
  +	if (!ctx || !ctx->pmeth || !ctx->pmeth->derive
|| !ctx->pmeth->ctrl)
  +		{
  +		EVPerr(EVP_F_EVP_PKEY_DERIVE_SET_PEER,
  +			EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
  +		return -2;
  +		}
  +	if (ctx->operation != EVP_PKEY_OP_DERIVE)
  +		{
  +		EVPerr(EVP_F_EVP_PKEY_DERIVE_SET_PEER,
  +					EVP_R_OPERATON_NOT_INITIALIZED);
  +		return -1;
  +		}
  +
  +	ret = ctx->pmeth->ctrl(ctx,
EVP_PKEY_CTRL_PEER_KEY, 0, peer);
  +
  +	if (ret <= 0)
  +		return ret;
  +
  +	if (ret == 2)
  +		return 1;
  +
  +	if (!ctx->pkey)
  +		{
  +		EVPerr(EVP_F_EVP_PKEY_DERIVE_SET_PEER,
EVP_R_NO_KEY_SET);
  +		return -1;
  +		}
  +
  +	if (ctx->pkey->type != peer->type)
  +		{
  +		EVPerr(EVP_F_EVP_PKEY_DERIVE_SET_PEER,
  +						EVP_R_DIFFERENT_KEY_TYPES);
  +		return -1;
  +		}
  +
  +	if (!EVP_PKEY_missing_parameters(peer) &&
  +		!EVP_PKEY_cmp_parameters(ctx->pkey, peer))
  +		{
  +		EVPerr(EVP_F_EVP_PKEY_DERIVE_SET_PEER,
  +						EVP_R_DIFFERENT_PARAMETERS);
  +		return -1;
  +		}
  +
  +	ctx->peerkey = peer;
  +
  +	ret = ctx->pmeth->ctrl(ctx,
EVP_PKEY_CTRL_PEER_KEY, 1, peer);
  +
  +	if (ret <= 0)
  +		{
  +		ctx->peerkey = NULL;
  +		return ret;
  +		}
  +
 
+	CRYPTO_add(&peer->references,1,CRYPTO_LOCK_EVP_PKEY
);
  +	return 1;
  +	}
  +
  +
   int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char
*key, int *pkeylen)
   	{
   	if (!ctx || !ctx->pmeth || !ctx->pmeth->derive)
   .
  patch -p0 <<' .'
  Index: openssl/crypto/evp/pmeth_lib.c
 
============================================================
================
  $ cvs diff -u -r1.13 -r1.14 pmeth_lib.c
  --- openssl/crypto/evp/pmeth_lib.c	13 Apr 2006 12:56:40
-0000	1.13
  +++ openssl/crypto/evp/pmeth_lib.c	13 Apr 2006 20:16:56
-0000	1.14
   -153,6 +153,8 
   		ctx->pmeth->cleanup(ctx);
   	if (ctx->pkey)
   		EVP_PKEY_free(ctx->pkey);
  +	if (ctx->peerkey)
  +		EVP_PKEY_free(ctx->peerkey);
   	OPENSSL_free(ctx);
   	}
   
   .
____________________________________________________________
__________
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 )