| 1 | /* |
| 2 | Copyright (C) 1999-2007 The Botan Project. All rights reserved. |
| 3 | |
| 4 | Redistribution and use in source and binary forms, for any use, with or without |
| 5 | modification, is permitted provided that the following conditions are met: |
| 6 | |
| 7 | 1. Redistributions of source code must retain the above copyright notice, this |
| 8 | list of conditions, and the following disclaimer. |
| 9 | |
| 10 | 2. Redistributions in binary form must reproduce the above copyright notice, |
| 11 | this list of conditions, and the following disclaimer in the documentation |
| 12 | and/or other materials provided with the distribution. |
| 13 | |
| 14 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) "AS IS" AND ANY EXPRESS OR IMPLIED |
| 15 | WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| 16 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. |
| 17 | |
| 18 | IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE FOR ANY DIRECT, |
| 19 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| 20 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 21 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| 22 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| 23 | OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| 24 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 25 | */ |
| 26 | // LICENSEHEADER_END |
| 27 | namespace QCA { // WRAPNS_LINE |
| 28 | /************************************************* |
| 29 | * BigInt Base Source File * |
| 30 | * (C) 1999-2007 The Botan Project * |
| 31 | *************************************************/ |
| 32 | |
| 33 | } // WRAPNS_LINE |
| 34 | #include <botan/bigint.h> |
| 35 | namespace QCA { // WRAPNS_LINE |
| 36 | } // WRAPNS_LINE |
| 37 | #include <botan/mp_core.h> |
| 38 | namespace QCA { // WRAPNS_LINE |
| 39 | } // WRAPNS_LINE |
| 40 | #include <botan/bit_ops.h> |
| 41 | namespace QCA { // WRAPNS_LINE |
| 42 | } // WRAPNS_LINE |
| 43 | #include <botan/parsing.h> |
| 44 | namespace QCA { // WRAPNS_LINE |
| 45 | } // WRAPNS_LINE |
| 46 | #include <botan/util.h> |
| 47 | namespace QCA { // WRAPNS_LINE |
| 48 | |
| 49 | namespace Botan { |
| 50 | |
| 51 | /************************************************* |
| 52 | * Construct a BigInt from a regular number * |
| 53 | *************************************************/ |
| 54 | BigInt::BigInt(u64bit n) |
| 55 | { |
| 56 | set_sign(Positive); |
| 57 | |
| 58 | if (n == 0) |
| 59 | return; |
| 60 | |
| 61 | const u32bit limbs_needed = sizeof(u64bit) / sizeof(word); |
| 62 | |
| 63 | reg.create(n: 4 * limbs_needed); |
| 64 | for (u32bit j = 0; j != limbs_needed; ++j) |
| 65 | reg[j] = (word)((n >> (j * MP_WORD_BITS)) & MP_WORD_MASK); |
| 66 | } |
| 67 | |
| 68 | /************************************************* |
| 69 | * Construct a BigInt of the specified size * |
| 70 | *************************************************/ |
| 71 | BigInt::BigInt(Sign s, u32bit size) |
| 72 | { |
| 73 | reg.create(n: round_up(size, 8)); |
| 74 | signedness = s; |
| 75 | } |
| 76 | |
| 77 | /************************************************* |
| 78 | * Construct a BigInt from a "raw" BigInt * |
| 79 | *************************************************/ |
| 80 | BigInt::BigInt(const BigInt &b) |
| 81 | { |
| 82 | const u32bit b_words = b.sig_words(); |
| 83 | |
| 84 | if (b_words) { |
| 85 | reg.create(n: round_up(b_words, 8)); |
| 86 | reg.copy(in: b.data(), n: b_words); |
| 87 | set_sign(b.sign()); |
| 88 | } else { |
| 89 | reg.create(n: 2); |
| 90 | set_sign(Positive); |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | BigInt &BigInt::operator=(const BigInt &) = default; |
| 95 | |
| 96 | /************************************************* |
| 97 | * Construct a BigInt from a string * |
| 98 | *************************************************/ |
| 99 | BigInt::BigInt(const std::string &str) |
| 100 | { |
| 101 | Base base = Decimal; |
| 102 | u32bit markers = 0; |
| 103 | bool negative = false; |
| 104 | if (str.length() > 0 && str[0] == '-') { |
| 105 | markers += 1; |
| 106 | negative = true; |
| 107 | } |
| 108 | |
| 109 | if (str.length() > markers + 2 && str[markers] == '0' && str[markers + 1] == 'x') { |
| 110 | markers += 2; |
| 111 | base = Hexadecimal; |
| 112 | } else if (str.length() > markers + 1 && str[markers] == '0') { |
| 113 | markers += 1; |
| 114 | base = Octal; |
| 115 | } |
| 116 | |
| 117 | *this = decode((const byte *)str.data() + markers, str.length() - markers, base); |
| 118 | |
| 119 | if (negative) |
| 120 | set_sign(Negative); |
| 121 | else |
| 122 | set_sign(Positive); |
| 123 | } |
| 124 | |
| 125 | /************************************************* |
| 126 | * Construct a BigInt from an encoded BigInt * |
| 127 | *************************************************/ |
| 128 | BigInt::BigInt(const byte input[], u32bit length, Base base) |
| 129 | { |
| 130 | set_sign(Positive); |
| 131 | *this = decode(input, length, base); |
| 132 | } |
| 133 | |
| 134 | /************************************************* |
| 135 | * Swap this BigInt with another * |
| 136 | *************************************************/ |
| 137 | void BigInt::swap(BigInt &other) |
| 138 | { |
| 139 | std::swap(a&: reg, b&: other.reg); |
| 140 | std::swap(a&: signedness, b&: other.signedness); |
| 141 | } |
| 142 | |
| 143 | /************************************************* |
| 144 | * Grow the internal storage * |
| 145 | *************************************************/ |
| 146 | void BigInt::grow_reg(u32bit n) const |
| 147 | { |
| 148 | reg.grow_to(n: round_up(size() + n, 8)); |
| 149 | } |
| 150 | |
| 151 | /************************************************* |
| 152 | * Grow the internal storage * |
| 153 | *************************************************/ |
| 154 | void BigInt::grow_to(u32bit n) const |
| 155 | { |
| 156 | if (n > size()) |
| 157 | reg.grow_to(n: round_up(n, 8)); |
| 158 | } |
| 159 | |
| 160 | /************************************************* |
| 161 | * Comparison Function * |
| 162 | *************************************************/ |
| 163 | s32bit BigInt::cmp(const BigInt &n, bool check_signs) const |
| 164 | { |
| 165 | if (check_signs) { |
| 166 | if (n.is_positive() && this->is_negative()) |
| 167 | return -1; |
| 168 | if (n.is_negative() && this->is_positive()) |
| 169 | return 1; |
| 170 | if (n.is_negative() && this->is_negative()) |
| 171 | return (-bigint_cmp(data(), sig_words(), n.data(), n.sig_words())); |
| 172 | } |
| 173 | return bigint_cmp(data(), sig_words(), n.data(), n.sig_words()); |
| 174 | } |
| 175 | |
| 176 | /************************************************* |
| 177 | * Convert this number to a u32bit, if possible * |
| 178 | *************************************************/ |
| 179 | u32bit BigInt::to_u32bit() const |
| 180 | { |
| 181 | if (is_negative()) |
| 182 | throw Encoding_Error("BigInt::to_u32bit: Number is negative" ); |
| 183 | if (bits() >= 32) |
| 184 | throw Encoding_Error("BigInt::to_u32bit: Number is too big to convert" ); |
| 185 | |
| 186 | u32bit out = 0; |
| 187 | for (u32bit j = 0; j != 4; ++j) |
| 188 | out = (out << 8) | byte_at(3 - j); |
| 189 | return out; |
| 190 | } |
| 191 | |
| 192 | /************************************************* |
| 193 | * Return byte n of this number * |
| 194 | *************************************************/ |
| 195 | byte BigInt::byte_at(u32bit n) const |
| 196 | { |
| 197 | const u32bit WORD_BYTES = sizeof(word); |
| 198 | u32bit word_num = n / WORD_BYTES, byte_num = n % WORD_BYTES; |
| 199 | if (word_num >= size()) |
| 200 | return 0; |
| 201 | else |
| 202 | return get_byte(byte_num: WORD_BYTES - byte_num - 1, input: reg[word_num]); |
| 203 | } |
| 204 | |
| 205 | /************************************************* |
| 206 | * Return bit n of this number * |
| 207 | *************************************************/ |
| 208 | bool BigInt::get_bit(u32bit n) const |
| 209 | { |
| 210 | return ((word_at(n: n / MP_WORD_BITS) >> (n % MP_WORD_BITS)) & 1); |
| 211 | } |
| 212 | |
| 213 | /************************************************* |
| 214 | * Return bits {offset...offset+length} * |
| 215 | *************************************************/ |
| 216 | u32bit BigInt::get_substring(u32bit offset, u32bit length) const |
| 217 | { |
| 218 | if (length > 32) |
| 219 | throw Invalid_Argument("BigInt::get_substring: Substring size too big" ); |
| 220 | |
| 221 | u64bit piece = 0; |
| 222 | for (u32bit j = 0; j != 8; ++j) |
| 223 | piece = (piece << 8) | byte_at(n: (offset / 8) + (7 - j)); |
| 224 | |
| 225 | u64bit mask = (1 << length) - 1; |
| 226 | u32bit shift = (offset % 8); |
| 227 | |
| 228 | return static_cast<u32bit>((piece >> shift) & mask); |
| 229 | } |
| 230 | |
| 231 | /************************************************* |
| 232 | * Set bit number n * |
| 233 | *************************************************/ |
| 234 | void BigInt::set_bit(u32bit n) |
| 235 | { |
| 236 | const u32bit which = n / MP_WORD_BITS; |
| 237 | const word mask = (word)1 << (n % MP_WORD_BITS); |
| 238 | if (which >= size()) |
| 239 | grow_to(n: which + 1); |
| 240 | reg[which] |= mask; |
| 241 | } |
| 242 | |
| 243 | /************************************************* |
| 244 | * Clear bit number n * |
| 245 | *************************************************/ |
| 246 | void BigInt::clear_bit(u32bit n) |
| 247 | { |
| 248 | const u32bit which = n / MP_WORD_BITS; |
| 249 | const word mask = (word)1 << (n % MP_WORD_BITS); |
| 250 | if (which < size()) |
| 251 | reg[which] &= ~mask; |
| 252 | } |
| 253 | |
| 254 | /************************************************* |
| 255 | * Clear all but the lowest n bits * |
| 256 | *************************************************/ |
| 257 | void BigInt::mask_bits(u32bit n) |
| 258 | { |
| 259 | if (n == 0) { |
| 260 | clear(); |
| 261 | return; |
| 262 | } |
| 263 | if (n >= bits()) |
| 264 | return; |
| 265 | |
| 266 | const u32bit top_word = n / MP_WORD_BITS; |
| 267 | const word mask = ((word)1 << (n % MP_WORD_BITS)) - 1; |
| 268 | |
| 269 | if (top_word < size()) |
| 270 | for (u32bit j = top_word + 1; j != size(); ++j) |
| 271 | reg[j] = 0; |
| 272 | |
| 273 | reg[top_word] &= mask; |
| 274 | } |
| 275 | |
| 276 | /************************************************* |
| 277 | * Count the significant words * |
| 278 | *************************************************/ |
| 279 | u32bit BigInt::sig_words() const |
| 280 | { |
| 281 | const word *x = data(); |
| 282 | u32bit top_set = size(); |
| 283 | |
| 284 | while (top_set >= 4) { |
| 285 | word sum = x[top_set - 1] | x[top_set - 2] | x[top_set - 3] | x[top_set - 4]; |
| 286 | if (sum) |
| 287 | break; |
| 288 | else |
| 289 | top_set -= 4; |
| 290 | } |
| 291 | while (top_set && (x[top_set - 1] == 0)) |
| 292 | top_set--; |
| 293 | return top_set; |
| 294 | } |
| 295 | |
| 296 | /************************************************* |
| 297 | * Count how many bytes are being used * |
| 298 | *************************************************/ |
| 299 | u32bit BigInt::bytes() const |
| 300 | { |
| 301 | return (bits() + 7) / 8; |
| 302 | } |
| 303 | |
| 304 | /************************************************* |
| 305 | * Count how many bits are being used * |
| 306 | *************************************************/ |
| 307 | u32bit BigInt::bits() const |
| 308 | { |
| 309 | if (sig_words() == 0) |
| 310 | return 0; |
| 311 | |
| 312 | u32bit full_words = sig_words() - 1, top_bits = MP_WORD_BITS; |
| 313 | word top_word = word_at(n: full_words), mask = MP_WORD_TOP_BIT; |
| 314 | |
| 315 | while (top_bits && ((top_word & mask) == 0)) { |
| 316 | mask >>= 1; |
| 317 | top_bits--; |
| 318 | } |
| 319 | |
| 320 | return (full_words * MP_WORD_BITS + top_bits); |
| 321 | } |
| 322 | |
| 323 | /************************************************* |
| 324 | * Calcluate the size in a certain base * |
| 325 | *************************************************/ |
| 326 | u32bit BigInt::encoded_size(Base base) const |
| 327 | { |
| 328 | static const double LOG_2_BASE_10 = 0.30102999566; |
| 329 | |
| 330 | if (base == Binary) |
| 331 | return bytes(); |
| 332 | else if (base == Hexadecimal) |
| 333 | return 2 * bytes(); |
| 334 | else if (base == Octal) |
| 335 | return ((bits() + 2) / 3); |
| 336 | else if (base == Decimal) |
| 337 | return (u32bit)((bits() * LOG_2_BASE_10) + 1); |
| 338 | else |
| 339 | throw Invalid_Argument("Unknown base for BigInt encoding" ); |
| 340 | } |
| 341 | |
| 342 | /************************************************* |
| 343 | * Return true if this number is zero * |
| 344 | *************************************************/ |
| 345 | bool BigInt::is_zero() const |
| 346 | { |
| 347 | for (u32bit j = 0; j != size(); ++j) |
| 348 | if (reg[j]) |
| 349 | return false; |
| 350 | return true; |
| 351 | } |
| 352 | |
| 353 | /************************************************* |
| 354 | * Set the sign * |
| 355 | *************************************************/ |
| 356 | void BigInt::set_sign(Sign s) |
| 357 | { |
| 358 | if (is_zero()) |
| 359 | signedness = Positive; |
| 360 | else |
| 361 | signedness = s; |
| 362 | } |
| 363 | |
| 364 | /************************************************* |
| 365 | * Reverse the value of the sign flag * |
| 366 | *************************************************/ |
| 367 | void BigInt::flip_sign() |
| 368 | { |
| 369 | set_sign(reverse_sign()); |
| 370 | } |
| 371 | |
| 372 | /************************************************* |
| 373 | * Return the opposite value of the current sign * |
| 374 | *************************************************/ |
| 375 | BigInt::Sign BigInt::reverse_sign() const |
| 376 | { |
| 377 | if (sign() == Positive) |
| 378 | return Negative; |
| 379 | return Positive; |
| 380 | } |
| 381 | |
| 382 | /************************************************* |
| 383 | * Return the negation of this number * |
| 384 | *************************************************/ |
| 385 | BigInt BigInt::operator-() const |
| 386 | { |
| 387 | BigInt x = (*this); |
| 388 | x.flip_sign(); |
| 389 | return x; |
| 390 | } |
| 391 | |
| 392 | /************************************************* |
| 393 | * Return the absolute value of this number * |
| 394 | *************************************************/ |
| 395 | BigInt BigInt::abs() const |
| 396 | { |
| 397 | BigInt x = (*this); |
| 398 | x.set_sign(Positive); |
| 399 | return x; |
| 400 | } |
| 401 | |
| 402 | /************************************************* |
| 403 | * Encode this number into bytes * |
| 404 | *************************************************/ |
| 405 | void BigInt::binary_encode(byte output[]) const |
| 406 | { |
| 407 | const u32bit sig_bytes = bytes(); |
| 408 | for (u32bit j = 0; j != sig_bytes; ++j) |
| 409 | output[sig_bytes - j - 1] = byte_at(n: j); |
| 410 | } |
| 411 | |
| 412 | /************************************************* |
| 413 | * Set this number to the value in buf * |
| 414 | *************************************************/ |
| 415 | void BigInt::binary_decode(const byte buf[], u32bit length) |
| 416 | { |
| 417 | const u32bit WORD_BYTES = sizeof(word); |
| 418 | reg.create(n: round_up((length / WORD_BYTES) + 1, 8)); |
| 419 | |
| 420 | for (u32bit j = 0; j != length / WORD_BYTES; ++j) { |
| 421 | u32bit top = length - WORD_BYTES * j; |
| 422 | for (u32bit k = WORD_BYTES; k > 0; --k) |
| 423 | reg[j] = (reg[j] << 8) | buf[top - k]; |
| 424 | } |
| 425 | for (u32bit j = 0; j != length % WORD_BYTES; ++j) |
| 426 | reg[length / WORD_BYTES] = (reg[length / WORD_BYTES] << 8) | buf[j]; |
| 427 | } |
| 428 | |
| 429 | } |
| 430 | } // WRAPNS_LINE |
| 431 | |