mirror of
https://github.com/arnaucube/ark-curves-cherry-picked.git
synced 2026-01-11 08:21:33 +01:00
Upgrade to work with latest ark-ff (#95)
Co-authored-by: Sun <huachuang20@gmail.com>
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
use crate::*;
|
||||
use ark_ec::{
|
||||
bls12,
|
||||
bls12::Bls12Parameters,
|
||||
@@ -6,9 +5,11 @@ use ark_ec::{
|
||||
short_weierstrass_jacobian::GroupAffine,
|
||||
AffineCurve, ProjectiveCurve,
|
||||
};
|
||||
use ark_ff::{biginteger::BigInteger256, field_new, Zero};
|
||||
use ark_ff::{biginteger::BigInteger256, MontFp, Zero};
|
||||
use ark_std::ops::Neg;
|
||||
|
||||
use crate::*;
|
||||
|
||||
pub type G1Affine = bls12::G1Affine<crate::Parameters>;
|
||||
pub type G1Projective = bls12::G1Projective<crate::Parameters>;
|
||||
|
||||
@@ -24,17 +25,18 @@ impl ModelParameters for Parameters {
|
||||
|
||||
/// COFACTOR_INV = COFACTOR^{-1} mod r
|
||||
/// = 52435875175126190458656871551744051925719901746859129887267498875565241663483
|
||||
#[rustfmt::skip]
|
||||
const COFACTOR_INV: Fr = field_new!(Fr, "52435875175126190458656871551744051925719901746859129887267498875565241663483");
|
||||
const COFACTOR_INV: Fr = MontFp!(
|
||||
Fr,
|
||||
"52435875175126190458656871551744051925719901746859129887267498875565241663483"
|
||||
);
|
||||
}
|
||||
|
||||
impl SWModelParameters for Parameters {
|
||||
/// COEFF_A = 0
|
||||
const COEFF_A: Fq = field_new!(Fq, "0");
|
||||
const COEFF_A: Fq = MontFp!(Fq, "0");
|
||||
|
||||
/// COEFF_B = 4
|
||||
#[rustfmt::skip]
|
||||
const COEFF_B: Fq = field_new!(Fq, "4");
|
||||
const COEFF_B: Fq = MontFp!(Fq, "4");
|
||||
|
||||
/// AFFINE_GENERATOR_COEFFS = (G1_GENERATOR_X, G1_GENERATOR_Y)
|
||||
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
|
||||
@@ -54,7 +56,8 @@ impl SWModelParameters for Parameters {
|
||||
let x = BigInteger256::new([crate::Parameters::X[0], 0, 0, 0]);
|
||||
|
||||
// An early-out optimization described in Section 6.
|
||||
// If uP == P but P != point of infinity, then the point is not in the right subgroup.
|
||||
// If uP == P but P != point of infinity, then the point is not in the right
|
||||
// subgroup.
|
||||
let x_times_p = p.mul(x);
|
||||
if x_times_p.eq(p) && !p.infinity {
|
||||
return false;
|
||||
@@ -68,20 +71,19 @@ impl SWModelParameters for Parameters {
|
||||
|
||||
/// G1_GENERATOR_X =
|
||||
/// 3685416753713387016781088315183077757961620795782546409894578378688607592378376318836054947676345821548104185464507
|
||||
#[rustfmt::skip]
|
||||
pub const G1_GENERATOR_X: Fq = field_new!(Fq, "3685416753713387016781088315183077757961620795782546409894578378688607592378376318836054947676345821548104185464507");
|
||||
pub const G1_GENERATOR_X: Fq = MontFp!(Fq, "3685416753713387016781088315183077757961620795782546409894578378688607592378376318836054947676345821548104185464507");
|
||||
|
||||
/// G1_GENERATOR_Y =
|
||||
/// 1339506544944476473020471379941921221584933875938349620426543736416511423956333506472724655353366534992391756441569
|
||||
#[rustfmt::skip]
|
||||
pub const G1_GENERATOR_Y: Fq = field_new!(Fq, "1339506544944476473020471379941921221584933875938349620426543736416511423956333506472724655353366534992391756441569");
|
||||
pub const G1_GENERATOR_Y: Fq = MontFp!(Fq, "1339506544944476473020471379941921221584933875938349620426543736416511423956333506472724655353366534992391756441569");
|
||||
|
||||
/// BETA is a non-trivial cubic root of unity in Fq.
|
||||
pub const BETA: Fq = field_new!(Fq, "793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350");
|
||||
pub const BETA: Fq = MontFp!(Fq, "793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350");
|
||||
|
||||
pub fn endomorphism(p: &GroupAffine<Parameters>) -> GroupAffine<Parameters> {
|
||||
// Endomorphism of the points on the curve.
|
||||
// endomorphism_p(x,y) = (BETA * x, y) where BETA is a non-trivial cubic root of unity in Fq.
|
||||
// endomorphism_p(x,y) = (BETA * x, y)
|
||||
// where BETA is a non-trivial cubic root of unity in Fq.
|
||||
let mut res = (*p).clone();
|
||||
res.x *= BETA;
|
||||
res
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
use crate::*;
|
||||
use ark_ec::bls12::Bls12Parameters;
|
||||
use ark_ec::{
|
||||
bls12,
|
||||
bls12::Bls12Parameters,
|
||||
models::{ModelParameters, SWModelParameters},
|
||||
short_weierstrass_jacobian::GroupAffine,
|
||||
AffineCurve,
|
||||
};
|
||||
use ark_ff::{field_new, BigInt, Field, Zero};
|
||||
use ark_ff::{BigInt, Field, MontFp, QuadExt, Zero};
|
||||
|
||||
use crate::*;
|
||||
|
||||
pub type G2Affine = bls12::G2Affine<crate::Parameters>;
|
||||
pub type G2Projective = bls12::G2Projective<crate::Parameters>;
|
||||
@@ -35,16 +36,18 @@ impl ModelParameters for Parameters {
|
||||
|
||||
/// COFACTOR_INV = COFACTOR^{-1} mod r
|
||||
/// 26652489039290660355457965112010883481355318854675681319708643586776743290055
|
||||
#[rustfmt::skip]
|
||||
const COFACTOR_INV: Fr = field_new!(Fr, "26652489039290660355457965112010883481355318854675681319708643586776743290055");
|
||||
const COFACTOR_INV: Fr = MontFp!(
|
||||
Fr,
|
||||
"26652489039290660355457965112010883481355318854675681319708643586776743290055"
|
||||
);
|
||||
}
|
||||
|
||||
impl SWModelParameters for Parameters {
|
||||
/// COEFF_A = [0, 0]
|
||||
const COEFF_A: Fq2 = field_new!(Fq2, g1::Parameters::COEFF_A, g1::Parameters::COEFF_A,);
|
||||
const COEFF_A: Fq2 = QuadExt!(g1::Parameters::COEFF_A, g1::Parameters::COEFF_A,);
|
||||
|
||||
/// COEFF_B = [4, 4]
|
||||
const COEFF_B: Fq2 = field_new!(Fq2, g1::Parameters::COEFF_B, g1::Parameters::COEFF_B,);
|
||||
const COEFF_B: Fq2 = QuadExt!(g1::Parameters::COEFF_B, g1::Parameters::COEFF_B,);
|
||||
|
||||
/// AFFINE_GENERATOR_COEFFS = (G2_GENERATOR_X, G2_GENERATOR_Y)
|
||||
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
|
||||
@@ -71,59 +74,55 @@ impl SWModelParameters for Parameters {
|
||||
}
|
||||
}
|
||||
|
||||
pub const G2_GENERATOR_X: Fq2 = field_new!(Fq2, G2_GENERATOR_X_C0, G2_GENERATOR_X_C1);
|
||||
pub const G2_GENERATOR_Y: Fq2 = field_new!(Fq2, G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1);
|
||||
pub const G2_GENERATOR_X: Fq2 = QuadExt!(G2_GENERATOR_X_C0, G2_GENERATOR_X_C1);
|
||||
pub const G2_GENERATOR_Y: Fq2 = QuadExt!(G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1);
|
||||
|
||||
/// G2_GENERATOR_X_C0 =
|
||||
/// 352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160
|
||||
#[rustfmt::skip]
|
||||
pub const G2_GENERATOR_X_C0: Fq = field_new!(Fq, "352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160");
|
||||
pub const G2_GENERATOR_X_C0: Fq = MontFp!(Fq, "352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160");
|
||||
|
||||
/// G2_GENERATOR_X_C1 =
|
||||
/// 3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758
|
||||
#[rustfmt::skip]
|
||||
pub const G2_GENERATOR_X_C1: Fq = field_new!(Fq, "3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758");
|
||||
pub const G2_GENERATOR_X_C1: Fq = MontFp!(Fq, "3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758");
|
||||
|
||||
/// G2_GENERATOR_Y_C0 =
|
||||
/// 1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905
|
||||
#[rustfmt::skip]
|
||||
pub const G2_GENERATOR_Y_C0: Fq = field_new!(Fq, "1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905");
|
||||
pub const G2_GENERATOR_Y_C0: Fq = MontFp!(Fq, "1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905");
|
||||
|
||||
/// G2_GENERATOR_Y_C1 =
|
||||
/// 927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582
|
||||
#[rustfmt::skip]
|
||||
pub const G2_GENERATOR_Y_C1: Fq = field_new!(Fq, "927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582");
|
||||
pub const G2_GENERATOR_Y_C1: Fq = MontFp!(Fq, "927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582");
|
||||
|
||||
// psi(x,y) = (x**p * PSI_X, y**p * PSI_Y) is the Frobenius composed
|
||||
// with the quadratic twist and its inverse
|
||||
|
||||
// PSI_X = 1/(u+1)^((p-1)/3)
|
||||
pub const P_POWER_ENDOMORPHISM_COEFF_0 : Fq2 = field_new!(
|
||||
Fq2,
|
||||
pub const P_POWER_ENDOMORPHISM_COEFF_0 : Fq2 = QuadExt!(
|
||||
FQ_ZERO,
|
||||
field_new!(
|
||||
Fq,
|
||||
"4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437"
|
||||
MontFp!(
|
||||
Fq,
|
||||
"4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437"
|
||||
)
|
||||
);
|
||||
|
||||
// PSI_Y = 1/(u+1)^((p-1)/2)
|
||||
pub const P_POWER_ENDOMORPHISM_COEFF_1: Fq2 = field_new!(
|
||||
Fq2,
|
||||
field_new!(
|
||||
Fq,
|
||||
"2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530"),
|
||||
field_new!(
|
||||
Fq,
|
||||
"1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257")
|
||||
pub const P_POWER_ENDOMORPHISM_COEFF_1: Fq2 = QuadExt!(
|
||||
MontFp!(
|
||||
Fq,
|
||||
"2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530"),
|
||||
MontFp!(
|
||||
Fq,
|
||||
"1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257")
|
||||
);
|
||||
|
||||
pub fn p_power_endomorphism(p: &GroupAffine<Parameters>) -> GroupAffine<Parameters> {
|
||||
// The p-power endomorphism for G2 is defined as follows:
|
||||
// 1. Note that G2 is defined on curve E': y^2 = x^3 + 4(u+1). To map a point (x, y) in E' to (s, t) in E,
|
||||
// one set s = x / ((u+1) ^ (1/3)), t = y / ((u+1) ^ (1/2)), because E: y^2 = x^3 + 4.
|
||||
// 2. Apply the Frobenius endomorphism (s, t) => (s', t'), another point on curve E,
|
||||
// where s' = s^p, t' = t^p.
|
||||
// 1. Note that G2 is defined on curve E': y^2 = x^3 + 4(u+1).
|
||||
// To map a point (x, y) in E' to (s, t) in E,
|
||||
// one set s = x / ((u+1) ^ (1/3)), t = y / ((u+1) ^ (1/2)),
|
||||
// because E: y^2 = x^3 + 4.
|
||||
// 2. Apply the Frobenius endomorphism (s, t) => (s', t'),
|
||||
// another point on curve E, where s' = s^p, t' = t^p.
|
||||
// 3. Map the point from E back to E'; that is,
|
||||
// one set x' = s' * ((u+1) ^ (1/3)), y' = t' * ((u+1) ^ (1/2)).
|
||||
//
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use ark_ec::bls12::{Bls12, Bls12Parameters, TwistType};
|
||||
|
||||
use crate::{Fq, Fq12Parameters, Fq2Parameters, Fq6Parameters};
|
||||
use crate::{Fq, Fq12Config, Fq2Config, Fq6Config};
|
||||
|
||||
pub mod g1;
|
||||
pub mod g2;
|
||||
@@ -22,9 +22,9 @@ impl Bls12Parameters for Parameters {
|
||||
const X_IS_NEGATIVE: bool = true;
|
||||
const TWIST_TYPE: TwistType = TwistType::M;
|
||||
type Fp = Fq;
|
||||
type Fp2Params = Fq2Parameters;
|
||||
type Fp6Params = Fq6Parameters;
|
||||
type Fp12Params = Fq12Parameters;
|
||||
type Fp2Config = Fq2Config;
|
||||
type Fp6Config = Fq6Config;
|
||||
type Fp12Config = Fq12Config;
|
||||
type G1Parameters = self::g1::Parameters;
|
||||
type G2Parameters = self::g2::Parameters;
|
||||
}
|
||||
|
||||
25
bls12_381/src/curves/tests.rs
Normal file → Executable file
25
bls12_381/src/curves/tests.rs
Normal file → Executable file
@@ -1,23 +1,16 @@
|
||||
#![allow(unused_imports)]
|
||||
use ark_ec::{
|
||||
models::SWModelParameters,
|
||||
short_weierstrass_jacobian::{GroupAffine, GroupProjective},
|
||||
AffineCurve, PairingEngine, ProjectiveCurve,
|
||||
};
|
||||
use ark_ff::{
|
||||
fields::{Field, FpParameters, PrimeField, SquareRootField},
|
||||
BitIteratorBE, One, UniformRand, Zero,
|
||||
};
|
||||
use ark_serialize::CanonicalSerialize;
|
||||
use ark_std::{rand::Rng, test_rng};
|
||||
use core::ops::{AddAssign, MulAssign};
|
||||
|
||||
use crate::{g1, g2, Bls12_381, Fq, Fq12, Fq2, Fr, G1Affine, G1Projective, G2Affine, G2Projective};
|
||||
use ark_algebra_test_templates::{
|
||||
curves::*, generate_bilinearity_test, generate_g1_generator_raw_test, generate_g1_test,
|
||||
generate_g2_test, groups::*, msm::*,
|
||||
};
|
||||
use ark_ec::group::Group;
|
||||
use ark_ec::{models::SWModelParameters, AffineCurve, PairingEngine, ProjectiveCurve};
|
||||
use ark_ff::{
|
||||
fields::{Field, PrimeField, SquareRootField},
|
||||
One, UniformRand, Zero,
|
||||
};
|
||||
use ark_std::{rand::Rng, test_rng};
|
||||
use core::ops::{AddAssign, MulAssign};
|
||||
|
||||
use crate::{g1, g2, Bls12_381, Fq, Fq12, Fq2, Fr, G1Affine, G1Projective, G2Affine, G2Projective};
|
||||
|
||||
generate_g1_test!(bls12_381; curve_tests; sw_tests;);
|
||||
generate_g2_test!(bls12_381; curve_tests; sw_tests;);
|
||||
|
||||
Reference in New Issue
Block a user