Coverage Report

Created: 2026-05-24 07:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl34/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.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[] = {
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
820k
    {                                       \
266
820k
        int ii;                             \
267
820k
        const BN_ULONG *src = src_in;       \
268
820k
                                            \
269
5.15M
        for (ii = 0; ii < top; ii++)        \
270
4.33M
            (dst)[ii] = src[ii];            \
271
1.02M
        for (; ii < max; ii++)              \
272
820k
            (dst)[ii] = 0;                  \
273
820k
    }
274
275
static void nist_cp_bn(BN_ULONG *dst, const BN_ULONG *src, int top)
276
820k
{
277
820k
    int i;
278
279
5.35M
    for (i = 0; i < top; i++)
280
4.53M
        dst[i] = src[i];
281
820k
}
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.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)) \
291
11.5M
                                                  : (to[(n) / 2] = ((m) & 1) ? (from[(m) / 2] >> 32) : (from[(m) / 2] & BN_MASK2l)))
292
5.27M
#define bn_32_set_0(to, n) (((n) & 1) ? (to[(n) / 2] &= BN_MASK2l) : (to[(n) / 2] = 0));
293
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)
294
#if defined(L_ENDIAN)
295
#if defined(__arch64__)
296
#define NIST_INT64 long
297
#else
298
149k
#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.79M
{
326
1.79M
    uint32_t tmp;
327
328
1.79M
    memcpy(&tmp, ptr, sizeof(tmp));
329
1.79M
    return tmp;
330
1.79M
}
331
332
static ossl_inline void store_lo32(void *ptr, NIST_INT64 val)
333
1.79M
{
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.79M
    uint32_t tmp = (uint32_t)val;
338
339
1.79M
    memcpy(ptr, &tmp, sizeof(tmp));
340
1.79M
}
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.39M
    {                                                           \
476
2.39M
        bn_cp_32(to, 0, from, (a7) - 7)                         \
477
2.39M
            bn_cp_32(to, 1, from, (a6) - 7)                     \
478
2.39M
                bn_cp_32(to, 2, from, (a5) - 7)                 \
479
2.39M
                    bn_cp_32(to, 3, from, (a4) - 7)             \
480
2.39M
                        bn_cp_32(to, 4, from, (a3) - 7)         \
481
2.39M
                            bn_cp_32(to, 5, from, (a2) - 7)     \
482
2.39M
                                bn_cp_32(to, 6, from, (a1) - 7) \
483
2.39M
    }
484
485
int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
486
    BN_CTX *ctx)
487
485k
{
488
485k
    int top = a->top, i;
489
485k
    int carry;
490
485k
    BN_ULONG *r_d, *a_d = a->d;
491
485k
    union {
492
485k
        BN_ULONG bn[BN_NIST_224_TOP];
493
485k
        unsigned int ui[BN_NIST_224_TOP * sizeof(BN_ULONG) / sizeof(unsigned int)];
494
485k
    } buf;
495
485k
    BN_ULONG c_d[BN_NIST_224_TOP], *res;
496
485k
    bn_addsub_f adjust;
497
485k
    static const BIGNUM ossl_bignum_nist_p_224_sqr = {
498
485k
        (BN_ULONG *)_nist_p_224_sqr,
499
485k
        OSSL_NELEM(_nist_p_224_sqr),
500
485k
        OSSL_NELEM(_nist_p_224_sqr),
501
485k
        0, BN_FLG_STATIC_DATA
502
485k
    };
503
504
485k
    field = &ossl_bignum_nist_p_224; /* just to make sure */
505
506
485k
    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
485k
    i = BN_ucmp(field, a);
510
485k
    if (i == 0) {
511
0
        BN_zero(r);
512
0
        return 1;
513
485k
    } else if (i > 0)
514
5.64k
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
515
516
479k
    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
479k
        r_d = a_d;
523
524
479k
#if BN_BITS2 == 64
525
    /* copy upper 256 bits of 448 bit number ... */
526
479k
    nist_cp_bn_0(c_d, a_d + (BN_NIST_224_TOP - 1),
527
479k
        top - (BN_NIST_224_TOP - 1), BN_NIST_224_TOP);
528
    /* ... and right shift by 32 to obtain upper 224 bits */
529
479k
    nist_set_224(buf.bn, c_d, 14, 13, 12, 11, 10, 9, 8);
530
    /* truncate lower part to 224 bits too */
531
479k
    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
#if BN_BITS2 == 64
589
        rp[7] = carry;
590
#endif
591
    }
