]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
eccdata: Use separate is_zero flag to represent the neutral element.
authorNiels Möller <nisse@lysator.liu.se>
Sun, 6 Jul 2014 20:14:58 +0000 (22:14 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Sun, 6 Jul 2014 20:14:58 +0000 (22:14 +0200)
ChangeLog
eccdata.c

index 591d33593b365e1232ae9df0e8cd0c2a9ff96f24..1128fd838b72aba2094f54d1b91d6660865cf947 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-07-06  Niels Möller  <nisse@lysator.liu.se>
+
+       * eccdata.c: Use separate is_zero flag to represent the neutral
+       element.
+
 2014-07-04  Niels Möller  <nisse@lysator.liu.se>
 
        * ecc-25519.c: New file.
index 0ccda716ab6a941d864c0e1b503ecda53f081efd..afcf6fcbf9ffc75edceb2f5a89ff63d6f3ed2bab 100644 (file)
--- a/eccdata.c
+++ b/eccdata.c
 
 #include "mini-gmp.c"
 
-/* Affine coordinates, for simplicity. Infinity point represented as x
-   == y == 0. FIXME: Doesn't quite work for Montgomery curves, where
-   (0,0) is a normal finite point. Shouldn't occur in these
-   computations, though. */
+/* Affine coordinates, for simplicity. Infinity point, i.e., te
+   neutral group element, is represented as is_zero. */
 struct ecc_point
 {
+  int is_zero;
   mpz_t x;
   mpz_t y;
 };
@@ -107,25 +106,26 @@ ecc_clear (struct ecc_point *p)
 static int
 ecc_zero_p (const struct ecc_point *p)
 {
-  return mpz_sgn (p->x) == 0 && mpz_sgn (p->y) == 0;
+  return p->is_zero;
 }
 
 static int
 ecc_equal_p (const struct ecc_point *p, const struct ecc_point *q)
 {
-  return mpz_cmp (p->x, q->x) == 0 && mpz_cmp (p->y, q->y) == 0;
+  return p->is_zero ? q->is_zero
+    : !q->is_zero && mpz_cmp (p->x, q->x) == 0 && mpz_cmp (p->y, q->y) == 0;
 }
 
 static void
 ecc_set_zero (struct ecc_point *r)
 {
-  mpz_set_ui (r->x, 0);
-  mpz_set_ui (r->y, 0);
+  r->is_zero = 1;
 }
 
 static void
 ecc_set (struct ecc_point *r, const struct ecc_point *p)
 {
+  r->is_zero = p->is_zero;
   mpz_set (r->x, p->x);
   mpz_set (r->y, p->y);
 }
@@ -186,9 +186,10 @@ ecc_dup (const struct ecc_curve *ecc,
       mpz_sub (y, y, p->y);
       mpz_mod (y, y, ecc->p);
 
+      r->is_zero = 0;
       mpz_swap (x, r->x);
       mpz_swap (y, r->y);
-  
+
       mpz_clear (m);
       mpz_clear (t);
       mpz_clear (x);
@@ -243,6 +244,7 @@ ecc_add (const struct ecc_curve *ecc,
       mpz_sub (y, y, p->y);
       mpz_mod (y, y, ecc->p);
 
+      r->is_zero = 0;
       mpz_swap (x, r->x);
       mpz_swap (y, r->y);
 
@@ -296,6 +298,7 @@ static void
 ecc_set_str (struct ecc_point *p,
             const char *x, const char *y)
 {
+  p->is_zero = 0;
   mpz_set_str (p->x, x, 16);
   mpz_set_str (p->y, y, 16);  
 }
@@ -506,7 +509,7 @@ ecc_curve_init (struct ecc_curve *ecc, unsigned bit_size)
     case 255:
       /* curve25519, y^2 = x^3 + 486662 x^2 + x (mod p), with p = 2^{255} - 19.
 
-        Acccording to http://cr.yp.to/papers.html#newelliptic, this
+        According to http://cr.yp.to/papers.html#newelliptic, this
         is birationally equivalent to the Edwards curve
 
           x^2 + y^2 = 1 + (121665/121666) x^2 y^2 (mod p).
@@ -644,20 +647,30 @@ ecc_mul_pippenger (const struct ecc_curve *ecc,
   mpz_clear (n);
 }
 
+static void
+ecc_point_out (FILE *f, const struct ecc_point *p)
+{
+  if (p->is_zero)
+    fprintf (f, "zero");
+  else
+    {
+       fprintf (stderr, "(");
+       mpz_out_str (stderr, 16, p->x);
+       fprintf (stderr, ",\n     ");
+       mpz_out_str (stderr, 16, (p)->y);
+       fprintf (stderr, ")");
+    }
+}
 #define ASSERT_EQUAL(p, q) do {                                                \
     if (!ecc_equal_p (p, q))                                           \
       {                                                                        \
        fprintf (stderr, "%s:%d: ASSERT_EQUAL (%s, %s) failed.\n",      \
                 __FILE__, __LINE__, #p, #q);                           \
-       fprintf (stderr, "p = (");                                      \
-       mpz_out_str (stderr, 16, (p)->x);                               \
-       fprintf (stderr, ",\n     ");                                   \
-       mpz_out_str (stderr, 16, (p)->y);                               \
-       fprintf (stderr, ")\nq = (");                                   \
-       mpz_out_str (stderr, 16, (q)->x);                               \
-       fprintf (stderr, ",\n     ");                                   \
-       mpz_out_str (stderr, 16, (q)->y);                               \
-       fprintf (stderr, ")\n");                                        \
+       fprintf (stderr, "p = ");                                       \
+       ecc_point_out (stderr, (p));                                    \
+       fprintf (stderr, "\nq = ");                                     \
+       ecc_point_out (stderr, (q));                                    \
+       fprintf (stderr, "\n");                                         \
        abort();                                                        \
       }                                                                        \
   } while (0)
@@ -667,11 +680,9 @@ ecc_mul_pippenger (const struct ecc_curve *ecc,
       {                                                                        \
        fprintf (stderr, "%s:%d: ASSERT_ZERO (%s) failed.\n",           \
                 __FILE__, __LINE__, #p);                               \
-       fprintf (stderr, "p = (");                                      \
-       mpz_out_str (stderr, 16, (p)->x);                               \
-       fprintf (stderr, ",\n     ");                                   \
-       mpz_out_str (stderr, 16, (p)->y);                               \
-       fprintf (stderr, ")\n");                                        \
+       fprintf (stderr, "p = ");                                       \
+       ecc_point_out (stderr, (p));                                    \
+       fprintf (stderr, "\n");                                         \
        abort();                                                        \
       }                                                                        \
   } while (0)