Line data Source code
1 : #include "tommath_private.h"
2 : #ifdef BN_MP_MUL_D_C
3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 : /* SPDX-License-Identifier: Unlicense */
5 :
6 : /* multiply by a digit */
7 44034 : mp_err mp_mul_d(const mp_int *a, mp_digit b, mp_int *c)
8 : {
9 : mp_digit u, *tmpa, *tmpc;
10 : mp_word r;
11 : mp_err err;
12 : int ix, olduse;
13 :
14 : /* make sure c is big enough to hold a*b */
15 44034 : if (c->alloc < (a->used + 1)) {
16 342 : if ((err = mp_grow(c, a->used + 1)) != MP_OKAY) {
17 0 : return err;
18 : }
19 : }
20 :
21 : /* get the original destinations used count */
22 44034 : olduse = c->used;
23 :
24 : /* set the sign */
25 44034 : c->sign = a->sign;
26 :
27 : /* alias for a->dp [source] */
28 44034 : tmpa = a->dp;
29 :
30 : /* alias for c->dp [dest] */
31 44034 : tmpc = c->dp;
32 :
33 : /* zero carry */
34 44034 : u = 0;
35 :
36 : /* compute columns */
37 1051405 : for (ix = 0; ix < a->used; ix++) {
38 : /* compute product and carry sum for this term */
39 1007371 : r = (mp_word)u + ((mp_word)*tmpa++ * (mp_word)b);
40 :
41 : /* mask off higher bits to get a single digit */
42 1007371 : *tmpc++ = (mp_digit)(r & (mp_word)MP_MASK);
43 :
44 : /* send carry into next iteration */
45 1007371 : u = (mp_digit)(r >> (mp_word)MP_DIGIT_BIT);
46 : }
47 :
48 : /* store final carry [if any] and increment ix offset */
49 44034 : *tmpc++ = u;
50 44034 : ++ix;
51 :
52 : /* now zero digits above the top */
53 44034 : MP_ZERO_DIGITS(tmpc, olduse - ix);
54 :
55 : /* set used count */
56 44034 : c->used = a->used + 1;
57 44034 : mp_clamp(c);
58 :
59 44034 : return MP_OKAY;
60 : }
61 : #endif
|