Prepare to provide EC_GROUP_{get,set}_curve(3)
authortb <tb@openbsd.org>
Tue, 20 Apr 2021 17:04:13 +0000 (17:04 +0000)
committertb <tb@openbsd.org>
Tue, 20 Apr 2021 17:04:13 +0000 (17:04 +0000)
There are numerous functions in ec/ that exist with _GF2m and _GFp
variants for no good reason.  The code of both variants is the same.
The EC_METHODs contain a pointer to the appropriate version.  This
commit hides the _GF2m and _GFp variants from internal use and
provides versions that work for both curve types. These will be made
public in an upcoming library bump.

Similar to part of OpenSSL commit 8e3cced75fb5fee5da59ebef9605d403a999391b

ok jsing

lib/libcrypto/ec/ec.h
lib/libcrypto/ec/ec_asn1.c
lib/libcrypto/ec/ec_cvt.c
lib/libcrypto/ec/ec_lcl.h
lib/libcrypto/ec/ec_lib.c
lib/libcrypto/ec/eck_prn.c

index a95d99f..a6ae3e3 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec.h,v 1.18 2019/09/29 10:09:09 tb Exp $ */
+/* $OpenBSD: ec.h,v 1.19 2021/04/20 17:04:13 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -280,6 +280,12 @@ unsigned char *EC_GROUP_get0_seed(const EC_GROUP *x);
 size_t EC_GROUP_get_seed_len(const EC_GROUP *);
 size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len);
 
+#if defined(LIBRESSL_INTERNAL)
+int EC_GROUP_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
+    const BIGNUM *b, BN_CTX *ctx);
+int EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b,
+    BN_CTX *ctx);
+#else
 /** Sets the parameter of a ec over GFp defined by y^2 = x^3 + a*x + b
  *  \param  group  EC_GROUP object
  *  \param  p      BIGNUM with the prime number
@@ -321,6 +327,8 @@ int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, c
  */
 int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);
 #endif
+#endif
+
 /** Returns the number of bits needed to represent a field element 
  *  \param  group  EC_GROUP object
  *  \return number of bits needed to represent a field element
index f69dd02..65bb007 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_asn1.c,v 1.31 2018/09/01 16:23:15 tb Exp $ */
+/* $OpenBSD: ec_asn1.c,v 1.32 2021/04/20 17:04:13 tb Exp $ */
 /*
  * Written by Nils Larsch for the OpenSSL project.
  */
@@ -709,7 +709,7 @@ ec_asn1_group2fieldid(const EC_GROUP * group, X9_62_FIELDID * field)
                        goto err;
                }
                /* the parameters are specified by the prime number p */
