Coverage Report

Created: 2026-09-12 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl40/crypto/bn/bn_mul.c
Line
Count
Source
1
/*
2
 * Copyright 1995-2026 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 <assert.h>
11
#include "internal/cryptlib.h"
12
#include "bn_local.h"
13
14
#if defined(OPENSSL_NO_ASM) || !defined(OPENSSL_BN_ASM_PART_WORDS)
15
/*
16
 * Here follows specialised variants of bn_add_words() and bn_sub_words().
17
 * They have the property performing operations on arrays of different sizes.
18
 * The sizes of those arrays is expressed through cl, which is the common
19
 * length ( basically, min(len(a),len(b)) ), and dl, which is the delta
20
 * between the two lengths, calculated as len(a)-len(b). All lengths are the
21
 * number of BN_ULONGs...  For the operations that require a result array as
22
 * parameter, it must have the length cl+abs(dl). These functions should
23
 * probably end up in bn_asm.c as soon as there are assembler counterparts
24
 * for the systems that use assembler files.
25
 */
26
27
BN_ULONG bn_sub_part_words(BN_ULONG *r,
28
    const BN_ULONG *a, const BN_ULONG *b,
29
    int cl, int dl)
30
86.1M
{
31
86.1M
    BN_ULONG c, t;
32
33
86.1M
    assert(cl >= 0);
34
86.1M
    c = bn_sub_words(r, a, b, cl);
35
36
86.1M
    if (dl == 0)
37
83.9M
        return c;
38
39
2.28M
    r += cl;
40
2.28M
    a += cl;
41
2.28M
    b += cl;
42
43
2.28M
    if (dl < 0) {
44
548k
        for (;;) {
45
548k
            t = b[0];
46
548k
            r[0] = (0 - t - c) & BN_MASK2;
47
548k
            if (t != 0)
48
0
                c = 1;
49
548k
            if (++dl >= 0)
50
34.1k
                break;
51
52
514k
            t = b[1];
53
514k
            r[1] = (0 - t - c) & BN_MASK2;
54
514k
            if (t != 0)
55
0
                c = 1;
56
514k
            if (++dl >= 0)
57
39.8k
                break;
58
59
474k
            t = b[2];
60
474k
            r[2] = (0 - t - c) & BN_MASK2;
61
474k
            if (t != 0)
62
0
                c = 1;
63
474k
            if (++dl >= 0)
64
107k
                break;
65
66
367k
            t = b[3];
67
367k
            r[3] = (0 - t - c) & BN_MASK2;
68
367k
            if (t != 0)
69
0
                c = 1;
70
367k
            if (++dl >= 0)
71
15.6k
                break;
72
73
352k
            b += 4;
74
352k
            r += 4;
75
352k
        }
76
2.08M
    } else {
77
2.08M
        int save_dl = dl;
78
2.43M
        while (c) {
79
481k
            t = a[0];
80
481k
            r[0] = (t - c) & BN_MASK2;
81
481k
            if (t != 0)
82
208k
                c = 0;
83
481k
            if (--dl <= 0)
84
48.8k
                break;
85
86
432k
            t = a[1];
87
432k
            r[1] = (t - c) & BN_MASK2;
88
432k
            if (t != 0)
89
178k
                c = 0;
90
432k
            if (--dl <= 0)
91
21.6k
                break;
92
93
411k
            t = a[2];
94
411k
            r[2] = (t - c) & BN_MASK2;
95
411k
            if (t != 0)
96
183k
                c = 0;
97
411k
            if (--dl <= 0)
98
44.2k
                break;
99
100
366k
            t = a[3];
101
366k
            r[3] = (t - c) & BN_MASK2;
102
366k
            if (t != 0)
103
159k
                c = 0;
104
366k
            if (--dl <= 0)
105
17.0k
                break;
106
107
349k
            save_dl = dl;
108
349k
            a += 4;
109
349k
            r += 4;
110
349k
        }
111
2.08M
        if (dl > 0) {
112
1.95M
            if (save_dl > dl) {
113
0
                switch (save_dl - dl) {
114
0
                case 1:
115
0
                    r[1] = a[1];
116
0
                    if (--dl <= 0)
117
0
                        break;
118
                    /* fall through */
119
0
                case 2:
120
0
                    r[2] = a[2];
121
0
                    if (--dl <= 0)
122
0
                        break;
123
                    /* fall through */
124
0
                case 3:
125
0
                    r[3] = a[3];
126
0
                    if (--dl <= 0)
127
0
                        break;
128
0
                }
129
0
                a += 4;
130
0
                r += 4;
131
0
            }
132
1.95M
        }
133
2.08M
        if (dl > 0) {
134
14.6M
            for (;;) {
135
14.6M
                r[0] = a[0];
136
14.6M
                if (--dl <= 0)
137
370k
                    break;
138
14.2M
                r[1] = a[1];
139
14.2M
                if (--dl <= 0)
140
276k
                    break;
141
13.9M
                r[2] = a[2];
142
13.9M
                if (--dl <= 0)
143
805k
                    break;
144
13.1M
                r[3] = a[3];
145
13.1M
                if (--dl <= 0)
146
504k
                    break;
147
148
12.6M
                a += 4;
149
12.6M
                r += 4;
150
12.6M
            }
151
1.95M
        }
152
2.08M
    }
153
2.28M
    return c;
154
2.28M
}
155
#endif
156
157
#ifndef OPENSSL_SMALL_FOOTPRINT
158
/*
159
 * Karatsuba recursive multiplication algorithm (cf. Knuth, The Art of
160
 * Computer Programming, Vol. 2)
161
 */