592
#else
593
479k
    {
594
479k
        BN_ULONG t_d[BN_NIST_224_TOP];
595
596
479k
        nist_set_224(t_d, buf.bn, 10, 9, 8, 7, 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, 0, 13, 12, 11, 0, 0, 0);
599
479k
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_224_TOP);
600
479k
        nist_set_224(t_d, buf.bn, 13, 12, 11, 10, 9, 8, 7);
601
479k
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP);
602
479k
        nist_set_224(t_d, buf.bn, 0, 0, 0, 0, 13, 12, 11);
603
479k
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_224_TOP);
604
605
479k
#if BN_BITS2 == 64
606
479k
        carry = (int)(r_d[BN_NIST_224_TOP - 1] >> 32);
607
479k
#endif
608
479k
    }
609
479k
#endif
610
479k
    adjust = bn_sub_words;
611
479k
    if (carry > 0) {
612
207k
        carry = (int)bn_sub_words(r_d, r_d, _nist_p_224[carry - 1],
613
207k
            BN_NIST_224_TOP);
614
207k
#if BN_BITS2 == 64
615
207k
        carry = (int)(~(r_d[BN_NIST_224_TOP - 1] >> 32)) & 1;
616
207k
#endif
617
271k
    } else if (carry < 0) {
618
        /*
619
         * it's a bit more complicated logic in this case. if bn_add_words
620
         * yields no carry, then result has to be adjusted by unconditionally
621
         * *adding* the modulus. but if it does, then result has to be
622
         * compared to the modulus and conditionally adjusted by
623
         * *subtracting* the latter.
624
         */
625
19.6k
        carry = (int)bn_add_words(r_d, r_d, _nist_p_224[-carry - 1],
626
19.6k
            BN_NIST_224_TOP);
627
19.6k
        adjust = carry ? bn_sub_words : bn_add_words;
628
19.6k
    } else
629
252k
        carry = 1;
630
631
    /* otherwise it's effectively same as in BN_nist_mod_192... */
632
479k
    res = ((*adjust)(c_d, r_d, _nist_p_224[0], BN_NIST_224_TOP) && carry)
633
479k
        ? r_d
634
479k
        : c_d;
635
479k
    nist_cp_bn(r_d, res, BN_NIST_224_TOP);
636
479k
    r->top = BN_NIST_224_TOP;
637
479k
    bn_correct_top(r);
638
639
479k
    return 1;
640
479k
}
641
642
#define nist_set_256(to, from, a1, a2, a3, a4, a5, a6, a7, a8)      \
643
    {                                                               \
644
        bn_cp_32(to, 0, from, (a8) - 8)                             \
645
            bn_cp_32(to, 1, from, (a7) - 8)                         \
646
                bn_cp_32(to, 2, from, (a6) - 8)                     \
647
                    bn_cp_32(to, 3, from, (a5) - 8)                 \
648
                        bn_cp_32(to, 4, from, (a4) - 8)             \
649
                            bn_cp_32(to, 5, from, (a3) - 8)         \
650
                                bn_cp_32(to, 6, from, (a2) - 8)     \
651
                                    bn_cp_32(to, 7, from, (a1) - 8) \
652
    }
653
654
int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
655
    BN_CTX *ctx)
656
0
{
657
0
    int i, top = a->top;
658
0
    int carry = 0;
659
0
    register BN_ULONG *a_d = a->d, *r_d;
660
0
    union {
661
0
        BN_ULONG bn[BN_NIST_256_TOP];
662
0
        unsigned int ui[BN_NIST_256_TOP * sizeof(BN_ULONG) / sizeof(unsigned int)];
663
0
    } buf;
664
0
    BN_ULONG c_d[BN_NIST_256_TOP], *res;
665
0
    bn_addsub_f adjust;
666
0
    static const BIGNUM ossl_bignum_nist_p_256_sqr = {
667
0
        (BN_ULONG *)_nist_p_256_sqr,
668
0
        OSSL_NELEM(_nist_p_256_sqr),
669
0
        OSSL_NELEM(_nist_p_256_sqr),
670
0
        0, BN_FLG_STATIC_DATA
671
0
    };
672
673
0
    field = &ossl_bignum_nist_p_256; /* just to make sure */
674
675
0
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_256_sqr) >= 0)
676
0
        return BN_nnmod(r, a, field, ctx);
