Blame SOURCES/nettle-3.4.1-ecdsa-verify.patch

4b3d9e
From 932ea29845da1ae350d9c056cb2cb0379a66d642 Mon Sep 17 00:00:00 2001
4b3d9e
From: Daiki Ueno <dueno@redhat.com>
4b3d9e
Date: Tue, 30 Mar 2021 09:22:47 +0200
4b3d9e
Subject: [PATCH] Port upstream hardening of EC scaler multiplication
4b3d9e
4b3d9e
Some internal functions used in point multiplications are known to
4b3d9e
misbehave if the scaler is out-of-range.  This performs canonical
4b3d9e
reduction on scalers, before point multiplication.
4b3d9e
4b3d9e
Signed-off-by: Daiki Ueno <dueno@redhat.com>
4b3d9e
---
4b3d9e
 ecc-ecdsa-sign.c   |  7 +++++--
4b3d9e
 ecc-ecdsa-verify.c | 14 ++++++++++++--
4b3d9e
 eddsa-hash.c       |  9 +++++++--
4b3d9e
 3 files changed, 24 insertions(+), 6 deletions(-)
4b3d9e
4b3d9e
diff --git a/ecc-ecdsa-sign.c b/ecc-ecdsa-sign.c
4b3d9e
index 3b9e9cc1..45062528 100644
4b3d9e
--- a/ecc-ecdsa-sign.c
4b3d9e
+++ b/ecc-ecdsa-sign.c
4b3d9e
@@ -62,6 +62,8 @@ ecc_ecdsa_sign (const struct ecc_curve *ecc,
4b3d9e
 		mp_limb_t *rp, mp_limb_t *sp,
4b3d9e
 		mp_limb_t *scratch)
4b3d9e
 {
4b3d9e
+  mp_limb_t cy;
4b3d9e
+
4b3d9e
 #define P	    scratch
4b3d9e
 #define kinv	    scratch                /* Needs 5*ecc->p.size for computation */
4b3d9e
 #define hp	    (scratch  + ecc->p.size) /* NOTE: ecc->p.size + 1 limbs! */
4b3d9e
@@ -91,8 +93,9 @@ ecc_ecdsa_sign (const struct ecc_curve *ecc,
4b3d9e
   ecc_modq_mul (ecc, tp, zp, rp);
4b3d9e
   ecc_modq_add (ecc, hp, hp, tp);
4b3d9e
   ecc_modq_mul (ecc, tp, hp, kinv);
4b3d9e
-
4b3d9e
-  mpn_copyi (sp, tp, ecc->p.size);
4b3d9e
+  /* Ensure canonical reduction. */
4b3d9e
+  cy = mpn_sub_n (sp, tp, ecc->q.m, ecc->q.size);
4b3d9e
+  cnd_copy (cy, sp, tp, ecc->q.size);
4b3d9e
 #undef P
4b3d9e
 #undef hp
4b3d9e
 #undef kinv
4b3d9e
diff --git a/ecc-ecdsa-verify.c b/ecc-ecdsa-verify.c
4b3d9e
index d7f5b684..6b8acb07 100644
4b3d9e
--- a/ecc-ecdsa-verify.c
4b3d9e
+++ b/ecc-ecdsa-verify.c
4b3d9e
@@ -75,6 +75,8 @@ ecc_ecdsa_verify (const struct ecc_curve *ecc,
4b3d9e
 		  const mp_limb_t *rp, const mp_limb_t *sp,
4b3d9e
 		  mp_limb_t *scratch)
4b3d9e
 {
4b3d9e
+  mp_limb_t cy;
4b3d9e
+
4b3d9e
   /* Procedure, according to RFC 6090, "KT-I". q denotes the group
4b3d9e
      order.
4b3d9e
 
4b3d9e
@@ -98,6 +100,7 @@ ecc_ecdsa_verify (const struct ecc_curve *ecc,
4b3d9e
 #define P1 (scratch + 4*ecc->p.size)
4b3d9e
 #define sinv (scratch)
4b3d9e
 #define hp (scratch + ecc->p.size)
4b3d9e
+#define tp (scratch + 4*ecc->p.size)
4b3d9e
 
4b3d9e
   if (! (ecdsa_in_range (ecc, rp)
4b3d9e
 	 && ecdsa_in_range (ecc, sp)))
4b3d9e
@@ -112,10 +115,16 @@ ecc_ecdsa_verify (const struct ecc_curve *ecc,
4b3d9e
 
4b3d9e
   /* u1 = h / s, P1 = u1 * G */
4b3d9e
   ecc_hash (&ecc->q, hp, length, digest);
4b3d9e
-  ecc_modq_mul (ecc, u1, hp, sinv);
4b3d9e
+  ecc_modq_mul (ecc, tp, hp, sinv);
4b3d9e
+  /* Ensure canonical reduction. */
4b3d9e
+  cy = mpn_sub_n (u1, tp, ecc->q.m, ecc->q.size);
4b3d9e
+  cnd_copy (cy, u1, tp, ecc->q.size);
4b3d9e
 
4b3d9e
   /* u2 = r / s, P2 = u2 * Y */
4b3d9e
-  ecc_modq_mul (ecc, u2, rp, sinv);
4b3d9e
+  ecc_modq_mul (ecc, hp, rp, sinv);
4b3d9e
+  /* Ensure canonical reduction. */
4b3d9e
+  cy = mpn_sub_n (u2, hp, ecc->q.m, ecc->q.size);
4b3d9e
+  cnd_copy (cy, u2, hp, ecc->q.size);
4b3d9e
 
4b3d9e
    /* Total storage: 5*ecc->p.size + ecc->mul_itch */
4b3d9e
   ecc->mul (ecc, P2, u2, pp, u2 + ecc->p.size);
4b3d9e
@@ -154,4 +163,5 @@ ecc_ecdsa_verify (const struct ecc_curve *ecc,
4b3d9e
 #undef u2
4b3d9e
 #undef hp
4b3d9e
 #undef u1
4b3d9e
+#undef tp
4b3d9e
 }
4b3d9e
diff --git a/eddsa-hash.c b/eddsa-hash.c
4b3d9e
index 4fb79f1b..53c6fc49 100644
4b3d9e
--- a/eddsa-hash.c
4b3d9e
+++ b/eddsa-hash.c
4b3d9e
@@ -45,7 +45,12 @@ void
4b3d9e
 _eddsa_hash (const struct ecc_modulo *m,
4b3d9e
 	     mp_limb_t *rp, const uint8_t *digest)
4b3d9e
 {
4b3d9e
+  mp_limb_t cy;
4b3d9e
+
4b3d9e
   size_t nbytes = 1 + m->bit_size / 8;
4b3d9e
-  mpn_set_base256_le (rp, 2*m->size, digest, 2*nbytes);
4b3d9e
-  m->mod (m, rp);
4b3d9e
+  mpn_set_base256_le (rp + m->size, 2*m->size, digest, 2*nbytes);
4b3d9e
+  m->mod (m, rp + m->size);
4b3d9e
+  /* Ensure canonical reduction. */
4b3d9e
+  cy = mpn_sub_n (rp, rp + m->size, m->m, m->size);
4b3d9e
+  cnd_copy (cy, rp, rp + m->size, m->size);
4b3d9e
 }
4b3d9e
-- 
4b3d9e
2.30.2
4b3d9e