mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-22 14:28:07 +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);
|
||||
|
||||
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
|
||||
static inline void bn_copy(const bignum256 *a, bignum256 *b) {
|
||||
*b = *a;
|
||||
|
42
tests.c
42
tests.c
@ -233,6 +233,46 @@ START_TEST(test_bignum_read_uint64)
|
||||
}
|
||||
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)
|
||||
{
|
||||
bignum256 a;
|
||||
@ -2547,6 +2587,8 @@ Suite *test_suite(void)
|
||||
tcase_add_test(tc, test_bignum_write_le);
|
||||
tcase_add_test(tc, test_bignum_read_uint32);
|
||||
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_is_even);
|
||||
tcase_add_test(tc, test_bignum_is_odd);
|
||||
|
Loading…
Reference in New Issue
Block a user