677
678
0
    i = BN_ucmp(field, a);
679
0
    if (i == 0) {
680
0
        BN_zero(r);
681
0
        return 1;
682
0
    } else if (i > 0)
683
0
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
684
685
0
    if (r != a) {
686
0
        if (!bn_wexpand(r, BN_NIST_256_TOP))
687
0
            return 0;
688
0
        r_d = r->d;
689
0
        nist_cp_bn(r_d, a_d, BN_NIST_256_TOP);
690
0
    } else
691
0
        r_d = a_d;
692
693
0
    nist_cp_bn_0(buf.bn, a_d + BN_NIST_256_TOP, top - BN_NIST_256_TOP,
694
0
        BN_NIST_256_TOP);
695
696
0
#if defined(NIST_INT64)
697
0
    {
698
0
        NIST_INT64 acc; /* accumulator */
699
0
        unsigned int *rp = (unsigned int *)r_d;
700
0
        const unsigned int *bp = (const unsigned int *)buf.ui;
701
702
0
        acc = load_u32(&rp[0]);
703
0
        acc += bp[8 - 8];
704
0
        acc += bp[9 - 8];
705
0
        acc -= bp[11 - 8];
706
0
        acc -= bp[12 - 8];
707
0
        acc -= bp[13 - 8];
708
0
        acc -= bp[14 - 8];
709
0
        store_lo32(&rp[0], acc);
710
0
        acc >>= 32;
711
712
0
        acc += load_u32(&rp[1]);
713
0
        acc += bp[9 - 8];
714
0
        acc += bp[10 - 8];
715
0
        acc -= bp[12 - 8];
716
0
        acc -= bp[13 - 8];
717
0
        acc -= bp[14 - 8];
718
0
        acc -= bp[15 - 8];
719
0
        store_lo32(&rp[1], acc);
720
0
        acc >>= 32;
721
722
0
        acc += load_u32(&rp[2]);
723
0
        acc += bp[10 - 8];
724
0
        acc += bp[11 - 8];
725
0
        acc -= bp[13 - 8];
726
0
        acc -= bp[14 - 8];
727
0
        acc -= bp[15 - 8];
728
0
        store_lo32(&rp[2], acc);
729
0
        acc >>= 32;
730
731
0
        acc += load_u32(&rp[3]);
732
0
        acc += bp[11 - 8];
733
0
        acc += bp[11 - 8];
734
0
        acc += bp[12 - 8];
735
0
        acc += bp[12 - 8];
736
0
        acc += bp[13 - 8];
737
0
        acc -= bp[15 - 8];
738
0
        acc -= bp[8 - 8];
739
0
        acc -= bp[9 - 8];
740
0
        store_lo32(&rp[3], acc);
741
0
        acc >>= 32;
742
743
0
        acc += load_u32(&rp[4]);
744
0
        acc += bp[12 - 8];
745
0
        acc += bp[12 - 8];
746
0
        acc += bp[13 - 8];
747
0
        acc += bp[13 - 8];
748
0
        acc += bp[14 - 8];
749
0
        acc -= bp[9 - 8];
750
0
        acc -= bp[10 - 8];
751
0
        store_lo32(&rp[4], acc);
752
0
        acc >>= 32;
753
754
0
        acc += load_u32(&rp[5]);
755
0
        acc += bp[13 - 8];
756
0
        acc += bp[13 - 8];
757
0
        acc += bp[14 - 8];
758
0
        acc += bp[14 - 8];
759
0
        acc += bp[15 - 8];
760
0
        acc -= bp[10 - 8];
761
0
        acc -= bp[11 - 8];
762
0
        store_lo32(&rp[5], acc);
763
0
        acc >>= 32;
764
765
0
        acc += load_u32(&rp[6]);
766
0
        acc += bp[14 - 8];
767
0
        acc += bp[14 - 8];
768
0
        acc += bp[15 - 8];
769
0
        acc += bp[15 - 8];
770
0
        acc += bp[14 - 8];
771
0
        acc += bp[13 - 8];
772
0
        acc -= bp[8 - 8];
773
0
        acc -= bp[9 - 8];
774
0
        store_lo32(&rp[6], acc);
775
0
        acc >>= 32;
776
777
0
        acc += load_u32(&rp[7]);
778
0
        acc += bp[15 - 8];
779
0
        acc += bp[15 - 8];
780
0
        acc += bp[15 - 8];
781
0
        acc += bp[8 - 8];
782
0
        acc -= bp[10 - 8];
783
0
        acc -= bp[11 - 8];
784
0
        acc -= bp[12 - 8];
785
0
        acc -= bp[13 - 8];
786
0
        store_lo32(&rp[7], acc);
787
788
0
        carry = (int)(acc >> 32);
789
0
    }
