Prepare to provide EC_POINT_set_compressed_coordinates
authortb <tb@openbsd.org>
Tue, 20 Apr 2021 17:32:57 +0000 (17:32 +0000)
committertb <tb@openbsd.org>
Tue, 20 Apr 2021 17:32:57 +0000 (17:32 +0000)
ok jsing

lib/libcrypto/ec/ec.h
lib/libcrypto/ec/ec2_oct.c
lib/libcrypto/ec/ec_lcl.h
lib/libcrypto/ec/ec_oct.c
lib/libcrypto/ec/ecp_oct.c

index ff60e80..dece357 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec.h,v 1.21 2021/04/20 17:28:18 tb Exp $ */
+/* $OpenBSD: ec.h,v 1.22 2021/04/20 17:32:57 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -455,11 +455,20 @@ const EC_METHOD *EC_POINT_method_of(const EC_POINT *point);
 int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point);
 
 #if defined(LIBRESSL_INTERNAL)
+
 int EC_POINT_set_Jprojective_coordinates(const EC_GROUP *group, EC_POINT *p,
     const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx);
 int EC_POINT_get_Jprojective_coordinates(const EC_GROUP *group,
-       const EC_POINT *p, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx);
+    const EC_POINT *p, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx);
+int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p,
+    const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx);
+int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *p,
+    BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
+int EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *p,
+    const BIGNUM *x, int y_bit, BN_CTX *ctx);
+
 #else
+
 /** Sets the jacobian projective coordinates of a EC_POINT over GFp
  *  \param  group  underlying EC_GROUP object
  *  \param  p      EC_POINT object
@@ -483,14 +492,7 @@ int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
  */
 int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group,
        const EC_POINT *p, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx);
-#endif
 
-#if defined(LIBRESSL_INTERNAL)
-int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *p,
-    const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx);
-int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *p,
-    BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
-#else
 /** Sets the affine coordinates of a EC_POINT over GFp
  *  \param  group  underlying EC_GROUP object
  *  \param  p      EC_POINT object
@@ -512,7 +514,6 @@ int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
  */
 int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group,
        const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
-#endif
 
 /** Sets the x9.62 compressed coordinates of a EC_POINT over GFp
  *  \param  group  underlying EC_GROUP object
@@ -526,7 +527,6 @@ int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
        const BIGNUM *x, int y_bit, BN_CTX *ctx);
 
 #ifndef OPENSSL_NO_EC2M
-#if !defined(LIBRESSL_INTERNAL)
 /** Sets the affine coordinates of a EC_POINT over GF2m
  *  \param  group  underlying EC_GROUP object
  *  \param  p      EC_POINT object
@@ -548,7 +548,6 @@ int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p,
  */
 int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group,
        const EC_POINT *p, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
-#endif
 
 /** Sets the x9.62 compressed coordinates of a EC_POINT over GF2m
  *  \param  group  underlying EC_GROUP object
@@ -560,7 +559,9 @@ int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group,
  */
 int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p,
        const BIGNUM *x, int y_bit, BN_CTX *ctx);
-#endif
+#endif /* OPENSSL_NO_EC2M */
+#endif /* !LIBRESSL_INTERNAL */
+
 /** Encodes a EC_POINT object to a octet string
  *  \param  group  underlying EC_GROUP object
  *  \param  p      EC_POINT object
index 28eb7a0..ad38991 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec2_oct.c,v 1.14 2021/04/20 17:16:37 tb Exp $ */
+/* $OpenBSD: ec2_oct.c,v 1.15 2021/04/20 17:32:57 tb Exp $ */
 /* ====================================================================
  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
  *
@@ -366,10 +366,10 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
        }
        if (form == POINT_CONVERSION_COMPRESSED) {
                /*
-                * EC_POINT_set_compressed_coordinates_GF2m checks that the
+                * EC_POINT_set_compressed_coordinates checks that the
                 * point is on the curve as required by X9.62.
                 */
