c7314fa400
These functions were introduced to give some timing guarantees. However the guarantees are too weak to be useful. The functions seem to be unused essentially by downstream users.
46 lines
898 B
C
46 lines
898 B
C
#include "tommath_private.h"
|
|
#ifdef BN_MP_EXPT_D_C
|
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
|
/* SPDX-License-Identifier: Unlicense */
|
|
|
|
/* calculate c = a**b using a square-multiply algorithm */
|
|
mp_err mp_expt_d(const mp_int *a, mp_digit b, mp_int *c)
|
|
{
|
|
mp_err err;
|
|
|
|
mp_int g;
|
|
|
|
if ((err = mp_init_copy(&g, a)) != MP_OKAY) {
|
|
return err;
|
|
}
|
|
|
|
/* set initial result */
|
|
mp_set(c, 1uL);
|
|
|
|
while (b > 0u) {
|
|
/* if the bit is set multiply */
|
|
if ((b & 1u) != 0u) {
|
|
if ((err = mp_mul(c, &g, c)) != MP_OKAY) {
|
|
mp_clear(&g);
|
|
return err;
|
|
}
|
|
}
|
|
|
|
/* square */
|
|
if (b > 1u) {
|
|
if ((err = mp_sqr(&g, &g)) != MP_OKAY) {
|
|
mp_clear(&g);
|
|
return err;
|
|
}
|
|
}
|
|
|
|
/* shift to next bit */
|
|
b >>= 1;
|
|
}
|
|
|
|
mp_clear(&g);
|
|
return MP_OKAY;
|
|
}
|
|
|
|
#endif
|