mirror of
https://github.com/pezkuwichain/bizinikiwi-bn.git
synced 2026-07-22 13:16:17 +00:00
Merge pull request #3 from cdetrio/mont-repr-fix
patchy fixes for elliptic pairing precompiles
This commit is contained in:
@@ -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<Self> {
|
||||
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()
|
||||
}
|
||||
@@ -80,6 +90,12 @@ macro_rules! field_impl {
|
||||
U256($modulus)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[allow(dead_code)]
|
||||
pub fn inv(&self) -> u64 {
|
||||
$inv
|
||||
}
|
||||
|
||||
pub fn raw(&self) -> &U256 {
|
||||
&self.0
|
||||
}
|
||||
|
||||
+7
-4
@@ -2,7 +2,7 @@ extern crate rand;
|
||||
extern crate rustc_serialize;
|
||||
extern crate byteorder;
|
||||
|
||||
mod arith;
|
||||
pub mod arith;
|
||||
mod fields;
|
||||
mod groups;
|
||||
|
||||
@@ -30,7 +30,7 @@ impl Fr {
|
||||
pub fn from_slice(slice: &[u8]) -> Result<Self, FieldError> {
|
||||
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> {
|
||||
@@ -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<Fq> for Fq {
|
||||
|
||||
Reference in New Issue
Block a user