www.usr.com/support/gpl/USR9107_release.1.4.tar.gz
[bcm963xx.git] / userapps / opensource / sshd / libtommath / bn_mp_lshd.c
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@iahu.ca, http://math.libtomcrypt.org
16  */
17
18 /* shift left a certain amount of digits */
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