790
#else
791
    {
792
        BN_ULONG t_d[BN_NIST_256_TOP];
793
794
        /*
795
         * S1
796
         */
797
        nist_set_256(t_d, buf.bn, 15, 14, 13, 12, 11, 0, 0, 0);
798
        /*
799
         * S2
800
         */
801
        nist_set_256(c_d, buf.bn, 0, 15, 14, 13, 12, 0, 0, 0);
802
        carry = (int)bn_add_words(t_d, t_d, c_d, BN_NIST_256_TOP);
803
        /* left shift */
804
        {
805
            register BN_ULONG *ap, t, c;
806
            ap = t_d;
807
            c = 0;
808
            for (i = BN_NIST_256_TOP; i != 0; --i) {
809
                t = *ap;
810
                *(ap++) = ((t << 1) | c) & BN_MASK2;
811
                c = (t & BN_TBIT) ? 1 : 0;
812
            }
813
            carry <<= 1;
814
            carry |= c;
815
        }
816
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP);
817
        /*
818
         * S3
819
         */
820
        nist_set_256(t_d, buf.bn, 15, 14, 0, 0, 0, 10, 9, 8);
821
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP);
822
        /*
823
         * S4
824
         */
825
        nist_set_256(t_d, buf.bn, 8, 13, 15, 14, 13, 11, 10, 9);
826
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_256_TOP);
827
        /*
828
         * D1
829
         */
830
        nist_set_256(t_d, buf.bn, 10, 8, 0, 0, 0, 13, 12, 11);
831
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
832
        /*
833
         * D2
834
         */
835
        nist_set_256(t_d, buf.bn, 11, 9, 0, 0, 15, 14, 13, 12);
836
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
837
        /*
838
         * D3
839
         */
840
        nist_set_256(t_d, buf.bn, 12, 0, 10, 9, 8, 15, 14, 13);
841
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
842
        /*
843
         * D4
844
         */
845
        nist_set_256(t_d, buf.bn, 13, 0, 11, 10, 9, 0, 15, 14);
846
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_256_TOP);
847
    }
848
#endif
849
    /* see BN_nist_mod_224 for explanation */
850
0
    adjust = bn_sub_words;
851
0
    if (carry > 0)
852
0
        carry = (int)bn_sub_words(r_d, r_d, _nist_p_256[carry - 1],
853
0
            BN_NIST_256_TOP);
854
0
    else if (carry < 0) {
855
0
        carry = (int)bn_add_words(r_d, r_d, _nist_p_256[-carry - 1],
856
0
            BN_NIST_256_TOP);
857
0
        adjust = carry ? bn_sub_words : bn_add_words;
858
0
    } else
859
0
        carry = 1;
860
861
0
    res = ((*adjust)(c_d, r_d, _nist_p_256[0], BN_NIST_256_TOP) && carry)
862
0
        ? r_d
863
0
        : c_d;
864
0
    nist_cp_bn(r_d, res, BN_NIST_256_TOP);
865
0
    r->top = BN_NIST_256_TOP;
866
0
    bn_correct_top(r);
867
868
0
    return 1;
