mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-02 19:40:57 +00:00
feat(crypto): introduce bn_read_be_512
This commit is contained in:
parent
93bb4c2e35
commit
4a686d9231
@ -107,6 +107,30 @@ void bn_read_be(const uint8_t *in_number, bignum256 *out_number) {
|
|||||||
out_number->val[BN_LIMBS - 1] = temp;
|
out_number->val[BN_LIMBS - 1] = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// out_number = (bignum512) in_number
|
||||||
|
// Assumes in_number is a raw bigendian 512-bit number
|
||||||
|
// Guarantees out_number is normalized
|
||||||
|
void bn_read_be_512(const uint8_t *in_number, bignum512 *out_number) {
|
||||||
|
bignum256 lower = {0}, upper = {0};
|
||||||
|
|
||||||
|
bn_read_be(in_number + 32, &lower);
|
||||||
|
bn_read_be(in_number, &upper);
|
||||||
|
|
||||||
|
const int shift_length = BN_BITS_PER_LIMB * BN_LIMBS - 256;
|
||||||
|
uint32_t shift = upper.val[0] & ((1 << shift_length) - 1);
|
||||||
|
for (int i = 0; i < shift_length; i++) {
|
||||||
|
bn_rshift(&upper);
|
||||||
|
}
|
||||||
|
lower.val[BN_LIMBS - 1] |= shift << (BN_BITS_PER_LIMB - shift_length);
|
||||||
|
|
||||||
|
for (int i = 0; i < BN_LIMBS; i++) {
|
||||||
|
out_number->val[i] = lower.val[i];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < BN_LIMBS; i++) {
|
||||||
|
out_number->val[i + BN_LIMBS] = upper.val[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// out_number = (256BE) in_number
|
// out_number = (256BE) in_number
|
||||||
// Assumes in_number < 2**256
|
// Assumes in_number < 2**256
|
||||||
// Guarantess out_number is a raw bigendian 256-bit number
|
// Guarantess out_number is a raw bigendian 256-bit number
|
||||||
|
@ -74,6 +74,7 @@ static inline void write_le(uint8_t *data, uint32_t x) {
|
|||||||
|
|
||||||
void bn_copy_lower(const bignum512 *x, bignum256 *y);
|
void bn_copy_lower(const bignum512 *x, bignum256 *y);
|
||||||
void bn_read_be(const uint8_t *in_number, bignum256 *out_number);
|
void bn_read_be(const uint8_t *in_number, bignum256 *out_number);
|
||||||
|
void bn_read_be_512(const uint8_t *in_number, bignum512 *out_number);
|
||||||
void bn_write_be(const bignum256 *in_number, uint8_t *out_number);
|
void bn_write_be(const bignum256 *in_number, uint8_t *out_number);
|
||||||
void bn_read_le(const uint8_t *in_number, bignum256 *out_number);
|
void bn_read_le(const uint8_t *in_number, bignum256 *out_number);
|
||||||
void bn_write_le(const bignum256 *in_number, uint8_t *out_number);
|
void bn_write_le(const bignum256 *in_number, uint8_t *out_number);
|
||||||
|
@ -216,6 +216,13 @@ def assert_bn_read_be(in_number):
|
|||||||
assert bignum_is_normalised(bn_out_number)
|
assert bignum_is_normalised(bn_out_number)
|
||||||
assert out_number == in_number
|
assert out_number == in_number
|
||||||
|
|
||||||
|
|
||||||
|
def assert_bn_read_be_512(in_number):
|
||||||
|
raw_in_number = integer_to_raw_number512(in_number, "big")
|
||||||
|
bn_out_number = bignum512()
|
||||||
|
lib.bn_read_be_512(raw_in_number, bn_out_number)
|
||||||
|
out_number = bignum512_to_int(bn_out_number)
|
||||||
|
|
||||||
assert bignum_is_normalised(bn_out_number)
|
assert bignum_is_normalised(bn_out_number)
|
||||||
assert out_number == in_number
|
assert out_number == in_number
|
||||||
|
|
||||||
@ -760,6 +767,10 @@ def test_bn_read_be(r):
|
|||||||
assert_bn_read_be(r.rand_int_256())
|
assert_bn_read_be(r.rand_int_256())
|
||||||
|
|
||||||
|
|
||||||
|
def test_bn_read_be_512(r):
|
||||||
|
assert_bn_read_be_512(r.rand_int_512())
|
||||||
|
|
||||||
|
|
||||||
def test_bn_read_le(r):
|
def test_bn_read_le(r):
|
||||||
assert_bn_read_le(r.rand_int_256())
|
assert_bn_read_le(r.rand_int_256())
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user