Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "pairing"

# Remember to change version string in README.md.
version = "0.14.1"
version = "0.14.2"
authors = ["Sean Bowe <ewillbefull@gmail.com>"]
license = "MIT/Apache-2.0"

Expand Down
22 changes: 22 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,28 @@ pub trait PrimeFieldRepr:

Ok(())
}

/// Writes this `PrimeFieldRepr` as a little endian integer.
fn write_le<W: Write>(&self, mut writer: W) -> io::Result<()> {
use byteorder::{LittleEndian, WriteBytesExt};

for digit in self.as_ref().iter() {
writer.write_u64::<LittleEndian>(*digit)?;
}

Ok(())
}

/// Reads a little endian integer into this representation.
fn read_le<R: Read>(&mut self, mut reader: R) -> io::Result<()> {
use byteorder::{LittleEndian, ReadBytesExt};

for digit in self.as_mut().iter_mut() {
*digit = reader.read_u64::<LittleEndian>()?;
}

Ok(())
}
}

#[derive(Debug, PartialEq)]
Expand Down
43 changes: 38 additions & 5 deletions src/tests/repr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,46 @@ fn random_encoding_tests<R: PrimeFieldRepr>() {

for _ in 0..1000 {
let r = R::rand(&mut rng);
let mut rdecoded = R::default();

let mut v: Vec<u8> = 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<u8> = 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<u8> = 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<u8> = 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<u8> = v.into_iter().rev().collect();
rdecoded_be_flip.read_be(&v[..]).unwrap();

assert_eq!(rdecoded_le, rdecoded_be_flip);
}
}
}

Expand Down