summaryrefslogtreecommitdiff
path: root/lib/nettle/ecc/override/eddsa-hash.c.diff
blob: f2237e503f5168ff732f1c92e74d49040f1f6d58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
diff --git a/eddsa-hash.c b/eddsa-hash.c
index e05f6ac1..743dc4be 100644
--- a/eddsa-hash.c
+++ b/eddsa-hash.c
@@ -44,13 +44,14 @@
 #include "ecc-internal.h"
 #include "nettle-internal.h"
 
-/* Convert hash digest to integer, and reduce modulo q, to m->size
-   limbs. Needs space for 2*m->size + 1 at rp. */
+/* Convert hash digest to integer, and reduce canonically modulo q.
+   Needs space for 2*m->size + 1 at rp. */
 void
 _eddsa_hash (const struct ecc_modulo *m,
 	     mp_limb_t *rp, size_t digest_size, const uint8_t *digest)
 {
   mp_size_t nlimbs = (8*digest_size + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS;
+  mp_limb_t cy;
 
   mpn_set_base256_le (rp, nlimbs, digest, digest_size);
 
@@ -75,4 +76,8 @@ _eddsa_hash (const struct ecc_modulo *m,
       assert (hi == 0);
     }
   m->mod (m, rp);
+  /* Ensure canonical reduction. */
+  cy = mpn_sub_n (rp + m->size, rp, m->m, m->size);
+  cnd_copy (cy, rp + m->size, rp, m->size);
+  mpn_copyi (rp, rp + m->size, m->size);
 }