Mercurial > dropbear
comparison libtommath/bn_s_mp_mul_high_digs.c @ 1436:60fc6476e044
Update to libtommath v1.0
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 24 Jun 2017 22:37:14 +0800 |
parents | 5ff8218bcee9 |
children | 8bba51a55704 |
comparison
equal
deleted
inserted
replaced
1435:f849a5ca2efc | 1436:60fc6476e044 |
---|---|
1 #include <tommath.h> | 1 #include <tommath_private.h> |
2 #ifdef BN_S_MP_MUL_HIGH_DIGS_C | 2 #ifdef BN_S_MP_MUL_HIGH_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. |
10 * additional optimizations in place. | 10 * additional optimizations in place. |
11 * | 11 * |
12 * The library is free for all purposes without any express | 12 * The library is free for all purposes without any express |
13 * guarantee it works. | 13 * guarantee it works. |
14 * | 14 * |
15 * Tom St Denis, [email protected], http://math.libtomcrypt.com | 15 * Tom St Denis, [email protected], http://libtom.org |
16 */ | 16 */ |
17 | 17 |
18 /* multiplies |a| * |b| and does not compute the lower digs digits | 18 /* multiplies |a| * |b| and does not compute the lower digs digits |
19 * [meant to get the higher part of the product] | 19 * [meant to get the higher part of the product] |
20 */ | 20 */ |
28 mp_digit tmpx, *tmpt, *tmpy; | 28 mp_digit tmpx, *tmpt, *tmpy; |
29 | 29 |
30 /* can we use the fast multiplier? */ | 30 /* can we use the fast multiplier? */ |
31 #ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C | 31 #ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C |
32 if (((a->used + b->used + 1) < MP_WARRAY) | 32 if (((a->used + b->used + 1) < MP_WARRAY) |
33 && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { | 33 && (MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof(mp_word)) - (2 * DIGIT_BIT))))) { |
34 return fast_s_mp_mul_high_digs (a, b, c, digs); | 34 return fast_s_mp_mul_high_digs (a, b, c, digs); |
35 } | 35 } |
36 #endif | 36 #endif |
37 | 37 |
38 if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { | 38 if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { |
55 /* alias for where to read the right hand side from */ | 55 /* alias for where to read the right hand side from */ |
56 tmpy = b->dp + (digs - ix); | 56 tmpy = b->dp + (digs - ix); |
57 | 57 |
58 for (iy = digs - ix; iy < pb; iy++) { | 58 for (iy = digs - ix; iy < pb; iy++) { |
59 /* calculate the double precision result */ | 59 /* calculate the double precision result */ |
60 r = ((mp_word)*tmpt) + | 60 r = (mp_word)*tmpt + |
61 ((mp_word)tmpx) * ((mp_word)*tmpy++) + | 61 ((mp_word)tmpx * (mp_word)*tmpy++) + |
62 ((mp_word) u); | 62 (mp_word)u; |
63 | 63 |
64 /* get the lower part */ | 64 /* get the lower part */ |
65 *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); | 65 *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); |
66 | 66 |
67 /* carry the carry */ | 67 /* carry the carry */ |
74 mp_clear (&t); | 74 mp_clear (&t); |
75 return MP_OKAY; | 75 return MP_OKAY; |
76 } | 76 } |
77 #endif | 77 #endif |
78 | 78 |
79 /* $Source: /cvs/libtom/libtommath/bn_s_mp_mul_high_digs.c,v $ */ | 79 /* $Source$ */ |
80 /* $Revision: 1.3 $ */ | 80 /* $Revision$ */ |
81 /* $Date: 2006/03/31 14:18:44 $ */ | 81 /* $Date$ */ |