162
163
/*-
164
 * r is 2*n2 words in size,
165
 * a and b are both n2 words in size.
166
 * n2 must be a power of 2.
167
 * We multiply and return the result.
168
 * t must be 2*n2 words in size
169
 * We calculate
170
 * a[0]*b[0]
171
 * a[0]*b[0]+a[1]*b[1]+(a[0]-a[1])*(b[1]-b[0])
172
 * a[1]*b[1]
173
 */
174
/* dnX may not be positive, but n2/2+dnX has to be */
175
void bn_mul_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
176
    int dna, int dnb, BN_ULONG *t)
177
45.2M
{
178
45.2M
    int n = n2 / 2, c1, c2;
179
45.2M
    int tna = n + dna, tnb = n + dnb;
180
45.2M
    unsigned int neg, zero;
181
45.2M
    BN_ULONG ln, lo, *p;
182
183
    /*
184
     * Only call bn_mul_comba 8 if n2 == 8 and the two arrays are complete
185
     * [steve]
186
     */
187
45.2M
    if (n2 == 8 && dna == 0 && dnb == 0) {
188
84.2k
        bn_mul_comba8(r, a, b);
189
84.2k
        return;
190
84.2k
    }
191
192
    /* Else do normal multiply */
193
45.1M
    if (n2 < BN_MUL_RECURSIVE_SIZE_NORMAL) {
194
47.8k
        bn_mul_normal(r, a, n2 + dna, b, n2 + dnb);
195
47.8k
        if ((dna + dnb) < 0)
196
47.8k
            memset(&r[2 * n2 + dna + dnb], 0,
197
47.8k
                sizeof(BN_ULONG) * -(dna + dnb));
198
47.8k
        return;
199
47.8k
    }
200
    /* r=(a[0]-a[1])*(b[1]-b[0]) */
201
45.0M
    c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna);
202
45.0M
    c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n);
203
45.0M
    zero = neg = 0;
