Coverage Report

Created: 2026-07-12 07:21

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