Coverage Report

Created: 2023-03-26 07:33

/src/nettle/ecc-secp384r1.c
Line
Count
Source (jump to first uncovered line)
1
/* ecc-secp384r1.c
2
3
   Compile time constant (but machine dependent) tables.
4
5
   Copyright (C) 2013, 2014 Niels Möller
6
7
   This file is part of GNU Nettle.
8
9
   GNU Nettle is free software: you can redistribute it and/or
10
   modify it under the terms of either:
11
12
     * the GNU Lesser General Public License as published by the Free
13
       Software Foundation; either version 3 of the License, or (at your
14
       option) any later version.
15
16
   or
17
18
     * the GNU General Public License as published by the Free
19
       Software Foundation; either version 2 of the License, or (at your
20
       option) any later version.
21
22
   or both in parallel, as here.
23
24
   GNU Nettle is distributed in the hope that it will be useful,
25
   but WITHOUT ANY WARRANTY; without even the implied warranty of
26
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27
   General Public License for more details.
28
29
   You should have received copies of the GNU General Public License and
30
   the GNU Lesser General Public License along with this program.  If
31
   not, see http://www.gnu.org/licenses/.
32
*/
33
34
/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */
35
36
#if HAVE_CONFIG_H
37
# include "config.h"
38
#endif
39
40
#include <assert.h>
41
42
#include "ecc-internal.h"
43
44
#define USE_REDC 0
45
46
#include "ecc-secp384r1.h"
47
48
#if HAVE_NATIVE_ecc_secp384r1_modp
49
#define ecc_secp384r1_modp _nettle_ecc_secp384r1_modp
50
void
51
ecc_secp384r1_modp (const struct ecc_modulo *m, mp_limb_t *rp, mp_limb_t *xp);
52
#elif GMP_NUMB_BITS == 32
53
54
/* Use that 2^{384} = 2^{128} + 2^{96} - 2^{32} + 1, and eliminate 256
55
   bits at a time.
56
57
   We can get carry == 2 in the first iteration, and I think *only* in
58
   the first iteration. */
59
60
/* p is 12 limbs, and B^12 - p = B^4 + B^3 - B + 1. We can eliminate
61
   almost 8 at a time. Do only 7, to avoid additional carry
62
   propagation, followed by 5. */
63
static void
64
ecc_secp384r1_modp (const struct ecc_modulo *p, mp_limb_t *rp, mp_limb_t *xp)
65
{
66
  mp_limb_t cy, bw;
67
68
  /* Reduce from 24 to 17 limbs. */
69
  cy = mpn_add_n (xp + 4, xp + 4, xp + 16, 8);
70
  cy = sec_add_1 (xp + 12, xp + 12, 3, cy);
71
72
  bw = mpn_sub_n (xp + 5, xp + 5, xp + 16, 8);
73
  bw = sec_sub_1 (xp + 13, xp + 13, 3, bw);
74
75
  cy += mpn_add_n (xp + 7, xp + 7, xp + 16, 8);
76
  cy = sec_add_1 (xp + 15, xp + 15, 1, cy);
77
78
  cy += mpn_add_n (xp + 8, xp + 8, xp + 16, 8);
79
  assert (bw <= cy);
80
  cy -= bw;
81
82
  assert (cy <= 2);  
83
  xp[16] = cy;
84
85
  /* Reduce from 17 to 12 limbs */
86
  cy = mpn_add_n (xp, xp, xp + 12, 5);
87
  cy = sec_add_1 (xp + 5, xp + 5, 3, cy);
88
  
89
  bw = mpn_sub_n (xp + 1, xp + 1, xp + 12, 5);
90
  bw = sec_sub_1 (xp + 6, xp + 6, 6, bw);
91
  
92
  cy += mpn_add_n (xp + 3, xp + 3, xp + 12, 5);
93
  cy = sec_add_1 (xp + 8, xp + 8, 1, cy);
94
95
  cy += mpn_add_n (xp + 4, xp + 4, xp + 12, 5);
96
  cy = sec_add_1 (xp + 9, xp + 9, 3, cy);
97
98
  assert (cy >= bw);
99
  cy -= bw;
100
  assert (cy <= 1);
101
  cy = mpn_cnd_add_n (cy, rp, xp, p->B, ECC_LIMB_SIZE);
102
  assert (cy == 0);
103
}
104
#elif GMP_NUMB_BITS == 64
105
/* p is 6 limbs, and B^6 - p = B^2 + 2^32 (B - 1) + 1. Eliminate 3
106
   (almost 4) limbs at a time. */
