1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
use crate::{ mnt6::MNT6Parameters, short_weierstrass_jacobian::{GroupAffine, GroupProjective}, AffineCurve, }; use ark_ff::{bytes::ToBytes, Fp3}; use ark_std::io::{Result as IoResult, Write}; pub type G1Affine<P> = GroupAffine<<P as MNT6Parameters>::G1Parameters>; pub type G1Projective<P> = GroupProjective<<P as MNT6Parameters>::G1Parameters>; #[derive(Derivative)] #[derivative( Copy(bound = "P: MNT6Parameters"), Clone(bound = "P: MNT6Parameters"), Debug(bound = "P: MNT6Parameters"), PartialEq(bound = "P: MNT6Parameters"), Eq(bound = "P: MNT6Parameters") )] pub struct G1Prepared<P: MNT6Parameters> { pub x: P::Fp, pub y: P::Fp, pub x_twist: Fp3<P::Fp3Params>, pub y_twist: Fp3<P::Fp3Params>, } impl<P: MNT6Parameters> From<G1Affine<P>> for G1Prepared<P> { fn from(g1: G1Affine<P>) -> Self { let mut x_twist = P::TWIST; x_twist.mul_assign_by_fp(&g1.x); let mut y_twist = P::TWIST; y_twist.mul_assign_by_fp(&g1.y); Self { x: g1.x, y: g1.y, x_twist, y_twist, } } } impl<P: MNT6Parameters> Default for G1Prepared<P> { fn default() -> Self { Self::from(G1Affine::<P>::prime_subgroup_generator()) } } impl<P: MNT6Parameters> ToBytes for G1Prepared<P> { fn write<W: Write>(&self, mut writer: W) -> IoResult<()> { self.x.write(&mut writer)?; self.y.write(&mut writer)?; self.x_twist.write(&mut writer)?; self.y_twist.write(&mut writer) } }