Commit 254ef80d authored by Bodo Möller's avatar Bodo Möller
Browse files

simplify asn1_flag

Submitted by: Nils Larsch
Reviewed by: Bodo Moeller
parent f9de8446
Loading
Loading
Loading
Loading
+16 −8
Original line number Original line Diff line number Diff line
@@ -4,12 +4,20 @@


 Changes between 0.9.7 and 0.9.8  [xx XXX 2002]
 Changes between 0.9.7 and 0.9.8  [xx XXX 2002]


  *) Add 'nid' and 'asn1_flag' members to EC_GROUP, and functions
  *) Add 'asn1_flag' and 'asn1_form' member to EC_GROUP with access
          EC_GROUP_get_nid()
     functions
          EC_GROUP_get_set_asn1_flag()
          EC_GROUP_set_asn1_flag()
          EC_GROUP_get_get_asn1_flag()
          EC_GROUP_get_asn1_flag()
     'nid' is an optional NID for named curves.  'asn1_flag'
          EC_GROUP_set_point_conversion_form()
     determines the encoding to be used for ASN1 purposes.
          EC_GROUP_get_point_conversion_form()
     These control ASN1 encoding details:
     - Curve are encoded explicitly unless asn1_flag has been set to
       OPENSSL_EC_NAMED_CURVE.
     - Points are encoded in compressed form by default; options for
       asn1_for are as for point2oct, namely
          POINT_CONVERSION_COMPRESSED
          POINT_CONVERSION_UNCOMPRESSED
          POINT_CONVERSION_HYBRID
     [Nils Larsch <nla@trustcenter.de>]
     [Nils Larsch <nla@trustcenter.de>]


  *) Add 'field_type' member to EC_METHOD, which holds the NID
  *) Add 'field_type' member to EC_METHOD, which holds the NID
@@ -69,8 +77,8 @@
     functions
     functions
          EC_GROUP_new_by_nid()
          EC_GROUP_new_by_nid()
          EC_GROUP_new_by_name()
          EC_GROUP_new_by_name()
     Also add a 'nid' field to EC_GROUP objects, which can be accessed
     Also add a 'curve_name' member to EC_GROUP objects, which can be
     via
     accessed via
         EC_GROUP_set_nid()
         EC_GROUP_set_nid()
         EC_GROUP_get_nid()
         EC_GROUP_get_nid()
     [Nils Larsch <nla@trustcenter.de, Bodo Moeller]
     [Nils Larsch <nla@trustcenter.de, Bodo Moeller]
+1 −2
Original line number Original line Diff line number Diff line
@@ -432,8 +432,7 @@ bad:
		ecdsa->group = EC_GROUP_new_by_name(curve_type);
		ecdsa->group = EC_GROUP_new_by_name(curve_type);
		if (named_curve)
		if (named_curve)
			EC_GROUP_set_asn1_flag(ecdsa->group, 
			EC_GROUP_set_asn1_flag(ecdsa->group, 
                                OPENSSL_EC_NAMED_CURVE |
						OPENSSL_EC_NAMED_CURVE);
				(EC_GROUP_get_asn1_flag(ecdsa->group) & ~0x3));
	}
	}
	else if (informat == FORMAT_ASN1)
	else if (informat == FORMAT_ASN1)
		ecdsa = d2i_ECDSAParameters_bio(in,NULL);
		ecdsa = d2i_ECDSAParameters_bio(in,NULL);
+3 −3
Original line number Original line Diff line number Diff line
@@ -145,7 +145,7 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey)
			goto err;
			goto err;
			}
			}


		if ((EC_GROUP_get_asn1_flag(ecdsa->group) & OPENSSL_EC_NAMED_CURVE) 
		if (EC_GROUP_get_asn1_flag(ecdsa->group)
                     && (nid = EC_GROUP_get_nid(ecdsa->group)))
                     && (nid = EC_GROUP_get_nid(ecdsa->group)))
			{
			{
			/* just set the OID */
			/* just set the OID */
@@ -312,8 +312,8 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
			if ((ecdsa->group = EC_GROUP_new_by_name(
			if ((ecdsa->group = EC_GROUP_new_by_name(
                             OBJ_obj2nid(a->parameter->value.object))) == NULL)
                             OBJ_obj2nid(a->parameter->value.object))) == NULL)
				goto err;
				goto err;
			EC_GROUP_set_asn1_flag(ecdsa->group, OPENSSL_EC_NAMED_CURVE |
			EC_GROUP_set_asn1_flag(ecdsa->group, 
                               (EC_GROUP_get_asn1_flag(ecdsa->group) & ~0x03));
						OPENSSL_EC_NAMED_CURVE);
			}
			}
			/* the case implicitlyCA is currently not implemented */
			/* the case implicitlyCA is currently not implemented */
		ret->save_parameters = 1;
		ret->save_parameters = 1;
+4 −5
Original line number Original line Diff line number Diff line
@@ -229,11 +229,7 @@ int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *);




/* ASN1 stuff */
/* ASN1 stuff */
#define OPENSSL_EC_EXPLICIT	0x001
#define OPENSSL_EC_NAMED_CURVE	0x001
#define OPENSSL_EC_NAMED_CURVE	0x002
#define OPENSSL_EC_COMPRESSED	0x010
#define OPENSSL_EC_UNCOMPRESSED	0x020
#define OPENSSL_EC_HYBRID	0x040


