Enhance DH dup functions.
Make DHparams_dup work properly with X9.42 DH parameters.
This commit is contained in:
		@@ -458,34 +458,77 @@ static int dh_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
 | 
				
			|||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
 | 
					static int int_dh_bn_cpy(BIGNUM **dst, const BIGNUM *src)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	BIGNUM *a;
 | 
						BIGNUM *a;
 | 
				
			||||||
 | 
						if (src)
 | 
				
			||||||
	if ((a=BN_dup(from->pkey.dh->p)) == NULL)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	if (to->pkey.dh->p != NULL)
 | 
					 | 
				
			||||||
		BN_free(to->pkey.dh->p);
 | 
					 | 
				
			||||||
	to->pkey.dh->p=a;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ((a=BN_dup(from->pkey.dh->g)) == NULL)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	if (to->pkey.dh->g != NULL)
 | 
					 | 
				
			||||||
		BN_free(to->pkey.dh->g);
 | 
					 | 
				
			||||||
	to->pkey.dh->g=a;
 | 
					 | 
				
			||||||
	if (from->ameth == &dhx_asn1_meth)
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		a = BN_dup(from->pkey.dh->q);
 | 
							a = BN_dup(src);
 | 
				
			||||||
		if (!a)
 | 
							if (!a)
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		if (to->pkey.dh->q)
 | 
					 | 
				
			||||||
			BN_free(to->pkey.dh->q);
 | 
					 | 
				
			||||||
		to->pkey.dh->q = a;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						else 
 | 
				
			||||||
 | 
							a = NULL;
 | 
				
			||||||
 | 
						if (*dst)
 | 
				
			||||||
 | 
							BN_free(*dst);
 | 
				
			||||||
 | 
						*dst = a;
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int int_dh_param_copy(DH *to, const DH *from, int is_x942)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						if (is_x942 == -1)
 | 
				
			||||||
 | 
							is_x942 = !!from->q;
 | 
				
			||||||
 | 
						if (!int_dh_bn_cpy(&to->p, from->p))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						if (!int_dh_bn_cpy(&to->g, from->g))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						if (is_x942)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							if (!int_dh_bn_cpy(&to->q, from->q))
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							if (!int_dh_bn_cpy(&to->j, from->j))
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							if(to->seed)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								OPENSSL_free(to->seed);
 | 
				
			||||||
 | 
								to->seed = NULL;
 | 
				
			||||||
 | 
								to->seedlen = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							if (from->seed)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								to->seed = BUF_memdup(from->seed, from->seedlen);
 | 
				
			||||||
 | 
								if (!to->seed)
 | 
				
			||||||
 | 
									return 0;
 | 
				
			||||||
 | 
								to->seedlen = from->seedlen;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							to->length = from->length;
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DH *DHparams_dup(DH *dh)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						DH *ret;
 | 
				
			||||||
 | 
						ret = DH_new();
 | 
				
			||||||
 | 
						if (!ret)
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						if (!int_dh_param_copy(ret, dh, -1))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							DH_free(ret);
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int dh_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						return int_dh_param_copy(to->pkey.dh, from->pkey.dh,
 | 
				
			||||||
 | 
									 from->ameth == &dhx_asn1_meth);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int dh_missing_parameters(const EVP_PKEY *a)
 | 
					static int dh_missing_parameters(const EVP_PKEY *a)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	if (!a->pkey.dh->p || !a->pkey.dh->g)
 | 
						if (!a->pkey.dh->p || !a->pkey.dh->g)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,11 +87,6 @@ ASN1_SEQUENCE_cb(DHparams, dh_cb) = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DH, DHparams, DHparams)
 | 
					IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DH, DHparams, DHparams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DH *DHparams_dup(DH *dh)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
	return ASN1_item_dup(ASN1_ITEM_rptr(DHparams), dh);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Internal only structures for handling X9.42 DH: this gets translated
 | 
					/* Internal only structures for handling X9.42 DH: this gets translated
 | 
				
			||||||
 * to or from a DH structure straight away.
 | 
					 * to or from a DH structure straight away.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user