Coverage Report

Created: 2023-09-25 06:43

/src/openssl30/crypto/bn/bn_nist.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2002-2023 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
10
#include "bn_local.h"
11
#include "internal/cryptlib.h"
12
13
0
#define BN_NIST_192_TOP (192+BN_BITS2-1)/BN_BITS2
14
138k
#define BN_NIST_224_TOP (224+BN_BITS2-1)/BN_BITS2
15
0
#define BN_NIST_256_TOP (256+BN_BITS2-1)/BN_BITS2
16
0
#define BN_NIST_384_TOP (384+BN_BITS2-1)/BN_BITS2
17
119k
#define BN_NIST_521_TOP (521+BN_BITS2-1)/BN_BITS2
18
19
/* pre-computed tables are "carry-less" values of modulus*(i+1) */
20
#if BN_BITS2 == 64
21
static const BN_ULONG _nist_p_192[][BN_NIST_192_TOP] = {
22
    {0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFEULL, 0xFFFFFFFFFFFFFFFFULL},
23
    {0xFFFFFFFFFFFFFFFEULL, 0xFFFFFFFFFFFFFFFDULL, 0xFFFFFFFFFFFFFFFFULL},
24
    {0xFFFFFFFFFFFFFFFDULL, 0xFFFFFFFFFFFFFFFCULL, 0xFFFFFFFFFFFFFFFFULL}
25
};
26
27
static const BN_ULONG _nist_p_192_sqr[] = {
28
    0x0000000000000001ULL, 0x0000000000000002ULL, 0x0000000000000001ULL,
29
    0xFFFFFFFFFFFFFFFEULL, 0xFFFFFFFFFFFFFFFDULL, 0xFFFFFFFFFFFFFFFFULL
30
};
31
32
static const BN_ULONG _nist_p_224[][BN_NIST_224_TOP] = {
33
    {0x0000000000000001ULL, 0xFFFFFFFF00000000ULL,
34
     0xFFFFFFFFFFFFFFFFULL, 0x00000000FFFFFFFFULL},
35
    {0x0000000000000002ULL, 0xFFFFFFFE00000000ULL,
36
     0xFFFFFFFFFFFFFFFFULL, 0x00000001FFFFFFFFULL} /* this one is
37
                                                    * "carry-full" */
38
};
39
40
static const BN_ULONG _nist_p_224_sqr[] = {
41
    0x0000000000000001ULL, 0xFFFFFFFE00000000ULL,
42
    0xFFFFFFFFFFFFFFFFULL, 0x0000000200000000ULL,
43
    0x0000000000000000ULL, 0xFFFFFFFFFFFFFFFEULL,
44
    0xFFFFFFFFFFFFFFFFULL
45
};
46
47
static const BN_ULONG _nist_p_256[][BN_NIST_256_TOP] = {
48
    {0xFFFFFFFFFFFFFFFFULL, 0x00000000FFFFFFFFULL,
49
     0x0000000000000000ULL, 0xFFFFFFFF00000001ULL},
50
    {0xFFFFFFFFFFFFFFFEULL, 0x00000001FFFFFFFFULL,
51
     0x0000000000000000ULL, 0xFFFFFFFE00000002ULL},
52
    {0xFFFFFFFFFFFFFFFDULL, 0x00000002FFFFFFFFULL,
53
     0x0000000000000000ULL, 0xFFFFFFFD00000003ULL},
54
    {0xFFFFFFFFFFFFFFFCULL, 0x00000003FFFFFFFFULL,
55
     0x0000000000000000ULL, 0xFFFFFFFC00000004ULL},
56
    {0xFFFFFFFFFFFFFFFBULL, 0x00000004FFFFFFFFULL,
57
     0x0000000000000000ULL, 0xFFFFFFFB00000005ULL},
58
};
59
60
static const BN_ULONG _nist_p_256_sqr[] = {
61
    0x0000000000000001ULL, 0xFFFFFFFE00000000ULL,
62
    0xFFFFFFFFFFFFFFFFULL, 0x00000001FFFFFFFEULL,
63
    0x00000001FFFFFFFEULL, 0x00000001FFFFFFFEULL,
64
    0xFFFFFFFE00000001ULL, 0xFFFFFFFE00000002ULL
65
};
66
67
static const BN_ULONG _nist_p_384[][BN_NIST_384_TOP] = {
68
    {0x00000000FFFFFFFFULL, 0xFFFFFFFF00000000ULL, 0xFFFFFFFFFFFFFFFEULL,
69
     0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL},
70
    {0x00000001FFFFFFFEULL, 0xFFFFFFFE00000000ULL, 0xFFFFFFFFFFFFFFFDULL,
71
     0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL},
72
    {0x00000002FFFFFFFDULL, 0xFFFFFFFD00000000ULL, 0xFFFFFFFFFFFFFFFCULL,
73
     0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL},
74
    {0x00000003FFFFFFFCULL, 0xFFFFFFFC00000000ULL, 0xFFFFFFFFFFFFFFFBULL,
75
     0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL},
76
    {0x00000004FFFFFFFBULL, 0xFFFFFFFB00000000ULL, 0xFFFFFFFFFFFFFFFAULL,
77
     0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL},
78
};
79
80
static const BN_ULONG _nist_p_384_sqr[] = {
81
    0xFFFFFFFE00000001ULL, 0x0000000200000000ULL, 0xFFFFFFFE00000000ULL,
82
    0x0000000200000000ULL, 0x0000000000000001ULL, 0x0000000000000000ULL,
83
    0x00000001FFFFFFFEULL, 0xFFFFFFFE00000000ULL, 0xFFFFFFFFFFFFFFFDULL,
84
    0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL
85
};
86
87
static const BN_ULONG _nist_p_521[] =
88
    { 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL,
89
    0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL,
90
    0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL,
91
    0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL,
92
    0x00000000000001FFULL
93
};
94
95
static const BN_ULONG _nist_p_521_sqr[] = {
96
    0x0000000000000001ULL, 0x0000000000000000ULL, 0x0000000000000000ULL,
97
    0x0000000000000000ULL, 0x0000000000000000ULL, 0x0000000000000000ULL,
98
    0x0000000000000000ULL, 0x0000000000000000ULL, 0xFFFFFFFFFFFFFC00ULL,
99
    0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL,
100
    0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL,
101
    0xFFFFFFFFFFFFFFFFULL, 0x000000000003FFFFULL
102
};
103
#elif BN_BITS2 == 32
104
static const BN_ULONG _nist_p_192[][BN_NIST_192_TOP] = {
105
    {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
106
    {0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
107
    {0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}
108
};
109
110
static const BN_ULONG _nist_p_192_sqr[] = {
111
    0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000001, 0x00000000,
112
    0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
113
};
114
115
static const BN_ULONG _nist_p_224[][BN_NIST_224_TOP] = {
116
    {0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFF,
117
     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
118
    {0x00000002, 0x00000000, 0x00000000, 0xFFFFFFFE,
119
     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}
120
};
121
122
static const BN_ULONG _nist_p_224_sqr[] = {
123
    0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE,
124
    0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000002,
125
    0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF,
126
    0xFFFFFFFF, 0xFFFFFFFF
127
};
128
129
static const BN_ULONG _nist_p_256[][BN_NIST_256_TOP] = {
130
    {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
131
     0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF},
132
    {0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001,
133
     0x00000000, 0x00000000, 0x00000002, 0xFFFFFFFE},
134
    {0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000002,
135
     0x00000000, 0x00000000, 0x00000003, 0xFFFFFFFD},
136
    {0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003,
137
     0x00000000, 0x00000000, 0x00000004, 0xFFFFFFFC},
138
    {0xFFFFFFFB, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000004,
139
     0x00000000, 0x00000000, 0x00000005, 0xFFFFFFFB},
140
};
141
142
static const BN_ULONG _nist_p_256_sqr[] = {
143
    0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE,
144
    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0x00000001,
145
    0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001,
146
    0x00000001, 0xFFFFFFFE, 0x00000002, 0xFFFFFFFE
147
};
148
149
static const BN_ULONG _nist_p_384[][BN_NIST_384_TOP] = {
150
    {0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
151
     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
152
    {0xFFFFFFFE, 0x00000001, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFF,
153
     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
154
    {0xFFFFFFFD, 0x00000002, 0x00000000, 0xFFFFFFFD, 0xFFFFFFFC, 0xFFFFFFFF,
155
     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
156
    {0xFFFFFFFC, 0x00000003, 0x00000000, 0xFFFFFFFC, 0xFFFFFFFB, 0xFFFFFFFF,
157
     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
158
    {0xFFFFFFFB, 0x00000004, 0x00000000, 0xFFFFFFFB, 0xFFFFFFFA, 0xFFFFFFFF,
159
     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
160
};
161
162
static const BN_ULONG _nist_p_384_sqr[] = {
163
    0x00000001, 0xFFFFFFFE, 0x00000000, 0x00000002, 0x00000000, 0xFFFFFFFE,
164
    0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000000, 0x00000000,
165
    0xFFFFFFFE, 0x00000001, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFF,
166
    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
167
};
168
169
static const BN_ULONG _nist_p_521[] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
170
    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
171
    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
172
    0xFFFFFFFF, 0x000001FF
173
};
174
175
static const BN_ULONG _nist_p_521_sqr[] = {
176
    0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
177
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
178
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFC00, 0xFFFFFFFF,
179
    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
180
    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
181
    0xFFFFFFFF, 0xFFFFFFFF, 0x0003FFFF
182
};
183
#else
184
# error "unsupported BN_BITS2"
185
#endif
186
187
static const BIGNUM ossl_bignum_nist_p_192 = {
188
    (BN_ULONG *)_nist_p_192[0],
189
    BN_NIST_192_TOP,
190
    BN_NIST_192_TOP,
191
    0,
192
    BN_FLG_STATIC_DATA
193
};
194
195
static const BIGNUM ossl_bignum_nist_p_224 = {
196
    (BN_ULONG *)_nist_p_224[0],
197
    BN_NIST_224_TOP,
198
    BN_NIST_224_TOP,
199
    0,
200
    BN_FLG_STATIC_DATA
201
};
202
203
static const BIGNUM ossl_bignum_nist_p_256 = {
204
    (BN_ULONG *)_nist_p_256[0],
205
    BN_NIST_256_TOP,
206
    BN_NIST_256_TOP,
207
    0,
208
    BN_FLG_STATIC_DATA
209
};
210
211
static const BIGNUM ossl_bignum_nist_p_384 = {
212
    (BN_ULONG *)_nist_p_384[0],
213
    BN_NIST_384_TOP,
214
    BN_NIST_384_TOP,
215
    0,
216
    BN_FLG_STATIC_DATA
217
};
218
219
static const BIGNUM ossl_bignum_nist_p_521 = {
220
    (BN_ULONG *)_nist_p_521,
221
    BN_NIST_521_TOP,
222
    BN_NIST_521_TOP,
223
    0,
224
    BN_FLG_STATIC_DATA
225
};
226
227
const BIGNUM *BN_get0_nist_prime_192(void)
228
0
{
229
0
    return &ossl_bignum_nist_p_192;
230
0
}
231
232
const BIGNUM *BN_get0_nist_prime_224(void)
233
0
{
234
0
    return &ossl_bignum_nist_p_224;
235
0
}
236
237
const BIGNUM *BN_get0_nist_prime_256(void)
238
0
{
239
0
    return &ossl_bignum_nist_p_256;
240
0
}
241
242
const BIGNUM *BN_get0_nist_prime_384(void)
243
0
{
244
0
    return &ossl_bignum_nist_p_384;
245
0
}
246
247
const BIGNUM *BN_get0_nist_prime_521(void)
248
0
{
249
0
    return &ossl_bignum_nist_p_521;
250
0
}
251
252
/*
253
 * To avoid more recent compilers (specifically clang-14) from treating this
254
 * code as a violation of the strict aliasing conditions and omiting it, this
255
 * cannot be declared as a function.  Moreover, the dst parameter cannot be
256
 * cached in a local since this no longer references the union and again falls
257
 * foul of the strict aliasing criteria.  Refer to #18225 for the initial
258
 * diagnostics and llvm/llvm-project#55255 for the later discussions with the
259
 * LLVM developers.  The problem boils down to if an array in the union is
260
 * converted to a pointer or if it is used directly.
261
 *
262
 * This function was inlined regardless, so there is no space cost to be
263
 * paid for making it a macro.
264
 */
265
22.8k
#define nist_cp_bn_0(dst, src_in, top, max) \
266
22.8k
{                                           \
267
22.8k
    int ii;                                 \
268
22.8k
    const BN_ULONG *src = src_in;           \
269
22.8k
                                            \
270
154k
    for (ii = 0; ii < top; ii++)            \
271
132k
        (dst)[ii] = src[ii];                \
272
28.5k
    for (; ii < max; ii++)                  \
273
22.8k
        (dst)[ii] = 0;                      \
274
22.8k
}
275
276
static void nist_cp_bn(BN_ULONG *dst, const BN_ULONG *src, int top)
277
22.8k
{
278
22.8k
    int i;
279
280
160k
    for (i = 0; i < top; i++)
281
137k
        dst[i] = src[i];
282
22.8k
}
283
284
#if BN_BITS2 == 64
285
# define bn_cp_64(to, n, from, m)        (to)[n] = (m>=0)?((from)[m]):0;
286
# define bn_64_set_0(to, n)              (to)[n] = (BN_ULONG)0;
287
/*
288
 * two following macros are implemented under assumption that they
289
 * are called in a sequence with *ascending* n, i.e. as they are...
290
 */
291
327k
# define bn_cp_32_naked(to, n, from, m)  (((n)&1)?(to[(n)/2]|=((m)&1)?(from[(m)/2]&BN_MASK2h):(from[(m)/2]<<32))\
292
327k
                                                :(to[(n)/2] =((m)&1)?(from[(m)/2]>>32):(from[(m)/2]&BN_MASK2l)))
293
150k
# define bn_32_set_0(to, n)              (((n)&1)?(to[(n)/2]&=BN_MASK2l):(to[(n)/2]=0));
294
477k
# define bn_cp_32(to,n,from,m)           ((m)>=0)?bn_cp_32_naked(to,n,from,m):bn_32_set_0(to,n)
295
# if defined(L_ENDIAN)
296
#  if defined(__arch64__)
297
#   define NIST_INT64 long
298
#  else
299
0
#   define NIST_INT64 long long
300
#  endif
301
# endif
302
#else
303
# define bn_cp_64(to, n, from, m) \
304
        { \
305
        bn_cp_32(to, (n)*2, from, (m)*2); \
306
        bn_cp_32(to, (n)*2+1, from, (m)*2+1); \
307
        }
308
# define bn_64_set_0(to, n) \
309
        { \
310
        bn_32_set_0(to, (n)*2); \
311
        bn_32_set_0(to, (n)*2+1); \
312
        }
313
# define bn_cp_32(to, n, from, m)        (to)[n] = (m>=0)?((from)[m]):0;
314
# define bn_32_set_0(to, n)              (to)[n] = (BN_ULONG)0;
315
# if defined(_WIN32) && !defined(__GNUC__)
316
#  define NIST_INT64 __int64
317
# elif defined(BN_LLONG)
318
#  define NIST_INT64 long long
319
# endif
320
#endif                          /* BN_BITS2 != 64 */
321
322
#define nist_set_192(to, from, a1, a2, a3) \
323
        { \
324
        bn_cp_64(to, 0, from, (a3) - 3) \
325
        bn_cp_64(to, 1, from, (a2) - 3) \
326
        bn_cp_64(to, 2, from, (a1) - 3) \
327
        }
328
329
int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
330
                    BN_CTX *ctx)
331
0
{
332
0
    int top = a->top, i;
333
0
    int carry;
334
0
    register BN_ULONG *r_d, *a_d = a->d;
335
0
    union {
336
0
        BN_ULONG bn[BN_NIST_192_TOP];
337
0
        unsigned int ui[BN_NIST_192_TOP * sizeof(BN_ULONG) /
338
0
                        sizeof(unsigned int)];
339
0
    } buf;
340
0
    BN_ULONG c_d[BN_NIST_192_TOP], *res;
341
0
    static const BIGNUM ossl_bignum_nist_p_192_sqr = {
342
0
        (BN_ULONG *)_nist_p_192_sqr,
343
0
        OSSL_NELEM(_nist_p_192_sqr),
344
0
        OSSL_NELEM(_nist_p_192_sqr),
345
0
        0, BN_FLG_STATIC_DATA
346
0
    };
347
348
0
    field = &ossl_bignum_nist_p_192; /* just to make sure */
349
350
0
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_192_sqr) >= 0)
351
0
        return BN_nnmod(r, a, field, ctx);
352
353
0
    i = BN_ucmp(field, a);
354
0
    if (i == 0) {
355
0
        BN_zero(r);
356
0
        return 1;
357
0
    } else if (i > 0)
358
0
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
359
360
0
    if (r != a) {
361
0
        if (!bn_wexpand(r, BN_NIST_192_TOP))
362
0
            return 0;
363
0
        r_d = r->d;
364
0
        nist_cp_bn(r_d, a_d, BN_NIST_192_TOP);
365
0
    } else
366
0
        r_d = a_d;
367
368
0
    nist_cp_bn_0(buf.bn, a_d + BN_NIST_192_TOP, top - BN_NIST_192_TOP,
369
0
                 BN_NIST_192_TOP);
370
371
0
#if defined(NIST_INT64)
372
0
    {
373
0
        NIST_INT64 acc;         /* accumulator */
374
0
        unsigned int *rp = (unsigned int *)r_d;
375
0
        const unsigned int *bp = (const unsigned int *)buf.ui;
376
377
0
        acc = rp[0];
378
0
        acc += bp[3 * 2 - 6];
379
0
        acc += bp[5 * 2 - 6];
380
0
        rp[0] = (unsigned int)acc;
381
0
        acc >>= 32;
382
383
0
        acc += rp[1];
384
0
        acc += bp[3 * 2 - 5];
385
0
        acc += bp[5 * 2 - 5];
386
0
        rp[1] = (unsigned int)acc;
387
0
        acc >>= 32;
388
389
0
        acc += rp[2];
390
0
        acc += bp[3 * 2 - 6];
391
0
        acc += bp[4 * 2 - 6];
392
0
        acc += bp[5 * 2 - 6];
393
0
        rp[2] = (unsigned int)acc;
394
0
        acc >>= 32;
395
396
0
        acc += rp[3];
397
0
        acc += bp[3 * 2 - 5];
398
0
        acc += bp[4 * 2 - 5];
399
0
        acc += bp[5 * 2 - 5];
400
0
        rp[3] = (unsigned int)acc;
401
0
        acc >>= 32;
402
403
0
        acc += rp[4];
404
0
        acc += bp[4 * 2 - 6];
405
0
        acc += bp[5 * 2 - 6];
406
0
        rp[4] = (unsigned int)acc;
407
0
        acc >>= 32;
408
409
0
        acc += rp[5];
410
0
        acc += bp[4 * 2 - 5];
411
0
        acc += bp[5 * 2 - 5];
412
0
        rp[5] = (unsigned int)acc;
413
414
0
        carry = (int)(acc >> 32);
415
0
    }
416
#else
417
    {
418
        BN_ULONG t_d[BN_NIST_192_TOP];
419
420
        nist_set_192(t_d, buf.bn, 0, 3, 3);
421
        carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP);
422
        nist_set_192(t_d, buf.bn, 4, 4, 0);
423
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP);
424
        nist_set_192(t_d, buf.bn, 5, 5, 5)
425
            carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_192_TOP);
426
    }
427
#endif
428
0
    if (carry > 0)
429
0
        carry =
430
0
            (int)bn_sub_words(r_d, r_d, _nist_p_192[carry - 1],
431
0
                              BN_NIST_192_TOP);
432
0
    else
433
0
        carry = 1;
434
435
    /*
436
     * we need 'if (carry==0 || result>=modulus) result-=modulus;'
437
     * as comparison implies subtraction, we can write
438
     * 'tmp=result-modulus; if (!carry || !borrow) result=tmp;'
439
     * this is what happens below, but without explicit if:-) a.
440
     */
441
0
    res = (bn_sub_words(c_d, r_d, _nist_p_192[0], BN_NIST_192_TOP) && carry)
442
0
        ? r_d
443
0
        : c_d;
444
0
    nist_cp_bn(r_d, res, BN_NIST_192_TOP);
445
0
    r->top = BN_NIST_192_TOP;
446
0
    bn_correct_top(r);
447
448
0
    return 1;
449
0
}
450
451
typedef BN_ULONG (*bn_addsub_f) (BN_ULONG *, const BN_ULONG *,
452
                                 const BN_ULONG *, int);
