|
|
|
@ -131,8 +131,8 @@ START_TEST(test_bignum_read_be) {
|
|
|
|
|
|
|
|
|
|
bn_read_be(input, &a);
|
|
|
|
|
|
|
|
|
|
bignum256 b = {{0x286d8bd5, 0x380c7c17, 0x3c6a2ec1, 0x2d787ef5, 0x14437cd3,
|
|
|
|
|
0x25a043f8, 0x1dd5263f, 0x33a162c3, 0x0000c55e}};
|
|
|
|
|
bignum256 b = {{0x086d8bd5, 0x1018f82f, 0x11a8bb07, 0x0bc3f7af, 0x0437cd3b,
|
|
|
|
|
0x14087f0a, 0x15498fe5, 0x10b161bb, 0xc55ece}};
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
|
|
|
ck_assert_int_eq(a.val[i], b.val[i]);
|
|
|
|
@ -141,8 +141,8 @@ START_TEST(test_bignum_read_be) {
|
|
|
|
|
END_TEST
|
|
|
|
|
|
|
|
|
|
START_TEST(test_bignum_write_be) {
|
|
|
|
|
bignum256 a = {{0x286d8bd5, 0x380c7c17, 0x3c6a2ec1, 0x2d787ef5, 0x14437cd3,
|
|
|
|
|
0x25a043f8, 0x1dd5263f, 0x33a162c3, 0x0000c55e}};
|
|
|
|
|
bignum256 a = {{0x086d8bd5, 0x1018f82f, 0x11a8bb07, 0x0bc3f7af, 0x0437cd3b,
|
|
|
|
|
0x14087f0a, 0x15498fe5, 0x10b161bb, 0xc55ece}};
|
|
|
|
|
uint8_t tmp[32];
|
|
|
|
|
|
|
|
|
|
bn_write_be(&a, tmp);
|
|
|
|
@ -156,10 +156,10 @@ START_TEST(test_bignum_write_be) {
|
|
|
|
|
END_TEST
|
|
|
|
|
|
|
|
|
|
START_TEST(test_bignum_is_equal) {
|
|
|
|
|
bignum256 a = {{0x286d8bd5, 0x380c7c17, 0x3c6a2ec1, 0x2d787ef5, 0x14437cd3,
|
|
|
|
|
0x25a043f8, 0x1dd5263f, 0x33a162c3, 0x0000c55e}};
|
|
|
|
|
bignum256 b = {{0x286d8bd5, 0x380c7c17, 0x3c6a2ec1, 0x2d787ef5, 0x14437cd3,
|
|
|
|
|
0x25a043f8, 0x1dd5263f, 0x33a162c3, 0x0000c55e}};
|
|
|
|
|
bignum256 a = {{0x086d8bd5, 0x1018f82f, 0x11a8bb07, 0x0bc3f7af, 0x0437cd3b,
|
|
|
|
|
0x14087f0a, 0x15498fe5, 0x10b161bb, 0xc55ece}};
|
|
|
|
|
bignum256 b = {{0x086d8bd5, 0x1018f82f, 0x11a8bb07, 0x0bc3f7af, 0x0437cd3b,
|
|
|
|
|
0x14087f0a, 0x15498fe5, 0x10b161bb, 0xc55ece}};
|
|
|
|
|
bignum256 c = {{
|
|
|
|
|
0,
|
|
|
|
|
}};
|
|
|
|
@ -339,6 +339,13 @@ END_TEST
|
|
|
|
|
START_TEST(test_bignum_write_uint32) {
|
|
|
|
|
bignum256 a;
|
|
|
|
|
|
|
|
|
|
// lowest 29 bits set
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
|
"000000000000000000000000000000000000000000000000000000001fffffff"),
|
|
|
|
|
&a);
|
|
|
|
|
ck_assert_int_eq(bn_write_uint32(&a), 0x1fffffff);
|
|
|
|
|
|
|
|
|
|
// lowest 30 bits set
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
@ -637,8 +644,8 @@ START_TEST(test_bignum_format) {
|
|
|
|
|
"0000000000000000000000000000000000000000000000000000000000000000"),
|
|
|
|
|
&a);
|
|
|
|
|
r = bn_format(&a, NULL, NULL, 18, 0, false, buf, sizeof(buf));
|
|
|
|
|
ck_assert_int_eq(r, 3);
|
|
|
|
|
ck_assert_str_eq(buf, "0.0");
|
|
|
|
|
ck_assert_int_eq(r, 1);
|
|
|
|
|
ck_assert_str_eq(buf, "0");
|
|
|
|
|
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
@ -757,8 +764,8 @@ START_TEST(test_bignum_format) {
|
|
|
|
|
"0000000000000000000000000000000000000000000000000000000000989680"),
|
|
|
|
|
&a);
|
|
|
|
|
r = bn_format(&a, NULL, NULL, 7, 0, false, buf, sizeof(buf));
|
|
|
|
|
ck_assert_int_eq(r, 3);
|
|
|
|
|
ck_assert_str_eq(buf, "1.0");
|
|
|
|
|
ck_assert_int_eq(r, 1);
|
|
|
|
|
ck_assert_str_eq(buf, "1");
|
|
|
|
|
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
@ -805,10 +812,10 @@ START_TEST(test_bignum_format) {
|
|
|
|
|
"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3bbb00"),
|
|
|
|
|
&a);
|
|
|
|
|
r = bn_format(&a, NULL, NULL, 8, 0, false, buf, sizeof(buf));
|
|
|
|
|
ck_assert_int_eq(r, 72);
|
|
|
|
|
ck_assert_int_eq(r, 70);
|
|
|
|
|
ck_assert_str_eq(buf,
|
|
|
|
|
"11579208923731619542357098500868790785326998466564056403945"
|
|
|
|
|
"75840079131.0");
|
|
|
|
|
"75840079131");
|
|
|
|
|
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
@ -825,9 +832,9 @@ START_TEST(test_bignum_format) {
|
|
|
|
|
"fffffffffffffffffffffffffffffffffffffffffffffffff7e52fe5afe40000"),
|
|
|
|
|
&a);
|
|
|
|
|
r = bn_format(&a, NULL, NULL, 18, 0, false, buf, sizeof(buf));
|
|
|
|
|
ck_assert_int_eq(r, 62);
|
|
|
|
|
ck_assert_int_eq(r, 60);
|
|
|
|
|
ck_assert_str_eq(
|
|
|
|
|
buf, "115792089237316195423570985008687907853269984665640564039457.0");
|
|
|
|
|
buf, "115792089237316195423570985008687907853269984665640564039457");
|
|
|
|
|
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
@ -875,7 +882,69 @@ START_TEST(test_bignum_format) {
|
|
|
|
|
memset(buf, 'a', sizeof(buf));
|
|
|
|
|
r = bn_format(&a, "prefix", "suffix", 10, 0, false, buf, 30);
|
|
|
|
|
ck_assert_int_eq(r, 0);
|
|
|
|
|
ck_assert_str_eq(buf, "prefix198552.9216486895suffix");
|
|
|
|
|
ck_assert_str_eq(buf, "");
|
|
|
|
|
}
|
|
|
|
|
END_TEST
|
|
|
|
|
|
|
|
|
|
START_TEST(test_bignum_sqrt) {
|
|
|
|
|
uint32_t quadratic_residua[] = {
|
|
|
|
|
1, 2, 4, 8, 9, 11, 15, 16, 17, 18, 19, 21, 22, 25, 29,
|
|
|
|
|
30, 31, 32, 34, 35, 36, 38, 39, 42, 43, 44, 47, 49, 50, 58,
|
|
|
|
|
59, 60, 61, 62, 64, 65, 67, 68, 69, 70, 71, 72, 76, 78, 81,
|
|
|
|
|
83, 84, 86, 88, 91, 94, 98, 99, 100, 103, 107, 111, 115, 116, 118,
|
|
|
|
|
120, 121, 122, 123, 124, 127, 128, 130, 131, 134, 135, 136, 137, 138, 139,
|
|
|
|
|
140, 142, 144, 149, 152, 153, 156, 159, 161, 162, 165, 166, 167, 168, 169,
|
|
|
|
|
171, 172, 176, 181, 182, 185, 187, 188, 189, 191, 193, 196, 197, 198, 200,
|
|
|
|
|
205, 206, 209, 214, 219, 222, 223, 225, 229, 230, 231, 232, 233, 236, 237,
|
|
|
|
|
239, 240, 242, 244, 246, 248, 254, 255, 256, 259, 260, 261, 262, 265, 267,
|
|
|
|
|
268, 269, 270, 272, 274, 275, 276, 277, 278, 279, 280, 281, 284, 285, 287,
|
|
|
|
|
288, 289, 291, 293, 298, 299, 303, 304, 306, 311, 312, 315, 318, 319, 322,
|
|
|
|
|
323, 324, 327, 330, 331, 332, 334, 336, 337, 338, 339, 341, 342, 344, 349,
|
|
|
|
|
351, 352, 353, 357, 359, 361, 362, 364, 365, 370, 371, 373, 374, 375, 376,
|
|
|
|
|
378, 379, 382, 383, 385, 386, 387, 389, 392, 394, 395, 396, 399, 400, 409,
|
|
|
|
|
410, 412, 418, 421, 423, 425, 428, 429, 431, 435, 438, 439, 441, 443, 444,
|
|
|
|
|
445, 446, 450, 453, 458, 460, 461, 462, 463, 464, 465, 466, 467, 471, 472,
|
|
|
|
|
473, 474, 475, 478, 479, 480, 481, 484, 485, 487, 488, 489, 492, 493, 496,
|
|
|
|
|
503, 505, 508, 510, 511, 512, 517, 518, 519, 520, 521, 522, 523, 524, 525,
|
|
|
|
|
527, 529, 530, 531, 533, 534, 536, 537, 538, 539, 540, 541, 544, 545, 547,
|
|
|
|
|
548, 549, 550, 551, 552, 553, 554, 556, 557, 558, 560, 562, 563, 565, 568,
|
|
|
|
|
570, 571, 574, 576, 578, 582, 585, 586, 587, 589, 595, 596, 597, 598, 599,
|
|
|
|
|
603, 606, 607, 608, 609, 612, 613, 619, 621, 622, 623, 624, 625, 630, 633,
|
|
|
|
|
636, 638, 639, 644, 645, 646, 648, 649, 651, 653, 654, 660, 662, 663, 664,
|
|
|
|
|
665, 668, 671, 672, 673, 674, 676, 678, 679, 681, 682, 684, 688, 689, 698,
|
|
|
|
|
702, 704, 705, 706, 707, 714, 715, 718, 722, 723, 724, 725, 728, 729, 730,
|
|
|
|
|
731, 733, 735, 737, 740, 741, 742, 746, 747, 748, 750, 751, 752, 753, 755,
|
|
|
|
|
756, 758, 759, 761, 763, 764, 766, 769, 770, 771, 772, 774, 775, 778, 781,
|
|
|
|
|
784, 785, 788, 789, 790, 791, 792, 797, 798, 799, 800, 813, 815, 817, 818,
|
|
|
|
|
819, 820, 823, 824, 833, 836, 841, 842, 846, 849, 850, 851, 856, 857, 858,
|
|
|
|
|
862, 865, 870, 875, 876, 878, 882, 885, 886, 887, 888, 890, 891, 892, 893,
|
|
|
|
|
895, 899, 900, 903, 906, 907, 911, 913, 915, 916, 919, 920, 921, 922, 924,
|
|
|
|
|
926, 927, 928, 930, 931, 932, 934, 937, 939, 942, 943, 944, 946, 948, 949,
|
|
|
|
|
950, 951, 953, 956, 958, 960, 961, 962, 963, 968, 970, 971, 974, 975, 976,
|
|
|
|
|
977, 978, 984, 986, 987, 992, 995, 999};
|
|
|
|
|
|
|
|
|
|
bignum256 a, b;
|
|
|
|
|
|
|
|
|
|
bn_zero(&a);
|
|
|
|
|
b = a;
|
|
|
|
|
bn_sqrt(&b, &secp256k1.prime);
|
|
|
|
|
ck_assert_int_eq(bn_is_equal(&a, &b), 1);
|
|
|
|
|
|
|
|
|
|
bn_one(&a);
|
|
|
|
|
b = a;
|
|
|
|
|
bn_sqrt(&b, &secp256k1.prime);
|
|
|
|
|
ck_assert_int_eq(bn_is_equal(&a, &b), 1);
|
|
|
|
|
|
|
|
|
|
// test some quadratic residua
|
|
|
|
|
for (size_t i = 0; i < sizeof(quadratic_residua) / sizeof(*quadratic_residua);
|
|
|
|
|
i++) {
|
|
|
|
|
bn_read_uint32(quadratic_residua[i], &a);
|
|
|
|
|
b = a;
|
|
|
|
|
bn_sqrt(&b, &secp256k1.prime);
|
|
|
|
|
bn_multiply(&b, &b, &secp256k1.prime);
|
|
|
|
|
bn_mod(&b, &secp256k1.prime);
|
|
|
|
|
ck_assert_int_eq(bn_is_equal(&a, &b), 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
END_TEST
|
|
|
|
|
|
|
|
|
@ -1102,12 +1171,16 @@ START_TEST(test_bignum_divmod) {
|
|
|
|
|
uint32_t r;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
bignum256 a = {{0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff,
|
|
|
|
|
0x3fffffff, 0x3fffffff, 0x3fffffff, 0xffff}};
|
|
|
|
|
bignum256 a;
|
|
|
|
|
uint32_t ar[] = {15, 14, 55, 29, 44, 24, 53, 49, 18, 55, 2, 28, 5, 4, 12,
|
|
|
|
|
43, 18, 37, 28, 14, 30, 46, 12, 11, 17, 10, 10, 13, 24, 45,
|
|
|
|
|
4, 33, 44, 42, 2, 46, 34, 43, 45, 28, 21, 18, 13, 17};
|
|
|
|
|
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
|
|
|
|
|
&a);
|
|
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
|
while (!bn_is_zero(&a) && i < 44) {
|
|
|
|
|
bn_divmod58(&a, &r);
|
|
|
|
@ -1116,12 +1189,15 @@ START_TEST(test_bignum_divmod) {
|
|
|
|
|
}
|
|
|
|
|
ck_assert_int_eq(i, 44);
|
|
|
|
|
|
|
|
|
|
bignum256 b = {{0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff,
|
|
|
|
|
0x3fffffff, 0x3fffffff, 0x3fffffff, 0xffff}};
|
|
|
|
|
bignum256 b;
|
|
|
|
|
uint32_t br[] = {935, 639, 129, 913, 7, 584, 457, 39, 564,
|
|
|
|
|
640, 665, 984, 269, 853, 907, 687, 8, 985,
|
|
|
|
|
570, 423, 195, 316, 237, 89, 792, 115};
|
|
|
|
|
|
|
|
|
|
bn_read_be(
|
|
|
|
|
fromhex(
|
|
|
|
|
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
|
|
|
|
|
&b);
|
|
|
|
|
i = 0;
|
|
|
|
|
while (!bn_is_zero(&b) && i < 26) {
|
|
|
|
|
bn_divmod1000(&b, &r);
|
|
|
|
@ -5904,7 +5980,8 @@ static void test_codepoints_curve(const ecdsa_curve *curve) {
|
|
|
|
|
for (i = 0; i < 64; i++) {
|
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
|
|
|
bn_zero(&a);
|
|
|
|
|
a.val[(4 * i) / 30] = (uint32_t)(2 * j + 1) << (4 * i % 30);
|
|
|
|
|
a.val[(4 * i) / BN_BITS_PER_LIMB] = (uint32_t)(2 * j + 1)
|
|
|
|
|
<< (4 * i % BN_BITS_PER_LIMB);
|
|
|
|
|
bn_normalize(&a);
|
|
|
|
|
// note that this is not a trivial test. We add 64 curve
|
|
|
|
|
// points in the table to get that particular curve point.
|
|
|
|
@ -8670,6 +8747,7 @@ Suite *test_suite(void) {
|
|
|
|
|
tcase_add_test(tc, test_bignum_is_less);
|
|
|
|
|
tcase_add_test(tc, test_bignum_format);
|
|
|
|
|
tcase_add_test(tc, test_bignum_format_uint64);
|
|
|
|
|
tcase_add_test(tc, test_bignum_sqrt);
|
|
|
|
|
suite_add_tcase(s, tc);
|
|
|
|
|
|
|
|
|
|
tc = tcase_create("base32");
|
|
|
|
|