869
0
}
870
871
#define nist_set_384(to, from, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)     \
872
    {                                                                                 \
873
        bn_cp_32(to, 0, from, (a12) - 12)                                             \
874
            bn_cp_32(to, 1, from, (a11) - 12)                                         \
875
                bn_cp_32(to, 2, from, (a10) - 12)                                     \
876
                    bn_cp_32(to, 3, from, (a9) - 12)                                  \
877
                        bn_cp_32(to, 4, from, (a8) - 12)                              \
878
                            bn_cp_32(to, 5, from, (a7) - 12)                          \
879
                                bn_cp_32(to, 6, from, (a6) - 12)                      \
880
                                    bn_cp_32(to, 7, from, (a5) - 12)                  \
881
                                        bn_cp_32(to, 8, from, (a4) - 12)              \
882
                                            bn_cp_32(to, 9, from, (a3) - 12)          \
883
                                                bn_cp_32(to, 10, from, (a2) - 12)     \
884
                                                    bn_cp_32(to, 11, from, (a1) - 12) \
885
    }
886
887
int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
888
    BN_CTX *ctx)
889
151k
{
890
151k
    int i, top = a->top;
891
151k
    int carry = 0;
892
151k
    register BN_ULONG *r_d, *a_d = a->d;
893
151k
    union {
894
151k
        BN_ULONG bn[BN_NIST_384_TOP];
895
151k
        unsigned int ui[BN_NIST_384_TOP * sizeof(BN_ULONG) / sizeof(unsigned int)];
896
151k
    } buf;
897
151k
    BN_ULONG c_d[BN_NIST_384_TOP], *res;
898
151k
    bn_addsub_f adjust;
899
151k
    static const BIGNUM ossl_bignum_nist_p_384_sqr = {
900
151k
        (BN_ULONG *)_nist_p_384_sqr,
901
151k
        OSSL_NELEM(_nist_p_384_sqr),
902
151k
        OSSL_NELEM(_nist_p_384_sqr),
903
151k
        0, BN_FLG_STATIC_DATA
904
151k
    };
905
906
151k
    field = &ossl_bignum_nist_p_384; /* just to make sure */
907
908
151k
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_384_sqr) >= 0)
909
0
        return BN_nnmod(r, a, field, ctx);
910
911
151k
    i = BN_ucmp(field, a);
912
151k
    if (i == 0) {
913
0
        BN_zero(r);
914
0
        return 1;
915
151k
    } else if (i > 0)
916
1.95k
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
917
918
149k
    if (r != a) {
919
0
        if (!bn_wexpand(r, BN_NIST_384_TOP))
920
0
            return 0;
921
0
        r_d = r->d;
922
0
        nist_cp_bn(r_d, a_d, BN_NIST_384_TOP);
923
0
    } else
924
149k
        r_d = a_d;
925
926
149k
    nist_cp_bn_0(buf.bn, a_d + BN_NIST_384_TOP, top - BN_NIST_384_TOP,
927
149k
        BN_NIST_384_TOP);
