mirror of
https://github.com/saymrwulf/pasta_curves-source.git
synced 2026-09-06 20:20:34 +00:00
pasta: Split halo2-specific curve-specific logic into a separate macro
This commit is contained in:
parent
627d729836
commit
81a7936d99
1 changed files with 55 additions and 48 deletions
|
|
@ -55,7 +55,7 @@ macro_rules! new_curve_impl {
|
||||||
type Scalar = $scalar;
|
type Scalar = $scalar;
|
||||||
type Base = $base;
|
type Base = $base;
|
||||||
|
|
||||||
impl_projective_curve_specific!($name, $name_affine, $iso_affine, $base, $curve_type);
|
impl_projective_curve_specific!($name, $base, $curve_type);
|
||||||
|
|
||||||
fn zero() -> Self {
|
fn zero() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
|
@ -85,6 +85,8 @@ macro_rules! new_curve_impl {
|
||||||
$name_affine::conditional_select(&tmp, &$name_affine::zero(), zinv.ct_is_zero())
|
$name_affine::conditional_select(&tmp, &$name_affine::zero(), zinv.ct_is_zero())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl_projective_curve_ext!($name, $name_affine, $iso_affine, $base, $curve_type);
|
||||||
|
|
||||||
fn a() -> Self::Base {
|
fn a() -> Self::Base {
|
||||||
$name::curve_constant_a()
|
$name::curve_constant_a()
|
||||||
}
|
}
|
||||||
|
|
@ -676,32 +678,7 @@ macro_rules! new_curve_impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! impl_projective_curve_specific {
|
macro_rules! impl_projective_curve_specific {
|
||||||
($name:ident, $name_affine:ident, $iso_affine:ident, $base:ident, special_a0_b5) => {
|
($name:ident, $base:ident, special_a0_b5) => {
|
||||||
fn hash_to_curve<'a>(domain_prefix: &'a str) -> Box<dyn Fn(&[u8]) -> Self + 'a> {
|
|
||||||
use super::hashtocurve;
|
|
||||||
|
|
||||||
Box::new(move |message| {
|
|
||||||
let mut us = [Field::zero(); 2];
|
|
||||||
hashtocurve::hash_to_field($name_affine::CURVE_ID, domain_prefix, message, &mut us);
|
|
||||||
let q0 = hashtocurve::map_to_curve_simple_swu::<$base, $name_affine, $iso_affine>(
|
|
||||||
&us[0],
|
|
||||||
$name::THETA,
|
|
||||||
$name::Z,
|
|
||||||
);
|
|
||||||
let q1 = hashtocurve::map_to_curve_simple_swu::<$base, $name_affine, $iso_affine>(
|
|
||||||
&us[1],
|
|
||||||
$name::THETA,
|
|
||||||
$name::Z,
|
|
||||||
);
|
|
||||||
let r = q0 + &q1;
|
|
||||||
debug_assert!(bool::from(r.is_on_curve()));
|
|
||||||
hashtocurve::iso_map::<$base, $name_affine, $iso_affine>(
|
|
||||||
&r,
|
|
||||||
&$name::ISOGENY_CONSTANTS,
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn one() -> Self {
|
fn one() -> Self {
|
||||||
// NOTE: This is specific to b = 5
|
// NOTE: This is specific to b = 5
|
||||||
|
|
||||||
|
|
@ -715,16 +692,6 @@ macro_rules! impl_projective_curve_specific {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Apply the curve endomorphism by multiplying the x-coordinate
|
|
||||||
/// by an element of multiplicative order 3.
|
|
||||||
fn endo(&self) -> Self {
|
|
||||||
$name {
|
|
||||||
x: self.x * $base::ZETA,
|
|
||||||
y: self.y,
|
|
||||||
z: self.z,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn double(&self) -> Self {
|
fn double(&self) -> Self {
|
||||||
// http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
|
// http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
|
||||||
//
|
//
|
||||||
|
|
@ -756,22 +723,12 @@ macro_rules! impl_projective_curve_specific {
|
||||||
$name::conditional_select(&tmp, &$name::zero(), self.is_zero())
|
$name::conditional_select(&tmp, &$name::zero(), self.is_zero())
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
($name:ident, $name_affine:ident, $iso_affine:ident, $base:ident, general) => {
|
($name:ident, $base:ident, general) => {
|
||||||
/// Unimplemented: hashing to this curve is not supported
|
|
||||||
fn hash_to_curve<'a>(_domain_prefix: &'a str) -> Box<dyn Fn(&[u8]) -> Self + 'a> {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Unimplemented: there is no standard generator for this curve.
|
/// Unimplemented: there is no standard generator for this curve.
|
||||||
fn one() -> Self {
|
fn one() -> Self {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Unimplemented: no endomorphism is supported for this curve.
|
|
||||||
fn endo(&self) -> Self {
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn double(&self) -> Self {
|
fn double(&self) -> Self {
|
||||||
// http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-2007-bl
|
// http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-2007-bl
|
||||||
//
|
//
|
||||||
|
|
@ -801,6 +758,56 @@ macro_rules! impl_projective_curve_specific {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! impl_projective_curve_ext {
|
||||||
|
($name:ident, $name_affine:ident, $iso_affine:ident, $base:ident, special_a0_b5) => {
|
||||||
|
fn hash_to_curve<'a>(domain_prefix: &'a str) -> Box<dyn Fn(&[u8]) -> Self + 'a> {
|
||||||
|
use super::hashtocurve;
|
||||||
|
|
||||||
|
Box::new(move |message| {
|
||||||
|
let mut us = [Field::zero(); 2];
|
||||||
|
hashtocurve::hash_to_field($name_affine::CURVE_ID, domain_prefix, message, &mut us);
|
||||||
|
let q0 = hashtocurve::map_to_curve_simple_swu::<$base, $name_affine, $iso_affine>(
|
||||||
|
&us[0],
|
||||||
|
$name::THETA,
|
||||||
|
$name::Z,
|
||||||
|
);
|
||||||
|
let q1 = hashtocurve::map_to_curve_simple_swu::<$base, $name_affine, $iso_affine>(
|
||||||
|
&us[1],
|
||||||
|
$name::THETA,
|
||||||
|
$name::Z,
|
||||||
|
);
|
||||||
|
let r = q0 + &q1;
|
||||||
|
debug_assert!(bool::from(r.is_on_curve()));
|
||||||
|
hashtocurve::iso_map::<$base, $name_affine, $iso_affine>(
|
||||||
|
&r,
|
||||||
|
&$name::ISOGENY_CONSTANTS,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Apply the curve endomorphism by multiplying the x-coordinate
|
||||||
|
/// by an element of multiplicative order 3.
|
||||||
|
fn endo(&self) -> Self {
|
||||||
|
$name {
|
||||||
|
x: self.x * $base::ZETA,
|
||||||
|
y: self.y,
|
||||||
|
z: self.z,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
($name:ident, $name_affine:ident, $iso_affine:ident, $base:ident, general) => {
|
||||||
|
/// Unimplemented: hashing to this curve is not supported
|
||||||
|
fn hash_to_curve<'a>(_domain_prefix: &'a str) -> Box<dyn Fn(&[u8]) -> Self + 'a> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Unimplemented: no endomorphism is supported for this curve.
|
||||||
|
fn endo(&self) -> Self {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! impl_affine_curve_specific {
|
macro_rules! impl_affine_curve_specific {
|
||||||
($name:ident, $base:ident, special_a0_b5) => {
|
($name:ident, $base:ident, special_a0_b5) => {
|
||||||
fn one() -> Self {
|
fn one() -> Self {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue