1 /* $NetBSD: bn_s_mp_add.c,v 1.2 2017/01/28 21:31:47 christos Exp $ */
2
3 #include <tommath.h>
4 #ifdef BN_S_MP_ADD_C
5 /* LibTomMath, multiple-precision integer library -- Tom St Denis
6 *
7 * LibTomMath is a library that provides multiple-precision
8 * integer arithmetic as well as number theoretic functionality.
9 *
10 * The library was designed directly after the MPI library by
11 * Michael Fromberger but has been written from scratch with
12 * additional optimizations in place.
13 *
14 * The library is free for all purposes without any express
15 * guarantee it works.
16 *
17 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
18 */
19
20 /* low level addition, based on HAC pp.594, Algorithm 14.7 */
21 int
s_mp_add(mp_int * a,mp_int * b,mp_int * c)22 s_mp_add (mp_int * a, mp_int * b, mp_int * c)
23 {
24 mp_int *x;
25 int olduse, res, min, max;
26
27 /* find sizes, we let |a| <= |b| which means we have to sort
28 * them. "x" will point to the input with the most digits
29 */
30 if (a->used > b->used) {
31 min = b->used;
32 max = a->used;
33 x = a;
34 } else {
35 min = a->used;
36 max = b->used;
37 x = b;
38 }
39
40 /* init result */
41 if (c->alloc < max + 1) {
42 if ((res = mp_grow (c, max + 1)) != MP_OKAY) {
43 return res;
44 }
45 }
46
47 /* get old used digit count and set new one */
48 olduse = c->used;
49 c->used = max + 1;
50
51 {
52 register mp_digit u, *tmpa, *tmpb, *tmpc;
53 register int i;
54
55 /* alias for digit pointers */
56
57 /* first input */
58 tmpa = a->dp;
59
60 /* second input */
61 tmpb = b->dp;
62
63 /* destination */
64 tmpc = c->dp;
65
66 /* zero the carry */
67 u = 0;
68 for (i = 0; i < min; i++) {
69 /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */
70 *tmpc = *tmpa++ + *tmpb++ + u;
71
72 /* U = carry bit of T[i] */
73 u = *tmpc >> ((mp_digit)DIGIT_BIT);
74
75 /* take away carry bit from T[i] */
76 *tmpc++ &= MP_MASK;
77 }
78
79 /* now copy higher words if any, that is in A+B
80 * if A or B has more digits add those in
81 */
82 if (min != max) {
83 for (; i < max; i++) {
84 /* T[i] = X[i] + U */
85 *tmpc = x->dp[i] + u;
86
87 /* U = carry bit of T[i] */
88 u = *tmpc >> ((mp_digit)DIGIT_BIT);
89
90 /* take away carry bit from T[i] */
91 *tmpc++ &= MP_MASK;
92 }
93 }
94
95 /* add carry */
96 *tmpc++ = u;
97
98 /* clear digits above oldused */
99 for (i = c->used; i < olduse; i++) {
100 *tmpc++ = 0;
101 }
102 }
103
104 mp_clamp (c);
105 return MP_OKAY;
106 }
107 #endif
108
109 /* Source: /cvs/libtom/libtommath/bn_s_mp_add.c,v */
110 /* Revision: 1.4 */
111 /* Date: 2006/12/28 01:25:13 */
112