simplify asn1_flag
Submitted by: Nils Larsch Reviewed by: Bodo Moeller
This commit is contained in:
parent
f9de8446a0
commit
254ef80db1
24
CHANGES
24
CHANGES
@ -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]
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -144,8 +144,9 @@ struct ec_group_st {
|
|||||||
EC_POINT *generator; /* optional */
|
EC_POINT *generator; /* optional */
|
||||||
BIGNUM order, cofactor;
|
BIGNUM order, cofactor;
|
||||||
|
|
||||||
int nid; /* optional NID for named curve */
|
int curve_name;/* optional NID for named curve */
|
||||||
int asn1_flag; /* flag to control the asn1 encoding */
|
int asn1_flag; /* flag to control the asn1 encoding */
|
||||||
|
point_conversion_form_t asn1_form;
|
||||||
|
|
||||||
void *extra_data;
|
void *extra_data;
|
||||||
void *(*extra_data_dup_func)(void *);
|
void *(*extra_data_dup_func)(void *);
|
||||||
|
@ -98,8 +98,9 @@ EC_GROUP *EC_GROUP_new(const EC_METHOD *meth)
|
|||||||
BN_init(&ret->order);
|
BN_init(&ret->order);
|
||||||
BN_init(&ret->cofactor);
|
BN_init(&ret->cofactor);
|
||||||
|
|
||||||
ret->nid = 0;
|
ret->curve_name = 0;
|
||||||
ret->asn1_flag = OPENSSL_EC_EXPLICIT | OPENSSL_EC_COMPRESSED;
|
ret->asn1_flag = 0;
|
||||||
|
ret->asn1_form = POINT_CONVERSION_COMPRESSED;
|
||||||
|
|
||||||
ret->seed = NULL;
|
ret->seed = NULL;
|
||||||
ret->seed_len = 0;
|
ret->seed_len = 0;
|
||||||
@ -214,8 +215,9 @@ int EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src)
|
|||||||
if (!BN_copy(&dest->order, &src->order)) return 0;
|
if (!BN_copy(&dest->order, &src->order)) return 0;
|
||||||
if (!BN_copy(&dest->cofactor, &src->cofactor)) return 0;
|
if (!BN_copy(&dest->cofactor, &src->cofactor)) return 0;
|
||||||
|
|
||||||
dest->nid = src->nid;
|
dest->curve_name = src->curve_name;
|
||||||
dest->asn1_flag = src->asn1_flag;
|
dest->asn1_flag = src->asn1_flag;
|
||||||
|
dest->asn1_form = src->asn1_form;
|
||||||
|
|
||||||
if (src->seed)
|
if (src->seed)
|
||||||
{
|
{
|
||||||
@ -308,13 +310,13 @@ int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx)
|
|||||||
|
|
||||||
void EC_GROUP_set_nid(EC_GROUP *group, int nid)
|
void EC_GROUP_set_nid(EC_GROUP *group, int nid)
|
||||||
{
|
{
|
||||||
group->nid = nid;
|
group->curve_name = nid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int EC_GROUP_get_nid(const EC_GROUP *group)
|
int EC_GROUP_get_nid(const EC_GROUP *group)
|
||||||
{
|
{
|
||||||
return group->nid;
|
return group->curve_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -330,6 +332,19 @@ int EC_GROUP_get_asn1_flag(const EC_GROUP *group)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EC_GROUP_set_point_conversion_form(EC_GROUP *group,
|
||||||
|
point_conversion_form_t form)
|
||||||
|
{
|
||||||
|
group->asn1_form = form;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *group)
|
||||||
|
{
|
||||||
|
return group->asn1_form;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
|
int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
|
||||||
{
|
{
|
||||||
if (group->meth->group_set_curve_GFp == 0)
|
if (group->meth->group_set_curve_GFp == 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user