-               if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL)) {
+               if (!EC_GROUP_get_curve(group, tmp, NULL, NULL, NULL)) {
                        ECerror(ERR_R_EC_LIB);
                        goto err;
                }
@@ -819,14 +819,14 @@ ec_asn1_group2curve(const EC_GROUP * group, X9_62_CURVE * curve)
 
        /* get a and b */
        if (nid == NID_X9_62_prime_field) {
-               if (!EC_GROUP_get_curve_GFp(group, NULL, tmp_1, tmp_2, NULL)) {
+               if (!EC_GROUP_get_curve(group, NULL, tmp_1, tmp_2, NULL)) {
                        ECerror(ERR_R_EC_LIB);
                        goto err;
                }
        }
 #ifndef OPENSSL_NO_EC2M
        else {                  /* nid == NID_X9_62_characteristic_two_field */
-               if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) {
+               if (!EC_GROUP_get_curve(group, NULL, tmp_1, tmp_2, NULL)) {
                        ECerror(ERR_R_EC_LIB);
                        goto err;
                }
index a098206..05c7dd1 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_cvt.c,v 1.6 2014/07/10 22:45:57 jsing Exp $ */
+/* $OpenBSD: ec_cvt.c,v 1.7 2021/04/20 17:04:13 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -112,7 +112,7 @@ EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b,
        if (ret == NULL)
                return NULL;
 
-       if (!EC_GROUP_set_curve_GFp(ret, p, a, b, ctx)) {
+       if (!EC_GROUP_set_curve(ret, p, a, b, ctx)) {
                unsigned long err;
 
                err = ERR_peek_last_error();
@@ -136,7 +136,7 @@ EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b,
                if (ret == NULL)
                        return NULL;
 
-               if (!EC_GROUP_set_curve_GFp(ret, p, a, b, ctx)) {
+               if (!EC_GROUP_set_curve(ret, p, a, b, ctx)) {
                        EC_GROUP_clear_free(ret);
                        return NULL;
                }
@@ -158,7 +158,7 @@ EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b,
        if (ret == NULL)
                return NULL;
 
-       if (!EC_GROUP_set_curve_GF2m(ret, p, a, b, ctx)) {
+       if (!EC_GROUP_set_curve(ret, p, a, b, ctx)) {
                EC_GROUP_clear_free(ret);
                return NULL;
        }
index 8948e51..f689428 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_lcl.h,v 1.13 2019/01/19 01:12:48 tb Exp $ */
+/* $OpenBSD: ec_lcl.h,v 1.14 2021/04/20 17:04:13 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -105,8 +105,7 @@ struct ec_method_st {
        void (*group_clear_finish)(EC_GROUP *);
        int (*group_copy)(EC_GROUP *, const EC_GROUP *);
 
-       /* used by EC_GROUP_set_curve_GFp, EC_GROUP_get_curve_GFp, */
-       /* EC_GROUP_set_curve_GF2m, and EC_GROUP_get_curve_GF2m: */
+       /* used by EC_GROUP_{get,set}_curve */
        int (*group_set_curve)(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
        int (*group_get_curve)(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
 
index 3442c7a..67db821 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_lib.c,v 1.33 2020/12/04 08:55:30 tb Exp $ */
+/* $OpenBSD: ec_lib.c,v 1.34 2021/04/20 17:04:13 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -488,10 +488,9 @@ EC_GROUP_get_seed_len(const EC_GROUP * group)
        return group->seed_len;
 }
 
-
-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(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
+    const BIGNUM *b, BN_CTX *ctx)
 {
        if (group->meth->group_set_curve == 0) {
                ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
@@ -500,10 +499,9 @@ EC_GROUP_set_curve_GFp(EC_GROUP * group, const BIGNUM * p, const BIGNUM * a,
        return group->meth->group_set_curve(group, p, a, b, ctx);
 }
 
-
-int 
-EC_GROUP_get_curve_GFp(const EC_GROUP * group, BIGNUM * p, BIGNUM * a,
-    BIGNUM * b, BN_CTX * ctx)
+int
+EC_GROUP_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b,
+    BN_CTX *ctx)
 {
        if (group->meth->group_get_curve == 0) {
                ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
@@ -512,28 +510,33 @@ EC_GROUP_get_curve_GFp(const EC_GROUP * group, BIGNUM * p, BIGNUM * a,
        return group->meth->group_get_curve(group, p, a, b, ctx);
 }
 
-#ifndef OPENSSL_NO_EC2M
-int 
-EC_GROUP_set_curve_GF2m(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 == 0) {
-               ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-               return 0;
-       }
-       return group->meth->group_set_curve(group, p, a, b, ctx);
+       return EC_GROUP_set_curve(group, p, a, b, ctx);
 }
 
+int
+EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b,
+    BN_CTX *ctx)
+{
+       return EC_GROUP_get_curve(group, p, a, b, ctx);
+}
 
-int 
-EC_GROUP_get_curve_GF2m(const EC_GROUP * group, BIGNUM * p, BIGNUM * a,
-    BIGNUM * b, BN_CTX * ctx)
+#ifndef OPENSSL_NO_EC2M
+int
+EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
+    const BIGNUM *b, BN_CTX *ctx)
 {
-       if (group->meth->group_get_curve == 0) {
-               ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-               return 0;
-       }
-       return group->meth->group_get_curve(group, p, a, b, ctx);
+       return EC_GROUP_set_curve(group, p, a, b, ctx);
+}
+
+int
+EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a,
+    BIGNUM *b, BN_CTX *ctx)
+{
+       return EC_GROUP_get_curve(group, p, a, b, ctx);
 }
 #endif
 
index be57d87..b17908d 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: eck_prn.c,v 1.15 2018/07/15 16:27:39 tb Exp $ */
+/* $OpenBSD: eck_prn.c,v 1.16 2021/04/20 17:04:13 tb Exp $ */
 /*
  * Written by Nils Larsch for the OpenSSL project.
  */
@@ -216,14 +216,14 @@ ECPKParameters_print(BIO * bp, const EC_GROUP * x, int off)
                }
 #ifndef OPENSSL_NO_EC2M
                if (is_char_two) {
-                       if (!EC_GROUP_get_curve_GF2m(x, p, a, b, ctx)) {
+                       if (!EC_GROUP_get_curve(x, p, a, b, ctx)) {
                                reason = ERR_R_EC_LIB;
                                goto err;
                        }
                } else          /* prime field */
 #endif
                {
-                       if (!EC_GROUP_get_curve_GFp(x, p, a, b, ctx)) {
+                       if (!EC_GROUP_get_curve(x, p, a, b, ctx)) {
                                reason = ERR_R_EC_LIB;
                                goto err;
                        }