453
454
#define nist_set_224(to, from, a1, a2, a3, a4, a5, a6, a7) \
455
68.2k
        { \
456
68.2k
        bn_cp_32(to, 0, from, (a7) - 7) \
457
68.2k
        bn_cp_32(to, 1, from, (a6) - 7) \
458
68.2k
        bn_cp_32(to, 2, from, (a5) - 7) \
459
68.2k
        bn_cp_32(to, 3, from, (a4) - 7) \
460
68.2k
        bn_cp_32(to, 4, from, (a3) - 7) \
461
68.2k
        bn_cp_32(to, 5, from, (a2) - 7) \
462
68.2k
        bn_cp_32(to, 6, from, (a1) - 7) \
463
68.2k
        }
464
465
int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
466
                    BN_CTX *ctx)
467
14.9k
{
468
14.9k
    int top = a->top, i;
469
14.9k
    int carry;
470
14.9k
    BN_ULONG *r_d, *a_d = a->d;
471
14.9k
    union {
472
14.9k
        BN_ULONG bn[BN_NIST_224_TOP];
473
14.9k
        unsigned int ui[BN_NIST_224_TOP * sizeof(BN_ULONG) /
474
14.9k
                        sizeof(unsigned int)];
475
14.9k
    } buf;
476
14.9k
    BN_ULONG c_d[BN_NIST_224_TOP], *res;
477
14.9k
    bn_addsub_f adjust;
478
14.9k
    static const BIGNUM ossl_bignum_nist_p_224_sqr = {
479
14.9k
        (BN_ULONG *)_nist_p_224_sqr,
480
14.9k
        OSSL_NELEM(_nist_p_224_sqr),
481
14.9k
        OSSL_NELEM(_nist_p_224_sqr),
482
14.9k
        0, BN_FLG_STATIC_DATA
483
14.9k
    };
484
485
14.9k
    field = &ossl_bignum_nist_p_224; /* just to make sure */
486
487
14.9k
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_224_sqr) >= 0)
488
0
        return BN_nnmod(r, a, field, ctx);
