@ -1,10 +1,7 @@
use ark_ec ::{
models ::{ ModelParameters , MontgomeryModelParameters , TEModelParameters } ,
short_weierstrass_jacobian ::{
GroupAffine as SWGroupAffine , GroupProjective as SWGroupProjective ,
} ,
twisted_edwards_extended ::{ GroupAffine , GroupProjective } ,
SWModelParameters ,
models ::CurveConfig ,
short_weierstrass ::{ self , SWCurveConfig } ,
twisted_edwards ::{ Affine , MontCurveConfig , Projective , TECurveConfig } ,
} ;
use ark_ff ::{ Field , MontFp } ;
@ -13,11 +10,11 @@ use crate::{Fq, Fr};
#[ cfg(test) ]
mod tests ;
pub type EdwardsAffine = Group Affine< BandersnatchParameters > ;
pub type EdwardsProjective = Group Projective< BandersnatchParameters > ;
pub type EdwardsAffine = Affine < BandersnatchParameters > ;
pub type EdwardsProjective = Projective < BandersnatchParameters > ;
pub type SWAffine = SWGroup Affine< BandersnatchParameters > ;
pub type SWProjective = SWGroup Projective< BandersnatchParameters > ;
pub type SWAffine = short_weierstrass ::Affine < BandersnatchParameters > ;
pub type SWProjective = short_weierstrass ::Projective < BandersnatchParameters > ;
/// `bandersnatch` is a twisted Edwards curve. These curves have equations of
/// the form: ax² + y² = 1 - dx²y².
@ -57,7 +54,7 @@ pub struct BandersnatchParameters;
pub type EdwardsParameters = BandersnatchParameters ;
pub type SWParameters = BandersnatchParameters ;
impl ModelParameters for BandersnatchParameters {
impl CurveConfig for BandersnatchParameters {
type BaseField = Fq ;
type ScalarField = Fr ;
@ -66,28 +63,23 @@ impl ModelParameters for BandersnatchParameters {
/// COFACTOR^(-1) mod r =
/// 9831726595336160714896451345284868594481866920080427688839802480047265754601
const COFACTOR_INV : Fr = MontFp ! (
Fr ,
"9831726595336160714896451345284868594481866920080427688839802480047265754601"
) ;
const COFACTOR_INV : Fr =
MontFp ! ( "9831726595336160714896451345284868594481866920080427688839802480047265754601" ) ;
}
impl TEModelParameters for BandersnatchParameters {
impl TECurveConfig for BandersnatchParameters {
/// COEFF_A = -5
const COEFF_A : Fq = MontFp ! ( Fq , "-5" ) ;
const COEFF_A : Fq = MontFp ! ( "-5" ) ;
/// COEFF_D = (138827208126141220649022263972958607803/
/// 171449701953573178309673572579671231137) mod q
const COEFF_D : Fq = MontFp ! (
Fq ,
"45022363124591815672509500913686876175488063829319466900776701791074614335719"
) ;
const COEFF_D : Fq =
MontFp ! ( "45022363124591815672509500913686876175488063829319466900776701791074614335719" ) ;
/// AFFINE_GENERATOR_COEFFS = (GENERATOR_X, GENERATOR_Y)
const AFFINE_GENERATOR_COEFFS : ( Self ::BaseField , Self ::BaseField ) =
( TE_GENERATOR_X , TE_GENERATOR_Y ) ;
const GENERATOR : EdwardsAffine = EdwardsAffine ::new_unchecked ( TE_GENERATOR_X , TE_GENERATOR_Y ) ;
type MontgomeryModelParameters = BandersnatchParameters ;
type MontCurveConfig = BandersnatchParameters ;
/// Multiplication by `a` is multiply by `-5`.
#[ inline(always) ]
@ -97,20 +89,16 @@ impl TEModelParameters for BandersnatchParameters {
}
}
impl MontgomeryModelParameters for BandersnatchParameters {
impl MontCurveConfig for BandersnatchParameters {
/// COEFF_A = 29978822694968839326280996386011761570173833766074948509196803838190355340952
const COEFF_A : Fq = MontFp ! (
Fq ,
"29978822694968839326280996386011761570173833766074948509196803838190355340952"
) ;
const COEFF_A : Fq =
MontFp ! ( "29978822694968839326280996386011761570173833766074948509196803838190355340952" ) ;
/// COEFF_B = 25465760566081946422412445027709227188579564747101592991722834452325077642517
const COEFF_B : Fq = MontFp ! (
Fq ,
"25465760566081946422412445027709227188579564747101592991722834452325077642517"
) ;
const COEFF_B : Fq =
MontFp ! ( "25465760566081946422412445027709227188579564747101592991722834452325077642517" ) ;
type TEModelParameters = BandersnatchParameters ;
type TECurveConfig = BandersnatchParameters ;
}
// The TE form generator is generated following Zcash's fashion:
@ -123,43 +111,30 @@ impl MontgomeryModelParameters for BandersnatchParameters {
// <https://github.com/zhenfeizhang/bandersnatch/blob/main/bandersnatch/script/bandersnatch.sage>
/// x coordinate for TE curve generator
const TE_GENERATOR_X : Fq = MontFp ! (
Fq ,
"18886178867200960497001835917649091219057080094937609519140440539760939937304"
) ;
const TE_GENERATOR_X : Fq =
MontFp ! ( "18886178867200960497001835917649091219057080094937609519140440539760939937304" ) ;
/// y coordinate for TE curve generator
const TE_GENERATOR_Y : Fq = MontFp ! (
Fq ,
"19188667384257783945677642223292697773471335439753913231509108946878080696678"
) ;
const TE_GENERATOR_Y : Fq =
MontFp ! ( "19188667384257783945677642223292697773471335439753913231509108946878080696678" ) ;
/// x coordinate for SW curve generator
const SW_GENERATOR_X : Fq = MontFp ! (
Fq ,
"30900340493481298850216505686589334086208278925799850409469406976849338430199"
) ;
const SW_GENERATOR_X : Fq =
MontFp ! ( "30900340493481298850216505686589334086208278925799850409469406976849338430199" ) ;
/// y coordinate for SW curve generator
const SW_GENERATOR_Y : Fq = MontFp ! (
Fq ,
"12663882780877899054958035777720958383845500985908634476792678820121468453298"
) ;
const SW_GENERATOR_Y : Fq =
MontFp ! ( "12663882780877899054958035777720958383845500985908634476792678820121468453298" ) ;
impl SWModelParameters for BandersnatchParameters {
impl SWCurveConfig for BandersnatchParameters {
/// COEFF_A = 10773120815616481058602537765553212789256758185246796157495669123169359657269
const COEFF_A : Self ::BaseField = MontFp ! (
Fq ,
"10773120815616481058602537765553212789256758185246796157495669123169359657269"
) ;
const COEFF_A : Self ::BaseField =
MontFp ! ( "10773120815616481058602537765553212789256758185246796157495669123169359657269" ) ;
/// COEFF_B = 29569587568322301171008055308580903175558631321415017492731745847794083609535
const COEFF_B : Self ::BaseField = MontFp ! (
Fq ,
"29569587568322301171008055308580903175558631321415017492731745847794083609535"
) ;
const COEFF_B : Self ::BaseField =
MontFp ! ( "29569587568322301171008055308580903175558631321415017492731745847794083609535" ) ;
/// generators
const AFFINE_GENERATOR_COEFFS : ( Self ::BaseField , Self ::BaseField ) =
( SW_GENERATOR_X , SW_GENERATOR_Y ) ;
const GENERATOR : SWAffine = SWAffine ::new_unchecked ( SW_GENERATOR_X , SW_GENERATOR_Y ) ;
}