204
45.0M
    switch (c1 * 3 + c2) {
205
8.79M
    case -4:
206
8.79M
        bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
207
8.79M
        bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
208
8.79M
        break;
209
838k
    case -3:
210
838k
        zero = 1;
211
838k
        break;
212
9.17M
    case -2:
213
9.17M
        bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
214
9.17M
        bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */
215
9.17M
        neg = 1;
216
9.17M
        break;
217
122k
    case -1:
218
1.21M
    case 0:
219
1.33M
    case 1:
220
1.33M
        zero = 1;
221
1.33M
        break;
222
14.8M
    case 2:
223
14.8M
        bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */
224
14.8M
        bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
225
14.8M
        neg = 1;
226
14.8M
        break;
227
932k
    case 3:
228
932k
        zero = 1;
229
932k
        break;
230
9.14M
    case 4:
231
9.14M
        bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
232
9.14M
        bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
233
9.14M
        break;
234
45.0M
    }
235
236
45.0M
    if (n == 4 && dna == 0 && dnb == 0) { /* XXX: bn_mul_comba4 could take
237
                                           * extra args to do this well */
238
0
        if (!zero)
239
0
            bn_mul_comba4(&(t[n2]), t, &(t[n]));
240
0
        else
241
0
            memset(&t[n2], 0, sizeof(*t) * 8);
242
243
0
        bn_mul_comba4(r, a, b);
244
0
        bn_mul_comba4(&(r[n2]), &(a[n]), &(b[n]));
245
45.0M
    } else if (n == 8 && dna == 0 && dnb == 0) { /* XXX: bn_mul_comba8 could
246
                                                  * take extra args to do
247
                                                  * this well */
248
30.4M
        if (!zero)
249
28.2M
            bn_mul_comba8(&(t[n2]), t, &(t[n]));
250
2.22M
        else
251
2.22M
            memset(&t[n2], 0, sizeof(*t) * 16);
252
253
30.4M
        bn_mul_comba8(r, a, b);
254
30.4M
        bn_mul_comba8(&(r[n2]), &(a[n]), &(b[n]));
255
30.4M
    } else {
256
14.5M
        p = &(t[n2 * 2]);
257
14.5M
        if (!zero)
258
13.7M
            bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p);
259
871k
        else
260
871k
            memset(&t[n2], 0, sizeof(*t) * n2);
261
14.5M
        bn_mul_recursive(r, a, b, n, 0, 0, p);
262
14.5M
        bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]), n, dna, dnb, p);
263
14.5M
    }
264
265
    /*-
266
     * t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
267
     * r[10] holds (a[0]*b[0])
268
     * r[32] holds (b[1]*b[1])
269
     */
270
271
45.0M
    c1 = (int)(bn_add_words(t, r, &(r[n2]), n2));
272
273
45.0M
    if (neg) { /* if t[32] is negative */
274
24.0M
        c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2));
275
24.0M
    } else {
276
        /* Might have a carry */
277
21.0M
        c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2));
278
21.0M
    }
279
280
    /*-
281
     * t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
282
     * r[10] holds (a[0]*b[0])
283
     * r[32] holds (b[1]*b[1])
284
     * c1 holds the carry bits
285
     */
286
45.0M
    c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2));
287
45.0M
    if (c1) {
288
17.5M
        p = &(r[n + n2]);
289
17.5M
        lo = *p;
290
17.5M
        ln = (lo + c1) & BN_MASK2;
291
17.5M
        *p = ln;
292
293
        /*
294
         * The overflow will stop before we over write words we should not
295
         * overwrite
296
         */
297
17.5M
        if (ln < (BN_ULONG)c1) {
298
553k
            do {
299
553k
                p++;
300
553k
                lo = *p;
301
553k
                ln = (lo + 1) & BN_MASK2;
302
553k
                *p = ln;
303
553k
            } while (ln == 0);
304
110k
        }
305
17.5M
    }
306
45.0M
}
307
308
/*
309
 * n+tn is the word length t needs to be n*4 is size, as does r
310
 */
311
/* tnX may not be negative but less than n */
312
void bn_mul_part_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n,
313
    int tna, int tnb, BN_ULONG *t)
