79 #include <gtest/gtest.h>
91 #include "../../internal.h"
92 #include "../../test/abi_test.h"
93 #include "../../test/file_test.h"
94 #include "../../test/test_util.h"
95 #include "../../test/wycheproof_util.h"
114 bssl::UniquePtr<BIGNUM>
GetBIGNUM(
const char *attribute) {
119 bssl::UniquePtr<BIGNUM>
ret =
126 if (word > INT_MAX) {
130 *
out =
static_cast<int>(word);
141 bssl::UniquePtr<BIGNUM>
ret;
142 if (
HexToBIGNUM(&
ret, hex.c_str()) !=
static_cast<int>(hex.size())) {
143 t_->
PrintLine(
"Could not decode '%s'.", hex.c_str());
163 const char *operation_expr,
const char *expected_expr,
164 const char *actual_expr,
const char *operation,
const BIGNUM *expected,
166 if (
BN_cmp(expected, actual) == 0) {
170 bssl::UniquePtr<char> expected_str(
BN_bn2hex(expected));
171 bssl::UniquePtr<char> actual_str(
BN_bn2hex(actual));
172 if (!expected_str || !actual_str) {
177 <<
"Wrong value for " << operation
178 <<
"\nActual: " << actual_str.get() <<
" (" << actual_expr
179 <<
")\nExpected: " << expected_str.get() <<
" (" << expected_expr
183 #define EXPECT_BIGNUMS_EQUAL(op, a, b) \
184 EXPECT_PRED_FORMAT3(AssertBIGNUMSEqual, op, a, b)
187 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
188 bssl::UniquePtr<BIGNUM>
b = t->GetBIGNUM(
"B");
189 bssl::UniquePtr<BIGNUM>
sum = t->GetBIGNUM(
"Sum");
298 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
299 bssl::UniquePtr<BIGNUM> lshift1 = t->GetBIGNUM(
"LShift1");
300 bssl::UniquePtr<BIGNUM> zero(
BN_new());
320 BN_div(
ret.get(), remainder.get(), lshift1.get(), two.get(),
ctx));
342 BN_div(
ret.get(),
nullptr , lshift1.get(), two.get(),
ctx));
357 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
358 bssl::UniquePtr<BIGNUM> lshift = t->GetBIGNUM(
"LShift");
381 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
382 bssl::UniquePtr<BIGNUM> rshift = t->GetBIGNUM(
"RShift");
407 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
408 bssl::UniquePtr<BIGNUM> square = t->GetBIGNUM(
"Square");
409 bssl::UniquePtr<BIGNUM> zero(
BN_new());
443 <<
"BN_sqrt succeeded on a negative number";
449 <<
"BN_sqrt succeeded on a non-square";
453 #if !defined(BORINGSSL_SHARED_LIBRARY)
458 size_t num_r = 2 * num_a;
460 std::unique_ptr<BN_ULONG[]> a_words(
new BN_ULONG[num_a]),
461 r_words(
new BN_ULONG[num_r]);
464 bn_mul_small(r_words.get(), num_r, a_words.get(), num_a, a_words.get(),
470 bn_sqr_small(r_words.get(), num_r, a_words.get(), num_a);
480 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
481 bssl::UniquePtr<BIGNUM>
b = t->GetBIGNUM(
"B");
482 bssl::UniquePtr<BIGNUM> product = t->GetBIGNUM(
"Product");
483 bssl::UniquePtr<BIGNUM> zero(
BN_new());
499 BN_div(
ret.get(), remainder.get(), product.get(),
a.get(),
ctx));
506 BN_div(
ret.get(), remainder.get(), product.get(),
b.get(),
ctx));
511 #if !defined(BORINGSSL_SHARED_LIBRARY)
519 for (
size_t num_a =
static_cast<size_t>(a_width);
522 for (
size_t num_b =
static_cast<size_t>(b_width);
525 size_t num_r = num_a + num_b;
527 std::unique_ptr<BN_ULONG[]> a_words(
new BN_ULONG[num_a]),
528 b_words(
new BN_ULONG[num_b]), r_words(
new BN_ULONG[num_r]);
532 bn_mul_small(r_words.get(), num_r, a_words.get(), num_a, b_words.get(),
543 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
544 bssl::UniquePtr<BIGNUM>
b = t->GetBIGNUM(
"B");
545 bssl::UniquePtr<BIGNUM> quotient = t->GetBIGNUM(
"Quotient");
546 bssl::UniquePtr<BIGNUM> remainder = t->GetBIGNUM(
"Remainder");
582 bssl::UniquePtr<BIGNUM> nnmod(
BN_new());
600 if (b_word != (BN_ULONG)-1) {
601 BN_ULONG remainder_word =
BN_get_word(remainder.get());
611 if (b_word <= 0xffff) {
630 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
631 bssl::UniquePtr<BIGNUM>
b = t->GetBIGNUM(
"B");
632 bssl::UniquePtr<BIGNUM>
m = t->GetBIGNUM(
"M");
633 bssl::UniquePtr<BIGNUM> mod_mul = t->GetBIGNUM(
"ModMul");
646 bssl::UniquePtr<BN_MONT_CTX> mont(
651 bssl::UniquePtr<BN_MONT_CTX> mont2(
658 bssl::UniquePtr<BIGNUM> a_tmp(
BN_new()), b_tmp(
BN_new());
671 #if !defined(BORINGSSL_SHARED_LIBRARY)
674 std::unique_ptr<BN_ULONG[]> a_words(
new BN_ULONG[m_width]),
675 b_words(
new BN_ULONG[m_width]), r_words(
new BN_ULONG[m_width]);
681 m_width, mont.get());
693 std::unique_ptr<BN_ULONG[]> prod_words(
new BN_ULONG[m_width * 2]);
694 bn_mul_small(prod_words.get(), m_width * 2, a_words.get(), m_width,
695 b_words.get(), m_width);
697 m_width * 2, mont.get());
702 mod_mul.get(),
ret.get());
709 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
710 bssl::UniquePtr<BIGNUM>
m = t->GetBIGNUM(
"M");
711 bssl::UniquePtr<BIGNUM> mod_square = t->GetBIGNUM(
"ModSquare");
716 bssl::UniquePtr<BIGNUM> a_copy(
BN_new());
730 bssl::UniquePtr<BN_MONT_CTX> mont(
732 bssl::UniquePtr<BIGNUM> a_tmp(
BN_new());
751 #if !defined(BORINGSSL_SHARED_LIBRARY)
754 std::unique_ptr<BN_ULONG[]> a_words(
new BN_ULONG[m_width]),
755 a_copy_words(
new BN_ULONG[m_width]), r_words(
new BN_ULONG[m_width]);
759 m_width, mont.get());
764 mod_square.get(),
ret.get());
768 m_width *
sizeof(BN_ULONG));
770 a_copy_words.get(), m_width, mont.get());
776 mod_square.get(),
ret.get());
783 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
784 bssl::UniquePtr<BIGNUM> e = t->GetBIGNUM(
"E");
785 bssl::UniquePtr<BIGNUM>
m = t->GetBIGNUM(
"M");
786 bssl::UniquePtr<BIGNUM>
mod_exp = t->GetBIGNUM(
"ModExp");
811 #if !defined(BORINGSSL_SHARED_LIBRARY)
814 bssl::UniquePtr<BN_MONT_CTX> mont(
817 std::unique_ptr<BN_ULONG[]> r_words(
new BN_ULONG[m_width]),
818 a_words(
new BN_ULONG[m_width]);
822 e->width, mont.get());
834 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
835 bssl::UniquePtr<BIGNUM> e = t->GetBIGNUM(
"E");
836 bssl::UniquePtr<BIGNUM> exp = t->GetBIGNUM(
"Exp");
848 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
849 bssl::UniquePtr<BIGNUM>
p = t->GetBIGNUM(
"P");
850 bssl::UniquePtr<BIGNUM> mod_sqrt = t->GetBIGNUM(
"ModSqrt");
851 bssl::UniquePtr<BIGNUM> mod_sqrt2(
BN_new());
867 if (
BN_cmp(
ret.get(), mod_sqrt2.get()) != 0) {
873 bssl::UniquePtr<BIGNUM> not_mod_square = t->GetBIGNUM(
"NotModSquare");
874 bssl::UniquePtr<BIGNUM>
p = t->GetBIGNUM(
"P");
881 <<
"BN_mod_sqrt unexpectedly succeeded.";
890 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
891 bssl::UniquePtr<BIGNUM>
m = t->GetBIGNUM(
"M");
892 bssl::UniquePtr<BIGNUM> mod_inv = t->GetBIGNUM(
"ModInv");
914 bssl::UniquePtr<BIGNUM>
a = t->GetBIGNUM(
"A");
915 bssl::UniquePtr<BIGNUM>
b = t->GetBIGNUM(
"B");
916 bssl::UniquePtr<BIGNUM>
gcd = t->GetBIGNUM(
"GCD");
917 bssl::UniquePtr<BIGNUM> lcm = t->GetBIGNUM(
"LCM");
930 <<
"A^-1 (mod B) computed, but it does not exist";
932 <<
"B^-1 (mod A) computed, but it does not exist";
935 bssl::UniquePtr<BIGNUM> a_reduced(
BN_new());
940 a_reduced.get(),
b.get(),
ctx))
941 <<
"A^-1 (mod B) computed, but it does not exist";
946 bssl::UniquePtr<BIGNUM> b_reduced(
BN_new());
951 b_reduced.get(),
a.get(),
ctx))
952 <<
"B^-1 (mod A) computed, but it does not exist";
957 int is_relative_prime;
982 static const struct {
1006 if (t->GetType() ==
test.name) {
1012 FAIL() <<
"Unknown test type: " << t->GetType();
1024 for (
unsigned large_mask = 1; large_mask < (1
u << num_bignums);
1041 bssl::UniquePtr<BIGNUM>
n(
BN_new());
1089 bssl::UniquePtr<BIGNUM>
x(
BN_new());
1090 bssl::UniquePtr<BIGNUM>
y(
BN_new());
1117 for (
size_t i = 0;
i <
sizeof(expected) / 2;
i++) {
1119 expected[
i] = expected[
sizeof(expected) - 1 -
i];
1120 expected[
sizeof(expected) - 1 -
i] =
tmp;
1139 bssl::UniquePtr<BIGNUM> bn;
1167 bssl::UniquePtr<BIGNUM> bn;
1199 return bssl::UniquePtr<BIGNUM>(raw);
1251 {
"0",
"\x00\x00\x00\x00", 4 },
1252 {
"1",
"\x00\x00\x00\x01\x01", 5 },
1253 {
"-1",
"\x00\x00\x00\x01\x81", 5 },
1254 {
"128",
"\x00\x00\x00\x02\x00\x80", 6 },
1255 {
"256",
"\x00\x00\x00\x02\x01\x00", 6 },
1256 {
"-256",
"\x00\x00\x00\x02\x81\x00", 6 },
1267 const size_t mpi_len =
BN_bn2mpi(bn.get(), NULL);
1281 bssl::UniquePtr<BIGNUM> bn(
BN_new());
1288 for (
int top : kTop) {
1290 for (
int bottom : kBottom) {
1296 bool seen_n_1_clear =
false, seen_n_1_set =
false;
1297 bool seen_n_2_clear =
false, seen_n_2_set =
false;
1298 bool seen_0_clear =
false, seen_0_set =
false;
1299 for (
int i = 0;
i < 100;
i++) {
1303 seen_n_1_set =
true;
1305 seen_n_1_clear =
true;
1308 seen_n_2_set =
true;
1310 seen_n_2_clear =
true;
1315 seen_0_clear =
true;
1330 }
else if (
bits == 1) {
1334 }
else if (
bits == 2) {
1357 bool seen[6] = {
false,
false,
false,
false,
false};
1358 for (
unsigned i = 0;
i < 1000;
i++) {
1366 FAIL() <<
"BN_rand_range_ex generated invalid value: " << word;
1377 for (
unsigned i = 1;
i < 6;
i++) {
1389 {
"0",
"\x02\x01\x00", 3},
1390 {
"1",
"\x02\x01\x01", 3},
1391 {
"127",
"\x02\x01\x7f", 3},
1392 {
"128",
"\x02\x02\x00\x80", 4},
1393 {
"0xdeadbeef",
"\x02\x05\x00\xde\xad\xbe\xef", 7},
1394 {
"0x0102030405060708",
1395 "\x02\x08\x01\x02\x03\x04\x05\x06\x07\x08", 10},
1396 {
"0xffffffffffffffff",
1397 "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff", 11},
1407 {
"\x03\x01\x00", 3},
1411 {
"\x02\x01\x80", 3},
1412 {
"\x02\x01\xff", 3},
1414 {
"\x02\x02\x00\x01", 4},
1424 bssl::UniquePtr<BIGNUM> bn2(
BN_new());
1433 bssl::ScopedCBB cbb;
1439 bssl::UniquePtr<uint8_t> delete_der(der);
1445 bssl::UniquePtr<BIGNUM> bn(
BN_new());
1450 <<
"Parsed invalid input.";
1457 bssl::ScopedCBB cbb;
1460 <<
"Serialized negative number.";
1465 bssl::UniquePtr<BIGNUM>
a(
BN_new());
1466 bssl::UniquePtr<BIGNUM>
b(
BN_new());
1467 bssl::UniquePtr<BIGNUM>
c(
BN_new());
1480 bssl::UniquePtr<BIGNUM> numerator(
BN_new()), denominator(
BN_new());
1489 BN_div(
a.get(),
b.get(), numerator.get(), denominator.get(),
ctx()));
1496 BN_div(
a.get(),
b.get(), numerator.get(), denominator.get(),
ctx()));
1508 bssl::UniquePtr<char> dec(
BN_bn2dec(
a.get()));
1509 bssl::UniquePtr<char> hex(
BN_bn2hex(
a.get()));
1534 bssl::UniquePtr<BIGNUM>
a(
BN_new());
1535 bssl::UniquePtr<BIGNUM>
b(
BN_new());
1536 bssl::UniquePtr<BIGNUM> zero(
BN_new());
1555 zero.get(),
ctx(), NULL));
1562 bssl::UniquePtr<BN_MONT_CTX> mont(
1629 static const unsigned kBits = 10;
1631 bssl::UniquePtr<BIGNUM>
r(
BN_new());
1639 static const BN_ULONG kMaxWord = (BN_ULONG)-1;
1641 bssl::UniquePtr<BIGNUM>
r(
BN_new());
1681 static const char *kBN2DecTests[] = {
1687 "123456789012345678901234567890",
1688 "-123456789012345678901234567890",
1689 "123456789012345678901234567890123456789012345678901234567890",
1690 "-123456789012345678901234567890123456789012345678901234567890",
1693 for (
const char *
test : kBN2DecTests) {
1695 bssl::UniquePtr<BIGNUM> bn;
1699 bssl::UniquePtr<char> dec(
BN_bn2dec(bn.get()));
1706 static const struct {
1712 {
"ffffffff",
UINT64_C(0xffffffff)},
1713 {
"100000000",
UINT64_C(0x100000000)},
1714 {
"ffffffffffffffff",
UINT64_C(0xffffffffffffffff)},
1717 for (
const auto&
test : kU64Tests) {
1719 bssl::UniquePtr<BIGNUM> bn(
BN_new()), expected;
1736 bssl::UniquePtr<BIGNUM> bn(
BN_new());
1748 bssl::UniquePtr<BIGNUM> power_of_two(
BN_new()), random(
BN_new()),
1756 for (
size_t e = 3; e < 512; e += 11) {
1759 for (
int len = 3;
len < 512;
len += 23) {
1776 BN_mod(expected.get(), random.get(), power_of_two.get(),
ctx()));
1783 BN_nnmod(expected.get(), random.get(), power_of_two.get(),
ctx()));
1786 expected.get(), actual.get());
1791 BN_nnmod(expected.get(), random.get(), power_of_two.get(),
ctx()));
1794 expected.get(), actual.get());
1800 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,
1801 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
1802 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137,
1803 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193,
1804 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257,
1805 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
1806 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389,
1807 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457,
1808 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523,
1809 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
1810 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661,
1811 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743,
1812 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823,
1813 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887,
1814 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977,
1815 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049,
1816 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117,
1817 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213,
1818 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289,
1819 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373,
1820 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453,
1821 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531,
1822 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607,
1823 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693,
1824 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777,
1825 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871,
1826 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951,
1827 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029,
1828 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113,
1829 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213,
1830 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293,
1831 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377,
1832 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447,
1833 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551,
1834 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659,
1835 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713,
1836 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797,
1837 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887,
1838 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971,
1839 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
1840 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187,
1841 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271,
1842 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359,
1843 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461,
1844 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539,
1845 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617,
1846 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701,
1847 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797,
1848 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889,
1849 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
1850 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073,
1851 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157,
1852 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253,
1853 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349,
1854 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451,
1855 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547,
1856 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643,
1857 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729,
1858 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817,
1859 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937,
1860 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009,
1861 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101,
1862 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209,
1863 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309,
1864 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417,
1865 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501,
1866 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581,
1867 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683,
1868 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783,
1869 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857,
1870 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953,
1871 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073,
1872 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163,
1873 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263,
1874 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337,
1875 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427,
1876 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553,
1877 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659,
1878 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737,
1879 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833,
1880 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947,
1881 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013,
1882 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127,
1883 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229,
1884 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333,
1885 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477,
1886 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547,
1887 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621,
1888 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717,
1889 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829,
1890 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927,
1891 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053,
1892 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147,
1893 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237,
1894 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329,
1895 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443,
1896 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563,
1897 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663,
1898 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737,
1899 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831,
1900 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933,
1901 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029,
1902 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137,
1903 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227,
1904 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337,
1905 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421,
1906 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497,
1907 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623,
1908 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721,
1909 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811,
1910 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901,
1911 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037,
1912 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133,
1913 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223,
1914 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313,
1915 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429,
1916 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529,
1917 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639,
1918 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733,
1919 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859,
1920 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957,
1921 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071,
1922 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171,
1923 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279,
1924 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393,
1925 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491,
1926 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617,
1927 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731,
1928 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831,
1929 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933,
1930 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037,
1931 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119,
1932 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241,
1933 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12343,
1934 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, 12421, 12433, 12437,
1935 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527,
1936 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613,
1937 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713,
1938 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823,
1939 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923,
1940 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009,
1941 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127,
1942 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229,
1943 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, 13337,
1944 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421, 13441, 13451, 13457,
1945 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577,
1946 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687,
1947 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759,
1948 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877,
1949 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967,
1950 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083,
1951 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221,
1952 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347,
1953 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447,
1954 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551,
1955 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653,
1956 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747,
1957 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831,
1958 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939,
1959 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073,
1960 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161,
1961 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269,
1962 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349,
1963 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443,
1964 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559,
1965 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649,
1966 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15733, 15737, 15739, 15749,
1967 15761, 15767, 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859,
1968 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959,
1969 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069,
1970 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187,
1971 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301,
1972 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421,
1973 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529,
1974 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649,
1975 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747,
1976 16759, 16763, 16787, 16811, 16823, 16829, 16831, 16843, 16871, 16879, 16883,
1977 16889, 16901, 16903, 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981,
1978 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077,
1979 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191,
1980 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321,
1981 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401,
1982 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491,
1983 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599,
1984 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729,
1985 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839,
1986 17851, 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939,
1987 17957, 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047,
1988 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133,
1989 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233,
1990 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329,
1991 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439,
1992 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539,
1993 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691,
1994 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797,
1995 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959,
1996 18973, 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079,
1997 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211,
1998 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309,
1999 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423,
2000 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483,
2001 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583,
2002 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727,
2003 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841,
2004 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949,
2005 19961, 19963, 19973, 19979, 19991, 19993, 19997,
2009 bssl::UniquePtr<BIGNUM>
p(
BN_new());
2011 int is_probably_prime_1 = 0, is_probably_prime_2 = 0;
2015 size_t next_prime_index = 0;
2017 for (
int i = 0;
i <= max_prime;
i++) {
2021 if (
i ==
kPrimes[next_prime_index]) {
2035 if (
i > 3 &&
i % 2 == 1) {
2055 static const char *kComposites[] = {
2066 "3825123056546413051",
2067 "318665857834031151167461",
2068 "3317044064679887385961981",
2106 for (
const char *
str : kComposites) {
2126 static const char *kPrimesHex[] = {
2129 "ebb00348b1308e29166f0401f7415cc3bf9c746460bcadfd1ad6838b6472f48f3afba0c1"
2130 "446eddc4708c68e307a882771794fbba45799f5b062e090613ee8203",
2131 "d9a896e15c5d0091e81825948f3111c615a32aa0bd9305b9591232138388176fe22ff765"
2132 "63c893b95c0f9898029be67543144c5e76c837333f109a0ffc0fa3db",
2133 "fdecb71e997f234111706cabdfdc515b7e7a2a8d77b3c3a4b4819493d39de84e791be692"
2134 "9ce1c3f5136808504f351eca19884894f581f96fba2b8d652265efe9",
2135 "dc37a778aa89eb4048267573421ac5b9d81a231d05191393bdf06a6a64c684968fd17c4f"
2136 "41fbd5745df2ee447fcc04693e2e3fecec270145388032149da63b3f",
2137 "fbf34841baa2dd4ecf9055328f4902532d80e82f6d8ea186311564b3680b39ea2162fed4"
2138 "701f02bec9d5be19f2e505c58a68620ee8873e8ab8fe98506a8bf9bb",
2139 "c3b3c3156c9d0bf3b27f9bf8274ddc8c8505bacbb4a9595d90354d1a472553d6ae3daa97"
2140 "1396c0361f6355531de29bf8ef1d7b471b5f2267d4b49cbe48ced5f1",
2141 "f8d1216de820efb437ca8070c5f4f34838c46cf354c998e253557cfc400eae7883d0a758"
2142 "0b2e617cca527d9d6c598cbc03ca743791f88a5a065fea9583068f1b",
2143 "cc12d224273b56e6765f6b42583d8da3c89ff531f14961351b5173a9017579cd7bb736e2"
2144 "78e626a426ee5a583b8d6c7b3006687ca9df596902a281e9e9cf3ad5",
2147 "f3244013a1b0ec2fe53a684260077d2afc3b35ed77026c594091d92b2eb47fd1266095b8"
2148 "7456cc451942f907079b8a9cd333d4bf22a892dbc632904a6423c5b19bb41fd43764a558"
2149 "0e9a5960d84fadbebfbbfaa5ec39acb78a94937d11d7a62c54a0f983bc8b5507479290de"
2150 "f4e979d3f24ce81f4c506ba3bfca4f402a3b11cf",
2151 "e4a70bdbb96fefd5732e9e94f9d04b9ef16635642ee728d40626861db00d57950697e892"
2152 "d0306de25ee35d5ccce1220e1b19fd2f98af2fdcac5796d860fd75aec31ed48baf5b39cf"
2153 "77ebda6727e33e6f72735ab0121395deb54fd430212499043cd1e11f7d5852f146997952"
2154 "d9959c83542b6cbad3c3a2ebb8698a0172e0c6d1",
2155 "e85ad4595ea74bf886977f4a06120b6ae28ec2d7ee44b4bc8658a8a90a2a55311814dfed"
2156 "ebd08f93e8241dcc87d91d6f6b498c6ec0576a7dad6e5d53b71f89fb985de290c0f02a78"
2157 "f2143217c0b7ae1487a751ec27dfbd46046a06f5ebe337e05ed5d6fe8620b7f82b349c37"
2158 "924d96128e42307fd708a74d608848cbdf6bc799",
2159 "cc890f5fe88bfc4028a2ab5eff9dea7b150ffe75fb29f1904adb4709e86f74eaed44218c"
2160 "d8058341a4b828d4fefeed5e34f50198bf643040037933f4305e1e01c3518279b9fa4131"
2161 "e5afbc462efe9b5ddc4ab91ec2c12abf95b526bb2a6bd7b2bb1ce8203364502f7c3b87ff"
2162 "585c94765505c20f728078a46759615ad23d4fb7",
2163 "ebd8cd32804c6c1e7264de4f9bf1e4d2dbdaa23292c8f4688aa2770f664fe03513974e13"
2164 "0a10ccc6b6ca95846dfecbd2d42285cf0212ff427ddb7cc222bfa459215ad4cc0f1f5fc7"
2165 "4186bbbe96ca4de0d7c793ee050f8e10a242ab9bf03aae5b017b42c405ccee34f59ff501"
2166 "5dbe4cab310bbb3ab50604f663cdb5af070d4a8d",
2167 "e1dab2efc6ba8c980b86164e11fc6c6c4abb53701031de431db2b608ec75fd03c7cf07e6"
2168 "e9d6c36da2a2aafe759f9c3e1522237d4dcae66ef03c86481428d58d4bcdffb919bb8da4"
2169 "4b0ac1cc922d2d904c543b1a09961faf7304af4482dc839091b258523ab5e36302e1157f"
2170 "3e6810513922c5d5c1f559e3a90b91e4cf2f0c9f",
2171 "d76a082eb03584a6253555cf9813206a06c9fc2112b6425e030f12d7d807656175f4c58e"
2172 "e367826ec0d89f03339fb520d7c8a735905e458f849827581e9db22fde302fc55db031fd"
2173 "8f3afe1910eaaa8ed4d122de99fa0a66bf69b932ce84d095ffcb3f98e231199817ebc316"
2174 "460df0c0769fef3f91777a9cf86ccf2e8233818b",
2175 "d506fd2c6557a7f8cd0ac8f0f098bffdede4ee79f74ce6e9478d8651058ec56aa1f4683c"
2176 "20729ee8d11d14b34170ce0cf419a7b22943d5fb443afb22e6a430fe993ac64737428f50"
2177 "37d19398ee226484b5ca64af71012245d87aefbcbd71e867f6fbcc52e0e1c49f1363aec1"
2178 "88c776abb67cda2fd6ce7be4bdbeee57fbafb07b",
2181 "f6aa5b151ea2cd151a720174d58c157e8dbbf3dbd93b102fcfb7ad3767cca8543d4fb168"
2182 "7fb907561da1330c7878853859bc2b4b9d639d9b9bba4fce3a95cfd9151c19365e6ad634"
2183 "7edc87acd4b79d2a7ce942c2a391c475cef2d4e347675487cc36a43f157562e32aff9d74"
2184 "e15f228a0ecc8eca2392e04ddea8eda995789c94b9f85dde65e66b074c7843260ebdcd60"
2185 "1cd49e2bf3ab83780281e4a56ada38b16e085f00c05bcce442daf1c9374a3ec2a2345309"
2186 "5570aaa6bb3a3e4945312aed",
2187 "e396e3ede4b0a33fe90b749b3dbc01fdb7d15e37cc3febe3f2b0ee6140204666fa4acb93"
2188 "da893d0ce19d9e5eb09b7395394ced79261ba8b1a40ee977d1954a98031256c0e3f83c5b"
2189 "ee234afddb80d4251b5f6f7493b3eb6156011e202fd4d8319445eb5bb3c0782e9e75077c"
2190 "87f9f3a25a2d117793fc98441ce74255d7bd55bdb0f17710737ab4aaca99271600f03503"
2191 "91ffbc9a5d5458414716e0c26b239096f6c6e4a680b0cccaebc4f200fa0500618d719493"
2192 "becacf936525680233273679",
2193 "e5e7d43632d844bd04fce45213257415a4c9c3f4bf9b6a1b74e8c31e3c66fbf3b42da531"
2194 "aaa9cdaac160d565cd81430983c18120e98be41df6d178d0e974cc9ce6ced673423c7727"
2195 "267ba1ba07b457a1557bffaf2c90957372c0f5f08c4940ccd858e0bc392e3050bb2adae8"
2196 "0f509dc129a49279c01c55434b383d359b7b255f55c33be445a3dc05e0c1b3d7486a8142"
2197 "675a3b6e7b3d3d27fbf54764d9f73ea98304612e5e1a4d566986efa53b62ad18f4ecad64"
2198 "f197c7d48a2732745a1e5ec9",
2199 "daa7795c70b8df8af978f9e66a19eed2a92b6f665aee3d58f3e450ac0f18772ed5cf8b2b"
2200 "381eb55facd93b32106d0d703f2316b50069b6db38cd62b12a4b7fdd6f8f93c4f110091a"
2201 "d972e5808afd6acf6bd6eaa0b846b50b7fe1786702a3382b8b637b8ea91ffe3225e9ad50"
2202 "3f1f9593ea6f19d6dc2d556e5d6f3a26134df4a964e67d789e7849eaf698c976ef592052"
2203 "6b023f2f96e96e2b89adf0ee4544e32029cfca972f824cb7af805c556a6143dcb93cb6b7"
2204 "91ebb8dba30cbc94dff782f3",
2205 "f48f534acee47a482ba43abc70aa8c7d4b6df27b957583fa2b23cbc1d34d9da7eb89fa3f"
2206 "881b9db1dfa8925f38328574ca8ff7256ae0bf163ee61b471d29f5e72d98f92775693091"
2207 "2bfbddb695a64137783232596d6c7892b89b4fb54abd5b077ccf532aaf5b9b29cf25b366"
2208 "3845987a0a947b97000c05bfc7a239e1cb962cc43e1dceaf91935353d2d6dad7eda20798"
2209 "9a2f0f8e367f3df5c1ee3b56209bd85832c35ff2cd7b9a67db801691c946b0a7a9a875e8"
2210 "9e1f65198caf1ca6f3037ff9",
2211 "ee5bc8c8d3ecd753b4c0e4e5934d8e44a9ab5d8dda127db28b32bfb357636d0c144dee78"
2212 "8c2a901af3b02439a8a3d2125954feeac722a72272f5595a91cf4ee5ae8e69159986cc50"
2213 "054c3a259c80ed84e7b793733eed05330b2a2ad11dee4140b5fe1f3706a0b1b28407e84c"
2214 "27e19e3a3d9d640629c35deaa9061d33b5888a88e4220340f488f764219f9e8edb2b1d04"
2215 "15253f5fd53835cdc6935898ecba173c5b2db3a6578fdc16e1221cac1e454864ada9f772"
2216 "1ecd24bc77ed5cf353d5f909",
2217 "f2f5ca816781cbae4fcea9587321497c252bfe84127f2d8ac7d6da7a34d1faa2f428911d"
2218 "a876a42299d2cb4af35c944df51f1421b74fe11b047f871b37f1f37a0c6d0753c28a3e52"
2219 "91a9cf54c5892408591bc932269626d1392f8c8c67d87300febbc63e4a779104ba6191f8"
2220 "a5bbfbcf6c675a6ad8a853ac1e9a86dc16a95a9566b5287b7862f6a962bf79626a82961f"
2221 "c378b4751da35e25d761469ad4e22072bd43951631a96026b37d7932ca8fabf22fb757b4"
2222 "e903252c416f0f96ca0eb663",
2223 "e01c620e4b80840816a99b5c1eed80c8bfdc040253889b2ce81e78de2f5511ea453d1492"
2224 "56bb53b64f4f43441e464867cfd40571c2c5527f1c79eb4b8b1022018e362ae51f13b8b5"
2225 "2426239c09369370575d873755e3bee630424e35a8024f76553f5635d26d791b5e4a8903"
2226 "d09be560c322837c29283aee2feb6864b724007334f1af2008db7eaf773d9f4e1e8fc396"
2227 "07969c43d7c1d106274fa24c3068d347244d5821e10153b5e1e84fef7c08c19e4f79b71e"
2228 "ebd1205c057812a74f6e09ab",
2231 "ff9166fd6945a3f692e99001528d5f4db6a36990f755275c3b34bded64bdd9c8e0cd190b"
2232 "3df421be41525d496478bb2c07400ea1abe2bda65aa95efaecfada8230df64405ace2594"
2233 "3193755ecf24db8fe8cda7a399cebe66f6d760cd9815bdcc65a5ad53c5b97dad21deed9b"
2234 "e24ba048f621a095b3ffc48d05de12e16fb53d1e81ba0ed20c601599ce3833c7f36bc481"
2235 "ab84ba7f38e3baeb19ad27e45dfd74fd5d03073426200c4b5ebf3323b3e16a0534b8df9b"
2236 "0359c8e56f2e8c3950803b28954f8b6f14cee76623481f3479638c4908ce88ee56a5940b"
2237 "c9e79198fedf83e5f931740346916d745c6279f13f4ca59e1534dba4f3eaeee8d20ddf20"
2239 "d17eaffaad2b87da90b280b3879908ef3ed395b0d7cf12daee62dd4a0bf73e536f912635"
2240 "f109908c8ceb26f31950dbcce65e443e452ac0eddf35aef2ae03a15f57bbb5d7800c9d61"
2241 "bae6d87f10927643bd5a2cd77bd5a70d84b0da28494e5cb7cd7ced9dd0a57177cade57d9"
2242 "53c80efa99ff09588dc7f6cab76d18fc86ccfc74fe5acca9aba2b4c143977d7abdae2a67"
2243 "7cb50810f6b60ccc0f77f75e9ea5733d8c7d6795f95350d91fafacd9d9ad00bafaadf558"
2244 "d95237ff53f090c674c326f38f728dbc4a42f2978d91c19686f3793862375adb2bc8b241"
2245 "ce9816e8e36ff105bb06e7a77ea0077371b28bbdf745dd0bf537e43a0bed8ddeff5eb29e"
2247 "df859ae517fac8682a715f666c70ad29421cb8a0186fe6016c5bd8a0fabf65ee2b018fcc"
2248 "53c50a29daf82a2a9f7bceac45c13a2458af34998cf16eecec02fe3254758eff63b60e25"
2249 "3e118fb1494d78de1d38b49ac0b528a04208d2b57d95a9edd7b7b02afeb2c47a628bef6b"
2250 "4a6a0f7b91cb5b8d5900f8ad3f332360a07f3ac00907cadfe6cacc7e696e897ca541a2e7"
2251 "12a5d419215712716b71e2a2a8b8c809bbf0cc3b24e55e7ec72cfdc5e8c9651f8a2f36a8"
2252 "abd0ebd77ddf59b7f096b788f8081e22465e4a6082c3ad4bcdf27bf5f51f3326eb87ac9e"
2253 "330fb6d68645299da63a1d977fb246e176afcfbc2474fca3ae40d75125f755f5a50c3080"
2255 "c6aea46d1fb7d2d1107e31399cc613a1db56174c96898e3e32688ce2a26c000486528f05"
2256 "4cc0dc3e448016944528183a2a90ca54a1029aedc519fe6d7b599097b214aab0d16b35cb"
2257 "b7948e2e301f4fe65fc35340a82eb25111150cd968e12ec063ac0901ec4bf5d490a39714"
2258 "b128848ee3852dce7bfdd66a4751abe8f365d1e83fd7a86a192d02bc892c6cd9558bacdf"
2259 "c55a61cb06be8d74c44c2d03245d9b5f003c7280e82f3f1204dc7abc3e5fa11f2168bc17"
2260 "c73fb1dc8b84e632a26420b32118fc8aa6a98c037b662d676370d10bfb47955e9b4f4c64"
2261 "062d32345677199b36abe1d6b1bb0badbb57ae4a65b643da7f122c1b38dad9df0318d3c9"
2263 "da64c031f133da1d014777b6f8c8d599f54b7e67dc3ac3883f0b78cfe27d1cb1849c72a3"
2264 "37a6d6a0ee53633c8382a416e8851fe9c81141121d702fa8b12dc6ba62a3dbb87faec66c"
2265 "6389e9e1df47015db6ff12ded83d2fc242e58e55cf7924b70e4cf463559705e382745006"
2266 "1aa88b38d3795042ab0e8657ed1c77e91e39d5a29e86f9572a3ce91b8d0ca12ef6ee5f1f"
2267 "f3930c5de357eaabe7497d7319461be00cbb1db36329baa6c298608aa7288a6926396abc"
2268 "9a662dc2c413311ec821cb4564c247fcdd32d57cae8dd37882377f9139aea9a5a6ae1e01"
2269 "1a356fc395682f64c08cb3130711bb759d16ed2eaf0da976876f156aa0965cb7292a5726"
2271 "ce705e04e5abb0d0f3058bff82c457ef6308f2b4279026c906c0679f382d92c96ae0d11f"
2272 "3004dfbdfd7950cc4f0aa1bcb7b06e4be6628b249e90339d8e1891e512c40f7b38ce9ad4"
2273 "ad7c37791b833cf668b4807c2b4d4638cb10af745e349c70ae7bc8396611725c43899131"
2274 "751729e98651b4250d680ddb1f208e971b8abaca2ba79a7665dd71fa532702f54930865c"
2275 "52ca536f04218aeb626ff94bc4e0886ffbccba910f879e000f363b0864dfc883d2de2af5"
2276 "70c2c4125c5b0e478f87f7b934b66af864fb63f4d13fa21db3e4cef03c395fe207764ae3"
2277 "1b64bbc301cdeb795c580885605b11bcaa53d32a1fa72381e524ef269748ce77deb0cd37"
2279 "f4f7bb8ab2983afc83b6ac060dcc4d96331dbbf800b321bbde2d8f8a9fa750e7c2b42fc4"
2280 "6baf9a167a7389812f65b52b283ad5dd95709e81f8f602031ee8a5f4929bee7b3da97b92"
2281 "f53f61ff25de8170aeef9a6c464d4be77fa3e5aea041f51d49932d30480f33bb44fd3af5"
2282 "e7bfad562acaaed5069b2dc003fdb207ee7db9061d02136cb4b59c2ba071ca6aa2747675"
2283 "bf86d601a9197d92091b36299cad0d6adceca87b16ee54b48ee19a9e9df20955cdc1ca2c"
2284 "fa07fd2b054377d6242fb1ae69209ac5ac2d98a2929dec9eb076e0c9d74083bab0797851"
2285 "b6eca68e3de7440001706cebee6adc8b317b0ef8332863aad26ec18f8156998566f32207"
2287 "da20f268b7254f3ed0ad35372ad4c78c1fc89465fc1a256ee0064b3c11980917d4d0b6fe"
2288 "c8546c5e4cea1e18ccd23f20dc096506062afeb57be9edd2443ec1cecd84108911c99ac0"
2289 "2d388bc7c415aa41b7a4396c3ed823f3c0921163e85e2dec186862e945affa069dee3dea"
2290 "3b382d7c5a9695aa76e2e25a516457d4eee12ef0c18bf09076c8f739189887492e4aecae"
2291 "2999ec305c2e66d444d14251caa1b546deb3c07c6d9c0ed9d1a33f405e780661684be318"
2292 "61db7030b2f0b5b6e6f1616ab017955a6025c89c6945329aa10567a5f26724dc074cae1a"
2293 "623c64fcda5241674bb4c9954342b1bac8cb13a4b98e893ee42b4ccebf788c2267de2d70"
2296 for (
const char *
str : kPrimesHex) {
2327 "crypto/fipsmodule/bn/miller_rabin_tests.txt", [&](
FileTest *t) {
2330 bssl::UniquePtr<BIGNUM> w = bn_test.
GetBIGNUM(
"W");
2332 bssl::UniquePtr<BIGNUM>
b = bn_test.
GetBIGNUM(
"B");
2334 bssl::UniquePtr<BN_MONT_CTX> mont(
2338 bssl::BN_CTXScope scope(
ctx());
2343 b.get(), mont.get(),
ctx()));
2356 "third_party/wycheproof_testvectors/primality_test.txt",
2368 "WorstCaseMillerRabin") !=
result.flags.end()) {
2375 int is_probably_prime;
2390 constexpr BN_ULONG kOne = 1;
2393 for (
unsigned i = 1;
i < BN_BITS2;
i++) {
2398 for (
unsigned i = 0;
i < BN_BITS2;
i++) {
2402 for (
unsigned i = 1;
i < 100;
i++) {
2410 const unsigned num_bits =
buf[0] % (BN_BITS2 + 1);
2411 if (num_bits == BN_BITS2) {
2412 w |= kOne << (BN_BITS2 - 1);
2413 }
else if (num_bits == 0) {
2416 w &= (kOne << num_bits) - 1;
2417 w |= kOne << (num_bits - 1);
2424 #if !defined(BORINGSSL_SHARED_LIBRARY)
2427 static const BN_ULONG
kTestVectors[][256 / BN_BITS2] = {
2428 {TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000),
2429 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2430 {TOBN(0x00000000, 0x00000001), TOBN(0x00000000, 0x00000000),
2431 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2432 {TOBN(0x00000000, 0x00000002), TOBN(0x00000000, 0x00000000),
2433 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2434 {TOBN(0x00000000, 0x0000ffff), TOBN(0x00000000, 0x00000000),
2435 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2436 {TOBN(0x00000000, 0x83339914), TOBN(0x00000000, 0x00000000),
2437 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2438 {TOBN(0x00000000, 0xfffffffe), TOBN(0x00000000, 0x00000000),
2439 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2440 {TOBN(0x00000000, 0xffffffff), TOBN(0x00000000, 0x00000000),
2441 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2442 {TOBN(0xed17ac85, 0x83339914), TOBN(0x00000000, 0x00000000),
2443 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2444 {TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0x00000000),
2445 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2446 {TOBN(0x00000000, 0x83339914), TOBN(0x00000000, 0x00000001),
2447 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2448 {TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff),
2449 TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
2450 {TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff),
2451 TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0x00000000)},
2452 {TOBN(0x00000000, 0x00000000), TOBN(0x1d6f60ba, 0x893ba84c),
2453 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
2454 {TOBN(0x00000000, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
2455 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
2456 {TOBN(0xed17ac85, 0x00000000), TOBN(0x1d6f60ba, 0x893ba84c),
2457 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
2458 {TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
2459 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
2460 {TOBN(0xed17ac85, 0xffffffff), TOBN(0x1d6f60ba, 0x893ba84c),
2461 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
2462 {TOBN(0xffffffff, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
2463 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
2464 {TOBN(0xffffffff, 0xffffffff), TOBN(0x1d6f60ba, 0x893ba84c),
2465 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
2466 {TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000),
2467 TOBN(0x00000000, 0x00000000), TOBN(0xffffffff, 0xffffffff)},
2468 {TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000),
2469 TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
2470 {TOBN(0x00000000, 0x00000001), TOBN(0x00000000, 0x00000000),
2471 TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
2472 {TOBN(0x00000000, 0x00000000), TOBN(0xffffffff, 0xffffffff),
2473 TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
2474 {TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff),
2475 TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
2500 for (
size_t k = 0;
k < one_word;
k++) {
2513 #endif // !BORINGSSL_SHARED_LIBRARY
2516 bssl::UniquePtr<BIGNUM> ten(
BN_new());
2520 bssl::UniquePtr<BIGNUM> ten_copy(
BN_dup(ten.get()));
2523 bssl::UniquePtr<BIGNUM> eight(
BN_new());
2527 bssl::UniquePtr<BIGNUM> forty_two(
BN_new());
2531 bssl::UniquePtr<BIGNUM> two_exp_256(
BN_new());
2535 bssl::UniquePtr<BIGNUM> zero(
BN_new());
2575 bssl::UniquePtr<char> hex(
BN_bn2hex(ten.get()));
2614 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2615 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2616 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
2618 bssl::UniquePtr<BIGNUM>
p(
BN_bin2bn(kP,
sizeof(kP),
nullptr));
2623 bssl::UniquePtr<BN_MONT_CTX> mont(
2626 bssl::UniquePtr<BN_MONT_CTX> mont2(
2631 bssl::UniquePtr<BN_MONT_CTX> mont3(
2634 bssl::UniquePtr<BN_MONT_CTX> mont4(
2638 EXPECT_EQ(mont->N.width, mont2->N.width);
2639 EXPECT_EQ(mont->N.width, mont3->N.width);
2640 EXPECT_EQ(mont->N.width, mont4->N.width);
2644 EXPECT_EQ(mont->N.width, mont->RR.width);
2645 EXPECT_EQ(mont->N.width, mont2->RR.width);
2646 EXPECT_EQ(mont->N.width, mont3->RR.width);
2647 EXPECT_EQ(mont->N.width, mont4->RR.width);
2651 bssl::UniquePtr<BIGNUM> bn(
BN_new());
2654 for (
int i = 0;
i < BN_BITS2;
i++) {
2656 for (
int set_high_bits = 0; set_high_bits < 2; set_high_bits++) {
2657 BN_ULONG word = ((BN_ULONG)1) <<
i;
2658 if (set_high_bits) {
2661 word |= junk & ~(word - 1);
2691 bssl::UniquePtr<BIGNUM>
r(
BN_new());
2693 bssl::UniquePtr<BIGNUM> two(
BN_new());
2696 bssl::UniquePtr<BIGNUM> three(
BN_new());
2699 bssl::UniquePtr<BIGNUM> seven(
BN_new());
2715 #if defined(OPENSSL_BN_ASM_MONT) && defined(SUPPORTS_ABI_TEST)
2717 for (
size_t words : {4, 5, 6, 7, 8, 16, 32}) {
2720 bssl::UniquePtr<BIGNUM>
m(
BN_new());
2724 bssl::UniquePtr<BN_MONT_CTX> mont(
2738 #endif // OPENSSL_BN_ASM_MONT && SUPPORTS_ABI_TEST
2740 #if defined(OPENSSL_BN_ASM_MONT5) && defined(SUPPORTS_ABI_TEST)
2742 for (
size_t words : {4, 5, 6, 7, 8, 16, 32}) {
2745 bssl::UniquePtr<BIGNUM>
m(
BN_new());
2749 bssl::UniquePtr<BN_MONT_CTX> mont(
2759 for (
size_t i = 0;
i < 32;
i++) {
2766 mont->n0,
words, 13);
2768 mont->n0,
words, 13);
2770 if (
words % 8 == 0) {
2787 #endif // OPENSSL_BN_ASM_MONT5 && SUPPORTS_ABI_TEST
2789 #if defined(RSAZ_ENABLED) && defined(SUPPORTS_ABI_TEST)
2791 if (!rsaz_avx2_capable()) {
2795 alignas(64) BN_ULONG
table[32 * 18] = {0};
2796 alignas(64) BN_ULONG rsaz1[40], rsaz2[40], rsaz3[40], n_rsaz[40];
2797 BN_ULONG norm[16], n_norm[16];
2802 bssl::UniquePtr<BIGNUM>
n(
BN_new());
2805 bssl::UniquePtr<BN_MONT_CTX> mont(
2808 const BN_ULONG
k = mont->n0[0];
2819 #endif // RSAZ_ENABLED && SUPPORTS_ABI_TEST