-               if (!EC_POINT_set_compressed_coordinates_GF2m(group, point, x, y_bit, ctx))
+               if (!EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx))
                        goto err;
        } else {
                if (!BN_bin2bn(buf + 1 + field_len, field_len, y))
index 7570cdc..a0343aa 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_lcl.h,v 1.16 2021/04/20 17:28:18 tb Exp $ */
+/* $OpenBSD: ec_lcl.h,v 1.17 2021/04/20 17:32:57 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -121,12 +121,13 @@ struct ec_method_st {
        void (*point_clear_finish)(EC_POINT *);
        int (*point_copy)(EC_POINT *, const EC_POINT *);
 
-       /* used by EC_POINT_set_to_infinity,
+       /*
+        * used by EC_POINT_set_to_infinity,
         * EC_POINT_set_Jprojective_coordinates,
         * EC_POINT_get_Jprojective_coordinates,
         * EC_POINT_set_affine_coordinates,
         * EC_POINT_get_affine_coordinates,
-        * EC_POINT_set_compressed_coordinates_GFp, ..._GF2m:
+        * EC_POINT_set_compressed_coordinates:
         */
        int (*point_set_to_infinity)(const EC_GROUP *, EC_POINT *);
        int (*point_set_Jprojective_coordinates)(const EC_GROUP *, EC_POINT *,
index a285c81..a3a826d 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ec_oct.c,v 1.6 2020/12/04 08:55:30 tb Exp $ */
+/* $OpenBSD: ec_oct.c,v 1.7 2021/04/20 17:32:57 tb Exp $ */
 /*
  * Originally written by Bodo Moeller for the OpenSSL project.
  */
@@ -70,9 +70,9 @@
 
 #include "ec_lcl.h"
 
-int 
-EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP * group, EC_POINT * point,
-    const BIGNUM * x, int y_bit, BN_CTX * ctx)
+int
+EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point,
+    const BIGNUM *x, int y_bit, BN_CTX *ctx)
 {
        if (group->meth->point_set_compressed_coordinates == 0
            && !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
@@ -108,40 +108,23 @@ EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP * group, EC_POINT * point
        return 1;
 }
 
+int
+EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point,
+    const BIGNUM *x, int y_bit, BN_CTX *ctx)
+{
+       return EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx);
+}
+
 #ifndef OPENSSL_NO_EC2M
-int 
-EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP * group, EC_POINT * point,
-    const BIGNUM * x, int y_bit, BN_CTX * ctx)
+int
+EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point,
+    const BIGNUM *x, int y_bit, BN_CTX *ctx)
 {
-       if (group->meth->point_set_compressed_coordinates == 0
-           && !(group->meth->flags & EC_FLAGS_DEFAULT_OCT)) {
-               ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-               return 0;
-       }
-       if (group->meth != point->meth) {
-               ECerror(EC_R_INCOMPATIBLE_OBJECTS);
-               return 0;
-       }
-       if (group->meth->flags & EC_FLAGS_DEFAULT_OCT) {
-               if (group->meth->field_type == NID_X9_62_prime_field)
-                       return ec_GFp_simple_set_compressed_coordinates(
-                           group, point, x, y_bit, ctx);
-               else
-                       return ec_GF2m_simple_set_compressed_coordinates(
-                           group, point, x, y_bit, ctx);
-       }
-       if (!group->meth->point_set_compressed_coordinates(group, point, x,
-           y_bit, ctx))
-               return 0;
-       if (EC_POINT_is_on_curve(group, point, ctx) <= 0) {
-               ECerror(EC_R_POINT_IS_NOT_ON_CURVE);
-               return 0;
-       }
-       return 1;
+       return EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx);
 }
 #endif
 
-size_t 
+size_t
 EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point,
     point_conversion_form_t form,
     unsigned char *buf, size_t len, BN_CTX *ctx)
@@ -173,8 +156,7 @@ EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point,
        return group->meth->point2oct(group, point, form, buf, len, ctx);
 }
 
-
-int 
+int
 EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point,
     const unsigned char *buf, size_t len, BN_CTX *ctx)
 {
index 9012204..177bbe1 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ecp_oct.c,v 1.13 2021/04/20 17:16:38 tb Exp $ */
+/* $OpenBSD: ecp_oct.c,v 1.14 2021/04/20 17:32:57 tb Exp $ */
 /* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de>
  * for the OpenSSL project.
  * Includes code written by Bodo Moeller for the OpenSSL project.
@@ -363,10 +363,10 @@ ec_GFp_simple_oct2point(const EC_GROUP * group, EC_POINT * point,
        }
        if (form == POINT_CONVERSION_COMPRESSED) {
                /*
-                * EC_POINT_set_compressed_coordinates_GFp checks that the point
+                * EC_POINT_set_compressed_coordinates checks that the point
                 * is on the curve as required by X9.62.
                 */
-               if (!EC_POINT_set_compressed_coordinates_GFp(group, point, x, y_bit, ctx))
+               if (!EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx))
                        goto err;
        } else {
                if (!BN_bin2bn(buf + 1 + field_len, field_len, y))