/src/dropbear/libtommath/bn_mp_div_2.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include "tommath_private.h" |
2 | | #ifdef BN_MP_DIV_2_C |
3 | | /* LibTomMath, multiple-precision integer library -- Tom St Denis */ |
4 | | /* SPDX-License-Identifier: Unlicense */ |
5 | | |
6 | | /* b = a/2 */ |
7 | | mp_err mp_div_2(const mp_int *a, mp_int *b) |
8 | 0 | { |
9 | 0 | int x, oldused; |
10 | 0 | mp_digit r, rr, *tmpa, *tmpb; |
11 | 0 | mp_err err; |
12 | | |
13 | | /* copy */ |
14 | 0 | if (b->alloc < a->used) { |
15 | 0 | if ((err = mp_grow(b, a->used)) != MP_OKAY) { |
16 | 0 | return err; |
17 | 0 | } |
18 | 0 | } |
19 | | |
20 | 0 | oldused = b->used; |
21 | 0 | b->used = a->used; |
22 | | |
23 | | /* source alias */ |
24 | 0 | tmpa = a->dp + b->used - 1; |
25 | | |
26 | | /* dest alias */ |
27 | 0 | tmpb = b->dp + b->used - 1; |
28 | | |
29 | | /* carry */ |
30 | 0 | r = 0; |
31 | 0 | for (x = b->used - 1; x >= 0; x--) { |
32 | | /* get the carry for the next iteration */ |
33 | 0 | rr = *tmpa & 1u; |
34 | | |
35 | | /* shift the current digit, add in carry and store */ |
36 | 0 | *tmpb-- = (*tmpa-- >> 1) | (r << (MP_DIGIT_BIT - 1)); |
37 | | |
38 | | /* forward carry to next iteration */ |
39 | 0 | r = rr; |
40 | 0 | } |
41 | | |
42 | | /* zero excess digits */ |
43 | 0 | MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used); |
44 | |
|
45 | 0 | b->sign = a->sign; |
46 | 0 | mp_clamp(b); |
47 | 0 | return MP_OKAY; |
48 | 0 | } |
49 | | #endif |