mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-22 22:38:08 +00:00
bignum: introduce write uint32/uint64
This commit is contained in:
parent
7956c2f2f1
commit
8581614d66
16
bignum.h
16
bignum.h
@ -58,6 +58,22 @@ void bn_read_uint32(uint32_t in_number, bignum256 *out_number);
|
|||||||
|
|
||||||
void bn_read_uint64(uint64_t in_number, bignum256 *out_number);
|
void bn_read_uint64(uint64_t in_number, bignum256 *out_number);
|
||||||
|
|
||||||
|
static inline uint32_t bn_write_uint32(const bignum256 *in_number)
|
||||||
|
{
|
||||||
|
return in_number->val[0] | (in_number->val[1] << 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t bn_write_uint64(const bignum256 *in_number)
|
||||||
|
{
|
||||||
|
uint64_t tmp;
|
||||||
|
tmp = in_number->val[2];
|
||||||
|
tmp <<= 30;
|
||||||
|
tmp |= in_number->val[1];
|
||||||
|
tmp <<= 30;
|
||||||
|
tmp |= in_number->val[0];
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
// copies number a to b
|
// copies number a to b
|
||||||
static inline void bn_copy(const bignum256 *a, bignum256 *b) {
|
static inline void bn_copy(const bignum256 *a, bignum256 *b) {
|
||||||
*b = *a;
|
*b = *a;
|
||||||
|
42
tests.c
42
tests.c
@ -233,6 +233,46 @@ START_TEST(test_bignum_read_uint64)
|
|||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_bignum_write_uint32)
|
||||||
|
{
|
||||||
|
bignum256 a;
|
||||||
|
|
||||||
|
// lowest 30 bits set
|
||||||
|
bn_read_be(fromhex("000000000000000000000000000000000000000000000000000000003fffffff"), &a);
|
||||||
|
ck_assert_int_eq(bn_write_uint32(&a), 0x3fffffff);
|
||||||
|
|
||||||
|
// bit 31 set
|
||||||
|
bn_read_be(fromhex("0000000000000000000000000000000000000000000000000000000040000000"), &a);
|
||||||
|
ck_assert_int_eq(bn_write_uint32(&a), 0x40000000);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
|
START_TEST(test_bignum_write_uint64)
|
||||||
|
{
|
||||||
|
bignum256 a;
|
||||||
|
|
||||||
|
// lowest 30 bits set
|
||||||
|
bn_read_be(fromhex("000000000000000000000000000000000000000000000000000000003fffffff"), &a);
|
||||||
|
ck_assert_int_eq(bn_write_uint64(&a), 0x3fffffff);
|
||||||
|
|
||||||
|
// bit 31 set
|
||||||
|
bn_read_be(fromhex("0000000000000000000000000000000000000000000000000000000040000000"), &a);
|
||||||
|
ck_assert_int_eq(bn_write_uint64(&a), 0x40000000);
|
||||||
|
|
||||||
|
// bit 33 set
|
||||||
|
bn_read_be(fromhex("0000000000000000000000000000000000000000000000000000000100000000"), &a);
|
||||||
|
ck_assert_int_eq(bn_write_uint64(&a), 0x100000000LL);
|
||||||
|
|
||||||
|
// bit 61 set
|
||||||
|
bn_read_be(fromhex("0000000000000000000000000000000000000000000000002000000000000000"), &a);
|
||||||
|
ck_assert_int_eq(bn_write_uint64(&a), 0x2000000000000000LL);
|
||||||
|
|
||||||
|
// all 64 bits set
|
||||||
|
bn_read_be(fromhex("000000000000000000000000000000000000000000000000ffffffffffffffff"), &a);
|
||||||
|
ck_assert_int_eq(bn_write_uint64(&a), 0xffffffffffffffffLL);
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
START_TEST(test_bignum_copy)
|
START_TEST(test_bignum_copy)
|
||||||
{
|
{
|
||||||
bignum256 a;
|
bignum256 a;
|
||||||
@ -2547,6 +2587,8 @@ Suite *test_suite(void)
|
|||||||
tcase_add_test(tc, test_bignum_write_le);
|
tcase_add_test(tc, test_bignum_write_le);
|
||||||
tcase_add_test(tc, test_bignum_read_uint32);
|
tcase_add_test(tc, test_bignum_read_uint32);
|
||||||
tcase_add_test(tc, test_bignum_read_uint64);
|
tcase_add_test(tc, test_bignum_read_uint64);
|
||||||
|
tcase_add_test(tc, test_bignum_write_uint32);
|
||||||
|
tcase_add_test(tc, test_bignum_write_uint64);
|
||||||
tcase_add_test(tc, test_bignum_copy);
|
tcase_add_test(tc, test_bignum_copy);
|
||||||
tcase_add_test(tc, test_bignum_is_even);
|
tcase_add_test(tc, test_bignum_is_even);
|
||||||
tcase_add_test(tc, test_bignum_is_odd);
|
tcase_add_test(tc, test_bignum_is_odd);
|
||||||
|
Loading…
Reference in New Issue
Block a user