489
490
14.9k
    i = BN_ucmp(field, a);
491
14.9k
    if (i == 0) {
492
0
        BN_zero(r);
493
0
        return 1;
494
14.9k
    } else if (i > 0)
495
1.32k
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
496
497
13.6k
    if (r != a) {
498
0
        if (!bn_wexpand(r, BN_NIST_224_TOP))
499
0
            return 0;
500
0
        r_d = r->d;
501
0
        nist_cp_bn(r_d, a_d, BN_NIST_224_TOP);
502
0
    } else
503
13.6k
        r_d = a_d;
504
505
13.6k
#if BN_BITS2==64
506
    /* copy upper 256 bits of 448 bit number ... */
507
13.6k
    nist_cp_bn_0(c_d, a_d + (BN_NIST_224_TOP - 1),
508
13.6k
                 top - (BN_NIST_224_TOP - 1), BN_NIST_224_TOP);
509
    /* ... and right shift by 32 to obtain upper 224 bits */
510
13.6k
    nist_set_224(buf.bn, c_d, 14, 13, 12, 11, 10, 9, 8);
511
    /* truncate lower part to 224 bits too */
512
13.6k
    r_d[BN_NIST_224_TOP - 1] &= BN_MASK2l;
513
#else
514
    nist_cp_bn_0(buf.bn, a_d + BN_NIST_224_TOP, top - BN_NIST_224_TOP,
515
                 BN_NIST_224_TOP);
