Migrate to `group::CurveAffine`

This commit is contained in:
Jack Grigg 2023-07-29 18:52:55 +00:00
parent a586b8c2db
commit fb643a4e5e
5 changed files with 19 additions and 43 deletions

View File

@ -72,3 +72,6 @@ sqrt-table = ["alloc", "lazy_static"]
repr-c = []
uninline-portable = []
serde = ["hex", "serde_crate"]
[patch.crates-io]
group = { git = "https://github.com/zkcrypto/group.git", rev = "696c2128529b5a9e18eed46d1da531753695db04" }

View File

@ -33,7 +33,7 @@ fn point_bench<C: CurveExt>(c: &mut Criterion, name: &str) {
for &n in [100, 1000, 10000].iter() {
let input = vec![a; n];
let mut output = vec![C::AffineRepr::default(); n];
let mut output = vec![C::Affine::default(); n];
group.bench_function(format!("point batch_normalize/{}", n), |bencher| {
bencher.iter(|| C::batch_normalize(input.as_slice(), output.as_mut_slice()));
});

View File

@ -24,7 +24,7 @@ pub trait CurveExt:
+ Default
+ ConditionallySelectable
+ ConstantTimeEq
+ From<<Self as PrimeCurve>::Affine>
+ From<Self::Affine>
{
/// The scalar field of this elliptic curve.
type ScalarExt: ff::WithSmallOrderMulGroup<3>;
@ -88,15 +88,13 @@ pub trait CurveExt:
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub trait CurveAffine:
PrimeCurveAffine<
Scalar = <Self as CurveAffine>::ScalarExt,
Curve = <Self as CurveAffine>::CurveExt,
> + Default
+ Add<Output = <Self as PrimeCurveAffine>::Curve>
+ Sub<Output = <Self as PrimeCurveAffine>::Curve>
PrimeCurveAffine<Curve = Self::CurveExt, Scalar = Self::ScalarExt>
+ Default
+ Add<Output = Self::Curve>
+ Sub<Output = Self::Curve>
+ ConditionallySelectable
+ ConstantTimeEq
+ From<<Self as PrimeCurveAffine>::Curve>
+ From<Self::Curve>
{
/// The scalar field of this elliptic curve.
type ScalarExt: ff::WithSmallOrderMulGroup<3> + Ord;

View File

@ -12,8 +12,8 @@ use alloc::boxed::Box;
use ff::{Field, PrimeField};
use group::{
cofactor::{CofactorCurve, CofactorGroup},
prime::{PrimeCurve, PrimeCurveAffine, PrimeGroup},
Curve as _, Group as _, GroupEncoding,
prime::{PrimeCurve, PrimeGroup},
Curve as _, CurveAffine as _, Group as _, GroupEncoding,
};
use rand::RngCore;
use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption};
@ -168,9 +168,9 @@ macro_rules! new_curve_impl {
}
impl group::Curve for $name {
type AffineRepr = $name_affine;
type Affine = $name_affine;
fn batch_normalize(p: &[Self], q: &mut [Self::AffineRepr]) {
fn batch_normalize(p: &[Self], q: &mut [Self::Affine]) {
assert_eq!(p.len(), q.len());
let mut acc = $base::one();
@ -207,7 +207,7 @@ macro_rules! new_curve_impl {
}
}
fn to_affine(&self) -> Self::AffineRepr {
fn to_affine(&self) -> Self::Affine {
let zinv = self.z.invert().unwrap_or($base::zero());
let zinv2 = zinv.square();
let x = self.x * zinv2;
@ -244,13 +244,9 @@ macro_rules! new_curve_impl {
}
}
impl PrimeCurve for $name {
type Affine = $name_affine;
}
impl PrimeCurve for $name {}
impl CofactorCurve for $name {
type Affine = $name_affine;
}
impl CofactorCurve for $name {}
impl GroupEncoding for $name {
type Repr = [u8; 32];
@ -610,7 +606,7 @@ macro_rules! new_curve_impl {
}
}
impl PrimeCurveAffine for $name_affine {
impl group::CurveAffine for $name_affine {
type Curve = $name;
type Scalar = $scalar;
@ -636,27 +632,6 @@ macro_rules! new_curve_impl {
}
}
impl group::cofactor::CofactorCurveAffine for $name_affine {
type Curve = $name;
type Scalar = $scalar;
fn identity() -> Self {
<Self as PrimeCurveAffine>::identity()
}
fn generator() -> Self {
<Self as PrimeCurveAffine>::generator()
}
fn is_identity(&self) -> Choice {
<Self as PrimeCurveAffine>::is_identity(self)
}
fn to_curve(&self) -> Self::Curve {
<Self as PrimeCurveAffine>::to_curve(self)
}
}
impl GroupEncoding for $name_affine {
type Repr = [u8; 32];

View File

@ -137,7 +137,7 @@ mod tests {
use core::fmt::Debug;
use ff::Field;
use group::{prime::PrimeCurveAffine, Curve, Group};
use group::{Curve, CurveAffine, Group};
use rand::SeedableRng;
use rand_xorshift::XorShiftRng;