107
static void
108
ecc_secp384r1_modp (const struct ecc_modulo *p, mp_limb_t *rp, mp_limb_t *xp)
109
{
110
  mp_limb_t tp[6];
111
  mp_limb_t cy;
112
113
  /* Reduce from 12 to 9 limbs */
114
  tp[0] = 0; /* FIXME: Could use mpn_sub_nc */
115
  mpn_copyi (tp + 1, xp + 8, 3);
116
  tp[4] = xp[11] - mpn_sub_n (tp, tp, xp + 8, 4);
117
  tp[5] = mpn_lshift (tp, tp, 5, 32);
118
119
  cy = mpn_add_n (xp + 2, xp + 2, xp + 8, 4);
120
  cy = sec_add_1 (xp + 6, xp + 6, 2, cy);
121
122
  cy += mpn_add_n (xp + 2, xp + 2, tp, 6);
123
  cy += mpn_add_n (xp + 4, xp + 4, xp + 8, 4);
124
125
  assert (cy <= 2);
126
  xp[8] = cy;
127
128
  /* Reduce from 9 to 6 limbs */
129
  tp[0] = 0;
130
  mpn_copyi (tp + 1, xp + 6, 2);
131
  tp[3] = xp[8] - mpn_sub_n (tp, tp, xp + 6, 3);
132
  tp[4] = mpn_lshift (tp, tp, 4, 32);
133
134
  cy = mpn_add_n (xp, xp, xp + 6, 3);
135
  cy = sec_add_1 (xp + 3, xp + 3, 2, cy);
136
  cy += mpn_add_n (xp, xp, tp, 5);
137
  cy += mpn_add_n (xp + 2, xp + 2, xp + 6, 3);
138
139
  cy = sec_add_1 (xp + 5, xp + 5, 1, cy);
140
  assert (cy <= 1);
141
142
  cy = mpn_cnd_add_n (cy, xp, xp, p->B, ECC_LIMB_SIZE);
143
  assert (cy == 0);
144
  mpn_copyi (rp, xp, ECC_LIMB_SIZE);
145
}
146
#else
147
#define ecc_secp384r1_modp ecc_mod
148
#endif
149
150
/* Computes a^{2^{288} -2^{32} - 1} mod m. Also produces the
151
   intermediate value a^{2^{30} - 1}. Needs 5*ECC_LIMB_SIZE
152
   scratch. */
153
static void
154
ecc_mod_pow_288m32m1 (const struct ecc_modulo *m,
155
          mp_limb_t *rp, mp_limb_t *a30m1,
156
          const mp_limb_t *ap, mp_limb_t *scratch)
