Upgrade to work with latest ark-ff (#95)

Co-authored-by: Sun <huachuang20@gmail.com>
This commit is contained in:
Pratyush Mishra
2022-03-07 13:12:03 -08:00
committed by GitHub
parent d0dc200f22
commit 1551d6d76c
231 changed files with 2830 additions and 4343 deletions

View File

@@ -1,6 +1,7 @@
use crate::Parameters;
use ark_r1cs_std::groups::mnt4;
use crate::Parameters;
/// An element of G1 in the MNT4-753 bilinear group.
pub type G1Var = mnt4::G1Var<Parameters>;
/// An element of G2 in the MNT4-753 bilinear group.

View File

@@ -1,13 +1,13 @@
use crate::{Fq, Fq2Parameters, Fq4Parameters};
use ark_r1cs_std::fields::{fp::FpVar, fp2::Fp2Var, fp4::Fp4Var};
use crate::{Fq, Fq2Config, Fq4Config};
/// A variable that is the R1CS equivalent of `crate::Fq`.
pub type FqVar = FpVar<Fq>;
/// A variable that is the R1CS equivalent of `crate::Fq2`.
pub type Fq2Var = Fp2Var<Fq2Parameters>;
pub type Fq2Var = Fp2Var<Fq2Config>;
/// A variable that is the R1CS equivalent of `crate::Fq4`.
pub type Fq4Var = Fp4Var<Fq4Parameters>;
pub type Fq4Var = Fp4Var<Fq4Config>;
#[test]
fn mnt4_753_field_gadgets_test() {

View File

@@ -1,6 +1,7 @@
use crate::Parameters;
/// Specifies the constraints for computing a pairing in the MNT4-753 bilinear group.
/// Specifies the constraints for computing a pairing in the MNT4-753 bilinear
/// group.
pub type PairingVar = ark_r1cs_std::pairing::mnt4::PairingVar<Parameters>;
#[test]

View File

@@ -2,7 +2,7 @@ use ark_ec::{
mnt4,
models::{ModelParameters, SWModelParameters},
};
use ark_ff::field_new;
use ark_ff::MontFp;
use crate::{Fq, Fr, FR_ONE};
@@ -21,18 +21,15 @@ impl ModelParameters for Parameters {
const COFACTOR: &'static [u64] = &[1];
/// COFACTOR^(-1) mod r = 1
#[rustfmt::skip]
const COFACTOR_INV: Fr = FR_ONE;
}
impl SWModelParameters for Parameters {
/// COEFF_A = 2
#[rustfmt::skip]
const COEFF_A: Fq = field_new!(Fq, "2");
const COEFF_A: Fq = MontFp!(Fq, "2");
/// COEFF_B = 0x01373684A8C9DCAE7A016AC5D7748D3313CD8E39051C596560835DF0C9E50A5B59B882A92C78DC537E51A16703EC9855C77FC3D8BB21C8D68BB8CFB9DB4B8C8FBA773111C36C8B1B4E8F1ECE940EF9EAAD265458E06372009C9A0491678EF4
#[rustfmt::skip]
const COEFF_B: Fq = field_new!(Fq, "28798803903456388891410036793299405764940372360099938340752576406393880372126970068421383312482853541572780087363938442377933706865252053507077543420534380486492786626556269083255657125025963825610840222568694137138741554679540");
const COEFF_B: Fq = MontFp!(Fq, "28798803903456388891410036793299405764940372360099938340752576406393880372126970068421383312482853541572780087363938442377933706865252053507077543420534380486492786626556269083255657125025963825610840222568694137138741554679540");
/// AFFINE_GENERATOR_COEFFS = (G1_GENERATOR_X, G1_GENERATOR_Y)
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
@@ -42,10 +39,10 @@ impl SWModelParameters for Parameters {
// Generator of G1
// X = 7790163481385331313124631546957228376128961350185262705123068027727518350362064426002432450801002268747950550964579198552865939244360469674540925037890082678099826733417900510086646711680891516503232107232083181010099241949569,
// Y = 6913648190367314284606685101150155872986263667483624713540251048208073654617802840433842931301128643140890502238233930290161632176167186761333725658542781350626799660920481723757654531036893265359076440986158843531053720994648,
/// G1_GENERATOR_X = 7790163481385331313124631546957228376128961350185262705123068027727518350362064426002432450801002268747950550964579198552865939244360469674540925037890082678099826733417900510086646711680891516503232107232083181010099241949569
#[rustfmt::skip]
pub const G1_GENERATOR_X: Fq = field_new!(Fq, "7790163481385331313124631546957228376128961350185262705123068027727518350362064426002432450801002268747950550964579198552865939244360469674540925037890082678099826733417900510086646711680891516503232107232083181010099241949569");
/// G1_GENERATOR_X =
/// 7790163481385331313124631546957228376128961350185262705123068027727518350362064426002432450801002268747950550964579198552865939244360469674540925037890082678099826733417900510086646711680891516503232107232083181010099241949569
pub const G1_GENERATOR_X: Fq = MontFp!(Fq, "7790163481385331313124631546957228376128961350185262705123068027727518350362064426002432450801002268747950550964579198552865939244360469674540925037890082678099826733417900510086646711680891516503232107232083181010099241949569");
/// G1_GENERATOR_Y = 6913648190367314284606685101150155872986263667483624713540251048208073654617802840433842931301128643140890502238233930290161632176167186761333725658542781350626799660920481723757654531036893265359076440986158843531053720994648
#[rustfmt::skip]
pub const G1_GENERATOR_Y: Fq = field_new!(Fq, "6913648190367314284606685101150155872986263667483624713540251048208073654617802840433842931301128643140890502238233930290161632176167186761333725658542781350626799660920481723757654531036893265359076440986158843531053720994648");
/// G1_GENERATOR_Y =
/// 6913648190367314284606685101150155872986263667483624713540251048208073654617802840433842931301128643140890502238233930290161632176167186761333725658542781350626799660920481723757654531036893265359076440986158843531053720994648
pub const G1_GENERATOR_Y: Fq = MontFp!(Fq, "6913648190367314284606685101150155872986263667483624713540251048208073654617802840433842931301128643140890502238233930290161632176167186761333725658542781350626799660920481723757654531036893265359076440986158843531053720994648");

View File

@@ -3,7 +3,7 @@ use ark_ec::{
mnt4::MNT4Parameters,
models::{ModelParameters, SWModelParameters},
};
use ark_ff::field_new;
use ark_ff::{MontFp, QuadExt};
use crate::{Fq, Fq2, Fr, FQ_ZERO, G1_COEFF_A_NON_RESIDUE};
@@ -38,16 +38,13 @@ impl ModelParameters for Parameters {
/// COFACTOR^(-1) mod r =
/// 102345604409665481004734934052318066391634848395005988700111949231215905051467807945653833683883449458834877235200
#[rustfmt::skip]
const COFACTOR_INV: Fr = field_new!(Fr, "102345604409665481004734934052318066391634848395005988700111949231215905051467807945653833683883449458834877235200");
const COFACTOR_INV: Fr = MontFp!(Fr, "102345604409665481004734934052318066391634848395005988700111949231215905051467807945653833683883449458834877235200");
}
/// MUL_BY_A_C0 = NONRESIDUE * COEFF_A
#[rustfmt::skip]
pub const MUL_BY_A_C0: Fq = G1_COEFF_A_NON_RESIDUE;
/// MUL_BY_A_C1 = NONRESIDUE * COEFF_A
#[rustfmt::skip]
pub const MUL_BY_A_C1: Fq = G1_COEFF_A_NON_RESIDUE;
impl SWModelParameters for Parameters {
@@ -61,10 +58,9 @@ impl SWModelParameters for Parameters {
// =
// (0, 39196523001581428369576759982967177918859161321667605855515469914917622337081756705006832951954384669101573360625169461998308377011601613979275218690841934572954991361632773738259652003389826903175898479855893660378722437317212)
// ```
#[rustfmt::skip]
const COEFF_B: Fq2 = field_new!(Fq2,
const COEFF_B: Fq2 = QuadExt!(
FQ_ZERO,
field_new!(Fq, "39196523001581428369576759982967177918859161321667605855515469914917622337081756705006832951954384669101573360625169461998308377011601613979275218690841934572954991361632773738259652003389826903175898479855893660378722437317212")
MontFp!(Fq, "39196523001581428369576759982967177918859161321667605855515469914917622337081756705006832951954384669101573360625169461998308377011601613979275218690841934572954991361632773738259652003389826903175898479855893660378722437317212")
);
/// AFFINE_GENERATOR_COEFFS = (G2_GENERATOR_X, G2_GENERATOR_Y)
@@ -73,12 +69,12 @@ impl SWModelParameters for Parameters {
#[inline(always)]
fn mul_by_a(elt: &Fq2) -> Fq2 {
field_new!(Fq2, MUL_BY_A_C0 * &elt.c0, MUL_BY_A_C1 * &elt.c1,)
QuadExt!(MUL_BY_A_C0 * &elt.c0, MUL_BY_A_C1 * &elt.c1,)
}
}
const G2_GENERATOR_X: Fq2 = field_new!(Fq2, G2_GENERATOR_X_C0, G2_GENERATOR_X_C1);
const G2_GENERATOR_Y: Fq2 = field_new!(Fq2, G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1);
const G2_GENERATOR_X: Fq2 = QuadExt!(G2_GENERATOR_X_C0, G2_GENERATOR_X_C1);
const G2_GENERATOR_Y: Fq2 = QuadExt!(G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1);
// Generator of G2
// These are two Fq elements each because X and Y (and Z) are elements of Fq^2
@@ -86,14 +82,10 @@ const G2_GENERATOR_Y: Fq2 = field_new!(Fq2, G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1
// 19706011319630172391076079624799753948158506771222147486237995321925443331396169656568431378974558350664383559981183980668976846806019030432389169137953988990802000581078994008283967768348275973921598166274857631001635633631000,
// Y = 39940152670760519653940320314827327941993141403708338666925204282084477074754642625849927569427860786384998614863651207257467076192649385174108085803168743803491780568503369317093191101779534035377266300185099318717465441820654,
// 17608637424964395737041291373756657139607306440193731804102457011726690702169238966996114255971643893157857311132388792357391583164125870757541009035041469463366528798593952884745987697403056488744603829437448927398468360797245,
#[rustfmt::skip]
pub const G2_GENERATOR_X_C0: Fq = field_new!(Fq, "29483965110843144675703364744708836524643960105538608078862508397502447349913068434941060515343254862580437318493682762113105361632548148204806052114008731372757389645383891982211245013965175213456066452587869519098351487925167");
pub const G2_GENERATOR_X_C0: Fq = MontFp!(Fq, "29483965110843144675703364744708836524643960105538608078862508397502447349913068434941060515343254862580437318493682762113105361632548148204806052114008731372757389645383891982211245013965175213456066452587869519098351487925167");
#[rustfmt::skip]
pub const G2_GENERATOR_X_C1: Fq = field_new!(Fq, "19706011319630172391076079624799753948158506771222147486237995321925443331396169656568431378974558350664383559981183980668976846806019030432389169137953988990802000581078994008283967768348275973921598166274857631001635633631000");
pub const G2_GENERATOR_X_C1: Fq = MontFp!(Fq, "19706011319630172391076079624799753948158506771222147486237995321925443331396169656568431378974558350664383559981183980668976846806019030432389169137953988990802000581078994008283967768348275973921598166274857631001635633631000");
#[rustfmt::skip]
pub const G2_GENERATOR_Y_C0: Fq = field_new!(Fq, "39940152670760519653940320314827327941993141403708338666925204282084477074754642625849927569427860786384998614863651207257467076192649385174108085803168743803491780568503369317093191101779534035377266300185099318717465441820654");
pub const G2_GENERATOR_Y_C0: Fq = MontFp!(Fq, "39940152670760519653940320314827327941993141403708338666925204282084477074754642625849927569427860786384998614863651207257467076192649385174108085803168743803491780568503369317093191101779534035377266300185099318717465441820654");
#[rustfmt::skip]
pub const G2_GENERATOR_Y_C1: Fq = field_new!(Fq, "17608637424964395737041291373756657139607306440193731804102457011726690702169238966996114255971643893157857311132388792357391583164125870757541009035041469463366528798593952884745987697403056488744603829437448927398468360797245");
pub const G2_GENERATOR_Y_C1: Fq = MontFp!(Fq, "17608637424964395737041291373756657139607306440193731804102457011726690702169238966996114255971643893157857311132388792357391583164125870757541009035041469463366528798593952884745987697403056488744603829437448927398468360797245");

View File

@@ -1,10 +1,10 @@
use ark_ec::models::mnt4::{MNT4Parameters, MNT4};
use ark_ff::{
biginteger::{BigInt, BigInteger768},
field_new, Fp2,
Fp2, MontFp, QuadExt,
};
use crate::{Fq, Fq2, Fq2Parameters, Fq4Parameters, Fr};
use crate::{Fq, Fq2Config, Fq4Config, Fr};
pub mod g1;
pub mod g2;
@@ -22,18 +22,14 @@ pub type MNT4_753 = MNT4<Parameters>;
pub struct Parameters;
impl MNT4Parameters for Parameters {
const TWIST: Fp2<Self::Fp2Params> = field_new!(Fq2, FQ_ZERO, FQ_ONE);
const TWIST: Fp2<Self::Fp2Config> = QuadExt!(FQ_ZERO, FQ_ONE);
// A coefficient of MNT4-753 G2 =
// ```
// mnt4753_twist_coeff_a = mnt4753_Fq2(mnt4753_G1::coeff_a * non_residue, mnt6753_Fq::zero());
// = (A_COEFF * NONRESIDUE, ZERO)
// = (26, ZERO)
// ```
#[rustfmt::skip]
const TWIST_COEFF_A: Fp2<Self::Fp2Params> = field_new!(Fq2,
G1_COEFF_A_NON_RESIDUE,
FQ_ZERO,
);
const TWIST_COEFF_A: Fp2<Self::Fp2Config> = QuadExt!(G1_COEFF_A_NON_RESIDUE, FQ_ZERO,);
// https://github.com/o1-labs/snarky/blob/9c21ab2bb23874604640740d646a932e813432c3/snarkette/mnt4753.ml
const ATE_LOOP_COUNT: &'static [u64] = &[
8824542903220142080,
@@ -63,16 +59,16 @@ impl MNT4Parameters for Parameters {
]);
type Fp = Fq;
type Fr = Fr;
type Fp2Params = Fq2Parameters;
type Fp4Params = Fq4Parameters;
type Fp2Config = Fq2Config;
type Fp4Config = Fq4Config;
type G1Parameters = self::g1::Parameters;
type G2Parameters = self::g2::Parameters;
}
// 26
pub const G1_COEFF_A_NON_RESIDUE: Fq = field_new!(Fq, "26");
pub const G1_COEFF_A_NON_RESIDUE: Fq = MontFp!(Fq, "26");
pub const FQ_ZERO: Fq = field_new!(Fq, "0");
pub const FQ_ONE: Fq = field_new!(Fq, "1");
pub const FR_ZERO: Fr = field_new!(Fr, "0");
pub const FR_ONE: Fr = field_new!(Fr, "1");
pub const FQ_ZERO: Fq = MontFp!(Fq, "0");
pub const FQ_ONE: Fq = MontFp!(Fq, "1");
pub const FR_ZERO: Fr = MontFp!(Fr, "0");
pub const FR_ONE: Fr = MontFp!(Fr, "1");

View File

@@ -1,15 +1,14 @@
use ark_ec::{AffineCurve, PairingEngine, ProjectiveCurve};
use ark_ff::{Field, One, PrimeField, UniformRand};
use ark_std::{rand::Rng, test_rng};
use crate::*;
use ark_algebra_test_templates::{
curves::*, generate_bilinearity_test, generate_g1_test, generate_g2_test,
generate_product_of_pairings_test, groups::*, msm::*,
};
use ark_ec::{AffineCurve, PairingEngine, ProjectiveCurve};
use ark_ff::{Field, One, PrimeField, UniformRand};
use ark_std::{rand::Rng, test_rng};
use core::ops::MulAssign;
use crate::*;
generate_g1_test!(mnt4_753; curve_tests; sw_tests;);
generate_g2_test!(mnt4_753; curve_tests; sw_tests;);
generate_bilinearity_test!(MNT4_753, Fq4);

View File

@@ -1,170 +1,9 @@
use ark_ff::{
biginteger::{BigInt, BigInteger768 as BigInteger},
fields::{FftParameters, Fp768, Fp768Parameters, FpParameters},
};
use ark_ff::fields::{Fp768, MontBackend, MontConfig};
pub type Fq = Fp768<FqParameters>;
pub struct FqParameters;
impl Fp768Parameters for FqParameters {}
impl FftParameters for FqParameters {
type BigInt = BigInteger;
const TWO_ADICITY: u32 = 15;
const TWO_ADIC_ROOT_OF_UNITY: BigInteger = BigInt::new([
0x3b079c7556ac378,
0x2c8c74d04a3f00d4,
0xd3b001061b90d4cf,
0x946e77514891b0e6,
0x79caec8ad6dc9ea1,
0xbefd780edc81435d,
0xe093d4dca630b154,
0x43a0f673199f1c12,
0x92276c78436253ff,
0xe249d1cf014fcd24,
0x96f36471fb7c3ec5,
0x1080b8906b7c4,
]);
const SMALL_SUBGROUP_BASE: Option<u32> = Some(5);
const SMALL_SUBGROUP_BASE_ADICITY: Option<u32> = Some(2);
/// LARGE_SUBGROUP_ROOT_OF_UNITY =
/// 12249458902762217747626832919710926618510011455364963726393752854649914979954138109976331601455448780251166045203053508523342111624583986869301658366625356826888785691823710598470775453742133593634524619429629803955083254436531
const LARGE_SUBGROUP_ROOT_OF_UNITY: Option<BigInteger> = Some(BigInt::new([
8926681816978929800,
10873079436792120119,
6519893728366769435,
7899277225737766970,
8416573500933450083,
12951641800297678468,
7093775028595490583,
14327009285082556021,
18228411097456927576,
2823658094446565457,
1708328092507553067,
109589007594791,
]));
}
impl FpParameters for FqParameters {
/// MODULUS = 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689601
const MODULUS: BigInteger = BigInt::new([
0x5e9063de245e8001,
0xe39d54522cdd119f,
0x638810719ac425f0,
0x685acce9767254a4,
0xb80f0da5cb537e38,
0xb117e776f218059d,
0x99d124d9a15af79d,
0x7fdb925e8a0ed8d,
0x5eb7e8f96c97d873,
0xb7f997505b8fafed,
0x10229022eee2cdad,
0x1c4c62d92c411,
]);
const MODULUS_BITS: u32 = 753;
const CAPACITY: u32 = Self::MODULUS_BITS - 1;
const REPR_SHAVE_BITS: u32 = 15;
const R: BigInteger = BigInt::new([
0x98a8ecabd9dc6f42,
0x91cd31c65a034686,
0x97c3e4a0cd14572e,
0x79589819c788b601,
0xed269c942108976f,
0x1e0f4d8acf031d68,
0x320c3bb713338559,
0x598b4302d2f00a62,
0x4074c9cbfd8ca621,
0xfa47edb3865e88c,
0x95455fb31ff9a195,
0x7b479ec8e242,
]);
const R2: BigInteger = BigInt::new([
0x84717088cfd190c8,
0xc7d9ff8e7df03c0a,
0xa24bea56242b3507,
0xa896a656a0714c7d,
0x80a46659ff6f3ddf,
0x2f47839ef88d7ce8,
0xa8c86d4604a3b597,
0xe03c79cac4f7ef07,
0x2505daf1f4a81245,
0x8e4605754c381723,
0xb081f15bcbfdacaf,
0x2a33e89cb485,
]);
const INV: u64 = 0xf2044cfbe45e7fff;
const GENERATOR: BigInteger = BigInt::new([
0xa8f627f0e629635e,
0x202afce346c36872,
0x85e1ece733493254,
0x6d76e610664ac389,
0xdf542f3f04441585,
0x3aa4885bf6d4dd80,
0xeb8b63c1c0fffc74,
0xd2488e985f6cfa4e,
0xcce1c2a623f7a66a,
0x2a060f4d5085b19a,
0xa9111a596408842f,
0x11ca8d50bf627,
]);
const MODULUS_MINUS_ONE_DIV_TWO: BigInteger = BigInt::new([
0xaf4831ef122f4000,
0x71ceaa29166e88cf,
0x31c40838cd6212f8,
0x342d6674bb392a52,
0xdc0786d2e5a9bf1c,
0xd88bf3bb790c02ce,
0xcce8926cd0ad7bce,
0x83fedc92f45076c6,
0xaf5bf47cb64bec39,
0xdbfccba82dc7d7f6,
0x88114811777166d6,
0xe26316c96208,
]);
// T and T_MINUS_ONE_DIV_TWO, where MODULUS - 1 = 2^S * T
/// T = (MODULUS - 1) / 2^S =
/// 1278640471433073529124274133033466709233725278318907137200424283478556909563327233064541435662546964154604216671394463687571830033251476599169665701965732619291119517454523942352538645255842982596454713491581459512424155325
const T: BigInteger = BigInt::new([
0x233ebd20c7bc48bd,
0x4be1c73aa8a459ba,
0xa948c71020e33588,
0xfc70d0b599d2ece4,
0xb3b701e1b4b96a6,
0xef3b622fceede430,
0xdb1b33a249b342b5,
0xb0e60ffb724bd141,
0x5fdabd6fd1f2d92f,
0x9b5b6ff32ea0b71f,
0x882220452045ddc5,
0x3898c5b25,
]);
/// (T - 1) / 2 =
/// 639320235716536764562137066516733354616862639159453568600212141739278454781663616532270717831273482077302108335697231843785915016625738299584832850982866309645559758727261971176269322627921491298227356745790729756212077662
const T_MINUS_ONE_DIV_TWO: BigInteger = BigInt::new([
0x119f5e9063de245e,
0x25f0e39d54522cdd,
0x54a4638810719ac4,
0x7e38685acce97672,
0x59db80f0da5cb53,
0xf79db117e776f218,
0xed8d99d124d9a15a,
0xd87307fdb925e8a0,
0xafed5eb7e8f96c97,
0xcdadb7f997505b8f,
0xc41110229022eee2,
0x1c4c62d92,
]);
}
#[derive(MontConfig)]
#[modulus = "41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689601"]
#[generator = "17"]
#[small_subgroup_base = "5"]
#[small_subgroup_power = "2"]
pub struct FqConfig;
pub type Fq = Fp768<MontBackend<FqConfig, 12>>;

View File

@@ -1,28 +1,28 @@
use crate::{Fq, FQ_ONE};
use ark_ff::{
field_new,
fields::fp2::{Fp2, Fp2Parameters},
fields::fp2::{Fp2, Fp2Config},
MontFp, QuadExt,
};
pub type Fq2 = Fp2<Fq2Parameters>;
use crate::{Fq, FQ_ONE};
pub struct Fq2Parameters;
pub type Fq2 = Fp2<Fq2Config>;
impl Fp2Parameters for Fq2Parameters {
pub struct Fq2Config;
impl Fp2Config for Fq2Config {
type Fp = Fq;
// non_residue = 13
#[rustfmt::skip]
const NONRESIDUE: Fq = field_new!(Fq, "13");
const NONRESIDUE: Fq = MontFp!(Fq, "13");
// qnr = (8, 1)
const QUADRATIC_NONRESIDUE: (Self::Fp, Self::Fp) = (field_new!(Fq, "8"), FQ_ONE);
const QUADRATIC_NONRESIDUE: Fq2 = QuadExt!(MontFp!(Fq, "8"), FQ_ONE);
// Coefficients:
// [1, 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689600]
// see https://github.com/o1-labs/snarky/blob/2cf5ef3a14989e57c17518832b3c52590068fc48/src/camlsnark_c/libsnark-caml/depends/libff/libff/algebra/curves/mnt753/mnt4753/mnt4753_init.cpp
const FROBENIUS_COEFF_FP2_C1: &'static [Self::Fp] = &[
FQ_ONE,
field_new!(Fq, "41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689600"),
MontFp!(Fq, "41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689600"),
];
}

View File

@@ -1,17 +1,18 @@
use crate::{Fq, Fq2, Fq2Parameters, FQ_ONE, FQ_ZERO};
use ark_ff::{
field_new,
fields::fp4::{Fp4, Fp4Parameters},
fields::fp4::{Fp4, Fp4Config},
MontFp, QuadExt,
};
pub type Fq4 = Fp4<Fq4Parameters>;
use crate::{Fq, Fq2, Fq2Config, FQ_ONE, FQ_ZERO};
pub struct Fq4Parameters;
pub type Fq4 = Fp4<Fq4Config>;
impl Fp4Parameters for Fq4Parameters {
type Fp2Params = Fq2Parameters;
pub struct Fq4Config;
const NONRESIDUE: Fq2 = field_new!(Fq2, FQ_ZERO, FQ_ONE);
impl Fp4Config for Fq4Config {
type Fp2Config = Fq2Config;
const NONRESIDUE: Fq2 = QuadExt!(FQ_ZERO, FQ_ONE);
// Coefficients for the Frobenius automorphism.
// c1[0] = 1,
@@ -19,12 +20,12 @@ impl Fp4Parameters for Fq4Parameters {
// c1[2] = 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689600
// c1[3] = 23206834398115182106100160267808784663211750120934935212776243228483231604266504233503543246714830633588317039329677309362453490879357004638891161288350364891904062489821230132228897943262725174047727280881395973788104254381611
//
// These are calculated as `FROBENIUS_COEFF_FP4_C1[i] = Fp2Params::NONRESIDUE^((q^i - 1) / 4)`.
#[rustfmt::skip]
// These are calculated as `FROBENIUS_COEFF_FP4_C1[i] =
// Fp2Config::NONRESIDUE^((q^i - 1) / 4)`.
const FROBENIUS_COEFF_FP4_C1: &'static [Fq] = &[
FQ_ONE,
field_new!(Fq, "18691656569803771296244054523431852464958959799019013859007259692542121208304602539555350517075508287829753932558576476751900235650227380562700444433662761577027341858128610410779088384480737679672900770810745291515010467307990"),
field_new!(Fq, "41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689600"),
field_new!(Fq, "23206834398115182106100160267808784663211750120934935212776243228483231604266504233503543246714830633588317039329677309362453490879357004638891161288350364891904062489821230132228897943262725174047727280881395973788104254381611"),
MontFp!(Fq, "18691656569803771296244054523431852464958959799019013859007259692542121208304602539555350517075508287829753932558576476751900235650227380562700444433662761577027341858128610410779088384480737679672900770810745291515010467307990"),
MontFp!(Fq, "41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888253786114353726529584385201591605722013126468931404347949840543007986327743462853720628051692141265303114721689600"),
MontFp!(Fq, "23206834398115182106100160267808784663211750120934935212776243228483231604266504233503543246714830633588317039329677309362453490879357004638891161288350364891904062489821230132228897943262725174047727280881395973788104254381611"),
];
}

View File

@@ -1,151 +1,9 @@
use ark_ff::{
biginteger::{BigInt, BigInteger768 as BigInteger},
fields::{FftParameters, Fp768, Fp768Parameters, FpParameters},
};
use ark_ff::fields::{Fp768, MontBackend, MontConfig};
pub type Fr = Fp768<FrParameters>;
pub struct FrParameters;
impl Fp768Parameters for FrParameters {}
impl FftParameters for FrParameters {
type BigInt = BigInteger;
const TWO_ADICITY: u32 = 30;
const TWO_ADIC_ROOT_OF_UNITY: BigInteger = BigInt::new([
0x307f66b297671883,
0xd72a7f2b1e645f4e,
0x67079daa9a902283,
0xf33f7620a86c668b,
0x8878570d66464c12,
0xa557af5b524f522b,
0x5fafa3f6ef19319d,
0x1eb9e04110a65629,
0x3f96feb3c639a0b0,
0x4d4fe37df3ffd732,
0xadc831bd55bcf3e9,
0x1b9f32a8bd6ab,
]);
}
impl FpParameters for FrParameters {
/// MODULUS = 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888458477323173057491593855069696241854796396165721416325350064441470418137846398469611935719059908164220784476160001
const MODULUS: BigInteger = BigInt::new([
0xd90776e240000001,
0x4ea099170fa13a4f,
0xd6c381bc3f005797,
0xb9dff97634993aa4,
0x3eebca9429212636,
0xb26c5c28c859a99b,
0x99d124d9a15af79d,
0x7fdb925e8a0ed8d,
0x5eb7e8f96c97d873,
0xb7f997505b8fafed,
0x10229022eee2cdad,
0x1c4c62d92c411,
]);
const MODULUS_BITS: u32 = 753;
const CAPACITY: u32 = Self::MODULUS_BITS - 1;
const REPR_SHAVE_BITS: u32 = 15;
const R: BigInteger = BigInt::new([
0xb99680147fff6f42,
0x4eb16817b589cea8,
0xa1ebd2d90c79e179,
0xf725caec549c0da,
0xab0c4ee6d3e6dad4,
0x9fbca908de0ccb62,
0x320c3bb713338498,
0x598b4302d2f00a62,
0x4074c9cbfd8ca621,
0xfa47edb3865e88c,
0x95455fb31ff9a195,
0x7b479ec8e242,
]);
const R2: BigInteger = BigInt::new([
0x3f9c69c7b7f4c8d1,
0x70a50fa9ee48d127,
0xcdbe6702009569cb,
0x6bd8c6c6c49edc38,
0x7955876cc35ee94e,
0xc7285529be54a3f4,
0xded52121ecec77cf,
0x99be80f2ee12ee8e,
0xc8a0ff01493bdcef,
0xacc27988f3d9a316,
0xd9e817a8fb44b3c9,
0x5b58037e0e4,
]);
const INV: u64 = 0xc90776e23fffffff;
const GENERATOR: BigInteger = BigInt::new([
0xeee0a5d37ff6635e,
0xff458536cfa1cff4,
0x659af978d8169ab0,
0x1f1841c24780e3f1,
0x602213036dcfef3a,
0xd1d5c8f39d72db20,
0xeb8b63c1c0ffefab,
0xd2488e985f6cfa4e,
0xcce1c2a623f7a66a,
0x2a060f4d5085b19a,
0xa9111a596408842f,
0x11ca8d50bf627,
]);
const MODULUS_MINUS_ONE_DIV_TWO: BigInteger = BigInt::new([
0xec83bb7120000000,
0xa7504c8b87d09d27,
0x6b61c0de1f802bcb,
0x5ceffcbb1a4c9d52,
0x9f75e54a1490931b,
0xd9362e14642cd4cd,
0xcce8926cd0ad7bce,
0x83fedc92f45076c6,
0xaf5bf47cb64bec39,
0xdbfccba82dc7d7f6,
0x88114811777166d6,
0xe26316c96208,
]);
// T and T_MINUS_ONE_DIV_TWO, where MODULUS - 1 = 2^S * T
/// T = (MODULUS - 1) / 2^S =
/// 39021010480745652133919498688765463538626870065884617224134041854204007249857398469987226430131438115069708760723898631821547688442835449306011425196003537779414482717728302293895201885929702287178426719326440397855625
const T: BigInteger = BigInt::new([
0x3e84e93f641ddb89,
0xfc015e5d3a82645c,
0xd264ea935b0e06f0,
0xa48498dae77fe5d8,
0x2166a66cfbaf2a50,
0x856bde76c9b170a3,
0xa283b63667449366,
0xb25f61cc1ff6e497,
0x6e3ebfb57adfa3e5,
0xbb8b36b6dfe65d41,
0xb64b1044408a408b,
0x71318,
]);
/// (T - 1) / 2 =
/// 19510505240372826066959749344382731769313435032942308612067020927102003624928699234993613215065719057534854380361949315910773844221417724653005712598001768889707241358864151146947600942964851143589213359663220198927812
const T_MINUS_ONE_DIV_TWO: BigInteger = BigInt::new([
0x1f42749fb20eedc4,
0x7e00af2e9d41322e,
0x69327549ad870378,
0x52424c6d73bff2ec,
0x90b353367dd79528,
0x42b5ef3b64d8b851,
0xd141db1b33a249b3,
0xd92fb0e60ffb724b,
0xb71f5fdabd6fd1f2,
0xddc59b5b6ff32ea0,
0x5b25882220452045,
0x3898c,
]);
}
#[derive(MontConfig)]
#[modulus = "41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888458477323173057491593855069696241854796396165721416325350064441470418137846398469611935719059908164220784476160001"]
#[generator = "17"]
#[small_subgroup_base = "5"]
#[small_subgroup_power = "2"]
pub struct FrConfig;
pub type Fr = Fp768<MontBackend<FrConfig, 12>>;

View File

@@ -1,9 +1,12 @@
use ark_ff::{Field, One, SquareRootField, UniformRand, Zero};
use ark_std::test_rng;
use crate::*;
use ark_algebra_test_templates::{fields::*, generate_field_test};
use ark_algebra_test_templates::{
fields::*, generate_field_serialization_test, generate_field_test,
};
use ark_ff::{Field, One, PrimeField, SquareRootField, UniformRand, Zero};
use ark_serialize::{buffer_bit_byte_size, CanonicalSerialize};
use ark_std::{rand::Rng, test_rng};
use core::ops::{AddAssign, MulAssign, SubAssign};
generate_field_test!(mnt4_753; fq2; fq4;);
use crate::*;
generate_field_test!(mnt4_753; fq2; fq4; mont(12, 12); );
generate_field_serialization_test!(mnt4_753;);

View File

@@ -10,9 +10,10 @@
//! This library implements the MNT4_753 curve generated in
//! [\[BCTV14\]](https://eprint.iacr.org/2014/595). The name denotes that it is a
//! Miyaji--Nakabayashi--Takano curve of embedding degree 4, defined over a 753-bit (prime) field.
//! The main feature of this curve is that its scalar field and base field respectively equal the
//! base field and scalar field of MNT6_753.
//! Miyaji--Nakabayashi--Takano curve of embedding degree 4, defined over a
//! 753-bit (prime) field. The main feature of this curve is that its scalar
//! field and base field respectively equal the base field and scalar field of
//! MNT6_753.
//!
//! Curve information:
//! * Base field: q = 0x01C4C62D92C41110229022EEE2CDADB7F997505B8FAFED5EB7E8F96C97D87307FDB925E8A0ED8D99D124D9A15AF79DB117E776F218059DB80F0DA5CB537E38685ACCE9767254A4638810719AC425F0E39D54522CDD119F5E9063DE245E8001
@@ -25,7 +26,8 @@
//! * G2 curve equation: y^2 = x^3 + Ax + B, where
//! * A = Fq2 = (a * NON_RESIDUE, 0)
//! * B = Fq2(0, b * NON_RESIDUE)
//! * NON_RESIDUE = 13 is the quadratic non-residue used to construct the extension field Fq2
//! * NON_RESIDUE = 13 is the quadratic non-residue used to construct the
//! extension field Fq2
#[cfg(feature = "r1cs")]
pub mod constraints;