516
#endif
517
518
#if defined(NIST_INT64) && BN_BITS2!=64
519
    {
520
        NIST_INT64 acc;         /* accumulator */
521
        unsigned int *rp = (unsigned int *)r_d;
522
        const unsigned int *bp = (const unsigned int *)buf.ui;
523
524
        acc = rp[0];
525
        acc -= bp[7 - 7];
526
        acc -= bp[11 - 7];
527
        rp[0] = (unsigned int)acc;
528
        acc >>= 32;
529
530
        acc += rp[1];
531
        acc -= bp[8 - 7];
532
        acc -= bp[12 - 7];
533
        rp[1] = (unsigned int)acc;
534
        acc >>= 32;
535
536
        acc += rp[2];
537
        acc -= bp[9 - 7];
538
        acc -= bp[13 - 7];
539
        rp[2] = (unsigned int)acc;
540
        acc >>= 32;
541
542
        acc += rp[3];
543
        acc += bp[7 - 7];
544
        acc += bp[11 - 7];
545
        acc -= bp[10 - 7];
546
        rp[3] = (unsigned int)acc;
547
        acc >>= 32;
548
549
        acc += rp[4];
550
        acc += bp[8 - 7];
551
        acc += bp[12 - 7];
552
        acc -= bp[11 - 7];
553
        rp[4] = (unsigned int)acc;
554
        acc >>= 32;
555
556
        acc += rp[5];
557
        acc += bp[9 - 7];
558
        acc += bp[13 - 7];
559
        acc -= bp[12 - 7];
560
        rp[5] = (unsigned int)acc;
561
        acc >>= 32;
562
563
        acc += rp[6];
564
        acc += bp[10 - 7];
565
        acc -= bp[13 - 7];
566
        rp[6] = (unsigned int)acc;
567
568
        carry = (int)(acc >> 32);
569
# if BN_BITS2==64
570
        rp[7] = carry;
571
# endif
572
    }
573
#else
574
13.6k
    {
575
13.6k
        BN_ULONG t_d[BN_NIST_224_TOP];
576
577
13.6k
        nist_set_224(t_d, buf.bn, 10, 9, 8, 7, 0, 0, 0);
578
13.6k
        carry = (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP);
579
13.6k
        nist_set_224(t_d, buf.bn, 0, 13, 12, 11, 0, 0, 0);
580
13.6k
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP);
581
13.6k
        nist_set_224(t_d, buf.bn, 13, 12, 11, 10, 9, 8, 7);
582
13.6k
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP);
583
13.6k
        nist_set_224(t_d, buf.bn, 0, 0, 0, 0, 13, 12, 11);
584
13.6k
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP);
585
586
13.6k
# if BN_BITS2==64
587
13.6k
        carry = (int)(r_d[BN_NIST_224_TOP - 1] >> 32);
588
13.6k
# endif
589
13.6k
    }
