TestBigInteger.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041
  1. /*
  2. * Copyright (c) 2021, Peter Bocan <me@pbocan.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCrypto/BigInt/Algorithms/UnsignedBigIntegerAlgorithms.h>
  7. #include <LibCrypto/BigInt/SignedBigInteger.h>
  8. #include <LibCrypto/BigInt/UnsignedBigInteger.h>
  9. #include <LibCrypto/NumberTheory/ModularFunctions.h>
  10. #include <LibTest/TestCase.h>
  11. #include <math.h>
  12. static Crypto::UnsignedBigInteger bigint_fibonacci(size_t n)
  13. {
  14. Crypto::UnsignedBigInteger num1(0);
  15. Crypto::UnsignedBigInteger num2(1);
  16. for (size_t i = 0; i < n; ++i) {
  17. Crypto::UnsignedBigInteger t = num1.plus(num2);
  18. num2 = num1;
  19. num1 = t;
  20. }
  21. return num1;
  22. }
  23. static Crypto::SignedBigInteger bigint_signed_fibonacci(size_t n)
  24. {
  25. Crypto::SignedBigInteger num1(0);
  26. Crypto::SignedBigInteger num2(1);
  27. for (size_t i = 0; i < n; ++i) {
  28. Crypto::SignedBigInteger t = num1.plus(num2);
  29. num2 = num1;
  30. num1 = t;
  31. }
  32. return num1;
  33. }
  34. TEST_CASE(test_bigint_fib500)
  35. {
  36. Vector<u32> result {
  37. 315178285, 505575602, 1883328078, 125027121, 3649625763,
  38. 347570207, 74535262, 3832543808, 2472133297, 1600064941, 65273441
  39. };
  40. EXPECT_EQ(bigint_fibonacci(500).words(), result);
  41. }
  42. TEST_CASE(test_unsigned_bigint_addition_initialization)
  43. {
  44. Crypto::UnsignedBigInteger num1;
  45. Crypto::UnsignedBigInteger num2(70);
  46. Crypto::UnsignedBigInteger num3 = num1.plus(num2);
  47. bool pass = (num3 == num2);
  48. pass &= (num1 == Crypto::UnsignedBigInteger(0));
  49. EXPECT(pass);
  50. }
  51. TEST_CASE(test_unsigned_bigint_addition_borrow_with_zero)
  52. {
  53. Crypto::UnsignedBigInteger num1({ UINT32_MAX - 3, UINT32_MAX });
  54. Crypto::UnsignedBigInteger num2({ UINT32_MAX - 2, 0 });
  55. Vector<u32> expected_result { 4294967289, 0, 1 };
  56. EXPECT_EQ(num1.plus(num2).words(), expected_result);
  57. }
  58. TEST_CASE(test_unsigned_bigint_basic_add_to_accumulator)
  59. {
  60. Crypto::UnsignedBigInteger num1(10);
  61. Crypto::UnsignedBigInteger num2(70);
  62. Crypto::UnsignedBigIntegerAlgorithms::add_into_accumulator_without_allocation(num1, num2);
  63. EXPECT_EQ(num1.words(), Vector<u32> { 80 });
  64. }
  65. TEST_CASE(test_unsigned_bigint_basic_add_to_empty_accumulator)
  66. {
  67. Crypto::UnsignedBigInteger num1 {};
  68. Crypto::UnsignedBigInteger num2(10);
  69. Crypto::UnsignedBigIntegerAlgorithms::add_into_accumulator_without_allocation(num1, num2);
  70. EXPECT_EQ(num1.words(), Vector<u32> { 10 });
  71. }
  72. TEST_CASE(test_unsigned_bigint_basic_add_to_smaller_accumulator)
  73. {
  74. Crypto::UnsignedBigInteger num1(10);
  75. Crypto::UnsignedBigInteger num2({ 10, 10 });
  76. Crypto::UnsignedBigIntegerAlgorithms::add_into_accumulator_without_allocation(num1, num2);
  77. Vector<u32> expected_result { 20, 10 };
  78. EXPECT_EQ(num1.words(), expected_result);
  79. }
  80. TEST_CASE(test_unsigned_bigint_add_to_accumulator_with_multiple_carry_levels)
  81. {
  82. Crypto::UnsignedBigInteger num1({ UINT32_MAX - 2, UINT32_MAX });
  83. Crypto::UnsignedBigInteger num2(5);
  84. Crypto::UnsignedBigIntegerAlgorithms::add_into_accumulator_without_allocation(num1, num2);
  85. Vector<u32> expected_result { 2, 0, 1 };
  86. EXPECT_EQ(num1.words(), expected_result);
  87. }
  88. TEST_CASE(test_unsigned_bigint_add_to_accumulator_with_leading_zero)
  89. {
  90. Crypto::UnsignedBigInteger num1(1);
  91. Crypto::UnsignedBigInteger num2({ 1, 0 });
  92. Crypto::UnsignedBigIntegerAlgorithms::add_into_accumulator_without_allocation(num1, num2);
  93. EXPECT_EQ(num1.words(), Vector<u32> { 2 });
  94. }
  95. TEST_CASE(test_unsigned_bigint_add_to_accumulator_with_carry_and_leading_zero)
  96. {
  97. Crypto::UnsignedBigInteger num1({ UINT32_MAX, 0, 0, 0 });
  98. Crypto::UnsignedBigInteger num2({ 1, 0 });
  99. Crypto::UnsignedBigIntegerAlgorithms::add_into_accumulator_without_allocation(num1, num2);
  100. Vector<u32> expected_result { 0, 1, 0, 0 };
  101. EXPECT_EQ(num1.words(), expected_result);
  102. }
  103. TEST_CASE(test_unsigned_bigint_simple_subtraction)
  104. {
  105. Crypto::UnsignedBigInteger num1(80);
  106. Crypto::UnsignedBigInteger num2(70);
  107. EXPECT_EQ(num1.minus(num2), Crypto::UnsignedBigInteger(10));
  108. }
  109. TEST_CASE(test_unsigned_bigint_simple_subtraction_invalid)
  110. {
  111. Crypto::UnsignedBigInteger num1(50);
  112. Crypto::UnsignedBigInteger num2(70);
  113. EXPECT(num1.minus(num2).is_invalid());
  114. }
  115. TEST_CASE(test_unsigned_bigint_simple_subtraction_with_borrow)
  116. {
  117. Crypto::UnsignedBigInteger num1(UINT32_MAX);
  118. Crypto::UnsignedBigInteger num2(1);
  119. Crypto::UnsignedBigInteger num3 = num1.plus(num2);
  120. Crypto::UnsignedBigInteger result = num3.minus(num2);
  121. EXPECT_EQ(result, num1);
  122. }
  123. TEST_CASE(test_unsigned_bigint_subtraction_with_large_numbers)
  124. {
  125. Crypto::UnsignedBigInteger num1 = bigint_fibonacci(343);
  126. Crypto::UnsignedBigInteger num2 = bigint_fibonacci(218);
  127. Crypto::UnsignedBigInteger result = num1.minus(num2);
  128. Vector<u32> expected_result {
  129. 811430588, 2958904896, 1130908877, 2830569969, 3243275482,
  130. 3047460725, 774025231, 7990
  131. };
  132. EXPECT_EQ(result.plus(num2), num1);
  133. EXPECT_EQ(result.words(), expected_result);
  134. }
  135. TEST_CASE(test_unsigned_bigint_subtraction_with_large_numbers2)
  136. {
  137. Crypto::UnsignedBigInteger num1(Vector<u32> { 1483061863, 446680044, 1123294122, 191895498, 3347106536, 16, 0, 0, 0 });
  138. Crypto::UnsignedBigInteger num2(Vector<u32> { 4196414175, 1117247942, 1123294122, 191895498, 3347106536, 16 });
  139. Crypto::UnsignedBigInteger result = num1.minus(num2);
  140. // this test only verifies that we don't crash on an assertion
  141. }
  142. TEST_CASE(test_unsigned_bigint_subtraction_regression_1)
  143. {
  144. auto num = Crypto::UnsignedBigInteger { 1 }.shift_left(256);
  145. Vector<u32> expected_result {
  146. 4294967295, 4294967295, 4294967295, 4294967295, 4294967295,
  147. 4294967295, 4294967295, 4294967295, 0
  148. };
  149. EXPECT_EQ(num.minus(1).words(), expected_result);
  150. }
  151. TEST_CASE(test_unsigned_bigint_simple_multiplication)
  152. {
  153. Crypto::UnsignedBigInteger num1(8);
  154. Crypto::UnsignedBigInteger num2(251);
  155. Crypto::UnsignedBigInteger result = num1.multiplied_by(num2);
  156. EXPECT_EQ(result.words(), Vector<u32> { 2008 });
  157. }
  158. TEST_CASE(test_unsigned_bigint_multiplication_with_big_numbers1)
  159. {
  160. Crypto::UnsignedBigInteger num1 = bigint_fibonacci(200);
  161. Crypto::UnsignedBigInteger num2(12345678);
  162. Crypto::UnsignedBigInteger result = num1.multiplied_by(num2);
  163. Vector<u32> expected_result { 669961318, 143970113, 4028714974, 3164551305, 1589380278, 2 };
  164. EXPECT_EQ(result.words(), expected_result);
  165. }
  166. TEST_CASE(test_unsigned_bigint_multiplication_with_big_numbers2)
  167. {
  168. Crypto::UnsignedBigInteger num1 = bigint_fibonacci(200);
  169. Crypto::UnsignedBigInteger num2 = bigint_fibonacci(341);
  170. Crypto::UnsignedBigInteger result = num1.multiplied_by(num2);
  171. Vector<u32> expected_result {
  172. 3017415433, 2741793511, 1957755698, 3731653885, 3154681877,
  173. 785762127, 3200178098, 4260616581, 529754471, 3632684436,
  174. 1073347813, 2516430
  175. };
  176. EXPECT_EQ(result.words(), expected_result);
  177. }
  178. TEST_CASE(test_unsigned_bigint_simple_division)
  179. {
  180. Crypto::UnsignedBigInteger num1(27194);
  181. Crypto::UnsignedBigInteger num2(251);
  182. auto result = num1.divided_by(num2);
  183. Crypto::UnsignedDivisionResult expected = { Crypto::UnsignedBigInteger(108), Crypto::UnsignedBigInteger(86) };
  184. EXPECT_EQ(result.quotient, expected.quotient);
  185. EXPECT_EQ(result.remainder, expected.remainder);
  186. }
  187. TEST_CASE(test_unsigned_bigint_division_with_big_numbers)
  188. {
  189. Crypto::UnsignedBigInteger num1 = bigint_fibonacci(386);
  190. Crypto::UnsignedBigInteger num2 = bigint_fibonacci(238);
  191. auto result = num1.divided_by(num2);
  192. Crypto::UnsignedDivisionResult expected = {
  193. Crypto::UnsignedBigInteger(Vector<u32> { 2300984486, 2637503534, 2022805584, 107 }),
  194. Crypto::UnsignedBigInteger(Vector<u32> { 1483061863, 446680044, 1123294122, 191895498, 3347106536, 16, 0, 0, 0 })
  195. };
  196. EXPECT_EQ(result.quotient, expected.quotient);
  197. EXPECT_EQ(result.remainder, expected.remainder);
  198. }
  199. TEST_CASE(test_unsigned_bigint_division_combined_test)
  200. {
  201. auto num1 = bigint_fibonacci(497);
  202. auto num2 = bigint_fibonacci(238);
  203. auto div_result = num1.divided_by(num2);
  204. EXPECT_EQ(div_result.quotient.multiplied_by(num2).plus(div_result.remainder), num1);
  205. }
  206. TEST_CASE(test_unsigned_bigint_base10_from_string)
  207. {
  208. auto result = TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(10, "57195071295721390579057195715793"sv));
  209. Vector<u32> expected_result { 3806301393, 954919431, 3879607298, 721 };
  210. EXPECT_EQ(result.words(), expected_result);
  211. Vector<StringView> invalid_base10_number_strings { "1A"sv, "1:"sv, "Z1"sv, "1/"sv };
  212. for (auto invalid_base10_number_string : invalid_base10_number_strings)
  213. EXPECT_EQ(Crypto::UnsignedBigInteger::from_base(10, invalid_base10_number_string).is_error(), true);
  214. }
  215. TEST_CASE(test_unsigned_bigint_base10_to_string)
  216. {
  217. auto bigint = Crypto::UnsignedBigInteger {
  218. Vector<u32> { 3806301393, 954919431, 3879607298, 721 }
  219. };
  220. auto result = MUST(bigint.to_base(10));
  221. EXPECT_EQ(result, "57195071295721390579057195715793");
  222. }
  223. TEST_CASE(test_bigint_modular_inverse)
  224. {
  225. auto result = Crypto::NumberTheory::ModularInverse(7, 87);
  226. EXPECT_EQ(result, 25);
  227. }
  228. TEST_CASE(test_bigint_even_simple_modular_power)
  229. {
  230. Crypto::UnsignedBigInteger base { 7 };
  231. Crypto::UnsignedBigInteger exponent { 2 };
  232. Crypto::UnsignedBigInteger modulo { 10 };
  233. auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
  234. EXPECT_EQ(result.words(), Vector<u32> { 9 });
  235. }
  236. TEST_CASE(test_bigint_odd_simple_modular_power)
  237. {
  238. Crypto::UnsignedBigInteger base { 10 };
  239. Crypto::UnsignedBigInteger exponent { 2 };
  240. Crypto::UnsignedBigInteger modulo { 9 };
  241. auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
  242. EXPECT_EQ(result.words(), Vector<u32> { 1 });
  243. }
  244. TEST_CASE(test_bigint_large_even_fibonacci_modular_power)
  245. {
  246. Crypto::UnsignedBigInteger base = bigint_fibonacci(200);
  247. Crypto::UnsignedBigInteger exponent = bigint_fibonacci(100);
  248. Crypto::UnsignedBigInteger modulo = bigint_fibonacci(150);
  249. // Result according to Wolfram Alpha : 7195284628716783672927396027925
  250. auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
  251. Vector<u32> expected_result { 2042093077, 1351416233, 3510104665, 90 };
  252. EXPECT_EQ(result.words(), expected_result);
  253. }
  254. TEST_CASE(test_bigint_large_odd_fibonacci_modular_power)
  255. {
  256. Crypto::UnsignedBigInteger base = bigint_fibonacci(200);
  257. Crypto::UnsignedBigInteger exponent = bigint_fibonacci(100);
  258. Crypto::UnsignedBigInteger modulo = bigint_fibonacci(149);
  259. // Result according to Wolfram Alpha : 1136278609611966596838389694992
  260. auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
  261. Vector<u32> expected_result { 2106049040, 2169509253, 1468244710, 14 };
  262. EXPECT_EQ(result.words(), expected_result);
  263. }
  264. TEST_CASE(test_bigint_large_odd_fibonacci_with_carry_modular_power)
  265. {
  266. Crypto::UnsignedBigInteger base = bigint_fibonacci(200);
  267. Crypto::UnsignedBigInteger exponent = bigint_fibonacci(100);
  268. Crypto::UnsignedBigInteger modulo = bigint_fibonacci(185);
  269. // Result according to Wolfram Alpha : 55094573983071006678665780782730672080
  270. auto result = Crypto::NumberTheory::ModularPower(base, exponent, modulo);
  271. Vector<u32> expected_result { 1988720592, 2097784252, 347129583, 695391288 };
  272. EXPECT_EQ(result.words(), expected_result);
  273. }
  274. TEST_CASE(test_bigint_modular_power_extra_tests)
  275. {
  276. struct {
  277. Crypto::UnsignedBigInteger base;
  278. Crypto::UnsignedBigInteger exp;
  279. Crypto::UnsignedBigInteger mod;
  280. Crypto::UnsignedBigInteger expected;
  281. } mod_pow_tests[] = {
  282. { "2988348162058574136915891421498819466320163312926952423791023078876139"_bigint, "2351399303373464486466122544523690094744975233415544072992656881240319"_bigint, "10000"_bigint, "3059"_bigint },
  283. { "24231"_bigint, "12448"_bigint, "14679"_bigint, "4428"_bigint },
  284. { "1005404"_bigint, "8352654"_bigint, "8161408"_bigint, "2605696"_bigint },
  285. { "3665005778"_bigint, "3244425589"_bigint, "565668506"_bigint, "524766494"_bigint },
  286. { "10662083169959689657"_bigint, "11605678468317533000"_bigint, "1896834583057209739"_bigint, "1292743154593945858"_bigint },
  287. { "99667739213529524852296932424683448520"_bigint, "123394910770101395416306279070921784207"_bigint, "238026722756504133786938677233768788719"_bigint, "197165477545023317459748215952393063201"_bigint },
  288. { "49368547511968178788919424448914214709244872098814465088945281575062739912239"_bigint, "25201856190991298572337188495596990852134236115562183449699512394891190792064"_bigint, "45950460777961491021589776911422805972195170308651734432277141467904883064645"_bigint, "39917885806532796066922509794537889114718612292469285403012781055544152450051"_bigint },
  289. { "48399385336454791246880286907257136254351739111892925951016159217090949616810"_bigint, "5758661760571644379364752528081901787573279669668889744323710906207949658569"_bigint, "32812120644405991429173950312949738783216437173380339653152625840449006970808"_bigint, "7948464125034399875323770213514649646309423451213282653637296324080400293584"_bigint },
  290. };
  291. for (auto test_case : mod_pow_tests) {
  292. auto actual = Crypto::NumberTheory::ModularPower(
  293. test_case.base, test_case.exp, test_case.mod);
  294. EXPECT_EQ(actual, test_case.expected);
  295. }
  296. }
  297. TEST_CASE(test_bigint_primality_test)
  298. {
  299. struct {
  300. Crypto::UnsignedBigInteger candidate;
  301. bool expected_result;
  302. } primality_tests[] = {
  303. { "1180591620717411303424"_bigint, false }, // 2**70
  304. { "620448401733239439360000"_bigint, false }, // 25!
  305. { "953962166440690129601298432"_bigint, false }, // 12**25
  306. { "620448401733239439360000"_bigint, false }, // 25!
  307. { "147926426347074375"_bigint, false }, // 35! / 2**32
  308. { "340282366920938429742726440690708343523"_bigint, false }, // 2 factors near 2^64
  309. { "73"_bigint, true },
  310. { "6967"_bigint, true },
  311. { "787649"_bigint, true },
  312. { "73513949"_bigint, true },
  313. { "6691236901"_bigint, true },
  314. { "741387182759"_bigint, true },
  315. { "67466615915827"_bigint, true },
  316. { "9554317039214687"_bigint, true },
  317. { "533344522150170391"_bigint, true },
  318. { "18446744073709551557"_bigint, true }, // just below 2**64
  319. };
  320. for (auto test_case : primality_tests) {
  321. bool actual_result = Crypto::NumberTheory::is_probably_prime(test_case.candidate);
  322. EXPECT_EQ(test_case.expected_result, actual_result);
  323. }
  324. }
  325. TEST_CASE(test_bigint_random_number_generation)
  326. {
  327. struct {
  328. Crypto::UnsignedBigInteger min;
  329. Crypto::UnsignedBigInteger max;
  330. } random_number_tests[] = {
  331. { "1"_bigint, "1000000"_bigint },
  332. { "10000000000"_bigint, "20000000000"_bigint },
  333. { "1000"_bigint, "200000000000000000"_bigint },
  334. { "200000000000000000"_bigint, "200000000000010000"_bigint },
  335. };
  336. for (auto test_case : random_number_tests) {
  337. auto actual_result = Crypto::NumberTheory::random_number(test_case.min, test_case.max);
  338. EXPECT(!(actual_result < test_case.min));
  339. EXPECT(actual_result < test_case.max);
  340. }
  341. }
  342. TEST_CASE(test_bigint_random_distribution)
  343. {
  344. auto actual_result = Crypto::NumberTheory::random_number(
  345. "1"_bigint,
  346. "100000000000000000000000000000"_bigint); // 10**29
  347. if (actual_result < "100000000000000000000"_bigint) { // 10**20
  348. FAIL("Too small");
  349. outln("The generated number {} is extremely small. This *can* happen by pure chance, but should happen only once in a billion times. So it's probably an error.", MUST(actual_result.to_base(10)));
  350. } else if ("99999999900000000000000000000"_bigint < actual_result) { // 10**29 - 10**20
  351. FAIL("Too large");
  352. outln("The generated number {} is extremely large. This *can* happen by pure chance, but should happen only once in a billion times. So it's probably an error.", MUST(actual_result.to_base(10)));
  353. }
  354. }
  355. TEST_CASE(test_bigint_import_big_endian_decode_encode_roundtrip)
  356. {
  357. u8 random_bytes[128];
  358. u8 target_buffer[128];
  359. fill_with_random(random_bytes);
  360. auto encoded = Crypto::UnsignedBigInteger::import_data(random_bytes, 128);
  361. encoded.export_data({ target_buffer, 128 });
  362. EXPECT(memcmp(target_buffer, random_bytes, 128) == 0);
  363. }
  364. TEST_CASE(test_bigint_import_big_endian_encode_decode_roundtrip)
  365. {
  366. u8 target_buffer[128];
  367. auto encoded = "12345678901234567890"_bigint;
  368. auto size = encoded.export_data({ target_buffer, 128 });
  369. auto decoded = Crypto::UnsignedBigInteger::import_data(target_buffer, size);
  370. EXPECT_EQ(encoded, decoded);
  371. }
  372. TEST_CASE(test_bigint_big_endian_import)
  373. {
  374. auto number = Crypto::UnsignedBigInteger::import_data("hello"sv);
  375. EXPECT_EQ(number, "448378203247"_bigint);
  376. }
  377. TEST_CASE(test_bigint_big_endian_export)
  378. {
  379. auto number = "448378203247"_bigint;
  380. char exported[8] { 0 };
  381. auto exported_length = number.export_data({ exported, 8 }, true);
  382. EXPECT_EQ(exported_length, 5u);
  383. EXPECT(memcmp(exported + 3, "hello", 5) == 0);
  384. }
  385. TEST_CASE(test_bigint_one_based_index_of_highest_set_bit)
  386. {
  387. auto num1 = "1234567"_bigint;
  388. auto num2 = "1234567"_bigint;
  389. EXPECT_EQ("0"_bigint.one_based_index_of_highest_set_bit(), 0u);
  390. EXPECT_EQ("1"_bigint.one_based_index_of_highest_set_bit(), 1u);
  391. EXPECT_EQ("7"_bigint.one_based_index_of_highest_set_bit(), 3u);
  392. EXPECT_EQ("4294967296"_bigint.one_based_index_of_highest_set_bit(), 33u);
  393. }
  394. TEST_CASE(test_signed_bigint_bitwise_not_fill_to_one_based_index)
  395. {
  396. EXPECT_EQ("0"_bigint.bitwise_not_fill_to_one_based_index(0), "0"_bigint);
  397. EXPECT_EQ("0"_bigint.bitwise_not_fill_to_one_based_index(1), "1"_bigint);
  398. EXPECT_EQ("0"_bigint.bitwise_not_fill_to_one_based_index(2), "3"_bigint);
  399. EXPECT_EQ("0"_bigint.bitwise_not_fill_to_one_based_index(4), "15"_bigint);
  400. EXPECT_EQ("0"_bigint.bitwise_not_fill_to_one_based_index(32), "4294967295"_bigint);
  401. EXPECT_EQ("0"_bigint.bitwise_not_fill_to_one_based_index(33), "8589934591"_bigint);
  402. }
  403. TEST_CASE(test_bigint_bitwise_or)
  404. {
  405. auto num1 = "1234567"_bigint;
  406. auto num2 = "1234567"_bigint;
  407. EXPECT_EQ(num1.bitwise_or(num2), num1);
  408. }
  409. TEST_CASE(test_bigint_bitwise_or_different_lengths)
  410. {
  411. auto num1 = "1234567"_bigint;
  412. auto num2 = "123456789012345678901234567890"_bigint;
  413. auto expected = "123456789012345678901234622167"_bigint;
  414. auto result = num1.bitwise_or(num2);
  415. EXPECT_EQ(result, expected);
  416. }
  417. TEST_CASE(test_signed_bigint_bitwise_or)
  418. {
  419. auto num1 = "-1234567"_sbigint;
  420. auto num2 = "1234567"_sbigint;
  421. EXPECT_EQ(num1.bitwise_or(num1), num1);
  422. EXPECT_EQ(num1.bitwise_or(num2), "-1"_sbigint);
  423. EXPECT_EQ(num2.bitwise_or(num1), "-1"_sbigint);
  424. EXPECT_EQ(num2.bitwise_or(num2), num2);
  425. EXPECT_EQ("0"_sbigint.bitwise_or("-1"_sbigint), "-1"_sbigint);
  426. }
  427. TEST_CASE(test_bigint_bitwise_and)
  428. {
  429. auto num1 = "1234567"_bigint;
  430. auto num2 = "1234561"_bigint;
  431. EXPECT_EQ(num1.bitwise_and(num2), "1234561"_bigint);
  432. }
  433. TEST_CASE(test_bigint_bitwise_and_different_lengths)
  434. {
  435. auto num1 = "1234567"_bigint;
  436. auto num2 = "123456789012345678901234567890"_bigint;
  437. EXPECT_EQ(num1.bitwise_and(num2), "1180290"_bigint);
  438. }
  439. TEST_CASE(test_signed_bigint_bitwise_not)
  440. {
  441. EXPECT_EQ("3"_sbigint.bitwise_not(), "-4"_sbigint);
  442. EXPECT_EQ("-1"_sbigint.bitwise_not(), "0"_sbigint);
  443. }
  444. TEST_CASE(test_signed_bigint_bitwise_and)
  445. {
  446. auto num1 = "-1234567"_sbigint;
  447. auto num2 = "1234567"_sbigint;
  448. EXPECT_EQ(num1.bitwise_and(num1), num1);
  449. EXPECT_EQ(num1.bitwise_and(num2), "1"_sbigint);
  450. EXPECT_EQ(num2.bitwise_and(num1), "1"_sbigint);
  451. EXPECT_EQ(num2.bitwise_and(num2), num2);
  452. EXPECT_EQ("-3"_sbigint.bitwise_and("-2"_sbigint), "-4"_sbigint);
  453. }
  454. TEST_CASE(test_bigint_bitwise_xor)
  455. {
  456. auto num1 = "1234567"_bigint;
  457. auto num2 = "1234561"_bigint;
  458. EXPECT_EQ(num1.bitwise_xor(num2), 6);
  459. }
  460. TEST_CASE(test_bigint_bitwise_xor_different_lengths)
  461. {
  462. auto num1 = "1234567"_bigint;
  463. auto num2 = "123456789012345678901234567890"_bigint;
  464. EXPECT_EQ(num1.bitwise_xor(num2), "123456789012345678901233441877"_bigint);
  465. }
  466. TEST_CASE(test_signed_bigint_bitwise_xor)
  467. {
  468. auto num1 = "-3"_sbigint;
  469. auto num2 = "1"_sbigint;
  470. EXPECT_EQ(num1.bitwise_xor(num1), "0"_sbigint);
  471. EXPECT_EQ(num1.bitwise_xor(num2), "-4"_sbigint);
  472. EXPECT_EQ(num2.bitwise_xor(num1), "-4"_sbigint);
  473. EXPECT_EQ(num2.bitwise_xor(num2), "0"_sbigint);
  474. }
  475. TEST_CASE(test_signed_bigint_fibo500)
  476. {
  477. Vector<u32> expected_result {
  478. 315178285, 505575602, 1883328078, 125027121,
  479. 3649625763, 347570207, 74535262, 3832543808,
  480. 2472133297, 1600064941, 65273441
  481. };
  482. auto result = bigint_signed_fibonacci(500);
  483. EXPECT_EQ(result.unsigned_value().words(), expected_result);
  484. }
  485. TEST_CASE(test_signed_addition_edgecase_borrow_with_zero)
  486. {
  487. Crypto::SignedBigInteger num1 { Crypto::UnsignedBigInteger { { UINT32_MAX - 3, UINT32_MAX } }, false };
  488. Crypto::SignedBigInteger num2 { Crypto::UnsignedBigInteger { UINT32_MAX - 2 }, false };
  489. Vector<u32> expected_result { 4294967289, 0, 1 };
  490. EXPECT_EQ(num1.plus(num2).unsigned_value().words(), expected_result);
  491. }
  492. TEST_CASE(test_signed_addition_edgecase_addition_to_other_sign)
  493. {
  494. Crypto::SignedBigInteger num1 = INT32_MAX;
  495. Crypto::SignedBigInteger num2 = num1;
  496. num2.negate();
  497. EXPECT_EQ(num1.plus(num2), Crypto::SignedBigInteger { 0 });
  498. }
  499. TEST_CASE(test_signed_subtraction_simple_subtraction_positive_result)
  500. {
  501. Crypto::SignedBigInteger num1(80);
  502. Crypto::SignedBigInteger num2(70);
  503. EXPECT_EQ(num1.minus(num2), Crypto::SignedBigInteger(10));
  504. }
  505. TEST_CASE(test_signed_subtraction_simple_subtraction_negative_result)
  506. {
  507. Crypto::SignedBigInteger num1(50);
  508. Crypto::SignedBigInteger num2(70);
  509. EXPECT_EQ(num1.minus(num2), Crypto::SignedBigInteger { -20 });
  510. }
  511. TEST_CASE(test_signed_subtraction_both_negative)
  512. {
  513. Crypto::SignedBigInteger num1(-50);
  514. Crypto::SignedBigInteger num2(-70);
  515. EXPECT_EQ(num1.minus(num2), Crypto::SignedBigInteger { 20 });
  516. EXPECT_EQ(num2.minus(num1), Crypto::SignedBigInteger { -20 });
  517. }
  518. TEST_CASE(test_signed_subtraction_simple_subtraction_with_borrow)
  519. {
  520. Crypto::SignedBigInteger num1(Crypto::UnsignedBigInteger { UINT32_MAX });
  521. Crypto::SignedBigInteger num2(1);
  522. Crypto::SignedBigInteger num3 = num1.plus(num2);
  523. Crypto::SignedBigInteger result = num2.minus(num3);
  524. num1.negate();
  525. EXPECT_EQ(result, num1);
  526. }
  527. TEST_CASE(test_signed_subtraction_with_large_numbers)
  528. {
  529. Crypto::SignedBigInteger num1 = bigint_signed_fibonacci(343);
  530. Crypto::SignedBigInteger num2 = bigint_signed_fibonacci(218);
  531. Crypto::SignedBigInteger result = num2.minus(num1);
  532. auto expected = Crypto::UnsignedBigInteger { Vector<u32> { 811430588, 2958904896, 1130908877, 2830569969, 3243275482, 3047460725, 774025231, 7990 } };
  533. EXPECT_EQ(result.plus(num1), num2);
  534. EXPECT_EQ(result.unsigned_value(), expected);
  535. }
  536. TEST_CASE(test_signed_subtraction_with_large_numbers_check_for_assertion)
  537. {
  538. Crypto::SignedBigInteger num1(Crypto::UnsignedBigInteger { Vector<u32> { 1483061863, 446680044, 1123294122, 191895498, 3347106536, 16, 0, 0, 0 } });
  539. Crypto::SignedBigInteger num2(Crypto::UnsignedBigInteger { Vector<u32> { 4196414175, 1117247942, 1123294122, 191895498, 3347106536, 16 } });
  540. Crypto::SignedBigInteger result = num1.minus(num2);
  541. // this test only verifies that we don't crash on an assertion
  542. }
  543. TEST_CASE(test_signed_multiplication_with_negative_number)
  544. {
  545. Crypto::SignedBigInteger num1(8);
  546. Crypto::SignedBigInteger num2(-251);
  547. Crypto::SignedBigInteger result = num1.multiplied_by(num2);
  548. EXPECT_EQ(result, Crypto::SignedBigInteger { -2008 });
  549. }
  550. TEST_CASE(test_signed_multiplication_with_big_number)
  551. {
  552. Crypto::SignedBigInteger num1 = bigint_signed_fibonacci(200);
  553. Crypto::SignedBigInteger num2(-12345678);
  554. Crypto::SignedBigInteger result = num1.multiplied_by(num2);
  555. Vector<u32> expected_result { 669961318, 143970113, 4028714974, 3164551305, 1589380278, 2 };
  556. EXPECT_EQ(result.unsigned_value().words(), expected_result);
  557. EXPECT(result.is_negative());
  558. }
  559. TEST_CASE(test_signed_multiplication_with_two_big_numbers)
  560. {
  561. Crypto::SignedBigInteger num1 = bigint_signed_fibonacci(200);
  562. Crypto::SignedBigInteger num2 = bigint_signed_fibonacci(341);
  563. num1.negate();
  564. Crypto::SignedBigInteger result = num1.multiplied_by(num2);
  565. Vector<u32> expected_results {
  566. 3017415433, 2741793511, 1957755698, 3731653885,
  567. 3154681877, 785762127, 3200178098, 4260616581,
  568. 529754471, 3632684436, 1073347813, 2516430
  569. };
  570. EXPECT_EQ(result.unsigned_value().words(), expected_results);
  571. EXPECT(result.is_negative());
  572. }
  573. TEST_CASE(test_negative_zero_is_not_allowed)
  574. {
  575. Crypto::SignedBigInteger zero(Crypto::UnsignedBigInteger(0), true);
  576. EXPECT(!zero.is_negative());
  577. zero.negate();
  578. EXPECT(!zero.is_negative());
  579. Crypto::SignedBigInteger positive_five(Crypto::UnsignedBigInteger(5), false);
  580. Crypto::SignedBigInteger negative_five(Crypto::UnsignedBigInteger(5), true);
  581. zero = positive_five.plus(negative_five);
  582. EXPECT(zero.unsigned_value().is_zero());
  583. EXPECT(!zero.is_negative());
  584. }
  585. TEST_CASE(double_comparisons) {
  586. #define EXPECT_LESS_THAN(bigint, double_value) EXPECT_EQ(bigint.compare_to_double(double_value), Crypto::UnsignedBigInteger::CompareResult::DoubleGreaterThanBigInt)
  587. #define EXPECT_GREATER_THAN(bigint, double_value) EXPECT_EQ(bigint.compare_to_double(double_value), Crypto::UnsignedBigInteger::CompareResult::DoubleLessThanBigInt)
  588. #define EXPECT_EQUAL_TO(bigint, double_value) EXPECT_EQ(bigint.compare_to_double(double_value), Crypto::UnsignedBigInteger::CompareResult::DoubleEqualsBigInt)
  589. { Crypto::SignedBigInteger zero { 0 };
  590. EXPECT_EQUAL_TO(zero, 0.0);
  591. EXPECT_EQUAL_TO(zero, -0.0);
  592. }
  593. {
  594. Crypto::SignedBigInteger one { 1 };
  595. EXPECT_EQUAL_TO(one, 1.0);
  596. EXPECT_GREATER_THAN(one, -1.0);
  597. EXPECT_GREATER_THAN(one, 0.5);
  598. EXPECT_GREATER_THAN(one, -0.5);
  599. EXPECT_LESS_THAN(one, 1.000001);
  600. one.negate();
  601. auto const& negative_one = one;
  602. EXPECT_EQUAL_TO(negative_one, -1.0);
  603. EXPECT_LESS_THAN(negative_one, 1.0);
  604. EXPECT_LESS_THAN(one, 0.5);
  605. EXPECT_LESS_THAN(one, -0.5);
  606. EXPECT_GREATER_THAN(one, -1.5);
  607. EXPECT_LESS_THAN(one, 1.000001);
  608. EXPECT_GREATER_THAN(one, -1.000001);
  609. }
  610. {
  611. double double_infinity = HUGE_VAL;
  612. VERIFY(isinf(double_infinity));
  613. Crypto::SignedBigInteger one { 1 };
  614. EXPECT_LESS_THAN(one, double_infinity);
  615. EXPECT_GREATER_THAN(one, -double_infinity);
  616. }
  617. {
  618. double double_max_value = NumericLimits<double>::max();
  619. double double_below_max_value = nextafter(double_max_value, 0.0);
  620. VERIFY(double_below_max_value < double_max_value);
  621. VERIFY(double_below_max_value < (double_max_value - 1.0));
  622. auto max_value_in_bigint = TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv));
  623. auto max_value_plus_one = max_value_in_bigint.plus(Crypto::SignedBigInteger { 1 });
  624. auto max_value_minus_one = max_value_in_bigint.minus(Crypto::SignedBigInteger { 1 });
  625. auto below_max_value_in_bigint = TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "fffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv));
  626. EXPECT_EQUAL_TO(max_value_in_bigint, double_max_value);
  627. EXPECT_LESS_THAN(max_value_minus_one, double_max_value);
  628. EXPECT_GREATER_THAN(max_value_plus_one, double_max_value);
  629. EXPECT_LESS_THAN(below_max_value_in_bigint, double_max_value);
  630. EXPECT_GREATER_THAN(max_value_in_bigint, double_below_max_value);
  631. EXPECT_GREATER_THAN(max_value_minus_one, double_below_max_value);
  632. EXPECT_GREATER_THAN(max_value_plus_one, double_below_max_value);
  633. EXPECT_EQUAL_TO(below_max_value_in_bigint, double_below_max_value);
  634. }
  635. {
  636. double double_min_value = NumericLimits<double>::lowest();
  637. double double_above_min_value = nextafter(double_min_value, 0.0);
  638. VERIFY(double_above_min_value > double_min_value);
  639. VERIFY(double_above_min_value > (double_min_value + 1.0));
  640. auto min_value_in_bigint = TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "-fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv));
  641. auto min_value_plus_one = min_value_in_bigint.plus(Crypto::SignedBigInteger { 1 });
  642. auto min_value_minus_one = min_value_in_bigint.minus(Crypto::SignedBigInteger { 1 });
  643. auto above_min_value_in_bigint = TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "-fffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv));
  644. EXPECT_EQUAL_TO(min_value_in_bigint, double_min_value);
  645. EXPECT_LESS_THAN(min_value_minus_one, double_min_value);
  646. EXPECT_GREATER_THAN(min_value_plus_one, double_min_value);
  647. EXPECT_GREATER_THAN(above_min_value_in_bigint, double_min_value);
  648. EXPECT_LESS_THAN(min_value_in_bigint, double_above_min_value);
  649. EXPECT_LESS_THAN(min_value_minus_one, double_above_min_value);
  650. EXPECT_LESS_THAN(min_value_plus_one, double_above_min_value);
  651. EXPECT_EQUAL_TO(above_min_value_in_bigint, double_above_min_value);
  652. }
  653. {
  654. double just_above_255 = bit_cast<double>(0x406fe00000000001ULL);
  655. double just_below_255 = bit_cast<double>(0x406fdfffffffffffULL);
  656. double double_255 = 255.0;
  657. Crypto::SignedBigInteger bigint_255 { 255 };
  658. EXPECT_EQUAL_TO(bigint_255, double_255);
  659. EXPECT_GREATER_THAN(bigint_255, just_below_255);
  660. EXPECT_LESS_THAN(bigint_255, just_above_255);
  661. }
  662. #undef EXPECT_LESS_THAN
  663. #undef EXPECT_GREATER_THAN
  664. #undef EXPECT_EQUAL_TO
  665. }
  666. TEST_CASE(to_double)
  667. {
  668. #define EXPECT_TO_EQUAL_DOUBLE(bigint, double_value) \
  669. EXPECT_EQ((bigint).to_double(Crypto::UnsignedBigInteger::RoundingMode::RoundTowardZero), double_value)
  670. EXPECT_TO_EQUAL_DOUBLE(Crypto::UnsignedBigInteger(0), 0.0);
  671. // Make sure we don't get negative zero!
  672. EXPECT_EQ(signbit(Crypto::UnsignedBigInteger(0).to_double()), 0);
  673. {
  674. Crypto::SignedBigInteger zero { 0 };
  675. EXPECT(!zero.is_negative());
  676. EXPECT_TO_EQUAL_DOUBLE(zero, 0.0);
  677. EXPECT_EQ(signbit(zero.to_double()), 0);
  678. zero.negate();
  679. EXPECT(!zero.is_negative());
  680. EXPECT_TO_EQUAL_DOUBLE(zero, 0.0);
  681. EXPECT_EQ(signbit(zero.to_double()), 0);
  682. }
  683. EXPECT_TO_EQUAL_DOUBLE(Crypto::UnsignedBigInteger(9682), 9682.0);
  684. EXPECT_TO_EQUAL_DOUBLE(Crypto::SignedBigInteger(-9660), -9660.0);
  685. double double_max_value = NumericLimits<double>::max();
  686. double infinity = INFINITY;
  687. EXPECT_TO_EQUAL_DOUBLE(
  688. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv)),
  689. double_max_value);
  690. EXPECT_TO_EQUAL_DOUBLE(
  691. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "ffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv)),
  692. double_max_value);
  693. EXPECT_TO_EQUAL_DOUBLE(
  694. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"sv)),
  695. double_max_value);
  696. EXPECT_TO_EQUAL_DOUBLE(
  697. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv)),
  698. infinity);
  699. EXPECT_TO_EQUAL_DOUBLE(
  700. TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "-fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv)),
  701. -double_max_value);
  702. EXPECT_TO_EQUAL_DOUBLE(
  703. TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "-ffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv)),
  704. -double_max_value);
  705. EXPECT_TO_EQUAL_DOUBLE(
  706. TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"sv)),
  707. -double_max_value);
  708. EXPECT_TO_EQUAL_DOUBLE(
  709. TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(16, "-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv)),
  710. -infinity);
  711. EXPECT_TO_EQUAL_DOUBLE(
  712. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "ffffffffffffffff"sv)),
  713. 18446744073709549568.0);
  714. EXPECT_TO_EQUAL_DOUBLE(
  715. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "fffffffffffff800"sv)),
  716. 18446744073709549568.0);
  717. EXPECT_TO_EQUAL_DOUBLE(
  718. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "fffffffffffff8ff"sv)),
  719. 18446744073709549568.0);
  720. EXPECT_TO_EQUAL_DOUBLE(TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(10, "1234567890123456789"sv)),
  721. 1234567890123456800.0);
  722. EXPECT_TO_EQUAL_DOUBLE(TRY_OR_FAIL(Crypto::SignedBigInteger::from_base(10, "2345678901234567890"sv)),
  723. 2345678901234567680.0);
  724. EXPECT_EQ(
  725. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "1fffffffffffff00"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  726. 2305843009213693696.0);
  727. EXPECT_EQ(
  728. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "1fffffffffffff00"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::RoundTowardZero),
  729. 2305843009213693696.0);
  730. EXPECT_EQ(
  731. TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "1fffffffffffff80"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  732. 2305843009213693952.0);
  733. EXPECT_EQ(TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "20000000000001"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  734. 9007199254740992.0);
  735. EXPECT_EQ(TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "20000000000002"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  736. 9007199254740994.0);
  737. // 2^53 = 20000000000000, +3 Rounds up because of tiesRoundToEven
  738. EXPECT_EQ(TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "20000000000003"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  739. 9007199254740996.0);
  740. // +4 is exactly 9007199254740996
  741. EXPECT_EQ(TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "20000000000004"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  742. 9007199254740996.0);
  743. // +5 rounds down because of tiesRoundToEven
  744. EXPECT_EQ(TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "20000000000005"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  745. 9007199254740996.0);
  746. EXPECT_EQ(TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "20000000000006"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  747. 9007199254740998.0);
  748. EXPECT_EQ(TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(10, "98382635059784269824"sv)).to_double(Crypto::UnsignedBigInteger::RoundingMode::IEEERoundAndTiesToEvenMantissa),
  749. bit_cast<double>(0x4415555555555555ULL));
  750. #undef EXPECT_TO_EQUAL_DOUBLE
  751. }
  752. TEST_CASE(bigint_from_double)
  753. {
  754. {
  755. Crypto::UnsignedBigInteger from_zero { 0.0 };
  756. EXPECT(from_zero.is_zero());
  757. EXPECT(!from_zero.is_invalid());
  758. }
  759. #define SURVIVES_ROUND_TRIP_UNSIGNED(double_value) \
  760. { \
  761. Crypto::UnsignedBigInteger bigint { (double_value) }; \
  762. EXPECT_EQ(bigint.to_double(), (double_value)); \
  763. }
  764. SURVIVES_ROUND_TRIP_UNSIGNED(0.0);
  765. SURVIVES_ROUND_TRIP_UNSIGNED(1.0);
  766. SURVIVES_ROUND_TRIP_UNSIGNED(100000.0);
  767. SURVIVES_ROUND_TRIP_UNSIGNED(1000000000000.0);
  768. SURVIVES_ROUND_TRIP_UNSIGNED(10000000000000000000.0);
  769. SURVIVES_ROUND_TRIP_UNSIGNED(NumericLimits<double>::max());
  770. SURVIVES_ROUND_TRIP_UNSIGNED(bit_cast<double>(0x4340000000000002ULL));
  771. SURVIVES_ROUND_TRIP_UNSIGNED(bit_cast<double>(0x4340000000000001ULL));
  772. SURVIVES_ROUND_TRIP_UNSIGNED(bit_cast<double>(0x4340000000000000ULL));
  773. // Failed on last bits of mantissa
  774. SURVIVES_ROUND_TRIP_UNSIGNED(bit_cast<double>(0x7EDFFFFFFFFFFFFFULL));
  775. SURVIVES_ROUND_TRIP_UNSIGNED(bit_cast<double>(0x7ed5555555555555ULL));
  776. SURVIVES_ROUND_TRIP_UNSIGNED(bit_cast<double>(0x7EDCBA9876543210ULL));
  777. // Has exactly exponent of 32
  778. SURVIVES_ROUND_TRIP_UNSIGNED(bit_cast<double>(0x41f22f74e0000000ULL));
  779. #define SURVIVES_ROUND_TRIP_SIGNED(double_value) \
  780. { \
  781. Crypto::SignedBigInteger bigint_positive { (double_value) }; \
  782. EXPECT_EQ(bigint_positive.to_double(), (double_value)); \
  783. Crypto::SignedBigInteger bigint_negative { -(double_value) }; \
  784. EXPECT_EQ(bigint_negative.to_double(), -(double_value)); \
  785. EXPECT(bigint_positive != bigint_negative); \
  786. bigint_positive.negate(); \
  787. EXPECT(bigint_positive == bigint_negative); \
  788. }
  789. {
  790. // Negative zero should be converted to positive zero
  791. double const negative_zero = bit_cast<double>(0x8000000000000000);
  792. // However it should give a bit exact +0.0
  793. Crypto::SignedBigInteger from_negative_zero { negative_zero };
  794. EXPECT(from_negative_zero.is_zero());
  795. EXPECT(!from_negative_zero.is_negative());
  796. double result = from_negative_zero.to_double();
  797. EXPECT_EQ(result, 0.0);
  798. EXPECT_EQ(bit_cast<u64>(result), 0ULL);
  799. }
  800. SURVIVES_ROUND_TRIP_SIGNED(1.0);
  801. SURVIVES_ROUND_TRIP_SIGNED(100000.0);
  802. SURVIVES_ROUND_TRIP_SIGNED(-1000000000000.0);
  803. SURVIVES_ROUND_TRIP_SIGNED(10000000000000000000.0);
  804. SURVIVES_ROUND_TRIP_SIGNED(NumericLimits<double>::max());
  805. SURVIVES_ROUND_TRIP_SIGNED(NumericLimits<double>::lowest());
  806. SURVIVES_ROUND_TRIP_SIGNED(bit_cast<double>(0x4340000000000002ULL));
  807. SURVIVES_ROUND_TRIP_SIGNED(bit_cast<double>(0x4340000000000001ULL));
  808. SURVIVES_ROUND_TRIP_SIGNED(bit_cast<double>(0x4340000000000000ULL));
  809. SURVIVES_ROUND_TRIP_SIGNED(bit_cast<double>(0x7EDFFFFFFFFFFFFFULL));
  810. SURVIVES_ROUND_TRIP_SIGNED(bit_cast<double>(0x7ed5555555555555ULL));
  811. SURVIVES_ROUND_TRIP_SIGNED(bit_cast<double>(0x7EDCBA9876543210ULL));
  812. #undef SURVIVES_ROUND_TRIP_SIGNED
  813. #undef SURVIVES_ROUND_TRIP_UNSIGNED
  814. }
  815. TEST_CASE(unsigned_bigint_double_comparisons)
  816. {
  817. #define EXPECT_LESS_THAN(bigint, double_value) EXPECT_EQ(bigint.compare_to_double(double_value), Crypto::UnsignedBigInteger::CompareResult::DoubleGreaterThanBigInt)
  818. #define EXPECT_GREATER_THAN(bigint, double_value) EXPECT_EQ(bigint.compare_to_double(double_value), Crypto::UnsignedBigInteger::CompareResult::DoubleLessThanBigInt)
  819. #define EXPECT_EQUAL_TO(bigint, double_value) EXPECT_EQ(bigint.compare_to_double(double_value), Crypto::UnsignedBigInteger::CompareResult::DoubleEqualsBigInt)
  820. {
  821. Crypto::UnsignedBigInteger zero { 0 };
  822. EXPECT_EQUAL_TO(zero, 0.0);
  823. EXPECT_EQUAL_TO(zero, -0.0);
  824. }
  825. {
  826. Crypto::UnsignedBigInteger one { 1 };
  827. EXPECT_EQUAL_TO(one, 1.0);
  828. EXPECT_GREATER_THAN(one, -1.0);
  829. EXPECT_GREATER_THAN(one, 0.5);
  830. EXPECT_GREATER_THAN(one, -0.5);
  831. EXPECT_LESS_THAN(one, 1.000001);
  832. }
  833. {
  834. double double_infinity = HUGE_VAL;
  835. VERIFY(isinf(double_infinity));
  836. Crypto::UnsignedBigInteger one { 1 };
  837. EXPECT_LESS_THAN(one, double_infinity);
  838. EXPECT_GREATER_THAN(one, -double_infinity);
  839. }
  840. {
  841. double double_max_value = NumericLimits<double>::max();
  842. double double_below_max_value = nextafter(double_max_value, 0.0);
  843. VERIFY(double_below_max_value < double_max_value);
  844. VERIFY(double_below_max_value < (double_max_value - 1.0));
  845. auto max_value_in_bigint = TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "fffffffffffff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv));
  846. auto max_value_plus_one = max_value_in_bigint.plus(Crypto::UnsignedBigInteger { 1 });
  847. auto max_value_minus_one = max_value_in_bigint.minus(Crypto::UnsignedBigInteger { 1 });
  848. auto below_max_value_in_bigint = TRY_OR_FAIL(Crypto::UnsignedBigInteger::from_base(16, "fffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"sv));
  849. EXPECT_EQUAL_TO(max_value_in_bigint, double_max_value);
  850. EXPECT_LESS_THAN(max_value_minus_one, double_max_value);
  851. EXPECT_GREATER_THAN(max_value_plus_one, double_max_value);
  852. EXPECT_LESS_THAN(below_max_value_in_bigint, double_max_value);
  853. EXPECT_GREATER_THAN(max_value_in_bigint, double_below_max_value);
  854. EXPECT_GREATER_THAN(max_value_minus_one, double_below_max_value);
  855. EXPECT_GREATER_THAN(max_value_plus_one, double_below_max_value);
  856. EXPECT_EQUAL_TO(below_max_value_in_bigint, double_below_max_value);
  857. }
  858. {
  859. double just_above_255 = bit_cast<double>(0x406fe00000000001ULL);
  860. double just_below_255 = bit_cast<double>(0x406fdfffffffffffULL);
  861. double double_255 = 255.0;
  862. Crypto::UnsignedBigInteger bigint_255 { 255 };
  863. EXPECT_EQUAL_TO(bigint_255, double_255);
  864. EXPECT_GREATER_THAN(bigint_255, just_below_255);
  865. EXPECT_LESS_THAN(bigint_255, just_above_255);
  866. }
  867. #undef EXPECT_LESS_THAN
  868. #undef EXPECT_GREATER_THAN
  869. #undef EXPECT_EQUAL_TO
  870. }
  871. namespace AK {
  872. template<>
  873. struct Formatter<Crypto::UnsignedBigInteger::CompareResult> : Formatter<StringView> {
  874. ErrorOr<void> format(FormatBuilder& builder, Crypto::UnsignedBigInteger::CompareResult const& compare_result)
  875. {
  876. switch (compare_result) {
  877. case Crypto::UnsignedBigInteger::CompareResult::DoubleEqualsBigInt:
  878. return builder.put_string("Equals"sv);
  879. case Crypto::UnsignedBigInteger::CompareResult::DoubleLessThanBigInt:
  880. return builder.put_string("LessThan"sv);
  881. case Crypto::UnsignedBigInteger::CompareResult::DoubleGreaterThanBigInt:
  882. return builder.put_string("GreaterThan"sv);
  883. default:
  884. return builder.put_string("???"sv);
  885. }
  886. }
  887. };
  888. }