928
929
149k
#if defined(NIST_INT64)
930
149k
    {
931
149k
        NIST_INT64 acc; /* accumulator */
932
149k
        unsigned int *rp = (unsigned int *)r_d;
933
149k
        const unsigned int *bp = (const unsigned int *)buf.ui;
934
935
149k
        acc = load_u32(&rp[0]);
936
149k
        acc += bp[12 - 12];
937
149k
        acc += bp[21 - 12];
938
149k
        acc += bp[20 - 12];
939
149k
        acc -= bp[23 - 12];
940
149k
        store_lo32(&rp[0], acc);
941
149k
        acc >>= 32;
942
943
149k
        acc += load_u32(&rp[1]);
944
149k
        acc += bp[13 - 12];
945
149k
        acc += bp[22 - 12];
946
149k
        acc += bp[23 - 12];
947
149k
        acc -= bp[12 - 12];
948
149k
        acc -= bp[20 - 12];
949
149k
        store_lo32(&rp[1], acc);
950
149k
        acc >>= 32;
951
952
149k
        acc += load_u32(&rp[2]);
953
149k
        acc += bp[14 - 12];
954
149k
        acc += bp[23 - 12];
955
149k
        acc -= bp[13 - 12];
956
149k
        acc -= bp[21 - 12];
957
149k
        store_lo32(&rp[2], acc);
958
149k
        acc >>= 32;
959
960
149k
        acc += load_u32(&rp[3]);
961
149k
        acc += bp[15 - 12];
962
149k
        acc += bp[12 - 12];
963
149k
        acc += bp[20 - 12];
964
149k
        acc += bp[21 - 12];
965
149k
        acc -= bp[14 - 12];
966
149k
        acc -= bp[22 - 12];
967
149k
        acc -= bp[23 - 12];
968
149k
        store_lo32(&rp[3], acc);
969
149k
        acc >>= 32;
970
971
149k
        acc += load_u32(&rp[4]);
972
149k
        acc += bp[21 - 12];
973
149k
        acc += bp[21 - 12];
974
149k
        acc += bp[16 - 12];
975
149k
        acc += bp[13 - 12];
976
149k
        acc += bp[12 - 12];
977
149k
        acc += bp[20 - 12];
978
149k
        acc += bp[22 - 12];
979
149k
        acc -= bp[15 - 12];
980
149k
        acc -= bp[23 - 12];
981
149k
        acc -= bp[23 - 12];
982
149k
        store_lo32(&rp[4], acc);
983
149k
        acc >>= 32;
984
985
149k
        acc += load_u32(&rp[5]);
986
149k
        acc += bp[22 - 12];
987
149k
        acc += bp[22 - 12];
988
149k
        acc += bp[17 - 12];
989
149k
        acc += bp[14 - 12];
990
149k
        acc += bp[13 - 12];
991
149k
        acc += bp[21 - 12];
992
149k
        acc += bp[23 - 12];
993
149k
        acc -= bp[16 - 12];
994
149k
        store_lo32(&rp[5], acc);
995
149k
        acc >>= 32;
996
997
149k
        acc += load_u32(&rp[6]);
998
149k
        acc += bp[23 - 12];
999
149k
        acc += bp[23 - 12];
1000
149k
        acc += bp[18 - 12];
1001
149k
        acc += bp[15 - 12];
1002
149k
        acc += bp[14 - 12];
1003
149k
        acc += bp[22 - 12];
1004
149k
        acc -= bp[17 - 12];
1005
149k
        store_lo32(&rp[6], acc);
1006
149k
        acc >>= 32;
1007
1008
149k
        acc += load_u32(&rp[7]);
1009
149k
        acc += bp[19 - 12];
1010
149k
        acc += bp[16 - 12];
1011
149k
        acc += bp[15 - 12];
1012
149k
        acc += bp[23 - 12];
1013
149k
        acc -= bp[18 - 12];
1014
149k
        store_lo32(&rp[7], acc);
1015
149k
        acc >>= 32;
1016
1017
149k
        acc += load_u32(&rp[8]);
1018
149k
        acc += bp[20 - 12];
1019
149k
        acc += bp[17 - 12];
1020
149k
        acc += bp[16 - 12];
1021
149k
        acc -= bp[19 - 12];
1022
149k
        store_lo32(&rp[8], acc);
1023
149k
        acc >>= 32;
1024
1025
149k
        acc += load_u32(&rp[9]);
1026
149k
        acc += bp[21 - 12];
1027
149k
        acc += bp[18 - 12];
1028
149k
        acc += bp[17 - 12];
1029
149k
        acc -= bp[20 - 12];
1030
149k
        store_lo32(&rp[9], acc);
1031
149k
        acc >>= 32;
1032
1033
149k
        acc += load_u32(&rp[10]);
1034
149k
        acc += bp[22 - 12];
1035
149k
        acc += bp[19 - 12];
1036
149k
        acc += bp[18 - 12];
1037
149k
        acc -= bp[21 - 12];
1038
149k
        store_lo32(&rp[10], acc);
1039
149k
        acc >>= 32;
1040
1041
149k
        acc += load_u32(&rp[11]);
1042
149k
        acc += bp[23 - 12];
1043
149k
        acc += bp[20 - 12];
1044
149k
        acc += bp[19 - 12];
1045
149k
        acc -= bp[22 - 12];
1046
149k
        store_lo32(&rp[11], acc);
1047
1048
149k
        carry = (int)(acc >> 32);
1049
149k
    }
