| 
									
										
										
										
											2015-11-12 01:49:07 +01:00
										 |  |  | #include <tommath_private.h>
 | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #ifdef BN_MP_MUL_C
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | /* LibTomMath, multiple-precision integer library -- Tom St Denis
 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2003-08-05 01:24:44 +00:00
										 |  |  |  * LibTomMath is a library that provides multiple-precision | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |  * integer arithmetic as well as number theoretic functionality. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2003-08-05 01:24:44 +00:00
										 |  |  |  * The library was designed directly after the MPI library by | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |  * Michael Fromberger but has been written from scratch with | 
					
						
							|  |  |  |  * additional optimizations in place. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The library is free for all purposes without any express | 
					
						
							|  |  |  |  * guarantee it works. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2015-10-30 17:55:29 -04:00
										 |  |  |  * Tom St Denis, tstdenis82@gmail.com, http://libtom.org
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* high level multiplication (handles sign) */ | 
					
						
							| 
									
										
										
										
											2003-12-24 18:59:22 +00:00
										 |  |  | int mp_mul (mp_int * a, mp_int * b, mp_int * c) | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  |   int     res, neg; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |   neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; | 
					
						
							| 
									
										
										
										
											2003-08-05 01:24:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* use Toom-Cook? */ | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #ifdef BN_MP_TOOM_MUL_C
 | 
					
						
							| 
									
										
										
										
											2014-10-18 18:54:06 +02:00
										 |  |  |   if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  |     res = mp_toom_mul(a, b, c); | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  |   } else  | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef BN_MP_KARATSUBA_MUL_C
 | 
					
						
							| 
									
										
										
										
											2003-08-05 01:24:44 +00:00
										 |  |  |   /* use Karatsuba? */ | 
					
						
							| 
									
										
										
										
											2014-10-18 18:54:06 +02:00
										 |  |  |   if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |     res = mp_karatsuba_mul (a, b, c); | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  |   } else  | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |     /* can we use the fast multiplier?
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  |      * The fast multiplier can be used if the output will  | 
					
						
							|  |  |  |      * have less than MP_WARRAY digits and the number of  | 
					
						
							|  |  |  |      * digits won't affect carry propagation | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  |      */ | 
					
						
							|  |  |  |     int     digs = a->used + b->used + 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #ifdef BN_FAST_S_MP_MUL_DIGS_C
 | 
					
						
							| 
									
										
										
										
											2003-05-29 13:35:26 +00:00
										 |  |  |     if ((digs < MP_WARRAY) && | 
					
						
							| 
									
										
										
										
											2015-11-13 10:28:23 +01:00
										 |  |  |         (MIN(a->used, b->used) <=  | 
					
						
							|  |  |  |          (1 << ((CHAR_BIT * sizeof(mp_word)) - (2 * DIGIT_BIT))))) { | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  |       res = fast_s_mp_mul_digs (a, b, c, digs); | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  |     } else  | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-10-11 19:01:04 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #ifdef BN_S_MP_MUL_DIGS_C
 | 
					
						
							|  |  |  |       res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |       res = MP_VAL; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-10-11 19:01:04 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2004-08-09 22:15:59 +00:00
										 |  |  |   c->sign = (c->used > 0) ? neg : MP_ZPOS; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |   return res; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-08-01 16:37:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* $Source$ */ | 
					
						
							|  |  |  | /* $Revision$ */ | 
					
						
							|  |  |  | /* $Date$ */ |