Coverage Report

Created: 2026-05-24 07:14

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