Home | History | Annotate | Download | only in libtommath
      1 #include <tommath.h>
      2 #ifdef BN_MP_MUL_D_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 (at) gmail.com, http://math.libtomcrypt.com
     16  */
     17 
     18 /* multiply by a digit */
     19 int
     20 mp_mul_d (mp_int * a, mp_digit b, mp_int * c)
     21 {
     22   mp_digit u, *tmpa, *tmpc;
     23   mp_word  r;
     24   int      ix, res, olduse;
     25 
     26   /* make sure c is big enough to hold a*b */
     27   if (c->alloc < a->used + 1) {
     28     if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) {
     29       return res;
     30     }
     31   }
     32 
     33   /* get the original destinations used count */
     34   olduse = c->used;
     35 
     36   /* set the sign */
     37   c->sign = a->sign;
     38 
     39   /* alias for a->dp [source] */
     40   tmpa = a->dp;
     41 
     42   /* alias for c->dp [dest] */
     43   tmpc = c->dp;
     44 
     45   /* zero carry */
     46   u = 0;
     47 
     48   /* compute columns */
     49   for (ix = 0; ix < a->used; ix++) {
     50     /* compute product and carry sum for this term */
     51     r       = ((mp_word) u) + ((mp_word)*tmpa++) * ((mp_word)b);
     52 
     53     /* mask off higher bits to get a single digit */
     54     *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK));
     55 
     56     /* send carry into next iteration */
     57     u       = (mp_digit) (r >> ((mp_word) DIGIT_BIT));
     58   }
     59 
     60   /* store final carry [if any] and increment ix offset  */
     61   *tmpc++ = u;
     62   ++ix;
     63 
     64   /* now zero digits above the top */
     65   while (ix++ < olduse) {
     66      *tmpc++ = 0;
     67   }
     68 
     69   /* set used count */
     70   c->used = a->used + 1;
     71   mp_clamp(c);
     72 
     73   return MP_OKAY;
     74 }
     75 #endif
     76 
     77 /* $Source: /cvs/libtom/libtommath/bn_mp_mul_d.c,v $ */
     78 /* $Revision: 1.3 $ */
     79 /* $Date: 2006/03/31 14:18:44 $ */
     80