Line data Source code
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 439290 : mp_err mp_div_2(const mp_int *a, mp_int *b)
8 : {
9 : int x, oldused;
10 : mp_digit r, rr, *tmpa, *tmpb;
11 : mp_err err;
12 :
13 : /* copy */
14 439290 : if (b->alloc < a->used) {
15 0 : if ((err = mp_grow(b, a->used)) != MP_OKAY) {
16 0 : return err;
17 : }
18 : }
19 :
20 439290 : oldused = b->used;
21 439290 : b->used = a->used;
22 :
23 : /* source alias */
24 439290 : tmpa = a->dp + b->used - 1;
25 :
26 : /* dest alias */
27 439290 : tmpb = b->dp + b->used - 1;
28 :
29 : /* carry */
30 439290 : r = 0;
31 23199003 : for (x = b->used - 1; x >= 0; x--) {
32 : /* get the carry for the next iteration */
33 22759713 : rr = *tmpa & 1u;
34 :
35 : /* shift the current digit, add in carry and store */
36 22759713 : *tmpb-- = (*tmpa-- >> 1) | (r << (MP_DIGIT_BIT - 1));
37 :
38 : /* forward carry to next iteration */
39 22759713 : r = rr;
40 : }
41 :
42 : /* zero excess digits */
43 439290 : MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
44 :
45 439290 : b->sign = a->sign;
46 439290 : mp_clamp(b);
47 439290 : return MP_OKAY;
48 : }
49 : #endif
|