157
0
{
158
  /*
159
    Addition chain for 2^{288} - 2^{32} - 1:
160
161
    2^2 - 1 = 1 + 2
162
    2^4 - 1 = (2^2 + 1) * (2^2 - 1)
163
    2^5 - 1 = 1 + 2(2^4 - 1)
164
    2^{10} - 1 = (2^5 + 1) (2^5 - 1)
165
    2^{15} - 1 = 2^5 (2^{10} - 1) + (2^5-1)
166
    2^{30} - 1 = (2^{15} + 1) (2^{15} - 1)
167
    2^{32} - 4 = 2^2 (2^{30} - 1)
168
    2^{32} - 1 = (2^{32} - 4) + 3
169
    2^{60} - 1 = 2^{28}(2^{32} - 4) + (2^{30} - 1)
170
    2^{120} - 1 = (2^{60} + 1) (2^{60} - 1)
171
    2^{240} - 1 = (2^{120} + 1)(2^{120} - 1)
172
    2^{255} - 1 = 2^{15} (2^{240} - 1) + 2^{15} - 1
173
    2^{288} - 2^{32} - 1 = 2^{33} (2^{255} - 1) + 2^{32} - 1
174
175
    Total 287 squarings, and 12 multiplies.
176
177
    The specific sqr/mul schedule is from Routine 3.2.12 of
178
    "Mathematical routines for the NIST prime elliptic curves", April
179
    5, 2010, author unknown.
180
  */
181
182
0
#define t0 scratch
183
0
#define a3 (scratch + ECC_LIMB_SIZE)
184
0
#define a5m1 a30m1
185
0
#define a15m1 (scratch + 2*ECC_LIMB_SIZE)
186
0
#define a32m1 a3
187
0
#define tp (scratch + 3*ECC_LIMB_SIZE)
188
189
0
  ecc_mod_sqr        (m, t0, ap, tp);      /* a^2 */
190
0
  ecc_mod_mul        (m, a3, t0, ap, tp);    /* a^3 */
191
0
  ecc_mod_pow_2kp1   (m, rp, a3, 2, tp);    /* a^(2^4 - 1) */
192
0
  ecc_mod_sqr        (m, t0, rp, tp);      /* a^(2^5 - 2) */
193
0
  ecc_mod_mul        (m, a5m1, t0, ap, tp);    /* a^(2^5 - 1) */
194
0
  ecc_mod_pow_2kp1   (m, t0, a5m1, 5, tp);    /* a^(2^10 - 1) */
195
0
  ecc_mod_pow_2k_mul (m, a15m1, t0, 5, a5m1, tp);  /* a^(2^15 - 1) a5m1*/
196
0
  ecc_mod_pow_2kp1   (m, a30m1, a15m1, 15, tp);   /* a^(2^30 - 1) */
197
0
  ecc_mod_pow_2k     (m, t0, a30m1, 2, tp);    /* a^(2^32 - 4) */
198
0
  ecc_mod_mul        (m, a32m1, t0, a3, tp);    /* a^(2^32 - 1) a3 */
199
0
  ecc_mod_pow_2k_mul (m, rp, t0, 28, a30m1, tp);  /* a^(2^60 - 1) a32m4 */
200
0
  ecc_mod_pow_2kp1   (m, t0, rp, 60, tp);   /* a^(2^120 - 1) */
201
0
  ecc_mod_pow_2kp1   (m, rp, t0, 120, tp);    /* a^(2^240 - 1) */
202
0
  ecc_mod_pow_2k_mul (m, t0, rp, 15, a15m1, tp);  /* a^(2^255 - 1) a15m1 */
203
0
  ecc_mod_pow_2k_mul (m, rp, t0, 33, a32m1, tp);  /* a^(2^288 - 2^32 - 1) a32m1 */
204
205
0
#undef t0
206
0
#undef a3
207
0
#undef a5m1
208
0
#undef a15m1
209
0
#undef a32m1
210
0
#undef tp
211
0
}
212
213
#define ECC_SECP384R1_INV_ITCH (6*ECC_LIMB_SIZE)
214
215
static void
216
ecc_secp384r1_inv (const struct ecc_modulo *p,
217
       mp_limb_t *rp, const mp_limb_t *ap,
218
       mp_limb_t *scratch)
219
0
{
220
  /*
221
    Addition chain for
222
223
    p - 2 = 2^{384} - 2^{128} - 2^{96} + 2^{32} - 3
224
225
    Start with
226
227
      a^{2^{288} - 2^{32} - 1}
228
229
    and then use
230
231
      2^{382} - 2^{126} - 2^{94} + 2^{30} - 1
232
         = 2^{94} (2^{288} - 2^{32} - 1) + 2^{30} - 1
233
234
      2^{384} - 2^{128} - 2^{96} + 2^{32} - 3
235
         = 2^2 (2^{382} - 2^{126} - 2^{94} + 2^{30} - 1) + 1
236
237
    This addition chain needs 96 additional squarings and 2
238
    multiplies, for a total of 383 squarings and 14 multiplies.
239
  */
240
241
0
#define a30m1 scratch
242
0
#define tp (scratch + ECC_LIMB_SIZE)
243
244
0
  ecc_mod_pow_288m32m1 (p, rp, a30m1, ap, tp);
245
0
  ecc_mod_pow_2k_mul (p, rp, rp, 94, a30m1, tp); /* a^{2^{382} - 2^{126} - 2^{94} + 2^{30} - 1 */
246
0
  ecc_mod_pow_2k_mul (p, rp, rp, 2, ap, tp);
247
248
0
#undef a30m1
249
0
#undef tp
250
0
}
251
252
/* To guarantee that inputs to ecc_mod_zero_p are in the required range. */
253
#if ECC_LIMB_SIZE * GMP_NUMB_BITS != 384
254
#error Unsupported limb size
255
#endif
256
257
#define ECC_SECP384R1_SQRT_ITCH (6*ECC_LIMB_SIZE)
258
259
static int
260
ecc_secp384r1_sqrt (const struct ecc_modulo *m,
261
        mp_limb_t *rp,
262
        const mp_limb_t *cp,
263
        mp_limb_t *scratch)