314
1.10M
{
315
1.10M
    int i, j, n2 = n * 2;
316
1.10M
    int c1, c2, neg;
317
1.10M
    BN_ULONG ln, lo, *p;
318
319
1.10M
    if (n < 8) {
320
0
        bn_mul_normal(r, a, n + tna, b, n + tnb);
321
0
        return;
322
0
    }
323
324
    /* r=(a[0]-a[1])*(b[1]-b[0]) */
325
1.10M
    c1 = bn_cmp_part_words(a, &(a[n]), tna, n - tna);
326
1.10M
    c2 = bn_cmp_part_words(&(b[n]), b, tnb, tnb - n);
327
1.10M
    neg = 0;
328
1.10M
    switch (c1 * 3 + c2) {
329
119k
    case -4:
330
119k
        bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
331
119k
        bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
332
119k
        break;
333
3.98k
    case -3:
334
17.2k
    case -2:
335
17.2k
        bn_sub_part_words(t, &(a[n]), a, tna, tna - n); /* - */
336
17.2k
        bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n); /* + */
337
17.2k
        neg = 1;
338
17.2k
        break;
339
16.1k
    case -1:
340
19.3k
    case 0:
341
21.9k
    case 1:
342
933k
    case 2:
343
933k
        bn_sub_part_words(t, a, &(a[n]), tna, n - tna); /* + */
344
933k
        bn_sub_part_words(&(t[n]), b, &(b[n]), tnb, n - tnb); /* - */
345
933k
        neg = 1;
346
933k
        break;
347
15.6k
    case 3:
348
37.0k
    case 4:
349
37.0k
        bn_sub_part_words(t, a, &(a[n]), tna, n - tna);
350
37.0k
        bn_sub_part_words(&(t[n]), &(b[n]), b, tnb, tnb - n);
351
37.0k
        break;
352
1.10M
    }
353
    /*
354
     * The zero case isn't yet implemented here. The speedup would probably
355
     * be negligible.
356
     */
357
#if 0
358
    if (n == 4) {
359
        bn_mul_comba4(&(t[n2]), t, &(t[n]));
360
        bn_mul_comba4(r, a, b);
361
        bn_mul_normal(&(r[n2]), &(a[n]), tn, &(b[n]), tn);
362
        memset(&r[n2 + tn * 2], 0, sizeof(*r) * (n2 - tn * 2));
363
    } else
364
#endif
365
1.10M
    if (n == 8) {
366
151k
        bn_mul_comba8(&(t[n2]), t, &(t[n]));
367
151k
        bn_mul_comba8(r, a, b);
368
151k
        bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb);
369
151k
        memset(&r[n2 + tna + tnb], 0, sizeof(*r) * (n2 - tna - tnb));
370
955k
    } else {
371
955k
        p = &(t[n2 * 2]);
372
955k
        bn_mul_recursive(&(t[n2]), t, &(t[n]), n, 0, 0, p);
373
955k
        bn_mul_recursive(r, a, b, n, 0, 0, p);
374
955k
        i = n / 2;
375
        /*
376
         * If there is only a bottom half to the number, just do it
377
         */
378
955k
        if (tna > tnb)
379
88.3k
            j = tna - i;
380
867k
        else
381
867k
            j = tnb - i;
382
955k
        if (j == 0) {
383
30.7k
            bn_mul_recursive(&(r[n2]), &(a[n]), &(b[n]),
384
30.7k
                i, tna - i, tnb - i, p);
385
30.7k
            memset(&r[n2 + i * 2], 0, sizeof(*r) * (n2 - i * 2));
386
925k
        } else if (j > 0) { /* eg, n == 16, i == 8 and tn == 11 */
387
217k
            bn_mul_part_recursive(&(r[n2]), &(a[n]), &(b[n]),
388
217k
                i, tna - i, tnb - i, p);
389
217k
            memset(&(r[n2 + tna + tnb]), 0,
390
217k
                sizeof(BN_ULONG) * (n2 - tna - tnb));
391
707k
        } else { /* (j < 0) eg, n == 16, i == 8 and tn == 5 */
392
393
707k
            memset(&r[n2], 0, sizeof(*r) * n2);
394
707k
            if (tna < BN_MUL_RECURSIVE_SIZE_NORMAL
395
615k
                && tnb < BN_MUL_RECURSIVE_SIZE_NORMAL) {
396
613k
                bn_mul_normal(&(r[n2]), &(a[n]), tna, &(b[n]), tnb);
397
613k
            } else {
398
104k
                for (;;) {
399
104k
                    i /= 2;
400
                    /*
401
                     * these simplified conditions work exclusively because
402
                     * difference between tna and tnb is 1 or 0
403
                     */
404
104k
                    if (i < tna || i < tnb) {
405
30.0k
                        bn_mul_part_recursive(&(r[n2]),
406
30.0k
                            &(a[n]), &(b[n]),
407
30.0k
                            i, tna - i, tnb - i, p);
408
30.0k
                        break;
409
74.6k
                    } else if (i == tna || i == tnb) {
410
64.2k
                        bn_mul_recursive(&(r[n2]),
411
64.2k
                            &(a[n]), &(b[n]),
412
64.2k
                            i, tna - i, tnb - i, p);
413
64.2k
                        break;
414
64.2k
                    }
415
104k
                }
416
94.3k
            }
417
707k
        }
418
955k
    }
