From 3734552cf3cb352390e260f65435b6a4f9573277 Mon Sep 17 00:00:00 2001 From: cdetrio Date: Thu, 7 Sep 2017 10:50:56 +0200 Subject: [PATCH 1/3] convert from Montgomery representation --- src/fields/fp.rs | 6 ++++++ src/lib.rs | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/fields/fp.rs b/src/fields/fp.rs index bbbfeada..6539d5e6 100644 --- a/src/fields/fp.rs +++ b/src/fields/fp.rs @@ -80,6 +80,12 @@ macro_rules! field_impl { U256($modulus) } + #[inline] + #[allow(dead_code)] + pub fn inv(&self) -> u64 { + $inv + } + pub fn raw(&self) -> &U256 { &self.0 } diff --git a/src/lib.rs b/src/lib.rs index 984c1334..00e5e206 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -92,8 +92,11 @@ impl Fq { .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) - } + let mut a: arith::U256 = self.0.into(); + // convert from Montgomery representation + a.mul(&fields::Fq::one().raw(), &fields::Fq::modulus(), self.0.inv()); + a.to_big_endian(slice).map_err(|_| FieldError::InvalidSliceLength) + } } impl Add for Fq { From 7002225d7648c1f5072f10e8f70b8e2efd5b0c2a Mon Sep 17 00:00:00 2001 From: cdetrio Date: Thu, 7 Sep 2017 10:58:43 +0200 Subject: [PATCH 2/3] fix for ecmul scalar factors --- src/fields/fp.rs | 10 ++++++++++ src/lib.rs | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/fields/fp.rs b/src/fields/fp.rs index 6539d5e6..625be0c0 100644 --- a/src/fields/fp.rs +++ b/src/fields/fp.rs @@ -69,6 +69,16 @@ macro_rules! field_impl { } } + /// Converts a U256 to an Fr regardless of modulus. + pub fn new_mul_factor(mut a: U256) -> Option { + if true { + a.mul(&U256($rsquared), &U256($modulus), $inv); + Some($name(a)) + } else { + None + } + } + pub fn interpret(buf: &[u8; 64]) -> Self { $name::new(U512::interpret(buf).divrem(&U256($modulus)).1).unwrap() } diff --git a/src/lib.rs b/src/lib.rs index 00e5e206..2ff09d36 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,7 +30,7 @@ impl Fr { pub fn from_slice(slice: &[u8]) -> Result { arith::U256::from_slice(slice) .map_err(|_| FieldError::InvalidSliceLength) // todo: maybe more sensful error handling - .and_then(|x| fields::Fr::new(x).ok_or(FieldError::NotMember)) + .and_then(|x| fields::Fr::new_mul_factor(x).ok_or(FieldError::NotMember)) .map(|x| Fr(x)) } pub fn to_big_endian(&self, slice: &mut [u8]) -> Result<(), FieldError> { From 624c60be56b6ee88272020b24d1291ba5cc67aab Mon Sep 17 00:00:00 2001 From: cdetrio Date: Fri, 8 Sep 2017 07:40:09 +0200 Subject: [PATCH 3/3] public arith module --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 2ff09d36..84ca22d3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ extern crate rand; extern crate rustc_serialize; extern crate byteorder; -mod arith; +pub mod arith; mod fields; mod groups;