Mercurial > dropbear
comparison libtommath/bn_s_mp_mul_digs.c @ 1655:f52919ffd3b1
update ltm to 1.1.0 and enable FIPS 186.4 compliant key-generation (#79)
* make key-generation compliant to FIPS 186.4
* fix includes in tommath_class.h
* update fuzzcorpus instead of error-out
* fixup fuzzing make-targets
* update Makefile.in
* apply necessary patches to ltm sources
* clean-up not required ltm files
* update to vanilla ltm 1.1.0
this already only contains the required files
* remove set/get double
author | Steffen Jaeckel <s_jaeckel@gmx.de> |
---|---|
date | Mon, 16 Sep 2019 15:50:38 +0200 |
parents | 8bba51a55704 |
children | 1051e4eea25a |
comparison
equal
deleted
inserted
replaced
1654:cc0fc5131c5c | 1655:f52919ffd3b1 |
---|---|
1 #include <tommath_private.h> | 1 #include "tommath_private.h" |
2 #ifdef BN_S_MP_MUL_DIGS_C | 2 #ifdef BN_S_MP_MUL_DIGS_C |
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis | 3 /* LibTomMath, multiple-precision integer library -- Tom St Denis |
4 * | 4 * |
5 * LibTomMath is a library that provides multiple-precision | 5 * LibTomMath is a library that provides multiple-precision |
6 * integer arithmetic as well as number theoretic functionality. | 6 * integer arithmetic as well as number theoretic functionality. |
7 * | 7 * |
8 * The library was designed directly after the MPI library by | 8 * The library was designed directly after the MPI library by |
9 * Michael Fromberger but has been written from scratch with | 9 * Michael Fromberger but has been written from scratch with |
10 * additional optimizations in place. | 10 * additional optimizations in place. |
11 * | 11 * |
12 * The library is free for all purposes without any express | 12 * SPDX-License-Identifier: Unlicense |
13 * guarantee it works. | |
14 * | |
15 * Tom St Denis, [email protected], http://libtom.org | |
16 */ | 13 */ |
17 | 14 |
18 /* multiplies |a| * |b| and only computes upto digs digits of result | 15 /* multiplies |a| * |b| and only computes upto digs digits of result |
19 * HAC pp. 595, Algorithm 14.12 Modified so you can control how | 16 * HAC pp. 595, Algorithm 14.12 Modified so you can control how |
20 * many digits of output are created. | 17 * many digits of output are created. |
21 */ | 18 */ |
22 int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) | 19 int s_mp_mul_digs(const mp_int *a, const mp_int *b, mp_int *c, int digs) |
23 { | 20 { |
24 mp_int t; | 21 mp_int t; |
25 int res, pa, pb, ix, iy; | 22 int res, pa, pb, ix, iy; |
26 mp_digit u; | 23 mp_digit u; |
27 mp_word r; | 24 mp_word r; |
28 mp_digit tmpx, *tmpt, *tmpy; | 25 mp_digit tmpx, *tmpt, *tmpy; |
29 | 26 |
30 /* can we use the fast multiplier? */ | 27 /* can we use the fast multiplier? */ |
31 if (((digs) < MP_WARRAY) && | 28 if ((digs < (int)MP_WARRAY) && |
32 (MIN (a->used, b->used) < | 29 (MIN(a->used, b->used) < |
33 (1 << ((CHAR_BIT * sizeof(mp_word)) - (2 * DIGIT_BIT))))) { | 30 (int)(1u << (((size_t)CHAR_BIT * sizeof(mp_word)) - (2u * (size_t)DIGIT_BIT))))) { |
34 return fast_s_mp_mul_digs (a, b, c, digs); | 31 return fast_s_mp_mul_digs(a, b, c, digs); |
35 } | 32 } |
36 | 33 |
37 if ((res = mp_init_size (&t, digs)) != MP_OKAY) { | 34 if ((res = mp_init_size(&t, digs)) != MP_OKAY) { |
38 return res; | 35 return res; |
39 } | 36 } |
40 t.used = digs; | 37 t.used = digs; |
41 | 38 |
42 /* compute the digits of the product directly */ | 39 /* compute the digits of the product directly */ |
43 pa = a->used; | 40 pa = a->used; |
44 for (ix = 0; ix < pa; ix++) { | 41 for (ix = 0; ix < pa; ix++) { |
45 /* set the carry to zero */ | 42 /* set the carry to zero */ |
46 u = 0; | 43 u = 0; |
47 | 44 |
48 /* limit ourselves to making digs digits of output */ | 45 /* limit ourselves to making digs digits of output */ |
49 pb = MIN (b->used, digs - ix); | 46 pb = MIN(b->used, digs - ix); |
50 | 47 |
51 /* setup some aliases */ | 48 /* setup some aliases */ |
52 /* copy of the digit from a used within the nested loop */ | 49 /* copy of the digit from a used within the nested loop */ |
53 tmpx = a->dp[ix]; | 50 tmpx = a->dp[ix]; |
54 | |
55 /* an alias for the destination shifted ix places */ | |
56 tmpt = t.dp + ix; | |
57 | |
58 /* an alias for the digits of b */ | |
59 tmpy = b->dp; | |
60 | 51 |
61 /* compute the columns of the output and propagate the carry */ | 52 /* an alias for the destination shifted ix places */ |
62 for (iy = 0; iy < pb; iy++) { | 53 tmpt = t.dp + ix; |
63 /* compute the column as a mp_word */ | |
64 r = (mp_word)*tmpt + | |
65 ((mp_word)tmpx * (mp_word)*tmpy++) + | |
66 (mp_word)u; | |
67 | 54 |
68 /* the new column is the lower part of the result */ | 55 /* an alias for the digits of b */ |
69 *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); | 56 tmpy = b->dp; |
70 | 57 |
71 /* get the carry word from the result */ | 58 /* compute the columns of the output and propagate the carry */ |
72 u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); | 59 for (iy = 0; iy < pb; iy++) { |
73 } | 60 /* compute the column as a mp_word */ |
74 /* set carry if it is placed below digs */ | 61 r = (mp_word)*tmpt + |
75 if ((ix + iy) < digs) { | 62 ((mp_word)tmpx * (mp_word)*tmpy++) + |
76 *tmpt = u; | 63 (mp_word)u; |
77 } | |
78 } | |
79 | 64 |
80 mp_clamp (&t); | 65 /* the new column is the lower part of the result */ |
81 mp_exch (&t, c); | 66 *tmpt++ = (mp_digit)(r & (mp_word)MP_MASK); |
82 | 67 |
83 mp_clear (&t); | 68 /* get the carry word from the result */ |
84 return MP_OKAY; | 69 u = (mp_digit)(r >> (mp_word)DIGIT_BIT); |
70 } | |
71 /* set carry if it is placed below digs */ | |
72 if ((ix + iy) < digs) { | |
73 *tmpt = u; | |
74 } | |
75 } | |
76 | |
77 mp_clamp(&t); | |
78 mp_exch(&t, c); | |
79 | |
80 mp_clear(&t); | |
81 return MP_OKAY; | |
85 } | 82 } |
86 #endif | 83 #endif |
87 | 84 |
88 /* ref: $Format:%D$ */ | 85 /* ref: HEAD -> master, tag: v1.1.0 */ |
89 /* git commit: $Format:%H$ */ | 86 /* git commit: 08549ad6bc8b0cede0b357a9c341c5c6473a9c55 */ |
90 /* commit time: $Format:%ai$ */ | 87 /* commit time: 2019-01-28 20:32:32 +0100 */ |