Line data Source code
1 : #include "tommath_private.h"
2 : #ifdef BN_MP_REDUCE_IS_2K_C
3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 : /* SPDX-License-Identifier: Unlicense */
5 :
6 : /* determines if mp_reduce_2k can be used */
7 229 : mp_bool mp_reduce_is_2k(const mp_int *a)
8 : {
9 : int ix, iy, iw;
10 : mp_digit iz;
11 :
12 229 : if (a->used == 0) {
13 0 : return MP_NO;
14 229 : } else if (a->used == 1) {
15 0 : return MP_YES;
16 229 : } else if (a->used > 1) {
17 229 : iy = mp_count_bits(a);
18 229 : iz = 1;
19 229 : iw = 1;
20 :
21 : /* Test every bit from the second digit up, must be 1 */
22 714 : for (ix = MP_DIGIT_BIT; ix < iy; ix++) {
23 714 : if ((a->dp[iw] & iz) == 0u) {
24 229 : return MP_NO;
25 : }
26 485 : iz <<= 1;
27 485 : if (iz > MP_DIGIT_MAX) {
28 0 : ++iw;
29 0 : iz = 1;
30 : }
31 : }
32 0 : return MP_YES;
33 : } else {
34 0 : return MP_YES;
35 : }
36 : }
37 :
38 : #endif
|