@@ -18,20 +18,11 @@ static const uint8_t s_read_radix_cutoff[65] = { 0, 0,
1818 18 , 17 , 17 , 17 , 17 , 17 , 17 /* 58 .. 64 */
1919 };
2020
21- /* This is in mp_prime_is_prime.c and can be reused */
22- static int s_floor_ilog2 (int value )
23- {
24- int r = 0 ;
25- while ((value >>= 1 ) != 0 ) {
26- r ++ ;
27- }
28- return r ;
29- }
30-
3121mp_err s_mp_faster_read_radix (mp_int * a , const char * str , size_t start , size_t end , int radix )
3222{
3323 size_t len , mid ;
3424 mp_int A , B , m ;
25+ mp_digit radix_ = (mp_digit )radix ;
3526 mp_err err = MP_OKAY ;
3627
3728 len = end - start ;
@@ -42,7 +33,7 @@ mp_err s_mp_faster_read_radix(mp_int *a, const char *str, size_t start, size_t e
4233
4334 mid = len / 2u ;
4435
45- if ((err = mp_init_set (& m , ( mp_digit ) radix )) != MP_OKAY ) {
36+ if ((err = mp_init_set (& m , radix_ )) != MP_OKAY ) {
4637 return err ;
4738 }
4839 if ((err = mp_init_multi (& A , & B , NULL )) != MP_OKAY ) {
@@ -53,8 +44,8 @@ mp_err s_mp_faster_read_radix(mp_int *a, const char *str, size_t start, size_t e
5344 if ((err = s_mp_slower_read_radix (& A , str , start , start + mid + 1 , radix )) != MP_OKAY ) goto LTM_ERR ;
5445 if ((err = s_mp_slower_read_radix (& B , str , start + mid + 1 , end , radix )) != MP_OKAY ) goto LTM_ERR ;
5546
56- if (MP_IS_2EXPT (( unsigned int ) radix )) {
57- if ((err = mp_mul_2d (& A , (int )(((len - mid ) - 1u ) * ( size_t ) s_floor_ilog2 ( radix )) , & A )) != MP_OKAY )goto LTM_ERR ;
47+ if (MP_IS_2EXPT (radix_ )) {
48+ if ((err = mp_mul_2d (& A , (int )(((len - mid ) - 1u ) * s_mp_floor_ilog2 ( radix_ )) , & A )) != MP_OKAY ) goto LTM_ERR ;
5849 } else {
5950 if ((err = mp_expt_n (& m , (int )((len - mid ) - 1u ), & m )) != MP_OKAY ) goto LTM_ERR ;
6051 if ((err = mp_mul (& A , & m , & A )) != MP_OKAY ) goto LTM_ERR ;
0 commit comments