Line data Source code
1 : #include "tommath_private.h" 2 : #ifdef BN_MP_RSHD_C 3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */ 4 : /* SPDX-License-Identifier: Unlicense */ 5 : 6 : /* shift right a certain amount of digits */ 7 1519 : void mp_rshd(mp_int *a, int b) 8 : { 9 74 : int x; 10 74 : mp_digit *bottom, *top; 11 : 12 : /* if b <= 0 then ignore it */ 13 1519 : if (b <= 0) { 14 48 : return; 15 : } 16 : 17 : /* if b > used then simply zero it and return */ 18 1469 : if (a->used <= b) { 19 0 : mp_zero(a); 20 0 : return; 21 : } 22 : 23 : /* shift the digits down */ 24 : 25 : /* bottom */ 26 1469 : bottom = a->dp; 27 : 28 : /* top [offset into digits] */ 29 1469 : top = a->dp + b; 30 : 31 : /* this is implemented as a sliding window where 32 : * the window is b-digits long and digits from 33 : * the top of the window are copied to the bottom 34 : * 35 : * e.g. 36 : 37 : b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> 38 : /\ | ----> 39 : \-------------------/ ----> 40 : */ 41 76820 : for (x = 0; x < (a->used - b); x++) { 42 75351 : *bottom++ = *top++; 43 : } 44 : 45 : /* zero the top digits */ 46 76539 : MP_ZERO_DIGITS(bottom, a->used - x); 47 : 48 : /* remove excess digits */ 49 1469 : a->used -= b; 50 : } 51 : #endif