* mpi/ec-nist.c (_gcry_mpi_ec_nist192_mod): Don't do MPN_NORMALIZE
when GCRYECC_FLAG_LEAST_LEAK.
(_gcry_mpi_ec_nist224_mod): Likewise.
(_gcry_mpi_ec_nist256_mod): Likewise.
(_gcry_mpi_ec_nist384_mod): Likewise.
(_gcry_mpi_ec_nist521_mod): Likewise.
* mpi/ec.c (ec_mod): Keep ->NLIMBS when GCRYECC_FLAG_LEAST_LEAK.

--

GnuPG-bug-id: 7519
Signed-off-by: NIIBE Yutaka <gni...@fsij.org>
---
 mpi/ec-nist.c | 16 +++++++++++-----
 mpi/ec.c      |  6 +++++-
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/mpi/ec-nist.c b/mpi/ec-nist.c
index bf245b6c..36357476 100644
--- a/mpi/ec-nist.c
+++ b/mpi/ec-nist.c
@@ -33,6 +33,7 @@
 #include "ec-context.h"
 #include "ec-inline.h"
 #include "const-time.h"
+#include "cipher.h" /* for GCRYECC_FLAG_LEAST_LEAK */
 
 
 static inline
@@ -145,7 +146,8 @@ _gcry_mpi_ec_nist192_mod (gcry_mpi_t w, mpi_ec_t ctx)
   STORE64_COND(wp, 2, mask2, o[2], mask1, s[2]);
 
   w->nlimbs = 192 / BITS_PER_MPI_LIMB;
-  MPN_NORMALIZE (wp, w->nlimbs);
+  if (!(ctx->flags & GCRYECC_FLAG_LEAST_LEAK))
+    MPN_NORMALIZE (wp, w->nlimbs);
 }
 
 void
@@ -265,7 +267,8 @@ _gcry_mpi_ec_nist224_mod (gcry_mpi_t w, mpi_ec_t ctx)
   STORE64_COND(wp, 3, mask2, d[3], mask1, s[3]);
 
   w->nlimbs = wsize * LIMBS_PER_LIMB64;
-  MPN_NORMALIZE (wp, w->nlimbs);
+  if (!(ctx->flags & GCRYECC_FLAG_LEAST_LEAK))
+    MPN_NORMALIZE (wp, w->nlimbs);
 }
 
 void
@@ -504,7 +507,8 @@ _gcry_mpi_ec_nist256_mod (gcry_mpi_t w, mpi_ec_t ctx)
   STORE64(wp, 3, s[3]);
 
   w->nlimbs = wsize * LIMBS_PER_LIMB64;
-  MPN_NORMALIZE (wp, w->nlimbs);
+  if (!(ctx->flags & GCRYECC_FLAG_LEAST_LEAK))
+    MPN_NORMALIZE (wp, w->nlimbs);
 }
 
 void
@@ -768,7 +772,8 @@ _gcry_mpi_ec_nist384_mod (gcry_mpi_t w, mpi_ec_t ctx)
   STORE64_COND(wp, 5, mask2, d[5], mask1, s[5]);
 
   w->nlimbs = wsize * LIMBS_PER_LIMB64;
-  MPN_NORMALIZE (wp, w->nlimbs);
+  if (!(ctx->flags & GCRYECC_FLAG_LEAST_LEAK))
+    MPN_NORMALIZE (wp, w->nlimbs);
 
 #if (BITS_PER_MPI_LIMB64 == BITS_PER_MPI_LIMB) && defined(WORDS_BIGENDIAN)
   wipememory(wp_shr32, sizeof(wp_shr32));
@@ -800,7 +805,8 @@ _gcry_mpi_ec_nist521_mod (gcry_mpi_t w, mpi_ec_t ctx)
   mpih_set_cond (wp, s, wsize, mpih_limb_is_not_zero (cy));
 
   w->nlimbs = wsize;
-  MPN_NORMALIZE (wp, w->nlimbs);
+  if (!(ctx->flags & GCRYECC_FLAG_LEAST_LEAK))
+    MPN_NORMALIZE (wp, w->nlimbs);
 }
 
 #endif /* !ASM_DISABLED */
diff --git a/mpi/ec.c b/mpi/ec.c
index 7ee616bb..4ccb95fb 100644
--- a/mpi/ec.c
+++ b/mpi/ec.c
@@ -280,6 +280,9 @@ ec_mod (gcry_mpi_t w, mpi_ec_t ec)
     _gcry_mpi_mod_barrett (w, w, ec->t.p_barrett);
   else
     _gcry_mpi_mod (w, w, ec->p);
+
+  if ((ec->flags & GCRYECC_FLAG_LEAST_LEAK))
+    w->nlimbs = ec->p->nlimbs;
 }
 
 static void
@@ -612,7 +615,8 @@ ec_secp256k1_mod (gcry_mpi_t w, mpi_ec_t ctx)
 		 mpih_limb_is_not_zero (cy) | mpih_limb_is_zero (borrow));
 
   w->nlimbs = wsize;
-  MPN_NORMALIZE (wp, w->nlimbs);
+  if (!(ctx->flags & GCRYECC_FLAG_LEAST_LEAK))
+    MPN_NORMALIZE (wp, w->nlimbs);
 }
 
 
_______________________________________________
Gcrypt-devel mailing list
Gcrypt-devel@gnupg.org
https://lists.gnupg.org/mailman/listinfo/gcrypt-devel

Reply via email to