/src/dropbear/libtommath/bn_mp_rshd.c
Line | Count | Source (jump to first uncovered line) |
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 | | void mp_rshd(mp_int *a, int b) |
8 | 444 | { |
9 | 444 | int x; |
10 | 444 | mp_digit *bottom, *top; |
11 | | |
12 | | /* if b <= 0 then ignore it */ |
13 | 444 | if (b <= 0) { |
14 | 33 | return; |
15 | 33 | } |
16 | | |
17 | | /* if b > used then simply zero it and return */ |
18 | 411 | if (a->used <= b) { |
19 | 0 | mp_zero(a); |
20 | 0 | return; |
21 | 0 | } |
22 | | |
23 | | /* shift the digits down */ |
24 | | |
25 | | /* bottom */ |
26 | 411 | bottom = a->dp; |
27 | | |
28 | | /* top [offset into digits] */ |
29 | 411 | 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 | 14.6k | for (x = 0; x < (a->used - b); x++) { |
42 | 14.2k | *bottom++ = *top++; |
43 | 14.2k | } |
44 | | |
45 | | /* zero the top digits */ |
46 | 411 | MP_ZERO_DIGITS(bottom, a->used - x); |
47 | | |
48 | | /* remove excess digits */ |
49 | 411 | a->used -= b; |
50 | 411 | } |
51 | | #endif |