590
13.6k
#endif
591
13.6k
    adjust = bn_sub_words;
592
13.6k
    if (carry > 0) {
593
6.84k
        carry =
594
6.84k
            (int)bn_sub_words(r_d, r_d, _nist_p_224[carry - 1],
595
6.84k
                              BN_NIST_224_TOP);
596
6.84k
#if BN_BITS2==64
597
6.84k
        carry = (int)(~(r_d[BN_NIST_224_TOP - 1] >> 32)) & 1;
598
6.84k
#endif
599
6.84k
    } else if (carry < 0) {
600
        /*
601
         * it's a bit more complicated logic in this case. if bn_add_words
602
         * yields no carry, then result has to be adjusted by unconditionally
603
         * *adding* the modulus. but if it does, then result has to be
604
         * compared to the modulus and conditionally adjusted by
605
         * *subtracting* the latter.
606
         */
607
1.61k
        carry =
608
1.61k
            (int)bn_add_words(r_d, r_d, _nist_p_224[-carry - 1],
609
1.61k
                              BN_NIST_224_TOP);
610
1.61k
        adjust = carry ? bn_sub_words : bn_add_words;
611
1.61k
    } else
612
5.18k
        carry = 1;
613
614
    /* otherwise it's effectively same as in BN_nist_mod_192... */
615
13.6k
    res = ((*adjust) (c_d, r_d, _nist_p_224[0], BN_NIST_224_TOP) && carry)
616
13.6k
        ? r_d
617
13.6k
        : c_d;
618
13.6k
    nist_cp_bn(r_d, res, BN_NIST_224_TOP);
619
13.6k
    r->top = BN_NIST_224_TOP;
620
13.6k
    bn_correct_top(r);
621
622
13.6k
    return 1;
623
13.6k
}
624
625
#define nist_set_256(to, from, a1, a2, a3, a4, a5, a6, a7, a8) \
626
        { \
627
        bn_cp_32(to, 0, from, (a8) - 8) \
628
        bn_cp_32(to, 1, from, (a7) - 8) \
629
        bn_cp_32(to, 2, from, (a6) - 8) \
630
        bn_cp_32(to, 3, from, (a5) - 8) \
631
        bn_cp_32(to, 4, from, (a4) - 8) \
632
        bn_cp_32(to, 5, from, (a3) - 8) \
633
        bn_cp_32(to, 6, from, (a2) - 8) \
634
        bn_cp_32(to, 7, from, (a1) - 8) \
635
        }
636
637
int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
638
                    BN_CTX *ctx)
639
0
{
640
0
    int i, top = a->top;
641
0
    int carry = 0;
642
0
    register BN_ULONG *a_d = a->d, *r_d;
643
0
    union {
644
0
        BN_ULONG bn[BN_NIST_256_TOP];
645
0
        unsigned int ui[BN_NIST_256_TOP * sizeof(BN_ULONG) /
646
0
                        sizeof(unsigned int)];
647
0
    } buf;
648
0
    BN_ULONG c_d[BN_NIST_256_TOP], *res;
649
0
    bn_addsub_f adjust;
650
0
    static const BIGNUM ossl_bignum_nist_p_256_sqr = {
651
0
        (BN_ULONG *)_nist_p_256_sqr,
652
0
        OSSL_NELEM(_nist_p_256_sqr),
653
0
        OSSL_NELEM(_nist_p_256_sqr),
654
0
        0, BN_FLG_STATIC_DATA
655
0
    };
656
657
0
    field = &ossl_bignum_nist_p_256; /* just to make sure */
658
659
0
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_256_sqr) >= 0)
660
0
        return BN_nnmod(r, a, field, ctx);
661
662
0
    i = BN_ucmp(field, a);
663
0
    if (i == 0) {
664
0
        BN_zero(r);
665
0
        return 1;
666
0
    } else if (i > 0)
667
0
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
668
669
0
    if (r != a) {
670
0
        if (!bn_wexpand(r, BN_NIST_256_TOP))
671
0
            return 0;
672
0
        r_d = r->d;
673
0
        nist_cp_bn(r_d, a_d, BN_NIST_256_TOP);
674
0
    } else
675
0
        r_d = a_d;
676
677
0
    nist_cp_bn_0(buf.bn, a_d + BN_NIST_256_TOP, top - BN_NIST_256_TOP,
678
0
                 BN_NIST_256_TOP);
679
680
0
#if defined(NIST_INT64)
681
0
    {
682
0
        NIST_INT64 acc;         /* accumulator */
683
0
        unsigned int *rp = (unsigned int *)r_d;
684
0
        const unsigned int *bp = (const unsigned int *)buf.ui;
685
686
0
        acc = rp[0];
687
0
        acc += bp[8 - 8];
688
0
        acc += bp[9 - 8];
689
0
        acc -= bp[11 - 8];
690
0
        acc -= bp[12 - 8];
691
0
        acc -= bp[13 - 8];
692
0
        acc -= bp[14 - 8];
693
0
        rp[0] = (unsigned int)acc;
694
0
        acc >>= 32;
695
696
0
        acc += rp[1];
697
0
        acc += bp[9 - 8];
698
0
        acc += bp[10 - 8];
699
0
        acc -= bp[12 - 8];
700
0
        acc -= bp[13 - 8];
701
0
        acc -= bp[14 - 8];
702
0
        acc -= bp[15 - 8];
703
0
        rp[1] = (unsigned int)acc;
704
0
        acc >>= 32;
705
706
0
        acc += rp[2];
707
0
        acc += bp[10 - 8];
708
0
        acc += bp[11 - 8];
709
0
        acc -= bp[13 - 8];
710
0
        acc -= bp[14 - 8];
711
0
        acc -= bp[15 - 8];
712
0
        rp[2] = (unsigned int)acc;
713
0
        acc >>= 32;
714
715
0
        acc += rp[3];
716
0
        acc += bp[11 - 8];
717
0
        acc += bp[11 - 8];
718
0
        acc += bp[12 - 8];
719
0
        acc += bp[12 - 8];
720
0
        acc += bp[13 - 8];
721
0
        acc -= bp[15 - 8];
722
0
        acc -= bp[8 - 8];
723
0
        acc -= bp[9 - 8];
724
0
        rp[3] = (unsigned int)acc;
725
0
        acc >>= 32;
726
727
0
        acc += rp[4];
728
0
        acc += bp[12 - 8];
729
0
        acc += bp[12 - 8];
730
0
        acc += bp[13 - 8];
731
0
        acc += bp[13 - 8];
732
0
        acc += bp[14 - 8];
733
0
        acc -= bp[9 - 8];
734
0
        acc -= bp[10 - 8];
735
0
        rp[4] = (unsigned int)acc;
736
0
        acc >>= 32;
737
738
0
        acc += rp[5];
739
0
        acc += bp[13 - 8];
740
0
        acc += bp[13 - 8];
741
0
        acc += bp[14 - 8];
742
0
        acc += bp[14 - 8];
743
0
        acc += bp[15 - 8];
744
0
        acc -= bp[10 - 8];
745
0
        acc -= bp[11 - 8];
746
0
        rp[5] = (unsigned int)acc;
747
0
        acc >>= 32;
748
749
0
        acc += rp[6];
750
0
        acc += bp[14 - 8];
751
0
        acc += bp[14 - 8];
752
0
        acc += bp[15 - 8];
753
0
        acc += bp[15 - 8];
754
0
        acc += bp[14 - 8];
755
0
        acc += bp[13 - 8];
756
0
        acc -= bp[8 - 8];
757
0
        acc -= bp[9 - 8];
758
0
        rp[6] = (unsigned int)acc;
759
0
        acc >>= 32;
760
761
0
        acc += rp[7];
762
0
        acc += bp[15 - 8];
763
0
        acc += bp[15 - 8];
764
0
        acc += bp[15 - 8];
765
0
        acc += bp[8 - 8];
766
0
        acc -= bp[10 - 8];
767
0
        acc -= bp[11 - 8];
768
0
        acc -= bp[12 - 8];
769
0
        acc -= bp[13 - 8];
770
0
        rp[7] = (unsigned int)acc;
771
772
0
        carry = (int)(acc >> 32);
773
0
    }
