/src/dropbear/libtommath/bn_mp_lshd.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include "tommath_private.h" |
2 | | #ifdef BN_MP_LSHD_C |
3 | | /* LibTomMath, multiple-precision integer library -- Tom St Denis */ |
4 | | /* SPDX-License-Identifier: Unlicense */ |
5 | | |
6 | | /* shift left a certain amount of digits */ |
7 | | mp_err mp_lshd(mp_int *a, int b) |
8 | 0 | { |
9 | 0 | int x; |
10 | 0 | mp_err err; |
11 | 0 | mp_digit *top, *bottom; |
12 | | |
13 | | /* if its less than zero return */ |
14 | 0 | if (b <= 0) { |
15 | 0 | return MP_OKAY; |
16 | 0 | } |
17 | | /* no need to shift 0 around */ |
18 | 0 | if (MP_IS_ZERO(a)) { |
19 | 0 | return MP_OKAY; |
20 | 0 | } |
21 | | |
22 | | /* grow to fit the new digits */ |
23 | 0 | if (a->alloc < (a->used + b)) { |
24 | 0 | if ((err = mp_grow(a, a->used + b)) != MP_OKAY) { |
25 | 0 | return err; |
26 | 0 | } |
27 | 0 | } |
28 | | |
29 | | /* increment the used by the shift amount then copy upwards */ |
30 | 0 | a->used += b; |
31 | | |
32 | | /* top */ |
33 | 0 | top = a->dp + a->used - 1; |
34 | | |
35 | | /* base */ |
36 | 0 | bottom = (a->dp + a->used - 1) - b; |
37 | | |
38 | | /* much like mp_rshd this is implemented using a sliding window |
39 | | * except the window goes the otherway around. Copying from |
40 | | * the bottom to the top. see bn_mp_rshd.c for more info. |
41 | | */ |
42 | 0 | for (x = a->used - 1; x >= b; x--) { |
43 | 0 | *top-- = *bottom--; |
44 | 0 | } |
45 | | |
46 | | /* zero the lower digits */ |
47 | 0 | MP_ZERO_DIGITS(a->dp, b); |
48 | |
|
49 | 0 | return MP_OKAY; |
50 | 0 | } |
51 | | #endif |