264
0
{
265
  /* This computes the square root modulo p384 using the identity:
266
267
     sqrt(c) = c^(2^382 − 2^126 - 2^94 + 2^30)  (mod P-384)
268
269
     which can be seen as a special case of Tonelli-Shanks with e=1.
270
271
     Starting with
272
273
       a^{2^{288} - 2^{32} - 1}
274
275
     and then use
276
277
       2^352 - 2^96 - 2^64 + 1
278
         = 2^64 (2^{288} - 2^{32} - 1) + 1
279
       2^382 − 2^126 - 2^94 + 2^30
280
         = 2^30 (2^352 - 2^96 - 2^64 + 1)
281
282
     An additional 94 squarings and 2 multiplies, for a total of for a
283
     total of 381 squarings and 14 multiplies.
284
  */
285
286
0
#define t0 scratch
287
0
#define tp (scratch + ECC_LIMB_SIZE)
288
289
0
  ecc_mod_pow_288m32m1 (m, rp, t0, cp, tp);
290
0
  ecc_mod_pow_2k_mul (m, t0, rp, 64, cp, tp);    /* c^(2^352 - 2^96 - 2^64 + 1) */
291
0
  ecc_mod_pow_2k     (m, rp, t0, 30, tp);    /* c^(2^382 - 2^126 - 2^94 + 2^30) */
292
293
0
  ecc_mod_sqr (m, t0, rp, tp);
294
0
  ecc_mod_sub (m, t0, t0, cp);
295
296
0
  return ecc_mod_zero_p (m, t0);
297
298
0
#undef t0
299
0
#undef tp
300
0
}
301
302
303
const struct ecc_curve _nettle_secp_384r1 =
304
{
305
  {
306
    384,
307
    ECC_LIMB_SIZE,    
308
    ECC_BMODP_SIZE,
309
    ECC_REDC_SIZE,
310
    ECC_SECP384R1_INV_ITCH,
311
    ECC_SECP384R1_SQRT_ITCH,
312
    0,
313
314
    ecc_p,
315
    ecc_Bmodp,
316
    ecc_Bmodp_shifted,
317
    ecc_Bm2p,
318
    ecc_redc_ppm1,
319
    ecc_pp1h,
320
321
    ecc_secp384r1_modp,
322
    ecc_secp384r1_modp,
323
    ecc_secp384r1_inv,
324
    ecc_secp384r1_sqrt,
325
    NULL,
326
  },
327
  {
328
    384,
329
    ECC_LIMB_SIZE,    
330
    ECC_BMODQ_SIZE,
331
    0,
332
    ECC_MOD_INV_ITCH (ECC_LIMB_SIZE),
333
    0,
334
    0,
335
336
    ecc_q,
337
    ecc_Bmodq,
338
    ecc_Bmodq_shifted,
339
    ecc_Bm2q,
340
    NULL,
341
    ecc_qp1h,
342
343
    ecc_mod,
344
    ecc_mod,
345
    ecc_mod_inv,
346
    NULL,
347
    NULL,
348
  },
349
350
  USE_REDC,
351
  ECC_PIPPENGER_K,
352
  ECC_PIPPENGER_C,
353
354
  ECC_ADD_JJA_ITCH (ECC_LIMB_SIZE),
355
  ECC_ADD_JJJ_ITCH (ECC_LIMB_SIZE),
356
  ECC_DUP_JJ_ITCH (ECC_LIMB_SIZE),
357
  ECC_MUL_A_ITCH (ECC_LIMB_SIZE),
358
  ECC_MUL_G_ITCH (ECC_LIMB_SIZE),
359
  ECC_J_TO_A_ITCH(ECC_LIMB_SIZE, ECC_SECP384R1_INV_ITCH),
360
361
  ecc_add_jja,
362
  ecc_add_jjj,
363
  ecc_dup_jj,
364
  ecc_mul_a,
365
  ecc_mul_g,
366
  ecc_j_to_a,
367
368
  ecc_b,
369
  ecc_unit,
370
  ecc_table
371
};
372
373
const struct ecc_curve *nettle_get_secp_384r1(void)
374
0
{
375
0
  return &_nettle_secp_384r1;
376
0
}