774
#else
775
    {
776
        BN_ULONG t_d[BN_NIST_256_TOP];
777
778
        /*
779
         * S1
780
         */
781
        nist_set_256(t_d, buf.bn, 15, 14, 13, 12, 11, 0, 0, 0);
782
        /*
783
         * S2
784
         */
785
        nist_set_256(c_d, buf.bn, 0, 15, 14, 13, 12, 0, 0, 0);
786
        carry = (int)bn_add_words(t_d, t_d, c_d, BN_NIST_256_TOP);
787
        /* left shift */
788
        {
789
            register BN_ULONG *ap, t, c;
790
            ap = t_d;
791
            c = 0;
792
            for (i = BN_NIST_256_TOP; i != 0; --i) {
793
                t = *ap;
794
                *(ap++) = ((t << 1) | c) & BN_MASK2;
795
                c = (t & BN_TBIT) ? 1 : 0;
796
            }
797
            carry <<= 1;
798
            carry |= c;
799
        }
800
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP);
801
        /*
802
         * S3
803
         */
804
        nist_set_256(t_d, buf.bn, 15, 14, 0, 0, 0, 10, 9, 8);
805
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP);
806
        /*
807
         * S4
808
         */
809
        nist_set_256(t_d, buf.bn, 8, 13, 15, 14, 13, 11, 10, 9);
810
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP);
811
        /*
812
         * D1
813
         */
814
        nist_set_256(t_d, buf.bn, 10, 8, 0, 0, 0, 13, 12, 11);
815
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
816
        /*
817
         * D2
818
         */
819
        nist_set_256(t_d, buf.bn, 11, 9, 0, 0, 15, 14, 13, 12);
820
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
821
        /*
822
         * D3
823
         */
824
        nist_set_256(t_d, buf.bn, 12, 0, 10, 9, 8, 15, 14, 13);
825
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
826
        /*
827
         * D4
828
         */
829
        nist_set_256(t_d, buf.bn, 13, 0, 11, 10, 9, 0, 15, 14);
830
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
831
832
    }
833
#endif
834
    /* see BN_nist_mod_224 for explanation */
835
0
    adjust = bn_sub_words;
836
0
    if (carry > 0)
837
0
        carry =
838
0
            (int)bn_sub_words(r_d, r_d, _nist_p_256[carry - 1],
839
0
                              BN_NIST_256_TOP);
840
0
    else if (carry < 0) {
841
0
        carry =
842
0
            (int)bn_add_words(r_d, r_d, _nist_p_256[-carry - 1],
843
0
                              BN_NIST_256_TOP);
844
0
        adjust = carry ? bn_sub_words : bn_add_words;
845
0
    } else
846
0
        carry = 1;
847
848
0
    res = ((*adjust) (c_d, r_d, _nist_p_256[0], BN_NIST_256_TOP) && carry)
849
0
        ? r_d
850
0
        : c_d;
851
0
    nist_cp_bn(r_d, res, BN_NIST_256_TOP);
852
0
    r->top = BN_NIST_256_TOP;
853
0
    bn_correct_top(r);
854
855
0
    return 1;
856
0
}
857
858
#define nist_set_384(to,from,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) \
859
        { \
860
        bn_cp_32(to, 0, from,  (a12) - 12) \
861
        bn_cp_32(to, 1, from,  (a11) - 12) \
862
        bn_cp_32(to, 2, from,  (a10) - 12) \
863
        bn_cp_32(to, 3, from,  (a9) - 12)  \
864
        bn_cp_32(to, 4, from,  (a8) - 12)  \
865
        bn_cp_32(to, 5, from,  (a7) - 12)  \
866
        bn_cp_32(to, 6, from,  (a6) - 12)  \
867
        bn_cp_32(to, 7, from,  (a5) - 12)  \
868
        bn_cp_32(to, 8, from,  (a4) - 12)  \
869
        bn_cp_32(to, 9, from,  (a3) - 12)  \
870
        bn_cp_32(to, 10, from, (a2) - 12)  \
871
        bn_cp_32(to, 11, from, (a1) - 12)  \
872
        }
873
874
int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
875
                    BN_CTX *ctx)
876
0
{
877
0
    int i, top = a->top;
878
0
    int carry = 0;
879
0
    register BN_ULONG *r_d, *a_d = a->d;
880
0
    union {
881
0
        BN_ULONG bn[BN_NIST_384_TOP];
882
0
        unsigned int ui[BN_NIST_384_TOP * sizeof(BN_ULONG) /
883
0
                        sizeof(unsigned int)];
884
0
    } buf;
885
0
    BN_ULONG c_d[BN_NIST_384_TOP], *res;
886
0
    bn_addsub_f adjust;
887
0
    static const BIGNUM ossl_bignum_nist_p_384_sqr = {
888
0
        (BN_ULONG *)_nist_p_384_sqr,
889
0
        OSSL_NELEM(_nist_p_384_sqr),
890
0
        OSSL_NELEM(_nist_p_384_sqr),
891
0
        0, BN_FLG_STATIC_DATA
892
0
    };
893
894
0
    field = &ossl_bignum_nist_p_384; /* just to make sure */
895
896
0
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_384_sqr) >= 0)
897
0
        return BN_nnmod(r, a, field, ctx);
898
899
0
    i = BN_ucmp(field, a);
900
0
    if (i == 0) {
901
0
        BN_zero(r);
902
0
        return 1;
903
0
    } else if (i > 0)