typedef struct ec_parameters_st ECPARAMETERS;
typedef struct ec_parameters_st ECPARAMETERS;
typedef struct ecpk_parameters_st ECPKPARAMETERS;
typedef struct ecpk_parameters_st ECPKPARAMETERS;
@@ -249,6 +245,9 @@ ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *, ECPKPARAMETERS *);
void EC_GROUP_set_asn1_flag(EC_GROUP *, int flag);
void EC_GROUP_set_asn1_flag(EC_GROUP *, int flag);
int EC_GROUP_get_asn1_flag(const EC_GROUP *);
int EC_GROUP_get_asn1_flag(const EC_GROUP *);


void EC_GROUP_set_point_conversion_form(EC_GROUP *, point_conversion_form_t);
point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *);

EC_GROUP *d2i_ECParameters(EC_GROUP **, const unsigned char **in, long len);
EC_GROUP *d2i_ECParameters(EC_GROUP **, const unsigned char **in, long len);
int i2d_ECParameters(const EC_GROUP *, unsigned char **out);
int i2d_ECParameters(const EC_GROUP *, unsigned char **out);


+6 −22
Original line number Original line Diff line number Diff line
@@ -394,7 +394,7 @@ err : if (!ok)
static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,
static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,
                                              ECPARAMETERS *param)
                                              ECPARAMETERS *param)
	{
	{
	int	ok=0, i;
	int	ok=0;
	size_t  len=0;
	size_t  len=0;
	ECPARAMETERS   *ret=NULL;
	ECPARAMETERS   *ret=NULL;
	BIGNUM	       *tmp=NULL;
	BIGNUM	       *tmp=NULL;
@@ -455,15 +455,7 @@ static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,
		goto err;
		goto err;
		}
		}


	i = EC_GROUP_get_asn1_flag(group);
	form = EC_GROUP_get_point_conversion_form(group);
	if (i | OPENSSL_EC_COMPRESSED)
		form = POINT_CONVERSION_COMPRESSED;
	else if (i | OPENSSL_EC_UNCOMPRESSED)
		form = POINT_CONVERSION_UNCOMPRESSED;
	else if (i | OPENSSL_EC_HYBRID)
		form = POINT_CONVERSION_HYBRID;
	else 
		goto err;


	len = EC_POINT_point2oct(group, point, form, NULL, len, NULL);
	len = EC_POINT_point2oct(group, point, form, NULL, len, NULL);
	if (len == 0)
	if (len == 0)
@@ -556,9 +548,7 @@ ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *group,
			ECPARAMETERS_free(ret->value.parameters);
			ECPARAMETERS_free(ret->value.parameters);
		}
		}


	tmp = EC_GROUP_get_asn1_flag(group);
	if (EC_GROUP_get_asn1_flag(group))

	if (tmp & OPENSSL_EC_NAMED_CURVE)
		{
		{
		/* use the asn1 OID to describe the
		/* use the asn1 OID to describe the
		 * the elliptic curve parameters
		 * the elliptic curve parameters
@@ -581,7 +571,7 @@ ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *group,
				ok = 0;
				ok = 0;
			}
			}
		}
		}
	else if (tmp & OPENSSL_EC_EXPLICIT)
	else
		{	
		{	
		/* use the ECPARAMETERS structure */
		/* use the ECPARAMETERS structure */
		ret->type = 1;
		ret->type = 1;
@@ -589,8 +579,6 @@ ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *group,
		     group, NULL)) == NULL)
		     group, NULL)) == NULL)
			ok = 0;
			ok = 0;
		}
		}
	else
		ok = 0;


	if (!ok)
	if (!ok)
		{
		{
@@ -759,9 +747,7 @@ EC_GROUP *EC_ASN1_pkparameters2group(const ECPKPARAMETERS *params)
			      EC_R_EC_GROUP_NEW_BY_NAME_FAILURE);
			      EC_R_EC_GROUP_NEW_BY_NAME_FAILURE);
			return NULL;
			return NULL;
			}
			}
		tmp = EC_GROUP_get_asn1_flag(ret);
		EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE);
		tmp = (tmp & ~0x03) | OPENSSL_EC_NAMED_CURVE;
		EC_GROUP_set_asn1_flag(ret, tmp);
		}
		}
	else if (params->type == 1)
	else if (params->type == 1)
		{ /* the parameters are given by a ECPARAMETERS
		{ /* the parameters are given by a ECPARAMETERS
@@ -772,9 +758,7 @@ EC_GROUP *EC_ASN1_pkparameters2group(const ECPKPARAMETERS *params)
			ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, ERR_R_EC_LIB);
			ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, ERR_R_EC_LIB);
			return NULL;
			return NULL;
			}
			}
		tmp = EC_GROUP_get_asn1_flag(ret);
		EC_GROUP_set_asn1_flag(ret, 0x0);
		tmp = (tmp & ~0x03) | OPENSSL_EC_EXPLICIT;
		EC_GROUP_set_asn1_flag(ret, tmp);
		}
		}
	else if (params->type == 2)
	else if (params->type == 2)
		{ /* implicitlyCA */
		{ /* implicitlyCA */
Loading