]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
Reduce scratch need for ecc_add_jja
authorNiels Möller <nisse@lysator.liu.se>
Sun, 8 Nov 2020 10:38:13 +0000 (11:38 +0100)
committerNiels Möller <nisse@lysator.liu.se>
Sun, 8 Nov 2020 10:38:13 +0000 (11:38 +0100)
ChangeLog
ecc-add-jja.c
ecc-internal.h

index 8846f1d135a98522c3cbc3dbf145875918d7abec..1479cec5be55eeb2216bc6b36743c32a556b75d6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2020-11-08  Niels Möller  <nisse@lysator.liu.se>
 
+       * ecc-add-jja.c (ecc_add_jja): Reduce scratch need.
+       * ecc-internal.h (ECC_ADD_JJA_ITCH): Now 5*size.
+
        * ecc-add-jjj.c (ecc_add_jjj): Reduce scratch need.
        * ecc-internal.h (ECC_ADD_JJJ_ITCH): Now 6*size.
 
index a79f995e54f7f7f8f173070dd08c6bae4433df26..570ea3455ee6b4faff9b40a53011bac879939a76 100644 (file)
@@ -54,6 +54,16 @@ ecc_add_jja (const struct ecc_curve *ecc,
             mp_limb_t *r, const mp_limb_t *p, const mp_limb_t *q,
             mp_limb_t *scratch)
 {
+#define x1  p
+#define y1 (p + ecc->p.size)
+#define z1 (p + 2*ecc->p.size)
+#define x2  q
+#define y2 (q + ecc->p.size)
+
+#define x3  r
+#define y3 (r + ecc->p.size)
+#define z3 (r + 2*ecc->p.size)
+
   /* Formulas, from djb,
      http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b):
 
@@ -73,52 +83,49 @@ ecc_add_jja (const struct ecc_curve *ecc,
   */
 #define zz  scratch
 #define h  (scratch + ecc->p.size)
-#define hh (scratch + 2*ecc->p.size)
-#define w  (scratch + 3*ecc->p.size)
-#define j  (scratch + 4*ecc->p.size)
-#define v   scratch
-
-#define x1  p
-#define y1 (p + ecc->p.size)
-#define z1 (p + 2*ecc->p.size)
-#define x2  q
-#define y2 (q + ecc->p.size)
+#define w (scratch + 2*ecc->p.size)
+#define hh zz
+#define i zz
+#define v zz
+#define j h
+#define tp (scratch + 3*ecc->p.size)
 
   /* zz */
-  ecc_mod_sqr (&ecc->p, zz, z1, zz);
+  ecc_mod_sqr (&ecc->p, zz, z1, tp);   /* zz */
   /* h*/
-  ecc_mod_mul (&ecc->p, h, x2, zz, h);
+  ecc_mod_mul (&ecc->p, h, x2, zz, tp);        /* zz, h */
   ecc_mod_sub (&ecc->p, h, h, x1);
-  /* hh */
-  ecc_mod_sqr (&ecc->p, hh, h, hh);
   /* Do z^3 early, store at w. */
-  ecc_mod_mul (&ecc->p, w, zz, z1, w);
-  /* z_3, use j area for scratch */
-  ecc_mod_add (&ecc->p, r + 2*ecc->p.size, p + 2*ecc->p.size, h);
-  ecc_mod_sqr (&ecc->p, j, r + 2*ecc->p.size, j);
-  ecc_mod_sub (&ecc->p, j, j, zz);
-  ecc_mod_sub (&ecc->p, r + 2*ecc->p.size, j, hh);
+  ecc_mod_mul (&ecc->p, w, zz, z1, tp);        /* zz, h, w */
+  /* z_3 */
+  ecc_mod_add (&ecc->p, z3, z1, h);
+  ecc_mod_sqr (&ecc->p, z3, z3, tp);
+  ecc_mod_sub (&ecc->p, z3, z3, zz);   /* h, w */
+  /* hh */
+  ecc_mod_sqr (&ecc->p, hh, h, tp);    /* h, w, hh */
+  ecc_mod_sub (&ecc->p, z3, z3, hh);
   
   /* w */
-  ecc_mod_mul (&ecc->p, j, y2, w, j);
-  ecc_mod_sub (&ecc->p, w, j, y1);
-  ecc_mod_mul_1 (&ecc->p, w, w, 2);
+  ecc_mod_mul (&ecc->p, w, y2, w, tp);
+  ecc_mod_sub (&ecc->p, w, w, y1);
+  ecc_mod_add (&ecc->p, w, w, w);
   
-  /* i replaces hh, j */
-  ecc_mod_mul_1 (&ecc->p, hh, hh, 4);
-  ecc_mod_mul (&ecc->p, j, hh, h, j);
-
-  /* v */
-  ecc_mod_mul (&ecc->p, v, x1, hh, v);
-
-  /* x_3, use (h, hh) as sqratch */  
-  ecc_mod_sqr (&ecc->p, h, w, h);
-  ecc_mod_sub (&ecc->p, r, h, j);
-  ecc_mod_submul_1 (&ecc->p, r, v, 2);
-
-  /* y_3, use (h, hh) as sqratch */
-  ecc_mod_mul (&ecc->p, h, y1, j, h); /* frees j */
-  ecc_mod_sub (&ecc->p, r + ecc->p.size, v, r);
-  ecc_mod_mul (&ecc->p, r + ecc->p.size, r + ecc->p.size, w, j);
-  ecc_mod_submul_1 (&ecc->p, r + ecc->p.size, h, 2);
+  /* i replaces hh */
+  ecc_mod_mul_1 (&ecc->p, i, hh, 4);   /* h, w, i */
+  /* j replaces h */
+  ecc_mod_mul (&ecc->p, j, i, h, tp);  /* w, i, j */
+
+  /* v replaces i */
+  ecc_mod_mul (&ecc->p, v, x1, i, tp);
+
+  /* x_3 */
+  ecc_mod_sqr (&ecc->p, x3, w, tp);
+  ecc_mod_sub (&ecc->p, x3, x3, j);
+  ecc_mod_submul_1 (&ecc->p, x3, v, 2);
+
+  /* y_3 */
+  ecc_mod_mul (&ecc->p, j, y1, j, tp);
+  ecc_mod_sub (&ecc->p, y3, v, x3);
+  ecc_mod_mul (&ecc->p, y3, y3, w, tp);
+  ecc_mod_submul_1 (&ecc->p, y3, j, 2);
 }
index 219135021089bd4e36b2627149895d1eae245307..ed725d9c5a70cc1b23e4de2d92baa772136e278e 100644 (file)
@@ -447,7 +447,7 @@ curve448_eh_to_x (mp_limb_t *xp, const mp_limb_t *p,
 #define ECC_DUP_JJ_ITCH(size) (4*(size))
 #define ECC_DUP_EH_ITCH(size) (3*(size))
 #define ECC_DUP_TH_ITCH(size) (3*(size))
-#define ECC_ADD_JJA_ITCH(size) (6*(size))
+#define ECC_ADD_JJA_ITCH(size) (5*(size))
 #define ECC_ADD_JJJ_ITCH(size) (6*(size))
 #define ECC_ADD_EH_ITCH(size) (4*(size))
 #define ECC_ADD_EHH_ITCH(size) (4*(size))