1050
#else
1051
    {
1052
        BN_ULONG t_d[BN_NIST_384_TOP];
1053
1054
        /*
1055
         * S1
1056
         */
1057
        nist_set_256(t_d, buf.bn, 0, 0, 0, 0, 0, 23 - 4, 22 - 4, 21 - 4);
1058
        /* left shift */
1059
        {
1060
            register BN_ULONG *ap, t, c;
1061
            ap = t_d;
1062
            c = 0;
1063
            for (i = 3; i != 0; --i) {
1064
                t = *ap;
1065
                *(ap++) = ((t << 1) | c) & BN_MASK2;
1066
                c = (t & BN_TBIT) ? 1 : 0;
1067
            }
1068
            *ap = c;
1069
        }
1070
        carry = (int)bn_add_words(r_d + (128 / BN_BITS2), r_d + (128 / BN_BITS2),
1071
            t_d, BN_NIST_256_TOP);
1072
        /*
1073
         * S2
1074
         */
1075
        carry += (int)bn_add_words(r_d, r_d, buf.bn, BN_NIST_384_TOP);
1076
        /*
1077
         * S3
1078
         */
1079
        nist_set_384(t_d, buf.bn, 20, 19, 18, 17, 16, 15, 14, 13, 12, 23, 22,
1080
            21);
1081
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1082
        /*
1083
         * S4
1084
         */
1085
        nist_set_384(t_d, buf.bn, 19, 18, 17, 16, 15, 14, 13, 12, 20, 0, 23,
1086
            0);
1087
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1088
        /*
1089
         * S5
1090
         */
1091
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 23, 22, 21, 20, 0, 0, 0, 0);
1092
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1093
        /*
1094
         * S6
1095
         */
1096
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 0, 0, 23, 22, 21, 0, 0, 20);
1097
        carry += (int)bn_add_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1098
        /*
1099
         * D1
1100
         */
1101
        nist_set_384(t_d, buf.bn, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12,
1102
            23);
1103
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1104
        /*
1105
         * D2
1106
         */
1107
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 0, 0, 0, 23, 22, 21, 20, 0);
1108
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1109
        /*
1110
         * D3
1111
         */
1112
        nist_set_384(t_d, buf.bn, 0, 0, 0, 0, 0, 0, 0, 23, 23, 0, 0, 0);
1113
        carry -= (int)bn_sub_words(r_d, r_d, t_d, BN_NIST_384_TOP);
1114
    }
1115
#endif
1116
    /* see BN_nist_mod_224 for explanation */
1117
149k
    adjust = bn_sub_words;
1118
149k
    if (carry > 0)
1119
86.9k
        carry = (int)bn_sub_words(r_d, r_d, _nist_p_384[carry - 1],
1120
86.9k
            BN_NIST_384_TOP);
1121
62.9k
    else if (carry < 0) {
1122
3.86k
        carry = (int)bn_add_words(r_d, r_d, _nist_p_384[-carry - 1],
1123
3.86k
            BN_NIST_384_TOP);
1124
3.86k
        adjust = carry ? bn_sub_words : bn_add_words;
1125
3.86k
    } else
1126
59.1k
        carry = 1;
1127
1128
149k
    res = ((*adjust)(c_d, r_d, _nist_p_384[0], BN_NIST_384_TOP) && carry)
1129
149k
        ? r_d
1130
149k
        : c_d;
1131
149k
    nist_cp_bn(r_d, res, BN_NIST_384_TOP);
1132
149k
    r->top = BN_NIST_384_TOP;
1133
149k
    bn_correct_top(r);
1134
1135
149k
    return 1;
1136
149k
}
1137
1138
3.43M
#define BN_NIST_521_RSHIFT (521 % BN_BITS2)
1139
1.71M
#define BN_NIST_521_LSHIFT (BN_BITS2 - BN_NIST_521_RSHIFT)
1140
190k
#define BN_NIST_521_TOP_MASK ((BN_ULONG)BN_MASK2 >> BN_NIST_521_LSHIFT)
1141
1142
int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *field,
1143
    BN_CTX *ctx)
