Introduce Group for generic group operations.

This commit is contained in:
Sean Bowe 2017-05-07 18:15:33 -06:00
parent 56c75c0c8a
commit 1434ad7b28
3 changed files with 35 additions and 2 deletions

View File

@ -43,6 +43,18 @@ macro_rules! curve_impl {
} }
} }
impl Group<$engine> for $name {
fn group_mul_assign(&mut self, e: &$engine, scalar: &$scalarfield) {
self.mul_assign(e, scalar);
}
fn group_add_assign(&mut self, e: &$engine, other: &Self) {
self.add_assign(e, other);
}
fn group_sub_assign(&mut self, e: &$engine, other: &Self) {
self.sub_assign(e, other);
}
}
impl CurveAffine<$engine, $name> for $name_affine { impl CurveAffine<$engine, $name> for $name_affine {
type Uncompressed = $name_uncompressed; type Uncompressed = $name_uncompressed;

View File

@ -5,6 +5,7 @@ use std::borrow::Borrow;
use super::{ use super::{
WindowTable, WindowTable,
Engine, Engine,
Group,
Curve, Curve,
CurveAffine, CurveAffine,
CurveRepresentation, CurveRepresentation,
@ -95,6 +96,18 @@ fp_impl!(
inv = 0xfffffffeffffffff inv = 0xfffffffeffffffff
); );
impl Group<Bls381> for Fr {
fn group_mul_assign(&mut self, e: &Bls381, scalar: &Fr) {
self.mul_assign(e, scalar);
}
fn group_add_assign(&mut self, e: &Bls381, other: &Self) {
self.add_assign(e, other);
}
fn group_sub_assign(&mut self, e: &Bls381, other: &Self) {
self.sub_assign(e, other);
}
}
curve_impl!(Bls381, G1, G1Affine, G1Affine, G1Uncompressed, G1Params, g1params, Fq, Fr); curve_impl!(Bls381, G1, G1Affine, G1Affine, G1Uncompressed, G1Params, g1params, Fq, Fr);
curve_impl!(Bls381, G2, G2Affine, G2Prepared, G2Uncompressed, G2Params, g2params, Fq2, Fr); curve_impl!(Bls381, G2, G2Affine, G2Prepared, G2Uncompressed, G2Params, g2params, Fq2, Fr);

View File

@ -46,13 +46,21 @@ pub trait Engine: Sized + Clone
fn batch_baseexp<G: Curve<Self>, S: AsRef<[Self::Fr]>>(&self, table: &WindowTable<Self, G, Vec<G>>, scalars: S) -> Vec<G::Affine>; fn batch_baseexp<G: Curve<Self>, S: AsRef<[Self::Fr]>>(&self, table: &WindowTable<Self, G, Vec<G>>, scalars: S) -> Vec<G::Affine>;
} }
pub trait Group<E: Engine>
{
fn group_mul_assign(&mut self, &E, scalar: &E::Fr);
fn group_add_assign(&mut self, &E, other: &Self);
fn group_sub_assign(&mut self, &E, other: &Self);
}
pub trait Curve<E: Engine>: Sized + pub trait Curve<E: Engine>: Sized +
Copy + Copy +
Clone + Clone +
Send + Send +
Sync + Sync +
fmt::Debug + fmt::Debug +
'static 'static +
Group<E>
{ {
type Affine: CurveAffine<E, Self>; type Affine: CurveAffine<E, Self>;
type Prepared: Clone + Send + Sync + 'static; type Prepared: Clone + Send + Sync + 'static;
@ -193,7 +201,7 @@ pub trait PrimeField<E: Engine>: SqrtField<E> + Convert<[u64], E>
fn capacity(&E) -> usize; fn capacity(&E) -> usize;
} }
pub trait SnarkField<E: Engine>: PrimeField<E> pub trait SnarkField<E: Engine>: PrimeField<E> + Group<E>
{ {
fn s(&E) -> u64; fn s(&E) -> u64;
fn multiplicative_generator(&E) -> Self; fn multiplicative_generator(&E) -> Self;