diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fea405..83c2583 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to Rust's notion of [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## Added +- Implementations of `group::cofactor::{CofactorCurve, CofactorCurveAffine}` for + Pallas and Vesta, enabling them to be used in cofactor-aware protocols that + also want to leverage the affine point representation. ## [0.1.0] - 2021-06-01 Initial release! diff --git a/src/curves.rs b/src/curves.rs index 047c799..e784902 100644 --- a/src/curves.rs +++ b/src/curves.rs @@ -7,7 +7,7 @@ use core::iter::Sum; use core::ops::{Add, Mul, Neg, Sub}; use ff::Field; use group::{ - cofactor::CofactorGroup, + cofactor::{CofactorCurve, CofactorGroup}, prime::{PrimeCurve, PrimeCurveAffine, PrimeGroup}, Curve as _, Group as _, GroupEncoding, }; @@ -218,6 +218,10 @@ macro_rules! new_curve_impl { type Affine = $name_affine; } + impl CofactorCurve for $name { + type Affine = $name_affine; + } + impl GroupEncoding for $name { type Repr = [u8; 32]; @@ -594,6 +598,27 @@ macro_rules! new_curve_impl { } } + impl group::cofactor::CofactorCurveAffine for $name_affine { + type Curve = $name; + type Scalar = $scalar; + + fn identity() -> Self { + ::identity() + } + + fn generator() -> Self { + ::generator() + } + + fn is_identity(&self) -> Choice { + ::is_identity(self) + } + + fn to_curve(&self) -> Self::Curve { + ::to_curve(self) + } + } + impl GroupEncoding for $name_affine { type Repr = [u8; 32];