From e1dfa81ec5a8777ba40c52a018aa2bc8bd0aa198 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sat, 27 Aug 2016 13:07:10 +0100 Subject: [PATCH 1/2] tests: add bn_is_less --- tests.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/tests.c b/tests.c index 45ef27aa0..f2fa3ed3c 100644 --- a/tests.c +++ b/tests.c @@ -111,7 +111,7 @@ START_TEST(test_bignum_write_be) } END_TEST -START_TEST(test_bignum_equal) +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 } }; @@ -333,6 +333,25 @@ START_TEST(test_bignum_bitcount) } END_TEST +START_TEST(test_bignum_is_less) +{ + bignum256 a; + bignum256 b; + + bn_read_uint32(0x1234, &a); + bn_read_uint32(0x8765, &b); + + ck_assert_int_eq(bn_is_less(&a, &b), 1); + ck_assert_int_eq(bn_is_less(&b, &a), 0); + + bn_zero(&a); + bn_read_be(fromhex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), &b); + + ck_assert_int_eq(bn_is_less(&a, &b), 1); + ck_assert_int_eq(bn_is_less(&b, &a), 0); +} +END_TEST + // from https://github.com/bitcoin/bitcoin/blob/master/src/test/data/base58_keys_valid.json START_TEST(test_base58) { @@ -2580,7 +2599,7 @@ Suite *test_suite(void) tc = tcase_create("bignum"); tcase_add_test(tc, test_bignum_read_be); tcase_add_test(tc, test_bignum_write_be); - tcase_add_test(tc, test_bignum_equal); + tcase_add_test(tc, test_bignum_is_equal); tcase_add_test(tc, test_bignum_zero); tcase_add_test(tc, test_bignum_is_zero); tcase_add_test(tc, test_bignum_read_le); @@ -2593,6 +2612,7 @@ Suite *test_suite(void) tcase_add_test(tc, test_bignum_is_even); tcase_add_test(tc, test_bignum_is_odd); tcase_add_test(tc, test_bignum_bitcount); + tcase_add_test(tc, test_bignum_is_less); suite_add_tcase(s, tc); tc = tcase_create("base58"); From 7e7e462be71b72d98b8a0dc387dd95b6b99765aa Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sat, 27 Aug 2016 13:15:20 +0100 Subject: [PATCH 2/2] bignum: introduce bn_one --- bignum.c | 18 ++++++++++++++++-- bignum.h | 2 ++ tests.c | 13 +++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/bignum.c b/bignum.c index 1bd65b605..eed53d22b 100644 --- a/bignum.c +++ b/bignum.c @@ -204,6 +204,20 @@ void bn_zero(bignum256 *a) } } +// sets a bignum to one. +void bn_one(bignum256 *a) +{ + a->val[0] = 1; + a->val[1] = 0; + a->val[2] = 0; + a->val[3] = 0; + a->val[4] = 0; + a->val[5] = 0; + a->val[6] = 0; + a->val[7] = 0; + a->val[8] = 0; +} + // checks that a bignum is zero. // a must be normalized // function is constant time (on some architectures, in particular ARM). @@ -459,7 +473,7 @@ void bn_sqrt(bignum256 *x, const bignum256 *prime) // this method compute x^1/2 = x^(prime+1)/4 uint32_t i, j, limb; bignum256 res, p; - bn_zero(&res); res.val[0] = 1; + bn_one(&res); // compute p = (prime+1)/4 memcpy(&p, prime, sizeof(bignum256)); bn_addi(&p, 1); @@ -498,7 +512,7 @@ void bn_inverse(bignum256 *x, const bignum256 *prime) // this method compute x^-1 = x^(prime-2) uint32_t i, j, limb; bignum256 res; - bn_zero(&res); res.val[0] = 1; + bn_one(&res); for (i = 0; i < 9; i++) { // invariants: // x = old(x)^(2^(i*30)) diff --git a/bignum.h b/bignum.h index 2d7af3c38..451e34489 100644 --- a/bignum.h +++ b/bignum.h @@ -85,6 +85,8 @@ void bn_zero(bignum256 *a); int bn_is_zero(const bignum256 *a); +void bn_one(bignum256 *a); + static inline int bn_is_even(const bignum256 *a) { return (a->val[0] & 1) == 0; } diff --git a/tests.c b/tests.c index f2fa3ed3c..a19e76155 100644 --- a/tests.c +++ b/tests.c @@ -153,6 +153,18 @@ START_TEST(test_bignum_is_zero) } END_TEST +START_TEST(test_bignum_one) +{ + bignum256 a; + bignum256 b; + + bn_read_be(fromhex("0000000000000000000000000000000000000000000000000000000000000001"), &a); + bn_one(&b); + + ck_assert_int_eq(bn_is_equal(&a, &b), 1); +} +END_TEST + START_TEST(test_bignum_read_le) { bignum256 a; @@ -2602,6 +2614,7 @@ Suite *test_suite(void) tcase_add_test(tc, test_bignum_is_equal); tcase_add_test(tc, test_bignum_zero); tcase_add_test(tc, test_bignum_is_zero); + tcase_add_test(tc, test_bignum_one); tcase_add_test(tc, test_bignum_read_le); tcase_add_test(tc, test_bignum_write_le); tcase_add_test(tc, test_bignum_read_uint32);