Coverage Report

Created: 2018-08-29 13:53

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