1144
195k
{
1145
195k
    int top = a->top, i;
1146
195k
    BN_ULONG *r_d, *a_d = a->d, t_d[BN_NIST_521_TOP], val, tmp, *res;
1147
195k
    static const BIGNUM ossl_bignum_nist_p_521_sqr = {
1148
195k
        (BN_ULONG *)_nist_p_521_sqr,
1149
195k
        OSSL_NELEM(_nist_p_521_sqr),
1150
195k
        OSSL_NELEM(_nist_p_521_sqr),
1151
195k
        0, BN_FLG_STATIC_DATA
1152
195k
    };
1153
1154
195k
    field = &ossl_bignum_nist_p_521; /* just to make sure */
1155
1156
195k
    if (BN_is_negative(a) || BN_ucmp(a, &ossl_bignum_nist_p_521_sqr) >= 0)
1157
0
        return BN_nnmod(r, a, field, ctx);
1158
1159
195k
    i = BN_ucmp(field, a);
1160
195k
    if (i == 0) {
1161
0
        BN_zero(r);
1162
0
        return 1;
1163
195k
    } else if (i > 0)
1164
4.70k
        return (r == a) ? 1 : (BN_copy(r, a) != NULL);
1165
1166
190k
    if (r != a) {
1167
0
        if (!bn_wexpand(r, BN_NIST_521_TOP))
1168
0
            return 0;
1169
0
        r_d = r->d;
1170
0
        nist_cp_bn(r_d, a_d, BN_NIST_521_TOP);
1171
0
    } else
1172
190k
        r_d = a_d;
1173
1174
    /* upper 521 bits, copy ... */
1175
190k
    nist_cp_bn_0(t_d, a_d + (BN_NIST_521_TOP - 1),
1176
190k
        top - (BN_NIST_521_TOP - 1), BN_NIST_521_TOP);
1177
    /* ... and right shift */
1178
1.71M
    for (val = t_d[0], i = 0; i < BN_NIST_521_TOP - 1; i++) {
1179
#if 0
1180
        /*
1181
         * MSC ARM compiler [version 2013, presumably even earlier,
1182
         * much earlier] miscompiles this code, but not one in
1183
         * #else section. See RT#3541.
1184
         */
1185
        tmp = val >> BN_NIST_521_RSHIFT;
1186
        val = t_d[i + 1];
1187
        t_d[i] = (tmp | val << BN_NIST_521_LSHIFT) & BN_MASK2;
1188
#else
1189
1.52M
        t_d[i] = (val >> BN_NIST_521_RSHIFT | (tmp = t_d[i + 1]) << BN_NIST_521_LSHIFT) & BN_MASK2;
1190
1.52M
        val = tmp;
1191
1.52M
#endif
1192
1.52M
    }
1193
190k
    t_d[i] = val >> BN_NIST_521_RSHIFT;
1194
    /* lower 521 bits */
1195
190k
    r_d[i] &= BN_NIST_521_TOP_MASK;
1196
1197
190k
    bn_add_words(r_d, r_d, t_d, BN_NIST_521_TOP);
1198
190k
    res = bn_sub_words(t_d, r_d, _nist_p_521,
1199
190k
              BN_NIST_521_TOP)
1200
190k
        ? r_d
1201
190k
        : t_d;
1202
190k
    nist_cp_bn(r_d, res, BN_NIST_521_TOP);
1203
190k
    r->top = BN_NIST_521_TOP;
1204
190k
    bn_correct_top(r);
1205
1206
190k
    return 1;
1207
190k
}
1208
1209
int (*BN_nist_mod_func(const BIGNUM *p))(BIGNUM *r, const BIGNUM *a,
1210
    const BIGNUM *field, BN_CTX *ctx)
1211
0
{
1212
0
    if (BN_ucmp(&ossl_bignum_nist_p_192, p) == 0)
1213
0
        return BN_nist_mod_192;
1214
0
    if (BN_ucmp(&ossl_bignum_nist_p_224, p) == 0)
1215
0
        return BN_nist_mod_224;
1216
0
    if (BN_ucmp(&ossl_bignum_nist_p_256, p) == 0)
1217
0
        return BN_nist_mod_256;
1218
0
    if (BN_ucmp(&ossl_bignum_nist_p_384, p) == 0)
1219
0
        return BN_nist_mod_384;
1220
0
    if (BN_ucmp(&ossl_bignum_nist_p_521, p) == 0)
1221
0
        return BN_nist_mod_521;
1222
0
    return 0;
1223
0
}