| [25] | 1 | #include <tommath.h> | 
|---|
|  | 2 | #ifdef BN_MP_MUL_C | 
|---|
|  | 3 | /* LibTomMath, multiple-precision integer library -- Tom St Denis | 
|---|
|  | 4 | * | 
|---|
|  | 5 | * LibTomMath is a library that provides multiple-precision | 
|---|
|  | 6 | * integer arithmetic as well as number theoretic functionality. | 
|---|
|  | 7 | * | 
|---|
|  | 8 | * The library was designed directly after the MPI library by | 
|---|
|  | 9 | * Michael Fromberger but has been written from scratch with | 
|---|
|  | 10 | * additional optimizations in place. | 
|---|
|  | 11 | * | 
|---|
|  | 12 | * The library is free for all purposes without any express | 
|---|
|  | 13 | * guarantee it works. | 
|---|
|  | 14 | * | 
|---|
|  | 15 | * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com | 
|---|
|  | 16 | */ | 
|---|
|  | 17 |  | 
|---|
|  | 18 | /* high level multiplication (handles sign) */ | 
|---|
|  | 19 | int mp_mul (mp_int * a, mp_int * b, mp_int * c) | 
|---|
|  | 20 | { | 
|---|
|  | 21 | int     res, neg; | 
|---|
|  | 22 | neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; | 
|---|
|  | 23 |  | 
|---|
|  | 24 | /* use Toom-Cook? */ | 
|---|
|  | 25 | #ifdef BN_MP_TOOM_MUL_C | 
|---|
|  | 26 | if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { | 
|---|
|  | 27 | res = mp_toom_mul(a, b, c); | 
|---|
|  | 28 | } else | 
|---|
|  | 29 | #endif | 
|---|
|  | 30 | #ifdef BN_MP_KARATSUBA_MUL_C | 
|---|
|  | 31 | /* use Karatsuba? */ | 
|---|
|  | 32 | if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { | 
|---|
|  | 33 | res = mp_karatsuba_mul (a, b, c); | 
|---|
|  | 34 | } else | 
|---|
|  | 35 | #endif | 
|---|
|  | 36 | { | 
|---|
|  | 37 | /* can we use the fast multiplier? | 
|---|
|  | 38 | * | 
|---|
|  | 39 | * The fast multiplier can be used if the output will | 
|---|
|  | 40 | * have less than MP_WARRAY digits and the number of | 
|---|
|  | 41 | * digits won't affect carry propagation | 
|---|
|  | 42 | */ | 
|---|
|  | 43 | int     digs = a->used + b->used + 1; | 
|---|
|  | 44 |  | 
|---|
|  | 45 | #ifdef BN_FAST_S_MP_MUL_DIGS_C | 
|---|
|  | 46 | if ((digs < MP_WARRAY) && | 
|---|
|  | 47 | MIN(a->used, b->used) <= | 
|---|
|  | 48 | (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { | 
|---|
|  | 49 | res = fast_s_mp_mul_digs (a, b, c, digs); | 
|---|
|  | 50 | } else | 
|---|
|  | 51 | #endif | 
|---|
|  | 52 | #ifdef BN_S_MP_MUL_DIGS_C | 
|---|
|  | 53 | res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ | 
|---|
|  | 54 | #else | 
|---|
|  | 55 | res = MP_VAL; | 
|---|
|  | 56 | #endif | 
|---|
|  | 57 |  | 
|---|
|  | 58 | } | 
|---|
|  | 59 | c->sign = (c->used > 0) ? neg : MP_ZPOS; | 
|---|
|  | 60 | return res; | 
|---|
|  | 61 | } | 
|---|
|  | 62 | #endif | 
|---|
|  | 63 |  | 
|---|
|  | 64 | /* $Source: /cvsroot/tcl/libtommath/bn_mp_mul.c,v $ */ | 
|---|
|  | 65 | /* $Revision: 1.1.1.3 $ */ | 
|---|
|  | 66 | /* $Date: 2006/12/01 00:08:11 $ */ | 
|---|