904
0
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
905
906
0
    if (r != a) {
907
0
        if (!bn_wexpand(r, BN_NIST_384_TOP))
908
0
            return 0;
909
0
        r_d = r->d;
910
0
        nist_cp_bn(r_d, a_d, BN_NIST_384_TOP);
911
0
    } else
912
0
        r_d = a_d;
913
914
0
    nist_cp_bn_0(buf.bn, a_d + BN_NIST_384_TOP, top - BN_NIST_384_TOP,
915
0
                 BN_NIST_384_TOP);
916
917
0
#if defined(NIST_INT64)
918
0
    {
919
0
        NIST_INT64 acc;         /* accumulator */
920
0
        unsigned int *rp = (unsigned int *)r_d;
921
0
        const unsigned int *bp = (const unsigned int *)buf.ui;
922
923
0
        acc = rp[0];
924
0
        acc += bp[12 - 12];
925
0
        acc += bp[21 - 12];
926
0
        acc += bp[20 - 12];
927
0
        acc -= bp[23 - 12];
928
0
        rp[0] = (unsigned int)acc;
929
0
        acc >>= 32;
930
931
0
        acc += rp[1];
932
0
        acc += bp[13 - 12];
933
0
        acc += bp[22 - 12];
934
0
        acc += bp[23 - 12];
935
0
        acc -= bp[12 - 12];
936
0
        acc -= bp[20 - 12];
937
0
        rp[1] = (unsigned int)acc;
938
0
        acc >>= 32;
939
940
0
        acc += rp[2];
941
0
        acc += bp[14 - 12];
942
0
        acc += bp[23 - 12];
943
0
        acc -= bp[13 - 12];
944
0
        acc -= bp[21 - 12];
945
0
        rp[2] = (unsigned int)acc;
946
0
        acc >>= 32;
947
948
0
        acc += rp[3];
949
0
        acc += bp[15 - 12];
950
0
        acc += bp[12 - 12];
951
0
        acc += bp[20 - 12];
952
0
        acc += bp[21 - 12];
953
0
        acc -= bp[14 - 12];
954
0
        acc -= bp[22 - 12];
955
0
        acc -= bp[23 - 12];
956
0
        rp[3] = (unsigned int)acc;
957
0
        acc >>= 32;
958
959
0
        acc += rp[4];
960
0
        acc += bp[21 - 12];
961
0
        acc += bp[21 - 12];
962
0
        acc += bp[16 - 12];
963
0
        acc += bp[13 - 12];
964
0
        acc += bp[12 - 12];
965
0
        acc += bp[20 - 12];
966
0
        acc += bp[22 - 12];
967
0
        acc -= bp[15 - 12];
968
0
        acc -= bp[23 - 12];
969
0
        acc -= bp[23 - 12];
970
0
        rp[4] = (unsigned int)acc;
971
0
        acc >>= 32;
972
973
0
        acc += rp[5];
974
0
        acc += bp[22 - 12];
975
0
        acc += bp[22 - 12];
976
0
        acc += bp[17 - 12];
977
0
        acc += bp[14 - 12];
978
0
        acc += bp[13 - 12];
979
0
        acc += bp[21 - 12];
980
0
        acc += bp[23 - 12];
981
0
        acc -= bp[16 - 12];
982
0
        rp[5] = (unsigned int)acc;
983
0
        acc >>= 32;
984
985
0
        acc += rp[6];
986
0
        acc += bp[23 - 12];
987
0
        acc += bp[23 - 12];
988
0
        acc += bp[18 - 12];
989
0
        acc += bp[15 - 12];
990
0
        acc += bp[14 - 12];
991
0
        acc += bp[22 - 12];
992
0
        acc -= bp[17 - 12];
993
0
        rp[6] = (unsigned int)acc;
994
0
        acc >>= 32;
995
996
0
        acc += rp[7];
997
0
        acc += bp[19 - 12];
998
0
        acc += bp[16 - 12];
999
0
        acc += bp[15 - 12];
1000
0
        acc += bp[23 - 12];
1001
0
        acc -= bp[18 - 12];
1002
0
        rp[7] = (unsigned int)acc;
1003
0
        acc >>= 32;
1004
1005
0
        acc += rp[8];
1006
0
        acc += bp[20 - 12];
1007
0
        acc += bp[17 - 12];
1008
0
        acc += bp[16 - 12];
1009
0
        acc -= bp[19 - 12];
1010
0
        rp[8] = (unsigned int)acc;
1011
0
        acc >>= 32;
1012
1013
0
        acc += rp[9];
1014
0
        acc += bp[21 - 12];
1015
0
        acc += bp[18 - 12];
1016
0
        acc += bp[17 - 12];
1017
0
        acc -= bp[20 - 12];
1018
0
        rp[9] = (unsigned int)acc;
1019
0
        acc >>= 32;
1020
1021
0
        acc += rp[10];
1022
0
        acc += bp[22 - 12];
1023
0
        acc += bp[19 - 12];
1024
0
        acc += bp[18 - 12];
1025
0
        acc -= bp[21 - 12];
1026
0
        rp[10] = (unsigned int)acc;
1027
0
        acc >>= 32;
1028
1029
0
        acc += rp[11];
1030
0
        acc += bp[23 - 12];
1031
0
        acc += bp[20 - 12];
1032
0
        acc += bp[19 - 12];
1033
0
        acc -= bp[22 - 12];
1034
0
        rp[11] = (unsigned int)acc;
1035
1036
0
        carry = (int)(acc >> 32);
1037
0
    }
1038
#else
1039
    {
1040
        BN_ULONG t_d[BN_NIST_384_TOP];
1041
1042
        /*
1043
         * S1
1044
         */
1045
        nist_set_256(t_d, buf.bn, 0, 0, 0, 0, 0, 23 - 4, 22 - 4, 21 - 4);
1046
        /* left shift */
1047
        {
1048
            register BN_ULONG *ap, t, c;
1049
            ap = t_d;
1050
            c = 0;
1051
            for (i = 3; i != 0; --i) {
1052
                t = *ap;
1053
                *(ap++) = ((t << 1) | c) & BN_MASK2;
1054
                c = (t & BN_TBIT) ? 1 : 0;
1055
            }
1056
            *ap = c;
1057
        }
1058
        carry =
1059
            (int)bn_add_words(r_d + (128 / BN_BITS2), r_d + (128 / BN_BITS2),
1060
                              t_d, BN_NIST_256_TOP);
1061
        /*
1062
         * S2
1063
         */
1064
        carry += (int)bn_add_words(r_d, r_d, buf.bn, BN_NIST_384_TOP);
1065
        /*
1066
         * S3
1067
         */
1068
        nist_set_384(t_d, buf.bn, 20, 19, 18, 17, 16, 15, 14, 13, 12, 23, 22,
1069
                     21);
1070
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1071
        /*
1072
         * S4
1073
         */
1074
        nist_set_384(t_d, buf.bn, 19, 18, 17, 16, 15, 14, 13, 12, 20, 0, 23,
1075
                     0);
1076
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1077
        /*
1078
         * S5
1079
         */
1080
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 23, 22, 21, 20, 0, 0, 0, 0);
1081
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1082
        /*
1083
         * S6
1084
         */