419
420
    /*-
421
     * t[32] holds (a[0]-a[1])*(b[1]-b[0]), c1 is the sign
422
     * r[10] holds (a[0]*b[0])
423
     * r[32] holds (b[1]*b[1])
424
     */
425
426
1.10M
    c1 = (int)(bn_add_words(t, r, &(r[n2]), n2));
427
428
1.10M
    if (neg) { /* if t[32] is negative */
429
950k
        c1 -= (int)(bn_sub_words(&(t[n2]), t, &(t[n2]), n2));
430
950k
    } else {
431
        /* Might have a carry */
432
157k
        c1 += (int)(bn_add_words(&(t[n2]), &(t[n2]), t, n2));
433
157k
    }
434
435
    /*-
436
     * t[32] holds (a[0]-a[1])*(b[1]-b[0])+(a[0]*b[0])+(a[1]*b[1])
437
     * r[10] holds (a[0]*b[0])
438
     * r[32] holds (b[1]*b[1])
439
     * c1 holds the carry bits
440
     */
441
1.10M
    c1 += (int)(bn_add_words(&(r[n]), &(r[n]), &(t[n2]), n2));
442
1.10M
    if (c1) {
443
18.0k
        p = &(r[n + n2]);
444
18.0k
        lo = *p;
445
18.0k
        ln = (lo + c1) & BN_MASK2;
446
18.0k
        *p = ln;
447
448
        /*
449
         * The overflow will stop before we over write words we should not
450
         * overwrite
451
         */
452
18.0k
        if (ln < (BN_ULONG)c1) {
453
52.7k
            do {
454
52.7k
                p++;
455
52.7k
                lo = *p;
456
52.7k
                ln = (lo + 1) & BN_MASK2;
457
52.7k
                *p = ln;
458
52.7k
            } while (ln == 0);
459
9.27k
        }
460
18.0k
    }
461
1.10M
}
462
463
/*-
464
 * a and b must be the same size, which is n2.
465
 * r needs to be n2 words and t needs to be n2*2
466
 */
467
void bn_mul_low_recursive(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n2,
468
    BN_ULONG *t)
