comparison libtommath/bn_mp_div_2d.c @ 1470:8bba51a55704

Update to libtommath v1.0.1
author Matt Johnston <matt@ucc.asn.au>
date Thu, 08 Feb 2018 23:11:40 +0800
parents 60fc6476e044
children f52919ffd3b1
comparison
equal deleted inserted replaced
1469:51043e868f55 1470:8bba51a55704
18 /* shift right by a certain bit count (store quotient in c, optional remainder in d) */ 18 /* shift right by a certain bit count (store quotient in c, optional remainder in d) */
19 int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) 19 int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d)
20 { 20 {
21 mp_digit D, r, rr; 21 mp_digit D, r, rr;
22 int x, res; 22 int x, res;
23 mp_int t;
24
25 23
26 /* if the shift count is <= 0 then we do no work */ 24 /* if the shift count is <= 0 then we do no work */
27 if (b <= 0) { 25 if (b <= 0) {
28 res = mp_copy (a, c); 26 res = mp_copy (a, c);
29 if (d != NULL) { 27 if (d != NULL) {
30 mp_zero (d); 28 mp_zero (d);
31 } 29 }
32 return res; 30 return res;
33 } 31 }
34 32
35 if ((res = mp_init (&t)) != MP_OKAY) { 33 /* copy */
34 if ((res = mp_copy (a, c)) != MP_OKAY) {
36 return res; 35 return res;
37 } 36 }
37 /* 'a' should not be used after here - it might be the same as d */
38 38
39 /* get the remainder */ 39 /* get the remainder */
40 if (d != NULL) { 40 if (d != NULL) {
41 if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { 41 if ((res = mp_mod_2d (a, b, d)) != MP_OKAY) {
42 mp_clear (&t);
43 return res; 42 return res;
44 } 43 }
45 }
46
47 /* copy */
48 if ((res = mp_copy (a, c)) != MP_OKAY) {
49 mp_clear (&t);
50 return res;
51 } 44 }
52 45
53 /* shift by as many digits in the bit count */ 46 /* shift by as many digits in the bit count */
54 if (b >= (int)DIGIT_BIT) { 47 if (b >= (int)DIGIT_BIT) {
55 mp_rshd (c, b / DIGIT_BIT); 48 mp_rshd (c, b / DIGIT_BIT);
82 /* set the carry to the carry bits of the current word found above */ 75 /* set the carry to the carry bits of the current word found above */
83 r = rr; 76 r = rr;
84 } 77 }
85 } 78 }
86 mp_clamp (c); 79 mp_clamp (c);
87 if (d != NULL) {
88 mp_exch (&t, d);
89 }
90 mp_clear (&t);
91 return MP_OKAY; 80 return MP_OKAY;
92 } 81 }
93 #endif 82 #endif
94 83
95 /* $Source$ */ 84 /* ref: $Format:%D$ */
96 /* $Revision$ */ 85 /* git commit: $Format:%H$ */
97 /* $Date$ */ 86 /* commit time: $Format:%ai$ */