diff --git a/src/util/endian.rs b/src/util/endian.rs index d4ae5ec4..e7c620f5 100644 --- a/src/util/endian.rs +++ b/src/util/endian.rs @@ -54,6 +54,7 @@ macro_rules! define_le_to_array { define_slice_to_be!(slice_to_u32_be, u32); define_slice_to_be!(slice_to_u64_be, u64); define_be_to_array!(u32_to_array_be, u32, 4); +define_be_to_array!(u64_to_array_be, u64, 8); define_slice_to_le!(slice_to_u16_le, u16); define_slice_to_le!(slice_to_u32_le, u32); define_slice_to_le!(slice_to_u64_le, u64); diff --git a/src/util/uint.rs b/src/util/uint.rs index 314ac6b0..16592727 100644 --- a/src/util/uint.rs +++ b/src/util/uint.rs @@ -102,6 +102,17 @@ macro_rules! construct_uint { $name(slice) } + /// Convert a big integer into a byte array using big-endian encoding + pub fn to_be_bytes(&self) -> [u8; $n_words * 8] { + use super::endian::u64_to_array_be; + let mut res = [0; $n_words * 8]; + for i in 0..$n_words { + let start = i * 8; + res[start..start+8].copy_from_slice(&u64_to_array_be(self.0[$n_words - (i+1)])); + } + res + } + // divmod like operation, returns (quotient, remainder) #[inline] fn div_rem(self, other: Self) -> (Self, Self) { @@ -505,6 +516,16 @@ mod tests { Uint256([0x11fed2bad1c0ffe0, 0xbaadf00ddefaceda, 0xdeafbabe2bedfeed, 0x1badcafedeadbeef])); } + #[test] + pub fn uint_to_be_bytes() { + assert_eq!(Uint128([0xdeafbabe2bedfeed, 0x1badcafedeadbeef]).to_be_bytes(), + [0x1b, 0xad, 0xca, 0xfe, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xaf, 0xba, 0xbe, 0x2b, 0xed, 0xfe, 0xed]); + + assert_eq!(Uint256([0x11fed2bad1c0ffe0, 0xbaadf00ddefaceda, 0xdeafbabe2bedfeed, 0x1badcafedeadbeef]).to_be_bytes(), + [0x1b, 0xad, 0xca, 0xfe, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xaf, 0xba, 0xbe, 0x2b, 0xed, 0xfe, 0xed, + 0xba, 0xad, 0xf0, 0x0d, 0xde, 0xfa, 0xce, 0xda, 0x11, 0xfe, 0xd2, 0xba, 0xd1, 0xc0, 0xff, 0xe0]); + } + #[test] pub fn uint256_arithmetic_test() { let init = Uint256::from_u64(0xDEADBEEFDEADBEEF).unwrap();