From 98bab6877a2f06b9b6eae1d56ece59a93767caab Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 17 May 2018 09:34:16 +1200 Subject: [PATCH] Add read_le and write_le to PrimeFieldRepr --- src/lib.rs | 22 ++++++++++++++++++++++ src/tests/repr.rs | 43 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 481ff26..930d806 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -407,6 +407,28 @@ pub trait PrimeFieldRepr: Ok(()) } + + /// Writes this `PrimeFieldRepr` as a little endian integer. + fn write_le(&self, mut writer: W) -> io::Result<()> { + use byteorder::{LittleEndian, WriteBytesExt}; + + for digit in self.as_ref().iter() { + writer.write_u64::(*digit)?; + } + + Ok(()) + } + + /// Reads a little endian integer into this representation. + fn read_le(&mut self, mut reader: R) -> io::Result<()> { + use byteorder::{LittleEndian, ReadBytesExt}; + + for digit in self.as_mut().iter_mut() { + *digit = reader.read_u64::()?; + } + + Ok(()) + } } #[derive(Debug, PartialEq)] diff --git a/src/tests/repr.rs b/src/tests/repr.rs index 3b9d76d..681a476 100644 --- a/src/tests/repr.rs +++ b/src/tests/repr.rs @@ -12,13 +12,46 @@ fn random_encoding_tests() { for _ in 0..1000 { let r = R::rand(&mut rng); - let mut rdecoded = R::default(); - let mut v: Vec = vec![]; - r.write_be(&mut v).unwrap(); - rdecoded.read_be(&v[0..]).unwrap(); + // Big endian + { + let mut rdecoded = R::default(); - assert_eq!(r, rdecoded); + let mut v: Vec = vec![]; + r.write_be(&mut v).unwrap(); + rdecoded.read_be(&v[0..]).unwrap(); + + assert_eq!(r, rdecoded); + } + + // Little endian + { + let mut rdecoded = R::default(); + + let mut v: Vec = vec![]; + r.write_le(&mut v).unwrap(); + rdecoded.read_le(&v[0..]).unwrap(); + + assert_eq!(r, rdecoded); + } + + { + let mut rdecoded_le = R::default(); + let mut rdecoded_be_flip = R::default(); + + let mut v: Vec = vec![]; + r.write_le(&mut v).unwrap(); + + // This reads in little-endian, so we are done. + rdecoded_le.read_le(&v[..]).unwrap(); + + // This reads in big-endian, so we perform a swap of the + // bytes beforehand. + let v: Vec = v.into_iter().rev().collect(); + rdecoded_be_flip.read_be(&v[..]).unwrap(); + + assert_eq!(rdecoded_le, rdecoded_be_flip); + } } }