8#include <botan/bigint.h>
9#include <botan/internal/mp_core.h>
10#include <botan/get_byte.h>
11#include <botan/parsing.h>
12#include <botan/internal/rounding.h>
13#include <botan/internal/ct_utils.h>
27 const size_t limbs_needed =
sizeof(
u64bit) /
sizeof(word);
29 reg.resize(4*limbs_needed);
30 for(
size_t i = 0; i != limbs_needed; ++i)
53 reg.copy(b.
data(), b_words);
70 bool negative =
false;
71 if(str.length() > 0 && str[0] ==
'-') { markers += 1; negative =
true; }
73 if(str.length() > markers + 2 && str[markers ] ==
'0' &&
74 str[markers + 1] ==
'x')
76 else if(str.length() > markers + 1 && str[markers] ==
'0')
77 { markers += 1; base =
Octal; }
79 *
this =
decode(
reinterpret_cast<const byte*
>(str.data()) + markers,
80 str.length() - markers, base);
92 *
this =
decode(input, length, base);
137 if(n.
is_positive() && this->is_negative())
return -1;
138 if(n.
is_negative() && this->is_positive())
return 1;
150 const size_t WORD_BYTES =
sizeof(word);
151 size_t word_num = n / WORD_BYTES, byte_num = n % WORD_BYTES;
152 if(word_num >=
size())
155 return get_byte(WORD_BYTES - byte_num - 1, reg[word_num]);
175 for(
size_t i = 0; i != 8; ++i)
177 const byte part =
byte_at((offset / 8) + (7-i));
178 piece = (piece << 8) | part;
181 const u64bit mask = (
static_cast<u64bit>(1) << length) - 1;
182 const size_t shift = (offset % 8);
184 return static_cast<u32bit>((piece >> shift) & mask);
195 throw Encoding_Error(
"BigInt::to_u32bit: Number is too big to convert");
198 for(
u32bit j = 0; j != 4; ++j)
199 out = (out << 8) |
byte_at(3-j);
209 const word mask =
static_cast<word
>(1) << (n %
MP_WORD_BITS);
220 const word mask =
static_cast<word
>(1) << (n %
MP_WORD_BITS);
230 if(n == 0) {
clear();
return; }
231 if(n >=
bits())
return;
234 const word mask = (
static_cast<word
>(1) << (n %
MP_WORD_BITS)) - 1;
236 if(top_word <
size())
237 for(
size_t i = top_word + 1; i !=
size(); ++i)
240 reg[top_word] &= mask;
248 return (
bits() + 7) / 8;
264 while(top_bits && ((top_word & mask) == 0))
265 { mask >>= 1; top_bits--; }
275 static const double LOG_2_BASE_10 = 0.30102999566;
281 else if(base ==
Octal)
282 return ((
bits() + 2) / 3);
284 return static_cast<size_t>((
bits() * LOG_2_BASE_10) + 1);
343 const size_t sig_bytes =
bytes();
344 for(
size_t i = 0; i != sig_bytes; ++i)
345 output[sig_bytes-i-1] =
byte_at(i);
353 const size_t WORD_BYTES =
sizeof(word);
358 for(
size_t i = 0; i != length / WORD_BYTES; ++i)
360 const size_t top = length - WORD_BYTES*i;
361 for(
size_t j = WORD_BYTES; j > 0; --j)
362 reg[i] = (reg[i] << 8) | buf[top - j];
365 for(
size_t i = 0; i != length % WORD_BYTES; ++i)
366 reg[length / WORD_BYTES] = (reg[length / WORD_BYTES] << 8) | buf[i];
383 const std::vector<BigInt>& vec,
386 const size_t words = output.
size();
390 for(
size_t i = 0; i != vec.size(); ++i)
392 for(
size_t w = 0; w != words; ++w)
static BigInt decode(const byte buf[], size_t length, Base base=Binary)
void binary_encode(byte buf[]) const
const word * data() const
word word_at(size_t n) const
s32bit cmp(const BigInt &n, bool check_signs=true) const
void randomize(RandomNumberGenerator &rng, size_t bitsize=0)
byte byte_at(size_t n) const
size_t encoded_size(Base base=Binary) const
void binary_decode(const byte buf[], size_t length)
static void const_time_lookup(SecureVector< word > &output, const std::vector< BigInt > &vec, size_t idx)
u32bit get_substring(size_t offset, size_t length) const
bool get_bit(size_t n) const
Sign reverse_sign() const
T select(T mask, T from0, T from1)
T round_up(T n, T align_to)
s32bit bigint_cmp(const word x[], size_t x_size, const word y[], size_t y_size)
byte get_byte(size_t byte_num, T input)
const word MP_WORD_TOP_BIT
unsigned long long u64bit
const size_t MP_WORD_BITS
std::invalid_argument Invalid_Argument
void clear_mem(T *ptr, size_t n)
void swap(Botan::MemoryRegion< T > &x, Botan::MemoryRegion< T > &y)
Encoding_Error(const std::string &name)