Line data Source code
1 : #include "tommath_private.h"
2 : #ifdef BN_MP_MUL_2_C
3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 : /* SPDX-License-Identifier: Unlicense */
5 :
6 : /* b = a*2 */
7 11837 : mp_err mp_mul_2(const mp_int *a, mp_int *b)
8 : {
9 : int x, oldused;
10 : mp_err err;
11 :
12 : /* grow to accomodate result */
13 11837 : if (b->alloc < (a->used + 1)) {
14 0 : if ((err = mp_grow(b, a->used + 1)) != MP_OKAY) {
15 0 : return err;
16 : }
17 : }
18 :
19 11837 : oldused = b->used;
20 11837 : b->used = a->used;
21 :
22 : {
23 : mp_digit r, rr, *tmpa, *tmpb;
24 :
25 : /* alias for source */
26 11837 : tmpa = a->dp;
27 :
28 : /* alias for dest */
29 11837 : tmpb = b->dp;
30 :
31 : /* carry */
32 11837 : r = 0;
33 463194 : for (x = 0; x < a->used; x++) {
34 :
35 : /* get what will be the *next* carry bit from the
36 : * MSB of the current digit
37 : */
38 451357 : rr = *tmpa >> (mp_digit)(MP_DIGIT_BIT - 1);
39 :
40 : /* now shift up this digit, add in the carry [from the previous] */
41 451357 : *tmpb++ = ((*tmpa++ << 1uL) | r) & MP_MASK;
42 :
43 : /* copy the carry that would be from the source
44 : * digit into the next iteration
45 : */
46 451357 : r = rr;
47 : }
48 :
49 : /* new leading digit? */
50 11837 : if (r != 0u) {
51 : /* add a MSB which is always 1 at this point */
52 111 : *tmpb = 1;
53 111 : ++(b->used);
54 : }
55 :
56 : /* now zero any excess digits on the destination
57 : * that we didn't write to
58 : */
59 11837 : MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
60 : }
61 11837 : b->sign = a->sign;
62 11837 : return MP_OKAY;
63 : }
64 : #endif
|