comparison libtommath/bn_mp_rshd.c @ 1739:13d834efc376 fuzz

merge from main
author Matt Johnston <matt@ucc.asn.au>
date Thu, 15 Oct 2020 19:55:15 +0800
parents 1051e4eea25a
children
comparison
equal deleted inserted replaced
1562:768ebf737aa0 1739:13d834efc376
1 #include <tommath_private.h> 1 #include "tommath_private.h"
2 #ifdef BN_MP_RSHD_C 2 #ifdef BN_MP_RSHD_C
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis 3 /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 * 4 /* SPDX-License-Identifier: Unlicense */
5 * LibTomMath is a library that provides multiple-precision
6 * integer arithmetic as well as number theoretic functionality.
7 *
8 * The library was designed directly after the MPI library by
9 * Michael Fromberger but has been written from scratch with
10 * additional optimizations in place.
11 *
12 * The library is free for all purposes without any express
13 * guarantee it works.
14 *
15 * Tom St Denis, [email protected], http://libtom.org
16 */
17 5
18 /* shift right a certain amount of digits */ 6 /* shift right a certain amount of digits */
19 void mp_rshd (mp_int * a, int b) 7 void mp_rshd(mp_int *a, int b)
20 { 8 {
21 int x; 9 int x;
10 mp_digit *bottom, *top;
22 11
23 /* if b <= 0 then ignore it */ 12 /* if b <= 0 then ignore it */
24 if (b <= 0) { 13 if (b <= 0) {
25 return; 14 return;
26 } 15 }
27 16
28 /* if b > used then simply zero it and return */ 17 /* if b > used then simply zero it and return */
29 if (a->used <= b) { 18 if (a->used <= b) {
30 mp_zero (a); 19 mp_zero(a);
31 return; 20 return;
32 } 21 }
33 22
34 { 23 /* shift the digits down */
35 mp_digit *bottom, *top;
36 24
37 /* shift the digits down */ 25 /* bottom */
26 bottom = a->dp;
38 27
39 /* bottom */ 28 /* top [offset into digits] */
40 bottom = a->dp; 29 top = a->dp + b;
41 30
42 /* top [offset into digits] */ 31 /* this is implemented as a sliding window where
43 top = a->dp + b; 32 * the window is b-digits long and digits from
33 * the top of the window are copied to the bottom
34 *
35 * e.g.
44 36
45 /* this is implemented as a sliding window where 37 b-2 | b-1 | b0 | b1 | b2 | ... | bb | ---->
46 * the window is b-digits long and digits from 38 /\ | ---->
47 * the top of the window are copied to the bottom 39 \-------------------/ ---->
48 * 40 */
49 * e.g. 41 for (x = 0; x < (a->used - b); x++) {
42 *bottom++ = *top++;
43 }
50 44
51 b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> 45 /* zero the top digits */
52 /\ | ----> 46 MP_ZERO_DIGITS(bottom, a->used - x);
53 \-------------------/ ---->
54 */
55 for (x = 0; x < (a->used - b); x++) {
56 *bottom++ = *top++;
57 }
58 47
59 /* zero the top digits */ 48 /* remove excess digits */
60 for (; x < a->used; x++) { 49 a->used -= b;
61 *bottom++ = 0;
62 }
63 }
64
65 /* remove excess digits */
66 a->used -= b;
67 } 50 }
68 #endif 51 #endif
69
70 /* ref: $Format:%D$ */
71 /* git commit: $Format:%H$ */
72 /* commit time: $Format:%ai$ */