New mpint function mp_get_integer().

If you have an mp_int that you know will fit in an ordinary integer
type, this function gives it to you in that form.
This commit is contained in:
Simon Tatham 2019-02-26 07:06:16 +00:00
Родитель 35f071f61c
Коммит 1a7521a0a7
2 изменённых файлов: 18 добавлений и 0 удалений

12
mpint.c
Просмотреть файл

@ -257,6 +257,18 @@ unsigned mp_get_bit(mp_int *x, size_t bit)
(bit % BIGNUM_INT_BITS));
}
uintmax_t mp_get_integer(mp_int *x)
{
uintmax_t toret = 0;
for (size_t i = x->nw; i-- > 0 ;) {
/* Shift in two stages to avoid undefined behaviour if the
* shift count equals the integer width */
toret = (toret << (BIGNUM_INT_BITS/2)) << (BIGNUM_INT_BITS/2);
toret |= x->w[i];
}
return toret;
}
void mp_set_bit(mp_int *x, size_t bit, unsigned val)
{
size_t word = bit / BIGNUM_INT_BITS;

Просмотреть файл

@ -100,6 +100,12 @@ mp_int *mp_power_2(size_t power);
uint8_t mp_get_byte(mp_int *x, size_t byte);
unsigned mp_get_bit(mp_int *x, size_t bit);
/*
* Retrieve the value of an mp_int as a uintmax_t, assuming it's small
* enough to fit.
*/
uintmax_t mp_get_integer(mp_int *x);
/*
* Set an mp_int bit. Again, the bit index is not considered secret.
* Do not pass an out-of-range index, on pain of assertion failure.