| 
									
										
										
										
											2015-11-12 01:49:07 +01:00
										 |  |  | #include <tommath_private.h>
 | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #ifdef BN_MP_MUL_D_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
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* multiply by a digit */ | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | mp_mul_d (mp_int * a, mp_digit b, mp_int * c) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   mp_digit u, *tmpa, *tmpc; | 
					
						
							|  |  |  |   mp_word  r; | 
					
						
							|  |  |  |   int      ix, res, olduse; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |   /* make sure c is big enough to hold a*b */ | 
					
						
							| 
									
										
										
										
											2015-11-13 10:28:23 +01:00
										 |  |  |   if (c->alloc < (a->used + 1)) { | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |     if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) { | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  |       return res; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  |   /* get the original destinations used count */ | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  |   olduse = c->used; | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   /* set the sign */ | 
					
						
							| 
									
										
										
										
											2003-06-19 10:04:50 +00:00
										 |  |  |   c->sign = a->sign; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   /* alias for a->dp [source] */ | 
					
						
							|  |  |  |   tmpa = a->dp; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   /* alias for c->dp [dest] */ | 
					
						
							|  |  |  |   tmpc = c->dp; | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   /* zero carry */ | 
					
						
							|  |  |  |   u = 0; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:09:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   /* compute columns */ | 
					
						
							|  |  |  |   for (ix = 0; ix < a->used; ix++) { | 
					
						
							|  |  |  |     /* compute product and carry sum for this term */ | 
					
						
							| 
									
										
										
										
											2015-11-13 10:28:23 +01:00
										 |  |  |     r       = (mp_word)u + ((mp_word)*tmpa++ * (mp_word)b); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |     /* mask off higher bits to get a single digit */ | 
					
						
							|  |  |  |     *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |     /* send carry into next iteration */ | 
					
						
							|  |  |  |     u       = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2003-05-17 12:33:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-02-12 08:40:15 +00:00
										 |  |  |   /* store final carry [if any] and increment ix offset  */ | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   *tmpc++ = u; | 
					
						
							| 
									
										
										
										
											2005-02-12 08:40:15 +00:00
										 |  |  |   ++ix; | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* now zero digits above the top */ | 
					
						
							|  |  |  |   while (ix++ < olduse) { | 
					
						
							|  |  |  |      *tmpc++ = 0; | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-09-19 22:43:07 +00:00
										 |  |  |   /* set used count */ | 
					
						
							|  |  |  |   c->used = a->used + 1; | 
					
						
							|  |  |  |   mp_clamp(c); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-28 16:08:34 +00:00
										 |  |  |   return MP_OKAY; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-10-29 22:07:18 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-08-01 16:37:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 16:27:26 +02:00
										 |  |  | /* ref:         $Format:%D$ */ | 
					
						
							|  |  |  | /* git commit:  $Format:%H$ */ | 
					
						
							|  |  |  | /* commit time: $Format:%ai$ */ |