1085
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 0, 0, 23, 22, 21, 0, 0, 20);
1086
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1087
        /*
1088
         * D1
1089
         */
1090
        nist_set_384(t_d, buf.bn, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12,
1091
                     23);
1092
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1093
        /*
1094
         * D2
1095
         */
1096
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 0, 0, 0, 23, 22, 21, 20, 0);
1097
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1098
        /*
1099
         * D3
1100
         */
1101
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 0, 0, 0, 23, 23, 0, 0, 0);
1102
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1103
1104
    }
1105
#endif
1106
    /* see BN_nist_mod_224 for explanation */
1107
0
    adjust = bn_sub_words;
1108
0
    if (carry > 0)
1109
0
        carry =
1110
0
            (int)bn_sub_words(r_d, r_d, _nist_p_384[carry - 1],
1111
0
                              BN_NIST_384_TOP);
1112
0
    else if (carry < 0) {
1113
0
        carry =
1114
0
            (int)bn_add_words(r_d, r_d, _nist_p_384[-carry - 1],
1115
0
                              BN_NIST_384_TOP);
1116
0
        adjust = carry ? bn_sub_words : bn_add_words;
1117
0
    } else
1118
0
        carry = 1;
1119
1120
0
    res = ((*adjust) (c_d, r_d, _nist_p_384[0], BN_NIST_384_TOP) && carry)
1121
0
        ? r_d
1122
0
        : c_d;
1123
0
    nist_cp_bn(r_d, res, BN_NIST_384_TOP);
1124
0
    r->top = BN_NIST_384_TOP;
1125
0
    bn_correct_top(r);
1126
1127
0
    return 1;
1128
0
}
1129
1130
166k
#define BN_NIST_521_RSHIFT      (521%BN_BITS2)
1131
83.0k
#define BN_NIST_521_LSHIFT      (BN_BITS2-BN_NIST_521_RSHIFT)
1132
9.22k
#define BN_NIST_521_TOP_MASK    ((BN_ULONG)BN_MASK2>>BN_NIST_521_LSHIFT)
1133
1134
int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
1135
                    BN_CTX *ctx)
1136
10.4k
{
1137
10.4k
    int top = a->top, i;
1138
10.4k
    BN_ULONG *r_d, *a_d = a->d, t_d[BN_NIST_521_TOP], val, tmp, *res;
1139
10.4k
    static const BIGNUM ossl_bignum_nist_p_521_sqr = {
1140
10.4k
        (BN_ULONG *)_nist_p_521_sqr,
1141
10.4k
        OSSL_NELEM(_nist_p_521_sqr),
1142
10.4k
        OSSL_NELEM(_nist_p_521_sqr),
1143
10.4k
        0, BN_FLG_STATIC_DATA
1144
10.4k
    };
1145
1146
10.4k
    field = &ossl_bignum_nist_p_521; /* just to make sure */
1147
1148
10.4k
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_521_sqr) >= 0)
1149
0
        return BN_nnmod(r, a, field, ctx);
1150
1151
10.4k
    i = BN_ucmp(field, a);
1152
10.4k
    if (i == 0) {
1153
0
        BN_zero(r);
1154
0
        return 1;
1155
10.4k
    } else if (i > 0)
1156
1.21k
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
1157
1158
9.22k
    if (r != a) {
1159
0
        if (!bn_wexpand(r, BN_NIST_521_TOP))
1160
0
            return 0;
1161
0
        r_d = r->d;
1162
0
        nist_cp_bn(r_d, a_d, BN_NIST_521_TOP);
1163
0
    } else
1164
9.22k
        r_d = a_d;
1165
1166
    /* upper 521 bits, copy ... */
1167
9.22k
    nist_cp_bn_0(t_d, a_d + (BN_NIST_521_TOP - 1),
1168
9.22k
                 top - (BN_NIST_521_TOP - 1), BN_NIST_521_TOP);
1169
    /* ... and right shift */
1170
83.0k
    for (val = t_d[0], i = 0; i < BN_NIST_521_TOP - 1; i++) {
1171
#if 0
1172
        /*
1173
         * MSC ARM compiler [version 2013, presumably even earlier,
1174
         * much earlier] miscompiles this code, but not one in
1175
         * #else section. See RT#3541.
1176
         */
1177
        tmp = val >> BN_NIST_521_RSHIFT;
1178
        val = t_d[i + 1];
1179
        t_d[i] = (tmp | val << BN_NIST_521_LSHIFT) & BN_MASK2;
1180
#else
1181
73.8k
        t_d[i] = (val >> BN_NIST_521_RSHIFT |
1182
73.8k
                  (tmp = t_d[i + 1]) << BN_NIST_521_LSHIFT) & BN_MASK2;
1183
73.8k
        val = tmp;
1184
73.8k
#endif
1185
73.8k
    }
1186
9.22k
    t_d[i] = val >> BN_NIST_521_RSHIFT;
1187
    /* lower 521 bits */
1188
9.22k
    r_d[i] &= BN_NIST_521_TOP_MASK;
1189
1190
9.22k
    bn_add_words(r_d, r_d, t_d, BN_NIST_521_TOP);
1191
9.22k
    res = bn_sub_words(t_d, r_d, _nist_p_521,
1192
9.22k
                       BN_NIST_521_TOP)
1193
9.22k
        ? r_d
1194
9.22k
        : t_d;
1195
9.22k
    nist_cp_bn(r_d, res, BN_NIST_521_TOP);
1196
9.22k
    r->top = BN_NIST_521_TOP;
1197
9.22k
    bn_correct_top(r);
1198
1199
9.22k
    return 1;
1200
9.22k
}
1201
1202
int (*BN_nist_mod_func(const BIGNUM *p)) (BIGNUM *r, const BIGNUM *a,
1203
0
                                          const BIGNUM *field, BN_CTX *ctx) {
1204
0
    if (BN_ucmp(&ossl_bignum_nist_p_192, p) == 0)
1205
0
        return BN_nist_mod_192;
1206
0
    if (BN_ucmp(&ossl_bignum_nist_p_224, p) == 0)
1207
0
        return BN_nist_mod_224;
1208
0
    if (BN_ucmp(&ossl_bignum_nist_p_256, p) == 0)
1209
0
        return BN_nist_mod_256;
1210
0
    if (BN_ucmp(&ossl_bignum_nist_p_384, p) == 0)
1211
0
        return BN_nist_mod_384;
1212
0
    if (BN_ucmp(&ossl_bignum_nist_p_521, p) == 0)
1213
0
        return BN_nist_mod_521;
1214
0
    return 0;
1215
0
}