Mercurial > dropbear
comparison libtommath/bn_mp_cnt_lsb.c @ 1733:d529a52b2f7c coverity coverity
merge coverity from main
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 26 Jun 2020 21:07:34 +0800 |
parents | 1051e4eea25a |
children |
comparison
equal
deleted
inserted
replaced
1643:b59623a64678 | 1733:d529a52b2f7c |
---|---|
1 #include <tommath_private.h> | 1 #include "tommath_private.h" |
2 #ifdef BN_MP_CNT_LSB_C | 2 #ifdef BN_MP_CNT_LSB_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 static const int lnz[16] = { | 6 static const int lnz[16] = { |
19 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 | 7 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 |
20 }; | 8 }; |
21 | 9 |
22 /* Counts the number of lsbs which are zero before the first zero bit */ | 10 /* Counts the number of lsbs which are zero before the first zero bit */ |
23 int mp_cnt_lsb(mp_int *a) | 11 int mp_cnt_lsb(const mp_int *a) |
24 { | 12 { |
25 int x; | 13 int x; |
26 mp_digit q, qq; | 14 mp_digit q, qq; |
27 | 15 |
28 /* easy out */ | 16 /* easy out */ |
29 if (mp_iszero(a) == MP_YES) { | 17 if (MP_IS_ZERO(a)) { |
30 return 0; | 18 return 0; |
31 } | 19 } |
32 | 20 |
33 /* scan lower digits until non-zero */ | 21 /* scan lower digits until non-zero */ |
34 for (x = 0; (x < a->used) && (a->dp[x] == 0); x++) {} | 22 for (x = 0; (x < a->used) && (a->dp[x] == 0u); x++) {} |
35 q = a->dp[x]; | 23 q = a->dp[x]; |
36 x *= DIGIT_BIT; | 24 x *= MP_DIGIT_BIT; |
37 | 25 |
38 /* now scan this digit until a 1 is found */ | 26 /* now scan this digit until a 1 is found */ |
39 if ((q & 1) == 0) { | 27 if ((q & 1u) == 0u) { |
40 do { | 28 do { |
41 qq = q & 15; | 29 qq = q & 15u; |
42 x += lnz[qq]; | 30 x += lnz[qq]; |
43 q >>= 4; | 31 q >>= 4; |
44 } while (qq == 0); | 32 } while (qq == 0u); |
45 } | 33 } |
46 return x; | 34 return x; |
47 } | 35 } |
48 | 36 |
49 #endif | 37 #endif |
50 | |
51 /* ref: $Format:%D$ */ | |
52 /* git commit: $Format:%H$ */ | |
53 /* commit time: $Format:%ai$ */ |