• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <tommath.h>
2 #ifdef BN_MP_LSHD_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 /* shift left a certain amount of digits */
mp_lshd(mp_int * a,int b)19 int mp_lshd (mp_int * a, int b)
20 {
21   int     x, res;
22 
23   /* if its less than zero return */
24   if (b <= 0) {
25     return MP_OKAY;
26   }
27 
28   /* grow to fit the new digits */
29   if (a->alloc < a->used + b) {
30      if ((res = mp_grow (a, a->used + b)) != MP_OKAY) {
31        return res;
32      }
33   }
34 
35   {
36     register mp_digit *top, *bottom;
37 
38     /* increment the used by the shift amount then copy upwards */
39     a->used += b;
40 
41     /* top */
42     top = a->dp + a->used - 1;
43 
44     /* base */
45     bottom = a->dp + a->used - 1 - b;
46 
47     /* much like mp_rshd this is implemented using a sliding window
48      * except the window goes the otherway around.  Copying from
49      * the bottom to the top.  see bn_mp_rshd.c for more info.
50      */
51     for (x = a->used - 1; x >= b; x--) {
52       *top-- = *bottom--;
53     }
54 
55     /* zero the lower digits */
56     top = a->dp;
57     for (x = 0; x < b; x++) {
58       *top++ = 0;
59     }
60   }
61   return MP_OKAY;
62 }
63 #endif
64 
65 /* $Source: /cvs/libtom/libtommath/bn_mp_lshd.c,v $ */
66 /* $Revision: 1.3 $ */
67 /* $Date: 2006/03/31 14:18:44 $ */
68