1// Copyright 2010 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28#include <stdlib.h> 29#include <string.h> 30 31 32#include "double-conversion/bignum.h" 33#include "cctest.h" 34#include "double-conversion/utils.h" 35 36using namespace double_conversion; 37 38 39static const int kBufferSize = 1024; 40 41static void AssignHexString(Bignum* bignum, const char* str) { 42 int len = static_cast<int>(strlen(str)); 43 bignum->AssignHexString(Vector<const char>(str, len)); 44} 45 46 47static void AssignDecimalString(Bignum* bignum, const char* str) { 48 int len = static_cast<int>(strlen(str)); 49 bignum->AssignDecimalString(Vector<const char>(str, len)); 50} 51 52 53TEST(Assign) { 54 char buffer[kBufferSize]; 55 Bignum bignum; 56 Bignum bignum2; 57 bignum.AssignUInt16(0); 58 CHECK(bignum.ToHexString(buffer, kBufferSize)); 59 CHECK_EQ("0", buffer); 60 bignum.AssignUInt16(0xA); 61 CHECK(bignum.ToHexString(buffer, kBufferSize)); 62 CHECK_EQ("A", buffer); 63 bignum.AssignUInt16(0x20); 64 CHECK(bignum.ToHexString(buffer, kBufferSize)); 65 CHECK_EQ("20", buffer); 66 67 68 bignum.AssignUInt64(0); 69 CHECK(bignum.ToHexString(buffer, kBufferSize)); 70 CHECK_EQ("0", buffer); 71 bignum.AssignUInt64(0xA); 72 CHECK(bignum.ToHexString(buffer, kBufferSize)); 73 CHECK_EQ("A", buffer); 74 bignum.AssignUInt64(0x20); 75 CHECK(bignum.ToHexString(buffer, kBufferSize)); 76 CHECK_EQ("20", buffer); 77 bignum.AssignUInt64(0x100); 78 CHECK(bignum.ToHexString(buffer, kBufferSize)); 79 CHECK_EQ("100", buffer); 80 81 // The first real test, since this will not fit into one bigit. 82 bignum.AssignUInt64(0x12345678); 83 CHECK(bignum.ToHexString(buffer, kBufferSize)); 84 CHECK_EQ("12345678", buffer); 85 86 uint64_t big = DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF); 87 bignum.AssignUInt64(big); 88 CHECK(bignum.ToHexString(buffer, kBufferSize)); 89 CHECK_EQ("FFFFFFFFFFFFFFFF", buffer); 90 91 big = DOUBLE_CONVERSION_UINT64_2PART_C(0x12345678, 9ABCDEF0); 92 bignum.AssignUInt64(big); 93 CHECK(bignum.ToHexString(buffer, kBufferSize)); 94 CHECK_EQ("123456789ABCDEF0", buffer); 95 96 bignum2.AssignBignum(bignum); 97 CHECK(bignum2.ToHexString(buffer, kBufferSize)); 98 CHECK_EQ("123456789ABCDEF0", buffer); 99 100 AssignDecimalString(&bignum, "0"); 101 CHECK(bignum.ToHexString(buffer, kBufferSize)); 102 CHECK_EQ("0", buffer); 103 104 AssignDecimalString(&bignum, "1"); 105 CHECK(bignum.ToHexString(buffer, kBufferSize)); 106 CHECK_EQ("1", buffer); 107 108 AssignDecimalString(&bignum, "1234567890"); 109 CHECK(bignum.ToHexString(buffer, kBufferSize)); 110 CHECK_EQ("499602D2", buffer); 111 112 AssignHexString(&bignum, "0"); 113 CHECK(bignum.ToHexString(buffer, kBufferSize)); 114 CHECK_EQ("0", buffer); 115 116 AssignHexString(&bignum, "123456789ABCDEF0"); 117 CHECK(bignum.ToHexString(buffer, kBufferSize)); 118 CHECK_EQ("123456789ABCDEF0", buffer); 119} 120 121 122TEST(ShiftLeft) { 123 char buffer[kBufferSize]; 124 Bignum bignum; 125 AssignHexString(&bignum, "0"); 126 bignum.ShiftLeft(100); 127 CHECK(bignum.ToHexString(buffer, kBufferSize)); 128 CHECK_EQ("0", buffer); 129 130 AssignHexString(&bignum, "1"); 131 bignum.ShiftLeft(1); 132 CHECK(bignum.ToHexString(buffer, kBufferSize)); 133 CHECK_EQ("2", buffer); 134 135 AssignHexString(&bignum, "1"); 136 bignum.ShiftLeft(4); 137 CHECK(bignum.ToHexString(buffer, kBufferSize)); 138 CHECK_EQ("10", buffer); 139 140 AssignHexString(&bignum, "1"); 141 bignum.ShiftLeft(32); 142 CHECK(bignum.ToHexString(buffer, kBufferSize)); 143 CHECK_EQ("100000000", buffer); 144 145 AssignHexString(&bignum, "1"); 146 bignum.ShiftLeft(64); 147 CHECK(bignum.ToHexString(buffer, kBufferSize)); 148 CHECK_EQ("10000000000000000", buffer); 149 150 AssignHexString(&bignum, "123456789ABCDEF"); 151 bignum.ShiftLeft(64); 152 CHECK(bignum.ToHexString(buffer, kBufferSize)); 153 CHECK_EQ("123456789ABCDEF0000000000000000", buffer); 154 bignum.ShiftLeft(1); 155 CHECK(bignum.ToHexString(buffer, kBufferSize)); 156 CHECK_EQ("2468ACF13579BDE0000000000000000", buffer); 157} 158 159 160TEST(AddUInt64) { 161 char buffer[kBufferSize]; 162 Bignum bignum; 163 AssignHexString(&bignum, "0"); 164 bignum.AddUInt64(0xA); 165 CHECK(bignum.ToHexString(buffer, kBufferSize)); 166 CHECK_EQ("A", buffer); 167 168 AssignHexString(&bignum, "1"); 169 bignum.AddUInt64(0xA); 170 CHECK(bignum.ToHexString(buffer, kBufferSize)); 171 CHECK_EQ("B", buffer); 172 173 AssignHexString(&bignum, "1"); 174 bignum.AddUInt64(0x100); 175 CHECK(bignum.ToHexString(buffer, kBufferSize)); 176 CHECK_EQ("101", buffer); 177 178 AssignHexString(&bignum, "1"); 179 bignum.AddUInt64(0xFFFF); 180 CHECK(bignum.ToHexString(buffer, kBufferSize)); 181 CHECK_EQ("10000", buffer); 182 183 AssignHexString(&bignum, "FFFFFFF"); 184 bignum.AddUInt64(0x1); 185 CHECK(bignum.ToHexString(buffer, kBufferSize)); 186 CHECK_EQ("10000000", buffer); 187 188 AssignHexString(&bignum, "10000000000000000000000000000000000000000000"); 189 bignum.AddUInt64(0xFFFF); 190 CHECK(bignum.ToHexString(buffer, kBufferSize)); 191 CHECK_EQ("1000000000000000000000000000000000000000FFFF", buffer); 192 193 AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); 194 bignum.AddUInt64(0x1); 195 CHECK(bignum.ToHexString(buffer, kBufferSize)); 196 CHECK_EQ("100000000000000000000000000000000000000000000", buffer); 197 198 bignum.AssignUInt16(0x1); 199 bignum.ShiftLeft(100); 200 bignum.AddUInt64(1); 201 CHECK(bignum.ToHexString(buffer, kBufferSize)); 202 CHECK_EQ("10000000000000000000000001", buffer); 203 204 bignum.AssignUInt16(0x1); 205 bignum.ShiftLeft(100); 206 bignum.AddUInt64(0xFFFF); 207 CHECK(bignum.ToHexString(buffer, kBufferSize)); 208 CHECK_EQ("1000000000000000000000FFFF", buffer); 209 210 AssignHexString(&bignum, "0"); 211 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xA, 00000000)); 212 CHECK(bignum.ToHexString(buffer, kBufferSize)); 213 CHECK_EQ("A00000000", buffer); 214 215 AssignHexString(&bignum, "1"); 216 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xA, 00000000)); 217 CHECK(bignum.ToHexString(buffer, kBufferSize)); 218 CHECK_EQ("A00000001", buffer); 219 220 AssignHexString(&bignum, "1"); 221 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x100, 00000000)); 222 CHECK(bignum.ToHexString(buffer, kBufferSize)); 223 CHECK_EQ("10000000001", buffer); 224 225 AssignHexString(&bignum, "1"); 226 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFF, 00000000)); 227 CHECK(bignum.ToHexString(buffer, kBufferSize)); 228 CHECK_EQ("FFFF00000001", buffer); 229 230 AssignHexString(&bignum, "FFFFFFF"); 231 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x1, 00000000)); 232 CHECK(bignum.ToHexString(buffer, kBufferSize)); 233 CHECK_EQ("10FFFFFFF", buffer); 234 235 AssignHexString(&bignum, "10000000000000000000000000000000000000000000"); 236 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFF, 00000000)); 237 CHECK(bignum.ToHexString(buffer, kBufferSize)); 238 CHECK_EQ("10000000000000000000000000000000FFFF00000000", buffer); 239 240 AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); 241 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x1, 00000000)); 242 CHECK(bignum.ToHexString(buffer, kBufferSize)); 243 CHECK_EQ("1000000000000000000000000000000000000FFFFFFFF", buffer); 244 245 bignum.AssignUInt16(0x1); 246 bignum.ShiftLeft(100); 247 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x1, 00000000)); 248 CHECK(bignum.ToHexString(buffer, kBufferSize)); 249 CHECK_EQ("10000000000000000100000000", buffer); 250 251 bignum.AssignUInt16(0x1); 252 bignum.ShiftLeft(100); 253 bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFF, 00000000)); 254 CHECK(bignum.ToHexString(buffer, kBufferSize)); 255 CHECK_EQ("10000000000000FFFF00000000", buffer); 256} 257 258 259TEST(AddBignum) { 260 char buffer[kBufferSize]; 261 Bignum bignum; 262 Bignum other; 263 264 AssignHexString(&other, "1"); 265 AssignHexString(&bignum, "0"); 266 bignum.AddBignum(other); 267 CHECK(bignum.ToHexString(buffer, kBufferSize)); 268 CHECK_EQ("1", buffer); 269 270 AssignHexString(&bignum, "1"); 271 bignum.AddBignum(other); 272 CHECK(bignum.ToHexString(buffer, kBufferSize)); 273 CHECK_EQ("2", buffer); 274 275 AssignHexString(&bignum, "FFFFFFF"); 276 bignum.AddBignum(other); 277 CHECK(bignum.ToHexString(buffer, kBufferSize)); 278 CHECK_EQ("10000000", buffer); 279 280 AssignHexString(&bignum, "FFFFFFFFFFFFFF"); 281 bignum.AddBignum(other); 282 CHECK(bignum.ToHexString(buffer, kBufferSize)); 283 CHECK_EQ("100000000000000", buffer); 284 285 AssignHexString(&bignum, "10000000000000000000000000000000000000000000"); 286 bignum.AddBignum(other); 287 CHECK(bignum.ToHexString(buffer, kBufferSize)); 288 CHECK_EQ("10000000000000000000000000000000000000000001", buffer); 289 290 AssignHexString(&other, "1000000000000"); 291 292 AssignHexString(&bignum, "1"); 293 bignum.AddBignum(other); 294 CHECK(bignum.ToHexString(buffer, kBufferSize)); 295 CHECK_EQ("1000000000001", buffer); 296 297 AssignHexString(&bignum, "FFFFFFF"); 298 bignum.AddBignum(other); 299 CHECK(bignum.ToHexString(buffer, kBufferSize)); 300 CHECK_EQ("100000FFFFFFF", buffer); 301 302 AssignHexString(&bignum, "10000000000000000000000000000000000000000000"); 303 bignum.AddBignum(other); 304 CHECK(bignum.ToHexString(buffer, kBufferSize)); 305 CHECK_EQ("10000000000000000000000000000001000000000000", buffer); 306 307 AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); 308 bignum.AddBignum(other); 309 CHECK(bignum.ToHexString(buffer, kBufferSize)); 310 CHECK_EQ("1000000000000000000000000000000FFFFFFFFFFFF", buffer); 311 312 bignum.AssignUInt16(0x1); 313 bignum.ShiftLeft(100); 314 bignum.AddBignum(other); 315 CHECK(bignum.ToHexString(buffer, kBufferSize)); 316 CHECK_EQ("10000000000001000000000000", buffer); 317 318 other.ShiftLeft(64); 319 CHECK(other.ToHexString(buffer, kBufferSize)); 320 CHECK_EQ("10000000000000000000000000000", buffer); 321 322 bignum.AssignUInt16(0x1); 323 CHECK(bignum.ToHexString(buffer, kBufferSize)); 324 CHECK_EQ("1", buffer); 325 326 bignum.AddBignum(other); 327 CHECK(bignum.ToHexString(buffer, kBufferSize)); 328 CHECK_EQ("10000000000000000000000000001", buffer); 329 330 AssignHexString(&bignum, "FFFFFFF"); 331 bignum.AddBignum(other); 332 CHECK(bignum.ToHexString(buffer, kBufferSize)); 333 CHECK_EQ("1000000000000000000000FFFFFFF", buffer); 334 335 AssignHexString(&bignum, "10000000000000000000000000000000000000000000"); 336 bignum.AddBignum(other); 337 CHECK(bignum.ToHexString(buffer, kBufferSize)); 338 CHECK_EQ("10000000000000010000000000000000000000000000", buffer); 339 340 AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); 341 bignum.AddBignum(other); 342 CHECK(bignum.ToHexString(buffer, kBufferSize)); 343 CHECK_EQ("100000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF", buffer); 344 345 bignum.AssignUInt16(0x1); 346 bignum.ShiftLeft(100); 347 bignum.AddBignum(other); 348 CHECK(bignum.ToHexString(buffer, kBufferSize)); 349 CHECK_EQ("10010000000000000000000000000", buffer); 350} 351 352 353TEST(SubtractBignum) { 354 char buffer[kBufferSize]; 355 Bignum bignum; 356 Bignum other; 357 358 AssignHexString(&bignum, "1"); 359 AssignHexString(&other, "0"); 360 bignum.SubtractBignum(other); 361 CHECK(bignum.ToHexString(buffer, kBufferSize)); 362 CHECK_EQ("1", buffer); 363 364 AssignHexString(&bignum, "2"); 365 AssignHexString(&other, "0"); 366 bignum.SubtractBignum(other); 367 CHECK(bignum.ToHexString(buffer, kBufferSize)); 368 CHECK_EQ("2", buffer); 369 370 AssignHexString(&bignum, "10000000"); 371 AssignHexString(&other, "1"); 372 bignum.SubtractBignum(other); 373 CHECK(bignum.ToHexString(buffer, kBufferSize)); 374 CHECK_EQ("FFFFFFF", buffer); 375 376 AssignHexString(&bignum, "100000000000000"); 377 AssignHexString(&other, "1"); 378 bignum.SubtractBignum(other); 379 CHECK(bignum.ToHexString(buffer, kBufferSize)); 380 CHECK_EQ("FFFFFFFFFFFFFF", buffer); 381 382 AssignHexString(&bignum, "10000000000000000000000000000000000000000001"); 383 AssignHexString(&other, "1"); 384 bignum.SubtractBignum(other); 385 CHECK(bignum.ToHexString(buffer, kBufferSize)); 386 CHECK_EQ("10000000000000000000000000000000000000000000", buffer); 387 388 AssignHexString(&bignum, "1000000000001"); 389 AssignHexString(&other, "1000000000000"); 390 bignum.SubtractBignum(other); 391 CHECK(bignum.ToHexString(buffer, kBufferSize)); 392 CHECK_EQ("1", buffer); 393 394 AssignHexString(&bignum, "100000FFFFFFF"); 395 AssignHexString(&other, "1000000000000"); 396 bignum.SubtractBignum(other); 397 CHECK(bignum.ToHexString(buffer, kBufferSize)); 398 CHECK_EQ("FFFFFFF", buffer); 399 400 AssignHexString(&bignum, "10000000000000000000000000000001000000000000"); 401 AssignHexString(&other, "1000000000000"); 402 bignum.SubtractBignum(other); 403 CHECK(bignum.ToHexString(buffer, kBufferSize)); 404 CHECK_EQ("10000000000000000000000000000000000000000000", buffer); 405 406 AssignHexString(&bignum, "1000000000000000000000000000000FFFFFFFFFFFF"); 407 AssignHexString(&other, "1000000000000"); 408 bignum.SubtractBignum(other); 409 CHECK(bignum.ToHexString(buffer, kBufferSize)); 410 CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", buffer); 411 412 bignum.AssignUInt16(0x1); 413 bignum.ShiftLeft(100); 414 // "10 0000 0000 0000 0000 0000 0000" 415 AssignHexString(&other, "1000000000000"); 416 bignum.SubtractBignum(other); 417 CHECK(bignum.ToHexString(buffer, kBufferSize)); 418 CHECK_EQ("FFFFFFFFFFFFF000000000000", buffer); 419 420 AssignHexString(&other, "1000000000000"); 421 other.ShiftLeft(48); 422 // other == "1000000000000000000000000" 423 424 bignum.AssignUInt16(0x1); 425 bignum.ShiftLeft(100); 426 // bignum == "10000000000000000000000000" 427 bignum.SubtractBignum(other); 428 CHECK(bignum.ToHexString(buffer, kBufferSize)); 429 CHECK_EQ("F000000000000000000000000", buffer); 430 431 other.AssignUInt16(0x1); 432 other.ShiftLeft(35); 433 // other == "800000000" 434 AssignHexString(&bignum, "FFFFFFF"); 435 bignum.ShiftLeft(60); 436 // bignum = FFFFFFF000000000000000 437 bignum.SubtractBignum(other); 438 CHECK(bignum.ToHexString(buffer, kBufferSize)); 439 CHECK_EQ("FFFFFFEFFFFFF800000000", buffer); 440 441 AssignHexString(&bignum, "10000000000000000000000000000000000000000000"); 442 bignum.SubtractBignum(other); 443 CHECK(bignum.ToHexString(buffer, kBufferSize)); 444 CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000000", buffer); 445 446 AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); 447 bignum.SubtractBignum(other); 448 CHECK(bignum.ToHexString(buffer, kBufferSize)); 449 CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFF", buffer); 450} 451 452 453TEST(MultiplyUInt32) { 454 char buffer[kBufferSize]; 455 Bignum bignum; 456 457 AssignHexString(&bignum, "0"); 458 bignum.MultiplyByUInt32(0x25); 459 CHECK(bignum.ToHexString(buffer, kBufferSize)); 460 CHECK_EQ("0", buffer); 461 462 AssignHexString(&bignum, "2"); 463 bignum.MultiplyByUInt32(0x5); 464 CHECK(bignum.ToHexString(buffer, kBufferSize)); 465 CHECK_EQ("A", buffer); 466 467 AssignHexString(&bignum, "10000000"); 468 bignum.MultiplyByUInt32(0x9); 469 CHECK(bignum.ToHexString(buffer, kBufferSize)); 470 CHECK_EQ("90000000", buffer); 471 472 AssignHexString(&bignum, "100000000000000"); 473 bignum.MultiplyByUInt32(0xFFFF); 474 CHECK(bignum.ToHexString(buffer, kBufferSize)); 475 CHECK_EQ("FFFF00000000000000", buffer); 476 477 AssignHexString(&bignum, "100000000000000"); 478 bignum.MultiplyByUInt32(0xFFFFFFFF); 479 CHECK(bignum.ToHexString(buffer, kBufferSize)); 480 CHECK_EQ("FFFFFFFF00000000000000", buffer); 481 482 AssignHexString(&bignum, "1234567ABCD"); 483 bignum.MultiplyByUInt32(0xFFF); 484 CHECK(bignum.ToHexString(buffer, kBufferSize)); 485 CHECK_EQ("12333335552433", buffer); 486 487 AssignHexString(&bignum, "1234567ABCD"); 488 bignum.MultiplyByUInt32(0xFFFFFFF); 489 CHECK(bignum.ToHexString(buffer, kBufferSize)); 490 CHECK_EQ("12345679998A985433", buffer); 491 492 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 493 bignum.MultiplyByUInt32(0x2); 494 CHECK(bignum.ToHexString(buffer, kBufferSize)); 495 CHECK_EQ("1FFFFFFFFFFFFFFFE", buffer); 496 497 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 498 bignum.MultiplyByUInt32(0x4); 499 CHECK(bignum.ToHexString(buffer, kBufferSize)); 500 CHECK_EQ("3FFFFFFFFFFFFFFFC", buffer); 501 502 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 503 bignum.MultiplyByUInt32(0xF); 504 CHECK(bignum.ToHexString(buffer, kBufferSize)); 505 CHECK_EQ("EFFFFFFFFFFFFFFF1", buffer); 506 507 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 508 bignum.MultiplyByUInt32(0xFFFFFF); 509 CHECK(bignum.ToHexString(buffer, kBufferSize)); 510 CHECK_EQ("FFFFFEFFFFFFFFFF000001", buffer); 511 512 bignum.AssignUInt16(0x1); 513 bignum.ShiftLeft(100); 514 // "10 0000 0000 0000 0000 0000 0000" 515 bignum.MultiplyByUInt32(2); 516 CHECK(bignum.ToHexString(buffer, kBufferSize)); 517 CHECK_EQ("20000000000000000000000000", buffer); 518 519 bignum.AssignUInt16(0x1); 520 bignum.ShiftLeft(100); 521 // "10 0000 0000 0000 0000 0000 0000" 522 bignum.MultiplyByUInt32(0xF); 523 CHECK(bignum.ToHexString(buffer, kBufferSize)); 524 CHECK_EQ("F0000000000000000000000000", buffer); 525 526 bignum.AssignUInt16(0xFFFF); 527 bignum.ShiftLeft(100); 528 // "FFFF0 0000 0000 0000 0000 0000 0000" 529 bignum.MultiplyByUInt32(0xFFFF); 530 CHECK(bignum.ToHexString(buffer, kBufferSize)); 531 CHECK_EQ("FFFE00010000000000000000000000000", buffer); 532 533 bignum.AssignUInt16(0xFFFF); 534 bignum.ShiftLeft(100); 535 // "FFFF0 0000 0000 0000 0000 0000 0000" 536 bignum.MultiplyByUInt32(0xFFFFFFFF); 537 CHECK(bignum.ToHexString(buffer, kBufferSize)); 538 CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer); 539 540 bignum.AssignUInt16(0xFFFF); 541 bignum.ShiftLeft(100); 542 // "FFFF0 0000 0000 0000 0000 0000 0000" 543 bignum.MultiplyByUInt32(0xFFFFFFFF); 544 CHECK(bignum.ToHexString(buffer, kBufferSize)); 545 CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer); 546 547 AssignDecimalString(&bignum, "15611230384529777"); 548 bignum.MultiplyByUInt32(10000000); 549 CHECK(bignum.ToHexString(buffer, kBufferSize)); 550 CHECK_EQ("210EDD6D4CDD2580EE80", buffer); 551} 552 553 554TEST(MultiplyUInt64) { 555 char buffer[kBufferSize]; 556 Bignum bignum; 557 558 AssignHexString(&bignum, "0"); 559 bignum.MultiplyByUInt64(0x25); 560 CHECK(bignum.ToHexString(buffer, kBufferSize)); 561 CHECK_EQ("0", buffer); 562 563 AssignHexString(&bignum, "2"); 564 bignum.MultiplyByUInt64(0x5); 565 CHECK(bignum.ToHexString(buffer, kBufferSize)); 566 CHECK_EQ("A", buffer); 567 568 AssignHexString(&bignum, "10000000"); 569 bignum.MultiplyByUInt64(0x9); 570 CHECK(bignum.ToHexString(buffer, kBufferSize)); 571 CHECK_EQ("90000000", buffer); 572 573 AssignHexString(&bignum, "100000000000000"); 574 bignum.MultiplyByUInt64(0xFFFF); 575 CHECK(bignum.ToHexString(buffer, kBufferSize)); 576 CHECK_EQ("FFFF00000000000000", buffer); 577 578 AssignHexString(&bignum, "100000000000000"); 579 bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF)); 580 CHECK(bignum.ToHexString(buffer, kBufferSize)); 581 CHECK_EQ("FFFFFFFFFFFFFFFF00000000000000", buffer); 582 583 AssignHexString(&bignum, "1234567ABCD"); 584 bignum.MultiplyByUInt64(0xFFF); 585 CHECK(bignum.ToHexString(buffer, kBufferSize)); 586 CHECK_EQ("12333335552433", buffer); 587 588 AssignHexString(&bignum, "1234567ABCD"); 589 bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFF, FFFFFFFF)); 590 CHECK(bignum.ToHexString(buffer, kBufferSize)); 591 CHECK_EQ("1234567ABCBDCBA985433", buffer); 592 593 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 594 bignum.MultiplyByUInt64(0x2); 595 CHECK(bignum.ToHexString(buffer, kBufferSize)); 596 CHECK_EQ("1FFFFFFFFFFFFFFFE", buffer); 597 598 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 599 bignum.MultiplyByUInt64(0x4); 600 CHECK(bignum.ToHexString(buffer, kBufferSize)); 601 CHECK_EQ("3FFFFFFFFFFFFFFFC", buffer); 602 603 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 604 bignum.MultiplyByUInt64(0xF); 605 CHECK(bignum.ToHexString(buffer, kBufferSize)); 606 CHECK_EQ("EFFFFFFFFFFFFFFF1", buffer); 607 608 AssignHexString(&bignum, "FFFFFFFFFFFFFFFF"); 609 bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF)); 610 CHECK(bignum.ToHexString(buffer, kBufferSize)); 611 CHECK_EQ("FFFFFFFFFFFFFFFE0000000000000001", buffer); 612 613 bignum.AssignUInt16(0x1); 614 bignum.ShiftLeft(100); 615 // "10 0000 0000 0000 0000 0000 0000" 616 bignum.MultiplyByUInt64(2); 617 CHECK(bignum.ToHexString(buffer, kBufferSize)); 618 CHECK_EQ("20000000000000000000000000", buffer); 619 620 bignum.AssignUInt16(0x1); 621 bignum.ShiftLeft(100); 622 // "10 0000 0000 0000 0000 0000 0000" 623 bignum.MultiplyByUInt64(0xF); 624 CHECK(bignum.ToHexString(buffer, kBufferSize)); 625 CHECK_EQ("F0000000000000000000000000", buffer); 626 627 bignum.AssignUInt16(0xFFFF); 628 bignum.ShiftLeft(100); 629 // "FFFF0 0000 0000 0000 0000 0000 0000" 630 bignum.MultiplyByUInt64(0xFFFF); 631 CHECK(bignum.ToHexString(buffer, kBufferSize)); 632 CHECK_EQ("FFFE00010000000000000000000000000", buffer); 633 634 bignum.AssignUInt16(0xFFFF); 635 bignum.ShiftLeft(100); 636 // "FFFF0 0000 0000 0000 0000 0000 0000" 637 bignum.MultiplyByUInt64(0xFFFFFFFF); 638 CHECK(bignum.ToHexString(buffer, kBufferSize)); 639 CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer); 640 641 bignum.AssignUInt16(0xFFFF); 642 bignum.ShiftLeft(100); 643 // "FFFF0 0000 0000 0000 0000 0000 0000" 644 bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF)); 645 CHECK(bignum.ToHexString(buffer, kBufferSize)); 646 CHECK_EQ("FFFEFFFFFFFFFFFF00010000000000000000000000000", buffer); 647 648 AssignDecimalString(&bignum, "15611230384529777"); 649 bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x8ac72304, 89e80000)); 650 CHECK(bignum.ToHexString(buffer, kBufferSize)); 651 CHECK_EQ("1E10EE4B11D15A7F3DE7F3C7680000", buffer); 652} 653 654 655TEST(MultiplyPowerOfTen) { 656 char buffer[kBufferSize]; 657 Bignum bignum; 658 659 AssignDecimalString(&bignum, "1234"); 660 bignum.MultiplyByPowerOfTen(1); 661 CHECK(bignum.ToHexString(buffer, kBufferSize)); 662 CHECK_EQ("3034", buffer); 663 664 AssignDecimalString(&bignum, "1234"); 665 bignum.MultiplyByPowerOfTen(2); 666 CHECK(bignum.ToHexString(buffer, kBufferSize)); 667 CHECK_EQ("1E208", buffer); 668 669 AssignDecimalString(&bignum, "1234"); 670 bignum.MultiplyByPowerOfTen(3); 671 CHECK(bignum.ToHexString(buffer, kBufferSize)); 672 CHECK_EQ("12D450", buffer); 673 674 AssignDecimalString(&bignum, "1234"); 675 bignum.MultiplyByPowerOfTen(4); 676 CHECK(bignum.ToHexString(buffer, kBufferSize)); 677 CHECK_EQ("BC4B20", buffer); 678 679 AssignDecimalString(&bignum, "1234"); 680 bignum.MultiplyByPowerOfTen(5); 681 CHECK(bignum.ToHexString(buffer, kBufferSize)); 682 CHECK_EQ("75AEF40", buffer); 683 684 AssignDecimalString(&bignum, "1234"); 685 bignum.MultiplyByPowerOfTen(6); 686 CHECK(bignum.ToHexString(buffer, kBufferSize)); 687 CHECK_EQ("498D5880", buffer); 688 689 AssignDecimalString(&bignum, "1234"); 690 bignum.MultiplyByPowerOfTen(7); 691 CHECK(bignum.ToHexString(buffer, kBufferSize)); 692 CHECK_EQ("2DF857500", buffer); 693 694 AssignDecimalString(&bignum, "1234"); 695 bignum.MultiplyByPowerOfTen(8); 696 CHECK(bignum.ToHexString(buffer, kBufferSize)); 697 CHECK_EQ("1CBB369200", buffer); 698 699 AssignDecimalString(&bignum, "1234"); 700 bignum.MultiplyByPowerOfTen(9); 701 CHECK(bignum.ToHexString(buffer, kBufferSize)); 702 CHECK_EQ("11F5021B400", buffer); 703 704 AssignDecimalString(&bignum, "1234"); 705 bignum.MultiplyByPowerOfTen(10); 706 CHECK(bignum.ToHexString(buffer, kBufferSize)); 707 CHECK_EQ("B3921510800", buffer); 708 709 AssignDecimalString(&bignum, "1234"); 710 bignum.MultiplyByPowerOfTen(11); 711 CHECK(bignum.ToHexString(buffer, kBufferSize)); 712 CHECK_EQ("703B4D2A5000", buffer); 713 714 AssignDecimalString(&bignum, "1234"); 715 bignum.MultiplyByPowerOfTen(12); 716 CHECK(bignum.ToHexString(buffer, kBufferSize)); 717 CHECK_EQ("4625103A72000", buffer); 718 719 AssignDecimalString(&bignum, "1234"); 720 bignum.MultiplyByPowerOfTen(13); 721 CHECK(bignum.ToHexString(buffer, kBufferSize)); 722 CHECK_EQ("2BD72A24874000", buffer); 723 724 AssignDecimalString(&bignum, "1234"); 725 bignum.MultiplyByPowerOfTen(14); 726 CHECK(bignum.ToHexString(buffer, kBufferSize)); 727 CHECK_EQ("1B667A56D488000", buffer); 728 729 AssignDecimalString(&bignum, "1234"); 730 bignum.MultiplyByPowerOfTen(15); 731 CHECK(bignum.ToHexString(buffer, kBufferSize)); 732 CHECK_EQ("11200C7644D50000", buffer); 733 734 AssignDecimalString(&bignum, "1234"); 735 bignum.MultiplyByPowerOfTen(16); 736 CHECK(bignum.ToHexString(buffer, kBufferSize)); 737 CHECK_EQ("AB407C9EB0520000", buffer); 738 739 AssignDecimalString(&bignum, "1234"); 740 bignum.MultiplyByPowerOfTen(17); 741 CHECK(bignum.ToHexString(buffer, kBufferSize)); 742 CHECK_EQ("6B084DE32E3340000", buffer); 743 744 AssignDecimalString(&bignum, "1234"); 745 bignum.MultiplyByPowerOfTen(18); 746 CHECK(bignum.ToHexString(buffer, kBufferSize)); 747 CHECK_EQ("42E530ADFCE0080000", buffer); 748 749 AssignDecimalString(&bignum, "1234"); 750 bignum.MultiplyByPowerOfTen(19); 751 CHECK(bignum.ToHexString(buffer, kBufferSize)); 752 CHECK_EQ("29CF3E6CBE0C0500000", buffer); 753 754 AssignDecimalString(&bignum, "1234"); 755 bignum.MultiplyByPowerOfTen(20); 756 CHECK(bignum.ToHexString(buffer, kBufferSize)); 757 CHECK_EQ("1A218703F6C783200000", buffer); 758 759 AssignDecimalString(&bignum, "1234"); 760 bignum.MultiplyByPowerOfTen(21); 761 CHECK(bignum.ToHexString(buffer, kBufferSize)); 762 CHECK_EQ("1054F4627A3CB1F400000", buffer); 763 764 AssignDecimalString(&bignum, "1234"); 765 bignum.MultiplyByPowerOfTen(22); 766 CHECK(bignum.ToHexString(buffer, kBufferSize)); 767 CHECK_EQ("A3518BD8C65EF38800000", buffer); 768 769 AssignDecimalString(&bignum, "1234"); 770 bignum.MultiplyByPowerOfTen(23); 771 CHECK(bignum.ToHexString(buffer, kBufferSize)); 772 CHECK_EQ("6612F7677BFB5835000000", buffer); 773 774 AssignDecimalString(&bignum, "1234"); 775 bignum.MultiplyByPowerOfTen(24); 776 CHECK(bignum.ToHexString(buffer, kBufferSize)); 777 CHECK_EQ("3FCBDAA0AD7D17212000000", buffer); 778 779 AssignDecimalString(&bignum, "1234"); 780 bignum.MultiplyByPowerOfTen(25); 781 CHECK(bignum.ToHexString(buffer, kBufferSize)); 782 CHECK_EQ("27DF68A46C6E2E74B4000000", buffer); 783 784 AssignDecimalString(&bignum, "1234"); 785 bignum.MultiplyByPowerOfTen(26); 786 CHECK(bignum.ToHexString(buffer, kBufferSize)); 787 CHECK_EQ("18EBA166C3C4DD08F08000000", buffer); 788 789 AssignDecimalString(&bignum, "1234"); 790 bignum.MultiplyByPowerOfTen(27); 791 CHECK(bignum.ToHexString(buffer, kBufferSize)); 792 CHECK_EQ("F9344E03A5B0A259650000000", buffer); 793 794 AssignDecimalString(&bignum, "1234"); 795 bignum.MultiplyByPowerOfTen(28); 796 CHECK(bignum.ToHexString(buffer, kBufferSize)); 797 CHECK_EQ("9BC0B0C2478E6577DF20000000", buffer); 798 799 AssignDecimalString(&bignum, "1234"); 800 bignum.MultiplyByPowerOfTen(29); 801 CHECK(bignum.ToHexString(buffer, kBufferSize)); 802 CHECK_EQ("61586E796CB8FF6AEB740000000", buffer); 803 804 AssignDecimalString(&bignum, "1234"); 805 bignum.MultiplyByPowerOfTen(30); 806 CHECK(bignum.ToHexString(buffer, kBufferSize)); 807 CHECK_EQ("3CD7450BE3F39FA2D32880000000", buffer); 808 809 AssignDecimalString(&bignum, "1234"); 810 bignum.MultiplyByPowerOfTen(31); 811 CHECK(bignum.ToHexString(buffer, kBufferSize)); 812 CHECK_EQ("26068B276E7843C5C3F9500000000", buffer); 813 814 AssignDecimalString(&bignum, "1234"); 815 bignum.MultiplyByPowerOfTen(50); 816 CHECK(bignum.ToHexString(buffer, kBufferSize)); 817 CHECK_EQ("149D1B4CFED03B23AB5F4E1196EF45C08000000000000", buffer); 818 819 AssignDecimalString(&bignum, "1234"); 820 bignum.MultiplyByPowerOfTen(100); 821 CHECK(bignum.ToHexString(buffer, kBufferSize)); 822 CHECK_EQ("5827249F27165024FBC47DFCA9359BF316332D1B91ACEECF471FBAB06D9B2" 823 "0000000000000000000000000", buffer); 824 825 AssignDecimalString(&bignum, "1234"); 826 bignum.MultiplyByPowerOfTen(200); 827 CHECK(bignum.ToHexString(buffer, kBufferSize)); 828 CHECK_EQ("64C1F5C06C3816AFBF8DAFD5A3D756365BB0FD020E6F084E759C1F7C99E4F" 829 "55B9ACC667CEC477EB958C2AEEB3C6C19BA35A1AD30B35C51EB72040920000" 830 "0000000000000000000000000000000000000000000000", buffer); 831 832 AssignDecimalString(&bignum, "1234"); 833 bignum.MultiplyByPowerOfTen(500); 834 CHECK(bignum.ToHexString(buffer, kBufferSize)); 835 CHECK_EQ("96741A625EB5D7C91039FEB5C5ACD6D9831EDA5B083D800E6019442C8C8223" 836 "3EAFB3501FE2058062221E15121334928880827DEE1EC337A8B26489F3A40A" 837 "CB440A2423734472D10BFCE886F41B3AF9F9503013D86D088929CA86EEB4D8" 838 "B9C831D0BD53327B994A0326227CFD0ECBF2EB48B02387AAE2D4CCCDF1F1A1" 839 "B8CC4F1FA2C56AD40D0E4DAA9C28CDBF0A549098EA13200000000000000000" 840 "00000000000000000000000000000000000000000000000000000000000000" 841 "0000000000000000000000000000000000000000000000", buffer); 842 843 AssignDecimalString(&bignum, "1234"); 844 bignum.MultiplyByPowerOfTen(1000); 845 CHECK(bignum.ToHexString(buffer, kBufferSize)); 846 CHECK_EQ("1258040F99B1CD1CC9819C676D413EA50E4A6A8F114BB0C65418C62D399B81" 847 "6361466CA8E095193E1EE97173553597C96673AF67FAFE27A66E7EF2E5EF2E" 848 "E3F5F5070CC17FE83BA53D40A66A666A02F9E00B0E11328D2224B8694C7372" 849 "F3D536A0AD1985911BD361496F268E8B23112500EAF9B88A9BC67B2AB04D38" 850 "7FEFACD00F5AF4F764F9ABC3ABCDE54612DE38CD90CB6647CA389EA0E86B16" 851 "BF7A1F34086E05ADBE00BD1673BE00FAC4B34AF1091E8AD50BA675E0381440" 852 "EA8E9D93E75D816BAB37C9844B1441C38FC65CF30ABB71B36433AF26DD97BD" 853 "ABBA96C03B4919B8F3515B92826B85462833380DC193D79F69D20DD6038C99" 854 "6114EF6C446F0BA28CC772ACBA58B81C04F8FFDE7B18C4E5A3ABC51E637FDF" 855 "6E37FDFF04C940919390F4FF92000000000000000000000000000000000000" 856 "00000000000000000000000000000000000000000000000000000000000000" 857 "00000000000000000000000000000000000000000000000000000000000000" 858 "00000000000000000000000000000000000000000000000000000000000000" 859 "0000000000000000000000000000", buffer); 860 861 Bignum bignum2; 862 AssignHexString(&bignum2, "3DA774C07FB5DF54284D09C675A492165B830D5DAAEB2A7501" 863 "DA17CF9DFA1CA2282269F92A25A97314296B717E3DCBB9FE17" 864 "41A842FE2913F540F40796F2381155763502C58B15AF7A7F88" 865 "6F744C9164FF409A28F7FA0C41F89ED79C1BE9F322C8578B97" 866 "841F1CBAA17D901BE1230E3C00E1C643AF32638B5674E01FEA" 867 "96FC90864E621B856A9E1CE56E6EB545B9C2F8F0CC10DDA88D" 868 "CC6D282605F8DB67044F2DFD3695E7BA63877AE16701536AE6" 869 "567C794D0BFE338DFBB42D92D4215AF3BB22BF0A8B283FDDC2" 870 "C667A10958EA6D2"); 871 CHECK(bignum2.ToHexString(buffer, kBufferSize)); 872 CHECK_EQ("3DA774C07FB5DF54284D09C675A492165B830D5DAAEB2A7501" 873 "DA17CF9DFA1CA2282269F92A25A97314296B717E3DCBB9FE17" 874 "41A842FE2913F540F40796F2381155763502C58B15AF7A7F88" 875 "6F744C9164FF409A28F7FA0C41F89ED79C1BE9F322C8578B97" 876 "841F1CBAA17D901BE1230E3C00E1C643AF32638B5674E01FEA" 877 "96FC90864E621B856A9E1CE56E6EB545B9C2F8F0CC10DDA88D" 878 "CC6D282605F8DB67044F2DFD3695E7BA63877AE16701536AE6" 879 "567C794D0BFE338DFBB42D92D4215AF3BB22BF0A8B283FDDC2" 880 "C667A10958EA6D2", buffer); 881 882 bignum.AssignBignum(bignum2); 883 bignum.MultiplyByPowerOfTen(1); 884 CHECK(bignum.ToHexString(buffer, kBufferSize)); 885 CHECK_EQ("2688A8F84FD1AB949930261C0986DB4DF931E85A8AD2FA8921284EE1C2BC51" 886 "E55915823BBA5789E7EC99E326EEE69F543ECE890929DED9AC79489884BE57" 887 "630AD569E121BB76ED8DAC8FB545A8AFDADF1F8860599AFC47A93B6346C191" 888 "7237F5BD36B73EB29371F4A4EE7A116CB5E8E5808D1BEA4D7F7E3716090C13" 889 "F29E5DDA53F0FD513362A2D20F6505314B9419DB967F8A8A89589FC43917C3" 890 "BB892062B17CBE421DB0D47E34ACCCE060D422CFF60DCBD0277EE038BD509C" 891 "7BC494D8D854F5B76696F927EA99BC00C4A5D7928434", buffer); 892 893 bignum.AssignBignum(bignum2); 894 bignum.MultiplyByPowerOfTen(2); 895 CHECK(bignum.ToHexString(buffer, kBufferSize)); 896 CHECK_EQ("1815699B31E30B3CDFBE17D185F44910BBBF313896C3DC95B4B9314D19B5B32" 897 "F57AD71655476B630F3E02DF855502394A74115A5BA2B480BCBCD5F52F6F69D" 898 "E6C5622CB5152A54788BD9D14B896DE8CB73B53C3800DDACC9C51E0C38FAE76" 899 "2F9964232872F9C2738E7150C4AE3F1B18F70583172706FAEE26DC5A78C77A2" 900 "FAA874769E52C01DA5C3499F233ECF3C90293E0FB69695D763DAA3AEDA5535B" 901 "43DAEEDF6E9528E84CEE0EC000C3C8495C1F9C89F6218AF4C23765261CD5ADD" 902 "0787351992A01E5BB8F2A015807AE7A6BB92A08", buffer); 903 904 bignum.AssignBignum(bignum2); 905 bignum.MultiplyByPowerOfTen(5); 906 CHECK(bignum.ToHexString(buffer, kBufferSize)); 907 CHECK_EQ("5E13A4863ADEE3E5C9FE8D0A73423D695D62D8450CED15A8C9F368952C6DC3" 908 "F0EE7D82F3D1EFB7AF38A3B3920D410AFCAD563C8F5F39116E141A3C5C14B3" 909 "58CD73077EA35AAD59F6E24AD98F10D5555ABBFBF33AC361EAF429FD5FBE94" 910 "17DA9EF2F2956011F9F93646AA38048A681D984ED88127073443247CCC167C" 911 "B354A32206EF5A733E73CF82D795A1AD598493211A6D613C39515E0E0F6304" 912 "DCD9C810F3518C7F6A7CB6C81E99E02FCC65E8FDB7B7AE97306CC16A8631CE" 913 "0A2AEF6568276BE4C176964A73C153FDE018E34CB4C2F40", buffer); 914 915 bignum.AssignBignum(bignum2); 916 bignum.MultiplyByPowerOfTen(10); 917 CHECK(bignum.ToHexString(buffer, kBufferSize)); 918 CHECK_EQ("8F8CB8EB51945A7E815809F6121EF2F4E61EF3405CD9432CAD2709749EEAFD" 919 "1B81E843F14A3667A7BDCCC9E0BB795F63CDFDB62844AC7438976C885A0116" 920 "29607DA54F9C023CC366570B7637ED0F855D931752038A614922D0923E382C" 921 "B8E5F6C975672DB76E0DE471937BB9EDB11E28874F1C122D5E1EF38CECE9D0" 922 "0723056BCBD4F964192B76830634B1D322B7EB0062F3267E84F5C824343A77" 923 "4B7DCEE6DD464F01EBDC8C671BB18BB4EF4300A42474A6C77243F2A12B03BF" 924 "0443C38A1C0D2701EDB393135AE0DEC94211F9D4EB51F990800", buffer); 925 926 bignum.AssignBignum(bignum2); 927 bignum.MultiplyByPowerOfTen(50); 928 CHECK(bignum.ToHexString(buffer, kBufferSize)); 929 CHECK_EQ("107A8BE345E24407372FC1DE442CBA696BC23C4FFD5B4BDFD9E5C39559815" 930 "86628CF8472D2D589F2FC2BAD6E0816EC72CBF85CCA663D8A1EC6C51076D8" 931 "2D247E6C26811B7EC4D4300FB1F91028DCB7B2C4E7A60C151161AA7E65E79" 932 "B40917B12B2B5FBE7745984D4E8EFA31F9AE6062427B068B144A9CB155873" 933 "E7C0C9F0115E5AC72DC5A73C4796DB970BF9205AB8C77A6996EB1B417F9D1" 934 "6232431E6313C392203601B9C22CC10DDA88DCC6D282605F8DB67044F2DFD" 935 "3695E7BA63877AE16701536AE6567C794D0BFE338DFBB42D924CF964BD2C0" 936 "F586E03A2FCD35A408000000000000", buffer); 937 938 bignum.AssignBignum(bignum2); 939 bignum.MultiplyByPowerOfTen(100); 940 CHECK(bignum.ToHexString(buffer, kBufferSize)); 941 CHECK_EQ("46784A90ACD0ED3E7759CC585FB32D36EB6034A6F78D92604E3BAA5ED3D8B" 942 "6E60E854439BE448897FB4B7EA5A3D873AA0FCB3CFFD80D0530880E45F511" 943 "722A50CE7E058B5A6F5464DB7500E34984EE3202A9441F44FA1554C0CEA96" 944 "B438A36F25E7C9D56D71AE2CD313EC37534DA299AC0854FC48591A7CF3171" 945 "31265AA4AE62DE32344CE7BEEEF894AE686A2DAAFE5D6D9A10971FFD9C064" 946 "5079B209E1048F58B5192D41D84336AC4C8C489EEF00939CFC9D55C122036" 947 "01B9C22CC10DDA88DCC6D282605F8DB67044F2DFD3695E7BA3F67B96D3A32" 948 "E11FB5561B68744C4035B0800DC166D49D98E3FD1D5BB2000000000000000" 949 "0000000000", buffer); 950 951 bignum.AssignBignum(bignum2); 952 bignum.MultiplyByPowerOfTen(200); 953 CHECK(bignum.ToHexString(buffer, kBufferSize)); 954 CHECK_EQ("508BD351221DF139D72D88CDC0416845A53EE2D0E6B98352509A9AC312F8C" 955 "6CB1A144889416201E0B6CE66EA3EBE259B5FD79ECFC1FD77963CE516CC7E" 956 "2FE73D4B5B710C19F6BCB092C7A2FD76286543B8DBD2C596DFF2C896720BA" 957 "DFF7BC9C366ACEA3A880AEC287C5E6207DF2739B5326FC19D773BD830B109" 958 "ED36C7086544BF8FDB9D4B73719C2B5BC2F571A5937EC46876CD428281F6B" 959 "F287E1E07F25C1B1D46BC37324FF657A8B2E0071DB83B86123CA34004F406" 960 "001082D7945E90C6E8C9A9FEC2B44BE0DDA46E9F52B152E4D1336D2FCFBC9" 961 "96E30CA0082256737365158FE36482AA7EB9DAF2AB128F10E7551A3CD5BE6" 962 "0A922F3A7D5EED38B634A7EC95BCF7021BA6820A292000000000000000000" 963 "00000000000000000000000000000000", buffer); 964 965 bignum.AssignBignum(bignum2); 966 bignum.MultiplyByPowerOfTen(500); 967 CHECK(bignum.ToHexString(buffer, kBufferSize)); 968 CHECK_EQ("7845F900E475B5086885BAAAE67C8E85185ACFE4633727F82A4B06B5582AC" 969 "BE933C53357DA0C98C20C5AC900C4D76A97247DF52B79F48F9E35840FB715" 970 "D392CE303E22622B0CF82D9471B398457DD3196F639CEE8BBD2C146873841" 971 "F0699E6C41F04FC7A54B48CEB995BEB6F50FE81DE9D87A8D7F849CC523553" 972 "7B7BBBC1C7CAAFF6E9650BE03B308C6D31012AEF9580F70D3EE2083ADE126" 973 "8940FA7D6308E239775DFD2F8C97FF7EBD525DAFA6512216F7047A62A93DC" 974 "38A0165BDC67E250DCC96A0181DE935A70B38704DC71819F02FC5261FF7E1" 975 "E5F11907678B0A3E519FF4C10A867B0C26CE02BE6960BA8621A87303C101C" 976 "3F88798BB9F7739655946F8B5744E6B1EAF10B0C5621330F0079209033C69" 977 "20DE2E2C8D324F0624463735D482BF291926C22A910F5B80FA25170B6B57D" 978 "8D5928C7BCA3FE87461275F69BD5A1B83181DAAF43E05FC3C72C4E93111B6" 979 "6205EBF49B28FEDFB7E7526CBDA658A332000000000000000000000000000" 980 "0000000000000000000000000000000000000000000000000000000000000" 981 "0000000000000000000000000000000000000", buffer); 982} 983 984 985TEST(DivideModuloIntBignum) { 986 char buffer[kBufferSize]; 987 Bignum bignum; 988 Bignum other; 989 Bignum third; 990 991 bignum.AssignUInt16(10); 992 other.AssignUInt16(2); 993 CHECK_EQ(5, bignum.DivideModuloIntBignum(other)); 994 CHECK(bignum.ToHexString(buffer, kBufferSize)); 995 CHECK_EQ("0", buffer); 996 997 bignum.AssignUInt16(10); 998 bignum.ShiftLeft(500); 999 other.AssignUInt16(2); 1000 other.ShiftLeft(500); 1001 CHECK_EQ(5, bignum.DivideModuloIntBignum(other)); 1002 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1003 CHECK_EQ("0", buffer); 1004 1005 bignum.AssignUInt16(11); 1006 other.AssignUInt16(2); 1007 CHECK_EQ(5, bignum.DivideModuloIntBignum(other)); 1008 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1009 CHECK_EQ("1", buffer); 1010 1011 bignum.AssignUInt16(10); 1012 bignum.ShiftLeft(500); 1013 other.AssignUInt16(1); 1014 bignum.AddBignum(other); 1015 other.AssignUInt16(2); 1016 other.ShiftLeft(500); 1017 CHECK_EQ(5, bignum.DivideModuloIntBignum(other)); 1018 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1019 CHECK_EQ("1", buffer); 1020 1021 bignum.AssignUInt16(10); 1022 bignum.ShiftLeft(500); 1023 other.AssignBignum(bignum); 1024 bignum.MultiplyByUInt32(0x1234); 1025 third.AssignUInt16(0xFFF); 1026 bignum.AddBignum(third); 1027 CHECK_EQ(0x1234, bignum.DivideModuloIntBignum(other)); 1028 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1029 CHECK_EQ("FFF", buffer); 1030 1031 bignum.AssignUInt16(10); 1032 AssignHexString(&other, "1234567890"); 1033 CHECK_EQ(0, bignum.DivideModuloIntBignum(other)); 1034 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1035 CHECK_EQ("A", buffer); 1036 1037 AssignHexString(&bignum, "12345678"); 1038 AssignHexString(&other, "3789012"); 1039 CHECK_EQ(5, bignum.DivideModuloIntBignum(other)); 1040 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1041 CHECK_EQ("D9861E", buffer); 1042 1043 AssignHexString(&bignum, "70000001"); 1044 AssignHexString(&other, "1FFFFFFF"); 1045 CHECK_EQ(3, bignum.DivideModuloIntBignum(other)); 1046 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1047 CHECK_EQ("10000004", buffer); 1048 1049 AssignHexString(&bignum, "28000000"); 1050 AssignHexString(&other, "12A05F20"); 1051 CHECK_EQ(2, bignum.DivideModuloIntBignum(other)); 1052 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1053 CHECK_EQ("2BF41C0", buffer); 1054 1055 bignum.AssignUInt16(10); 1056 bignum.ShiftLeft(500); 1057 other.AssignBignum(bignum); 1058 bignum.MultiplyByUInt32(0x1234); 1059 third.AssignUInt16(0xFFF); 1060 other.SubtractBignum(third); 1061 CHECK_EQ(0x1234, bignum.DivideModuloIntBignum(other)); 1062 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1063 CHECK_EQ("1232DCC", buffer); 1064 CHECK_EQ(0, bignum.DivideModuloIntBignum(other)); 1065 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1066 CHECK_EQ("1232DCC", buffer); 1067} 1068 1069 1070TEST(Compare) { 1071 Bignum bignum1; 1072 Bignum bignum2; 1073 bignum1.AssignUInt16(1); 1074 bignum2.AssignUInt16(1); 1075 CHECK_EQ(0, Bignum::Compare(bignum1, bignum2)); 1076 CHECK(Bignum::Equal(bignum1, bignum2)); 1077 CHECK(Bignum::LessEqual(bignum1, bignum2)); 1078 CHECK(!Bignum::Less(bignum1, bignum2)); 1079 1080 bignum1.AssignUInt16(0); 1081 bignum2.AssignUInt16(1); 1082 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1083 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1084 CHECK(!Bignum::Equal(bignum1, bignum2)); 1085 CHECK(!Bignum::Equal(bignum2, bignum1)); 1086 CHECK(Bignum::LessEqual(bignum1, bignum2)); 1087 CHECK(!Bignum::LessEqual(bignum2, bignum1)); 1088 CHECK(Bignum::Less(bignum1, bignum2)); 1089 CHECK(!Bignum::Less(bignum2, bignum1)); 1090 1091 AssignHexString(&bignum1, "1234567890ABCDEF12345"); 1092 AssignHexString(&bignum2, "1234567890ABCDEF12345"); 1093 CHECK_EQ(0, Bignum::Compare(bignum1, bignum2)); 1094 1095 AssignHexString(&bignum1, "1234567890ABCDEF12345"); 1096 AssignHexString(&bignum2, "1234567890ABCDEF12346"); 1097 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1098 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1099 1100 AssignHexString(&bignum1, "1234567890ABCDEF12345"); 1101 bignum1.ShiftLeft(500); 1102 AssignHexString(&bignum2, "1234567890ABCDEF12345"); 1103 bignum2.ShiftLeft(500); 1104 CHECK_EQ(0, Bignum::Compare(bignum1, bignum2)); 1105 1106 AssignHexString(&bignum1, "1234567890ABCDEF12345"); 1107 bignum1.ShiftLeft(500); 1108 AssignHexString(&bignum2, "1234567890ABCDEF12346"); 1109 bignum2.ShiftLeft(500); 1110 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1111 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1112 1113 bignum1.AssignUInt16(1); 1114 bignum1.ShiftLeft(64); 1115 AssignHexString(&bignum2, "10000000000000000"); 1116 CHECK_EQ(0, Bignum::Compare(bignum1, bignum2)); 1117 CHECK_EQ(0, Bignum::Compare(bignum2, bignum1)); 1118 1119 bignum1.AssignUInt16(1); 1120 bignum1.ShiftLeft(64); 1121 AssignHexString(&bignum2, "10000000000000001"); 1122 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1123 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1124 1125 bignum1.AssignUInt16(1); 1126 bignum1.ShiftLeft(96); 1127 AssignHexString(&bignum2, "10000000000000001"); 1128 bignum2.ShiftLeft(32); 1129 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1130 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1131 1132 AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF"); 1133 bignum2.AssignUInt16(1); 1134 bignum2.ShiftLeft(64); 1135 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1136 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1137 1138 AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF"); 1139 bignum1.ShiftLeft(32); 1140 bignum2.AssignUInt16(1); 1141 bignum2.ShiftLeft(96); 1142 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1143 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1144 1145 AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF"); 1146 bignum1.ShiftLeft(32); 1147 bignum2.AssignUInt16(1); 1148 bignum2.ShiftLeft(95); 1149 CHECK_EQ(+1, Bignum::Compare(bignum1, bignum2)); 1150 CHECK_EQ(-1, Bignum::Compare(bignum2, bignum1)); 1151 1152 AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF"); 1153 bignum1.ShiftLeft(32); 1154 bignum2.AssignUInt16(1); 1155 bignum2.ShiftLeft(100); 1156 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1157 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1158 1159 AssignHexString(&bignum1, "100000000000000"); 1160 bignum2.AssignUInt16(1); 1161 bignum2.ShiftLeft(14*4); 1162 CHECK_EQ(0, Bignum::Compare(bignum1, bignum2)); 1163 CHECK_EQ(0, Bignum::Compare(bignum2, bignum1)); 1164 1165 AssignHexString(&bignum1, "100000000000001"); 1166 bignum2.AssignUInt16(1); 1167 bignum2.ShiftLeft(14*4); 1168 CHECK_EQ(+1, Bignum::Compare(bignum1, bignum2)); 1169 CHECK_EQ(-1, Bignum::Compare(bignum2, bignum1)); 1170 1171 AssignHexString(&bignum1, "200000000000000"); 1172 bignum2.AssignUInt16(3); 1173 bignum2.ShiftLeft(14*4); 1174 CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2)); 1175 CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1)); 1176} 1177 1178 1179TEST(PlusCompare) { 1180 Bignum a; 1181 Bignum b; 1182 Bignum c; 1183 a.AssignUInt16(1); 1184 b.AssignUInt16(0); 1185 c.AssignUInt16(1); 1186 CHECK_EQ(0, Bignum::PlusCompare(a, b, c)); 1187 CHECK(Bignum::PlusEqual(a, b, c)); 1188 CHECK(Bignum::PlusLessEqual(a, b, c)); 1189 CHECK(!Bignum::PlusLess(a, b, c)); 1190 1191 a.AssignUInt16(0); 1192 b.AssignUInt16(0); 1193 c.AssignUInt16(1); 1194 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1195 CHECK_EQ(+1, Bignum::PlusCompare(c, b, a)); 1196 CHECK(!Bignum::PlusEqual(a, b, c)); 1197 CHECK(!Bignum::PlusEqual(c, b, a)); 1198 CHECK(Bignum::PlusLessEqual(a, b, c)); 1199 CHECK(!Bignum::PlusLessEqual(c, b, a)); 1200 CHECK(Bignum::PlusLess(a, b, c)); 1201 CHECK(!Bignum::PlusLess(c, b, a)); 1202 1203 AssignHexString(&a, "1234567890ABCDEF12345"); 1204 b.AssignUInt16(1); 1205 AssignHexString(&c, "1234567890ABCDEF12345"); 1206 CHECK_EQ(+1, Bignum::PlusCompare(a, b, c)); 1207 1208 AssignHexString(&a, "1234567890ABCDEF12344"); 1209 b.AssignUInt16(1); 1210 AssignHexString(&c, "1234567890ABCDEF12345"); 1211 CHECK_EQ(0, Bignum::PlusCompare(a, b, c)); 1212 1213 AssignHexString(&a, "1234567890"); 1214 a.ShiftLeft(11*4); 1215 AssignHexString(&b, "ABCDEF12345"); 1216 AssignHexString(&c, "1234567890ABCDEF12345"); 1217 CHECK_EQ(0, Bignum::PlusCompare(a, b, c)); 1218 1219 AssignHexString(&a, "1234567890"); 1220 a.ShiftLeft(11*4); 1221 AssignHexString(&b, "ABCDEF12344"); 1222 AssignHexString(&c, "1234567890ABCDEF12345"); 1223 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1224 1225 AssignHexString(&a, "1234567890"); 1226 a.ShiftLeft(11*4); 1227 AssignHexString(&b, "ABCDEF12346"); 1228 AssignHexString(&c, "1234567890ABCDEF12345"); 1229 CHECK_EQ(1, Bignum::PlusCompare(a, b, c)); 1230 1231 AssignHexString(&a, "1234567891"); 1232 a.ShiftLeft(11*4); 1233 AssignHexString(&b, "ABCDEF12345"); 1234 AssignHexString(&c, "1234567890ABCDEF12345"); 1235 CHECK_EQ(1, Bignum::PlusCompare(a, b, c)); 1236 1237 AssignHexString(&a, "1234567889"); 1238 a.ShiftLeft(11*4); 1239 AssignHexString(&b, "ABCDEF12345"); 1240 AssignHexString(&c, "1234567890ABCDEF12345"); 1241 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1242 1243 AssignHexString(&a, "1234567890"); 1244 a.ShiftLeft(11*4 + 32); 1245 AssignHexString(&b, "ABCDEF12345"); 1246 b.ShiftLeft(32); 1247 AssignHexString(&c, "1234567890ABCDEF12345"); 1248 c.ShiftLeft(32); 1249 CHECK_EQ(0, Bignum::PlusCompare(a, b, c)); 1250 1251 AssignHexString(&a, "1234567890"); 1252 a.ShiftLeft(11*4 + 32); 1253 AssignHexString(&b, "ABCDEF12344"); 1254 b.ShiftLeft(32); 1255 AssignHexString(&c, "1234567890ABCDEF12345"); 1256 c.ShiftLeft(32); 1257 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1258 1259 AssignHexString(&a, "1234567890"); 1260 a.ShiftLeft(11*4 + 32); 1261 AssignHexString(&b, "ABCDEF12346"); 1262 b.ShiftLeft(32); 1263 AssignHexString(&c, "1234567890ABCDEF12345"); 1264 c.ShiftLeft(32); 1265 CHECK_EQ(1, Bignum::PlusCompare(a, b, c)); 1266 1267 AssignHexString(&a, "1234567891"); 1268 a.ShiftLeft(11*4 + 32); 1269 AssignHexString(&b, "ABCDEF12345"); 1270 b.ShiftLeft(32); 1271 AssignHexString(&c, "1234567890ABCDEF12345"); 1272 c.ShiftLeft(32); 1273 CHECK_EQ(1, Bignum::PlusCompare(a, b, c)); 1274 1275 AssignHexString(&a, "1234567889"); 1276 a.ShiftLeft(11*4 + 32); 1277 AssignHexString(&b, "ABCDEF12345"); 1278 b.ShiftLeft(32); 1279 AssignHexString(&c, "1234567890ABCDEF12345"); 1280 c.ShiftLeft(32); 1281 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1282 1283 AssignHexString(&a, "1234567890"); 1284 a.ShiftLeft(11*4 + 32); 1285 AssignHexString(&b, "ABCDEF12345"); 1286 b.ShiftLeft(32); 1287 AssignHexString(&c, "1234567890ABCDEF1234500000000"); 1288 CHECK_EQ(0, Bignum::PlusCompare(a, b, c)); 1289 1290 AssignHexString(&a, "1234567890"); 1291 a.ShiftLeft(11*4 + 32); 1292 AssignHexString(&b, "ABCDEF12344"); 1293 b.ShiftLeft(32); 1294 AssignHexString(&c, "1234567890ABCDEF1234500000000"); 1295 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1296 1297 AssignHexString(&a, "1234567890"); 1298 a.ShiftLeft(11*4 + 32); 1299 AssignHexString(&b, "ABCDEF12346"); 1300 b.ShiftLeft(32); 1301 AssignHexString(&c, "1234567890ABCDEF1234500000000"); 1302 CHECK_EQ(1, Bignum::PlusCompare(a, b, c)); 1303 1304 AssignHexString(&a, "1234567891"); 1305 a.ShiftLeft(11*4 + 32); 1306 AssignHexString(&b, "ABCDEF12345"); 1307 b.ShiftLeft(32); 1308 AssignHexString(&c, "1234567890ABCDEF1234500000000"); 1309 CHECK_EQ(1, Bignum::PlusCompare(a, b, c)); 1310 1311 AssignHexString(&a, "1234567889"); 1312 a.ShiftLeft(11*4 + 32); 1313 AssignHexString(&b, "ABCDEF12345"); 1314 b.ShiftLeft(32); 1315 AssignHexString(&c, "1234567890ABCDEF1234500000000"); 1316 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1317 1318 AssignHexString(&a, "1234567890"); 1319 a.ShiftLeft(11*4 + 32); 1320 AssignHexString(&b, "ABCDEF12345"); 1321 AssignHexString(&c, "123456789000000000ABCDEF12345"); 1322 CHECK_EQ(0, Bignum::PlusCompare(a, b, c)); 1323 1324 AssignHexString(&a, "1234567890"); 1325 a.ShiftLeft(11*4 + 32); 1326 AssignHexString(&b, "ABCDEF12346"); 1327 AssignHexString(&c, "123456789000000000ABCDEF12345"); 1328 CHECK_EQ(1, Bignum::PlusCompare(a, b, c)); 1329 1330 AssignHexString(&a, "1234567890"); 1331 a.ShiftLeft(11*4 + 32); 1332 AssignHexString(&b, "ABCDEF12344"); 1333 AssignHexString(&c, "123456789000000000ABCDEF12345"); 1334 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1335 1336 AssignHexString(&a, "1234567890"); 1337 a.ShiftLeft(11*4 + 32); 1338 AssignHexString(&b, "ABCDEF12345"); 1339 b.ShiftLeft(16); 1340 AssignHexString(&c, "12345678900000ABCDEF123450000"); 1341 CHECK_EQ(0, Bignum::PlusCompare(a, b, c)); 1342 1343 AssignHexString(&a, "1234567890"); 1344 a.ShiftLeft(11*4 + 32); 1345 AssignHexString(&b, "ABCDEF12344"); 1346 b.ShiftLeft(16); 1347 AssignHexString(&c, "12345678900000ABCDEF123450000"); 1348 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1349 1350 AssignHexString(&a, "1234567890"); 1351 a.ShiftLeft(11*4 + 32); 1352 AssignHexString(&b, "ABCDEF12345"); 1353 b.ShiftLeft(16); 1354 AssignHexString(&c, "12345678900000ABCDEF123450001"); 1355 CHECK_EQ(-1, Bignum::PlusCompare(a, b, c)); 1356 1357 AssignHexString(&a, "1234567890"); 1358 a.ShiftLeft(11*4 + 32); 1359 AssignHexString(&b, "ABCDEF12346"); 1360 b.ShiftLeft(16); 1361 AssignHexString(&c, "12345678900000ABCDEF123450000"); 1362 CHECK_EQ(+1, Bignum::PlusCompare(a, b, c)); 1363} 1364 1365 1366TEST(Square) { 1367 Bignum bignum; 1368 char buffer[kBufferSize]; 1369 1370 bignum.AssignUInt16(1); 1371 bignum.Square(); 1372 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1373 CHECK_EQ("1", buffer); 1374 1375 bignum.AssignUInt16(2); 1376 bignum.Square(); 1377 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1378 CHECK_EQ("4", buffer); 1379 1380 bignum.AssignUInt16(10); 1381 bignum.Square(); 1382 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1383 CHECK_EQ("64", buffer); 1384 1385 AssignHexString(&bignum, "FFFFFFF"); 1386 bignum.Square(); 1387 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1388 CHECK_EQ("FFFFFFE0000001", buffer); 1389 1390 AssignHexString(&bignum, "FFFFFFFFFFFFFF"); 1391 bignum.Square(); 1392 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1393 CHECK_EQ("FFFFFFFFFFFFFE00000000000001", buffer); 1394} 1395 1396 1397TEST(AssignPowerUInt16) { 1398 Bignum bignum; 1399 char buffer[kBufferSize]; 1400 1401 bignum.AssignPowerUInt16(1, 0); 1402 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1403 CHECK_EQ("1", buffer); 1404 1405 bignum.AssignPowerUInt16(1, 1); 1406 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1407 CHECK_EQ("1", buffer); 1408 1409 bignum.AssignPowerUInt16(1, 2); 1410 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1411 CHECK_EQ("1", buffer); 1412 1413 bignum.AssignPowerUInt16(2, 0); 1414 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1415 CHECK_EQ("1", buffer); 1416 1417 bignum.AssignPowerUInt16(2, 1); 1418 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1419 CHECK_EQ("2", buffer); 1420 1421 bignum.AssignPowerUInt16(2, 2); 1422 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1423 CHECK_EQ("4", buffer); 1424 1425 bignum.AssignPowerUInt16(16, 1); 1426 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1427 CHECK_EQ("10", buffer); 1428 1429 bignum.AssignPowerUInt16(16, 2); 1430 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1431 CHECK_EQ("100", buffer); 1432 1433 bignum.AssignPowerUInt16(16, 5); 1434 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1435 CHECK_EQ("100000", buffer); 1436 1437 bignum.AssignPowerUInt16(16, 8); 1438 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1439 CHECK_EQ("100000000", buffer); 1440 1441 bignum.AssignPowerUInt16(16, 16); 1442 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1443 CHECK_EQ("10000000000000000", buffer); 1444 1445 bignum.AssignPowerUInt16(16, 30); 1446 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1447 CHECK_EQ("1000000000000000000000000000000", buffer); 1448 1449 bignum.AssignPowerUInt16(10, 0); 1450 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1451 CHECK_EQ("1", buffer); 1452 1453 bignum.AssignPowerUInt16(10, 1); 1454 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1455 CHECK_EQ("A", buffer); 1456 1457 bignum.AssignPowerUInt16(10, 2); 1458 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1459 CHECK_EQ("64", buffer); 1460 1461 bignum.AssignPowerUInt16(10, 5); 1462 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1463 CHECK_EQ("186A0", buffer); 1464 1465 bignum.AssignPowerUInt16(10, 8); 1466 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1467 CHECK_EQ("5F5E100", buffer); 1468 1469 bignum.AssignPowerUInt16(10, 16); 1470 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1471 CHECK_EQ("2386F26FC10000", buffer); 1472 1473 bignum.AssignPowerUInt16(10, 30); 1474 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1475 CHECK_EQ("C9F2C9CD04674EDEA40000000", buffer); 1476 1477 bignum.AssignPowerUInt16(10, 31); 1478 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1479 CHECK_EQ("7E37BE2022C0914B2680000000", buffer); 1480 1481 bignum.AssignPowerUInt16(2, 0); 1482 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1483 CHECK_EQ("1", buffer); 1484 1485 bignum.AssignPowerUInt16(2, 100); 1486 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1487 CHECK_EQ("10000000000000000000000000", buffer); 1488 1489 bignum.AssignPowerUInt16(17, 0); 1490 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1491 CHECK_EQ("1", buffer); 1492 1493 bignum.AssignPowerUInt16(17, 99); 1494 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1495 CHECK_EQ("1942BB9853FAD924A3D4DD92B89B940E0207BEF05DB9C26BC1B757" 1496 "80BE0C5A2C2990E02A681224F34ED68558CE4C6E33760931", 1497 buffer); 1498 1499 bignum.AssignPowerUInt16(0xFFFF, 99); 1500 CHECK(bignum.ToHexString(buffer, kBufferSize)); 1501 CHECK_EQ("FF9D12F09B886C54E77E7439C7D2DED2D34F669654C0C2B6B8C288250" 1502 "5A2211D0E3DC9A61831349EAE674B11D56E3049D7BD79DAAD6C9FA2BA" 1503 "528E3A794299F2EE9146A324DAFE3E88967A0358233B543E233E575B9" 1504 "DD4E3AA7942146426C328FF55BFD5C45E0901B1629260AF9AE2F310C5" 1505 "50959FAF305C30116D537D80CF6EBDBC15C5694062AF1AC3D956D0A41" 1506 "B7E1B79FF11E21D83387A1CE1F5882B31E4B5D8DE415BDBE6854466DF" 1507 "343362267A7E8833119D31D02E18DB5B0E8F6A64B0ED0D0062FFFF", 1508 buffer); 1509} 1510