1 /* $NetBSD: bn_mp_rshd.c,v 1.1.1.2 2014/04/24 12:45:31 pettai Exp $ */ 2 3 #include <tommath.h> 4 #ifdef BN_MP_RSHD_C 5 /* LibTomMath, multiple-precision integer library -- Tom St Denis 6 * 7 * LibTomMath is a library that provides multiple-precision 8 * integer arithmetic as well as number theoretic functionality. 9 * 10 * The library was designed directly after the MPI library by 11 * Michael Fromberger but has been written from scratch with 12 * additional optimizations in place. 13 * 14 * The library is free for all purposes without any express 15 * guarantee it works. 16 * 17 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org 18 */ 19 20 /* shift right a certain amount of digits */ 21 void mp_rshd (mp_int * a, int b) 22 { 23 int x; 24 25 /* if b <= 0 then ignore it */ 26 if (b <= 0) { 27 return; 28 } 29 30 /* if b > used then simply zero it and return */ 31 if (a->used <= b) { 32 mp_zero (a); 33 return; 34 } 35 36 { 37 register mp_digit *bottom, *top; 38 39 /* shift the digits down */ 40 41 /* bottom */ 42 bottom = a->dp; 43 44 /* top [offset into digits] */ 45 top = a->dp + b; 46 47 /* this is implemented as a sliding window where 48 * the window is b-digits long and digits from 49 * the top of the window are copied to the bottom 50 * 51 * e.g. 52 53 b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> 54 /\ | ----> 55 \-------------------/ ----> 56 */ 57 for (x = 0; x < (a->used - b); x++) { 58 *bottom++ = *top++; 59 } 60 61 /* zero the top digits */ 62 for (; x < a->used; x++) { 63 *bottom++ = 0; 64 } 65 } 66 67 /* remove excess digits */ 68 a->used -= b; 69 } 70 #endif 71 72 /* Source: /cvs/libtom/libtommath/bn_mp_rshd.c,v */ 73 /* Revision: 1.4 */ 74 /* Date: 2006/12/28 01:25:13 */ 75