1/* $NetBSD$ */ 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 */ 21void 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