use crate::cyclic_group::IsGroup;
use crate::elliptic_curve::traits::IsEllipticCurve;
use crate::field::element::FieldElement;
use core::fmt::Debug;
pub trait IsShortWeierstrass: IsEllipticCurve + Clone + Debug {
fn a() -> FieldElement<Self::BaseField>;
fn b() -> FieldElement<Self::BaseField>;
fn defining_equation(
x: &FieldElement<Self::BaseField>,
y: &FieldElement<Self::BaseField>,
) -> FieldElement<Self::BaseField> {
y.square() - ((x.square() + Self::a()) * x + Self::b())
}
fn defining_equation_projective(
x: &FieldElement<Self::BaseField>,
y: &FieldElement<Self::BaseField>,
z: &FieldElement<Self::BaseField>,
) -> FieldElement<Self::BaseField> {
y.square() * z - ((x.square() + Self::a() * z.square()) * x + Self::b() * z.square() * z)
}
fn defining_equation_jacobian(
x: &FieldElement<Self::BaseField>,
y: &FieldElement<Self::BaseField>,
z: &FieldElement<Self::BaseField>,
) -> FieldElement<Self::BaseField> {
y.square()
- ((x.square() + Self::a() * z.square().square()) * x
+ Self::b() * z.square().square() * z.square())
}
}
pub trait Compress {
type G1Point: IsGroup;
type G2Point: IsGroup;
type G1Compressed;
type G2Compressed;
type Error;
#[cfg(feature = "alloc")]
fn compress_g1_point(point: &Self::G1Point) -> Self::G1Compressed;
#[cfg(feature = "alloc")]
fn compress_g2_point(point: &Self::G2Point) -> Self::G2Compressed;
fn decompress_g1_point(input_bytes: &mut [u8]) -> Result<Self::G1Point, Self::Error>;
fn decompress_g2_point(input_bytes: &mut [u8]) -> Result<Self::G2Point, Self::Error>;
}