469
0
{
470
0
    int n = n2 / 2;
471
472
0
    bn_mul_recursive(r, a, b, n, 0, 0, &(t[0]));
473
0
    if (n >= BN_MUL_LOW_RECURSIVE_SIZE_NORMAL) {
474
0
        bn_mul_low_recursive(&(t[0]), &(a[0]), &(b[n]), n, &(t[n2]));
475
0
        bn_add_words(&(r[n]), &(r[n]), &(t[0]), n);
476
0
        bn_mul_low_recursive(&(t[0]), &(a[n]), &(b[0]), n, &(t[n2]));
477
0
        bn_add_words(&(r[n]), &(r[n]), &(t[0]), n);
478
0
    } else {
479
0
        bn_mul_low_normal(&(t[0]), &(a[0]), &(b[n]), n);
480
0
        bn_mul_low_normal(&(t[n]), &(a[n]), &(b[0]), n);
481
0
        bn_add_words(&(r[n]), &(r[n]), &(t[0]), n);
482
0
        bn_add_words(&(r[n]), &(r[n]), &(t[n]), n);
483
0
    }
484
0
}
485
#endif /* OPENSSL_SMALL_FOOTPRINT */
486
487
int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
488
22.6M
{
489
22.6M
    int ret = bn_mul_fixed_top(r, a, b, ctx);
490
491
22.6M
    bn_correct_top(r);
492
22.6M
    bn_check_top(r);
493
494
22.6M
    return ret;
495
22.6M
}
496
497
int bn_mul_fixed_top(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
498
26.4M
{
499
26.4M
    int ret = 0;
500
26.4M
    int top, al, bl;
501
26.4M
    BIGNUM *rr;
502
26.4M
#if !defined(OPENSSL_SMALL_FOOTPRINT)
503
26.4M
    int i;
504
26.4M
    BIGNUM *t = NULL;
505
26.4M
    int j = 0, k;
506
26.4M
#endif
507
508
26.4M
    bn_check_top(a);
509
26.4M
    bn_check_top(b);
510
26.4M
    bn_check_top(r);
511
512
26.4M
    al = a->top;
513
26.4M
    bl = b->top;
514
515
26.4M
    if ((al == 0) || (bl == 0)) {
516
1.25M
        BN_zero(r);
517
1.25M
        return 1;
518
1.25M
    }
519
25.1M
    top = al + bl;
520
521
25.1M
    BN_CTX_start(ctx);
522
25.1M
    if ((r == a) || (r == b)) {
523
159k
        if ((rr = BN_CTX_get(ctx)) == NULL)
524
0
            goto err;
525
159k
    } else
526
25.0M
        rr = r;
527
528
25.1M
#if !defined(OPENSSL_SMALL_FOOTPRINT)
529
25.1M
    i = al - bl;
530
531
25.1M
    if (i == 0) {
532
#if 0
533
        if (al == 4) {
534
            if (bn_wexpand(rr, 8) == NULL)
535
                goto err;
536
            rr->top = 8;
537
            bn_mul_comba4(rr->d, a->d, b->d);
538
            goto end;
539
        }
540
#endif
541
7.42M
        if (al == 8) {
542
17.8k
            if (bn_wexpand(rr, 16) == NULL)
543
0
                goto err;
544
17.8k
            rr->top = 16;
545
17.8k
            bn_mul_comba8(rr->d, a->d, b->d);
546
17.8k
            goto end;
547
17.8k
        }
548
7.42M
    }
549
550
25.1M
    if ((al >= BN_MULL_SIZE_NORMAL) && (bl >= BN_MULL_SIZE_NORMAL)) {
551
1.19M
        if (i >= -1 && i <= 1) {
552
            /*
553
             * Find out the power of two lower or equal to the longest of the
554
             * two numbers
555
             */
556
1.15M
            if (i >= 0) {
557
952k
                j = BN_num_bits_word((BN_ULONG)al);
558
952k
            }
559
1.15M
            if (i == -1) {
560
199k
                j = BN_num_bits_word((BN_ULONG)bl);
561
199k
            }
562
1.15M
            j = 1 << (j - 1);
563
1.15M
            assert(j <= al || j <= bl);
564
1.15M
            k = j + j;
565
1.15M
            t = BN_CTX_get(ctx);
566
1.15M
            if (t == NULL)
567
0
                goto err;
568
1.15M
            if (al > j || bl > j) {
569
859k
                if (bn_wexpand(t, k * 4) == NULL)
570
0
                    goto err;
571
859k
                if (bn_wexpand(rr, k * 4) == NULL)
572
0
                    goto err;
573
859k
                bn_mul_part_recursive(rr->d, a->d, b->d,
574
859k
                    j, al - j, bl - j, t->d);
575
859k
            } else { /* al <= j || bl <= j */
576
577
292k
                if (bn_wexpand(t, k * 2) == NULL)
578
0
                    goto err;
579
292k
                if (bn_wexpand(rr, k * 2) == NULL)
580
0
                    goto err;
581
292k
                bn_mul_recursive(rr->d, a->d, b->d, j, al - j, bl - j, t->d);
582
292k
            }
583
1.15M
            rr->top = top;
584
1.15M
            goto end;
585
1.15M
        }
586
1.19M
    }
587
23.9M
#endif /* OPENSSL_SMALL_FOOTPRINT */
588
23.9M
    if (bn_wexpand(rr, top) == NULL)
589
0
        goto err;
590
23.9M
    rr->top = top;
591
23.9M
    bn_mul_normal(rr->d, a->d, al, b->d, bl);
592
593
23.9M
#if !defined(OPENSSL_SMALL_FOOTPRINT)
594
25.1M
end:
595
25.1M
#endif
596
25.1M
    rr->neg = a->neg ^ b->neg;
597
25.1M
    rr->flags |= BN_FLG_FIXED_TOP;
598
25.1M
    if (r != rr && BN_copy(r, rr) == NULL)
599
0
        goto err;
600
601
25.1M
    ret = 1;
602
25.1M
err:
603
25.1M
    bn_check_top(r);
604
25.1M
    BN_CTX_end(ctx);
605
25.1M
    return ret;
606
25.1M
}
607
608
void bn_mul_normal(BN_ULONG *r, BN_ULONG *a, int na, BN_ULONG *b, int nb)
609
24.8M
{
610
24.8M
    BN_ULONG *rr;
611
612
24.8M
    if (na < nb) {
613
17.0M
        int itmp;
614
17.0M
        BN_ULONG *ltmp;
615
616
17.0M
        itmp = na;
617
17.0M
        na = nb;
618
17.0M
        nb = itmp;
619
17.0M
        ltmp = a;
620
17.0M
        a = b;
621
17.0M
        b = ltmp;
622
17.0M
    }
623
24.8M
    rr = &(r[na]);
624
24.8M
    if (nb <= 0) {
625
182k
        (void)bn_mul_words(r, a, na, 0);
626
182k
        return;
627
182k
    } else
628
24.6M
        rr[0] = bn_mul_words(r, a, na, b[0]);
629
630
25.6M
    for (;;) {
631
25.6M
        if (--nb <= 0)
632
20.2M
            return;
633
5.37M
        rr[1] = bn_mul_add_words(&(r[1]), a, na, b[1]);
634
5.37M
        if (--nb <= 0)
635
476k
            return;
636
4.89M
        rr[2] = bn_mul_add_words(&(r[2]), a, na, b[2]);
637
4.89M
        if (--nb <= 0)
638
269k
            return;
639
4.62M
        rr[3] = bn_mul_add_words(&(r[3]), a, na, b[3]);
640
4.62M
        if (--nb <= 0)
641
3.59M
            return;
642
1.03M
        rr[4] = bn_mul_add_words(&(r[4]), a, na, b[4]);
643
1.03M
        rr += 4;
644
1.03M
        r += 4;
645
1.03M
        b += 4;
646
1.03M
    }
647
24.6M
}
648
649
void bn_mul_low_normal(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n)
650
0
{
651
0
    bn_mul_words(r, a, n, b[0]);
652
653
0
    for (;;) {
654
0
        if (--n <= 0)
655
0
            return;
656
0
        bn_mul_add_words(&(r[1]), a, n, b[1]);
657
0
        if (--n <= 0)
658
0
            return;
659
0
        bn_mul_add_words(&(r[2]), a, n, b[2]);
660
0
        if (--n <= 0)
661
0
            return;
662
0
        bn_mul_add_words(&(r[3]), a, n, b[3]);
663
0
        if (--n <= 0)
664
0
            return;
665
0
        bn_mul_add_words(&(r[4]), a, n, b[4]);
666
0
        r += 4;
667
0
        b += 4;
668
0
    }
669
0
}