From e749d4577aea188bd3520544cedf97a18547d2d3 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Wed, 22 Mar 2017 13:56:28 +0300 Subject: [PATCH] to big endian for elments --- src/arith.rs | 25 +++++++++++++++++++++++++ src/fields/fp.rs | 4 ++++ src/lib.rs | 8 +++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/arith.rs b/src/arith.rs index 8560d8f..89d09f3 100644 --- a/src/arith.rs +++ b/src/arith.rs @@ -195,6 +195,16 @@ impl U256 { Ok(U256(n)) } + pub fn to_big_endian(&self, s: &mut [u8]) -> Result<(), Error> { + if s.len() != 32 { return Err(Error::InvalidLength { expected: 32, actual: s.len() }); } + + for (l, i) in (0..4).rev().zip((0..4).map(|i| i * 8)) { + BigEndian::write_u64(&mut s[i..], self.0[l]); + } + + Ok(()) + } + #[inline] pub fn zero() -> U256 { U256([0, 0, 0, 0]) @@ -540,6 +550,21 @@ fn from_slice() { assert_eq!(num, tst); } +#[test] +fn to_big_endian() { + let num = U256::one(); + let mut s = [0u8; 32]; + + num.to_big_endian(&mut s).expect("U256 should convert to bytes ok in `to_big_endian` test"); + assert_eq!( + s, + [ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, + ] + ); +} + #[test] fn testing_divrem() { let rng = &mut ::rand::thread_rng(); diff --git a/src/fields/fp.rs b/src/fields/fp.rs index c15c7a4..bbbfead 100644 --- a/src/fields/fp.rs +++ b/src/fields/fp.rs @@ -79,6 +79,10 @@ macro_rules! field_impl { pub fn modulus() -> U256 { U256($modulus) } + + pub fn raw(&self) -> &U256 { + &self.0 + } } impl FieldElement for $name { diff --git a/src/lib.rs b/src/lib.rs index 353cbab..e237ee6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,7 +32,10 @@ impl Fr { .map_err(|_| FieldError::InvalidSliceLength) // todo: maybe more sensful error handling .and_then(|x| fields::Fr::new(x).ok_or(FieldError::NotMember)) .map(|x| Fr(x)) - } + } + pub fn to_big_endian(&self, slice: &mut [u8]) -> Result<(), FieldError> { + self.0.raw().to_big_endian(slice).map_err(|_| FieldError::InvalidSliceLength) + } } impl Add for Fr { @@ -86,6 +89,9 @@ impl Fq { .and_then(|x| fields::Fq::new(x).ok_or(FieldError::NotMember)) .map(|x| Fq(x)) } + pub fn to_big_endian(&self, slice: &mut [u8]) -> Result<(), FieldError> { + self.0.raw().to_big_endian(slice).map_err(|_| FieldError::InvalidSliceLength) + } } impl Add for Fq {