зеркало из https://github.com/github/putty.git
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:
Родитель
35f071f61c
Коммит
1a7521a0a7
12
mpint.c
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;
|
||||
|
|
6
mpint.h
6
mpint.h
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче