Browse Source

Update `MNT6-298`

fq2_neg_nonresidue
Pratyush Mishra 4 years ago
parent
commit
1534bbbfdf
6 changed files with 49 additions and 242 deletions
  1. +8
    -38
      mnt6_298/src/curves/g1.rs
  2. +16
    -85
      mnt6_298/src/curves/g2.rs
  3. +6
    -12
      mnt6_298/src/curves/mod.rs
  4. +2
    -2
      mnt6_298/src/curves/tests.rs
  5. +11
    -60
      mnt6_298/src/fields/fq3.rs
  6. +6
    -45
      mnt6_298/src/fields/fq6.rs

+ 8
- 38
mnt6_298/src/curves/g1.rs

@ -2,7 +2,7 @@ use ark_ec::{
mnt6, mnt6,
models::{ModelParameters, SWModelParameters}, models::{ModelParameters, SWModelParameters},
}; };
use ark_ff::{biginteger::BigInteger320, field_new};
use ark_ff::{field_new};
use crate::{Fq, Fr}; use crate::{Fq, Fr};
@ -19,25 +19,13 @@ impl ModelParameters for Parameters {
} }
impl SWModelParameters for Parameters { impl SWModelParameters for Parameters {
/// COEFF_A =
/// COEFF_A = 11
#[rustfmt::skip] #[rustfmt::skip]
const COEFF_A: Fq = field_new!(Fq, BigInteger320([
0xb9b2411bfd0eafef,
0xc61a10fadd9fecbd,
0x89f128e59811f3fb,
0x980c0f780adadabb,
0x9ba1f11320,
]));
const COEFF_A: Fq = field_new!(Fq, "11");
/// COEFF_B =
/// COEFF_B = 106700080510851735677967319632585352256454251201367587890185989362936000262606668469523074
#[rustfmt::skip] #[rustfmt::skip]
const COEFF_B: Fq = field_new!(Fq, BigInteger320([
0xa94cb16ed8e733b,
0xe1ed15e8119bae6,
0xae927592157c8121,
0x990dbcbc6661cf95,
0xecff0892ef,
]));
const COEFF_B: Fq = field_new!(Fq, "106700080510851735677967319632585352256454251201367587890185989362936000262606668469523074");
/// COFACTOR = 1 /// COFACTOR = 1
const COFACTOR: &'static [u64] = &[1]; const COFACTOR: &'static [u64] = &[1];
@ -45,13 +33,7 @@ impl SWModelParameters for Parameters {
/// COFACTOR^(-1) mod r = /// COFACTOR^(-1) mod r =
/// 1 /// 1
#[rustfmt::skip] #[rustfmt::skip]
const COFACTOR_INV: Fr = field_new!(Fr, BigInteger320([
1784298994435064924,
16852041090100268533,
14258261760832875328,
2961187778261111191,
1929014752195,
]));
const COFACTOR_INV: Fr = field_new!(Fr, "1");
/// AFFINE_GENERATOR_COEFFS = (G1_GENERATOR_X, G1_GENERATOR_Y) /// AFFINE_GENERATOR_COEFFS = (G1_GENERATOR_X, G1_GENERATOR_Y)
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) = const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
@ -60,20 +42,8 @@ impl SWModelParameters for Parameters {
/// G1_GENERATOR_X = /// G1_GENERATOR_X =
#[rustfmt::skip] #[rustfmt::skip]
pub const G1_GENERATOR_X: Fq = field_new!(Fq, BigInteger320([
0x1a663562f74e1d24,
0xc1d1d583fccd1b79,
0xda077538a9763df2,
0x70c4a4ea36aa01d9,
0x86537578a8,
]));
pub const G1_GENERATOR_X: Fq = field_new!(Fq, "336685752883082228109289846353937104185698209371404178342968838739115829740084426881123453");
/// G1_GENERATOR_Y = /// G1_GENERATOR_Y =
#[rustfmt::skip] #[rustfmt::skip]
pub const G1_GENERATOR_Y: Fq = field_new!(Fq, BigInteger320([
0x7ad5bfd16dcfffb2,
0x88dd739252215070,
0x43f137a8b517b339,
0x9a7fac709a8c463c,
0x3140fbc3593,
]));
pub const G1_GENERATOR_Y: Fq = field_new!(Fq, "402596290139780989709332707716568920777622032073762749862342374583908837063963736098549800");

+ 16
- 85
mnt6_298/src/curves/g2.rs

@ -3,9 +3,9 @@ use ark_ec::{
mnt6::MNT6Parameters, mnt6::MNT6Parameters,
models::{ModelParameters, SWModelParameters}, models::{ModelParameters, SWModelParameters},
}; };
use ark_ff::{biginteger::BigInteger320, field_new};
use ark_ff::{field_new};
use crate::{g1, Fq, Fq3, Fr};
use crate::{g1, Fq, Fq3, Fr, FQ_ZERO};
pub type G2Affine = mnt6::G2Affine<crate::Parameters>; pub type G2Affine = mnt6::G2Affine<crate::Parameters>;
pub type G2Projective = mnt6::G2Projective<crate::Parameters>; pub type G2Projective = mnt6::G2Projective<crate::Parameters>;
@ -19,25 +19,13 @@ impl ModelParameters for Parameters {
type ScalarField = Fr; type ScalarField = Fr;
} }
/// MUL_BY_A_C0 = NONRESIDUE * COEFF_A
/// MUL_BY_A_C0 = NONRESIDUE * COEFF_A = 5 * 11
#[rustfmt::skip] #[rustfmt::skip]
pub const MUL_BY_A_C0: Fq = field_new!(Fq, BigInteger320([
0xa07b458bf1496fab,
0xde8254e6541f9fb4,
0xb1b5cc7bf859c3ea,
0xf83c4d58364645a9,
0x30a29b55fa2,
]));
pub const MUL_BY_A_C0: Fq = field_new!(Fq, "55");
/// MUL_BY_A_C1 = NONRESIDUE * COEFF_A /// MUL_BY_A_C1 = NONRESIDUE * COEFF_A
#[rustfmt::skip] #[rustfmt::skip]
pub const MUL_BY_A_C1: Fq = field_new!(Fq, BigInteger320([
0xa07b458bf1496fab,
0xde8254e6541f9fb4,
0xb1b5cc7bf859c3ea,
0xf83c4d58364645a9,
0x30a29b55fa2,
]));
pub const MUL_BY_A_C1: Fq = field_new!(Fq, "55");
/// MUL_BY_A_C2 = COEFF_A /// MUL_BY_A_C2 = COEFF_A
pub const MUL_BY_A_C2: Fq = g1::Parameters::COEFF_A; pub const MUL_BY_A_C2: Fq = g1::Parameters::COEFF_A;
@ -46,15 +34,10 @@ impl SWModelParameters for Parameters {
const COEFF_A: Fq3 = crate::Parameters::TWIST_COEFF_A; const COEFF_A: Fq3 = crate::Parameters::TWIST_COEFF_A;
#[rustfmt::skip] #[rustfmt::skip]
const COEFF_B: Fq3 = field_new!(Fq3, const COEFF_B: Fq3 = field_new!(Fq3,
field_new!(Fq, BigInteger320([
0x79a4c2cea3c84026,
0x4b50cad0f3233baa,
0x9ded82770e7a4410,
0x5ade8b105838b95d,
0xe4036e0a3a,
])),
field_new!(Fq, BigInteger320([0, 0, 0, 0, 0])),
field_new!(Fq, BigInteger320([0, 0, 0, 0, 0])),
// 5 * G1::COEFF_B
field_new!(Fq, "57578116384997352636487348509878309737146377454014423897662211075515354005624851787652233"),
FQ_ZERO,
FQ_ZERO,
); );
/// COFACTOR = /// COFACTOR =
@ -76,13 +59,7 @@ impl SWModelParameters for Parameters {
/// COFACTOR^(-1) mod r = /// COFACTOR^(-1) mod r =
/// 79320381028210220958891541608841408590854146655427655872973753568875979721417185067925504 /// 79320381028210220958891541608841408590854146655427655872973753568875979721417185067925504
#[rustfmt::skip] #[rustfmt::skip]
const COFACTOR_INV: Fr = field_new!(Fr, BigInteger320([
5837598184463018016,
7845868194417674836,
12170332588914158076,
6950611683754678431,
102280178745,
]));
const COFACTOR_INV: Fr = field_new!(Fr, "79320381028210220958891541608841408590854146655427655872973753568875979721417185067925504");
/// AFFINE_GENERATOR_COEFFS = (G2_GENERATOR_X, G2_GENERATOR_Y) /// AFFINE_GENERATOR_COEFFS = (G2_GENERATOR_X, G2_GENERATOR_Y)
const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) = const AFFINE_GENERATOR_COEFFS: (Self::BaseField, Self::BaseField) =
@ -104,56 +81,10 @@ const G2_GENERATOR_X: Fq3 =
const G2_GENERATOR_Y: Fq3 = const G2_GENERATOR_Y: Fq3 =
field_new!(Fq3, G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1, G2_GENERATOR_Y_C2); field_new!(Fq3, G2_GENERATOR_Y_C0, G2_GENERATOR_Y_C1, G2_GENERATOR_Y_C2);
#[rustfmt::skip]
pub const G2_GENERATOR_X_C0: Fq = field_new!(Fq, BigInteger320([
0x15ca12fc5d551ea7,
0x9e0b2b2b2bb8b979,
0xe6e66283ad5a786a,
0x46ba0aedcc383c07,
0x243853463ed,
]));
pub const G2_GENERATOR_X_C0: Fq = field_new!(Fq, "421456435772811846256826561593908322288509115489119907560382401870203318738334702321297427");
pub const G2_GENERATOR_X_C1: Fq = field_new!(Fq, "103072927438548502463527009961344915021167584706439945404959058962657261178393635706405114");
pub const G2_GENERATOR_X_C2: Fq = field_new!(Fq, "143029172143731852627002926324735183809768363301149009204849580478324784395590388826052558");
#[rustfmt::skip]
pub const G2_GENERATOR_X_C1: Fq = field_new!(Fq, BigInteger320([
0x2c0e3dd7be176130,
0x27a15d879495904b,
0x6f1f0d2dd1502a82,
0x9782ee3c70834da,
0x2c28bb71862,
]));
#[rustfmt::skip]
pub const G2_GENERATOR_X_C2: Fq = field_new!(Fq, BigInteger320([
0xf3e5f4eb9631e1f1,
0x657801e80c50778,
0x2d2abb128fee90f3,
0x72e58e4c3aa3598c,
0x100b8026b9d,
]));
#[rustfmt::skip]
pub const G2_GENERATOR_Y_C0: Fq = field_new!(Fq, BigInteger320([
0xb1cddd6c64a67c5f,
0xa01e90d89aa5d2ba,
0x39e9a733be49ed1,
0x9438f46f63d3264f,
0x12cc928ef10,
]));
#[rustfmt::skip]
pub const G2_GENERATOR_Y_C1: Fq = field_new!(Fq, BigInteger320([
0xa1529b7265ad4be7,
0x21c5e827cf309306,
0x9b3d647bd8c70b22,
0x42835bf373e4b213,
0xd3c77c9ff9,
]));
#[rustfmt::skip]
pub const G2_GENERATOR_Y_C2: Fq = field_new!(Fq, BigInteger320([
0x610557ec4b58b8df,
0x51a23865b52045f1,
0x9dcfd915a09da608,
0x6d65c95f69adb700,
0x2d3c3d195a1,
]));
pub const G2_GENERATOR_Y_C0: Fq = field_new!(Fq, "464673596668689463130099227575639512541218133445388869383893594087634649237515554342751377");
pub const G2_GENERATOR_Y_C1: Fq = field_new!(Fq, "100642907501977375184575075967118071807821117960152743335603284583254620685343989304941678");
pub const G2_GENERATOR_Y_C2: Fq = field_new!(Fq, "123019855502969896026940545715841181300275180157288044663051565390506010149881373807142903");

+ 6
- 12
mnt6_298/src/curves/mod.rs

@ -1,8 +1,8 @@
use ark_ff::{biginteger::BigInteger320, field_new, fields::FpParameters, Fp3};
use ark_ff::{biginteger::BigInteger320, field_new, Fp3};
use ark_ec::models::mnt6::{MNT6Parameters, MNT6};
use ark_ec::{models::mnt6::{MNT6Parameters, MNT6}, SWModelParameters};
use crate::{Fq, Fq3, Fq3Parameters, Fq6Parameters, FqParameters, Fr};
use crate::{Fq, Fq3, Fq3Parameters, Fq6Parameters, Fr};
pub mod g1; pub mod g1;
pub mod g2; pub mod g2;
@ -25,13 +25,7 @@ impl MNT6Parameters for Parameters {
const TWIST_COEFF_A: Fp3<Self::Fp3Params> = field_new!(Fq3, const TWIST_COEFF_A: Fp3<Self::Fp3Params> = field_new!(Fq3,
FQ_ZERO, FQ_ZERO,
FQ_ZERO, FQ_ZERO,
field_new!(Fq, BigInteger320([
0xb9b2411bfd0eafef,
0xc61a10fadd9fecbd,
0x89f128e59811f3fb,
0x980c0f780adadabb,
0x9ba1f11320,
])),
g1::Parameters::COEFF_A,
); );
const ATE_LOOP_COUNT: &'static [u64] = &[0xdc9a1b671660000, 0x46609756bec2a33f, 0x1eef55]; const ATE_LOOP_COUNT: &'static [u64] = &[0xdc9a1b671660000, 0x46609756bec2a33f, 0x1eef55];
const ATE_IS_LOOP_COUNT_NEG: bool = true; const ATE_IS_LOOP_COUNT_NEG: bool = true;
@ -47,5 +41,5 @@ impl MNT6Parameters for Parameters {
type G2Parameters = self::g2::Parameters; type G2Parameters = self::g2::Parameters;
} }
pub const FQ_ZERO: Fq = field_new!(Fq, BigInteger320([0, 0, 0, 0, 0]));
pub const FQ_ONE: Fq = field_new!(Fq, FqParameters::R);
pub const FQ_ZERO: Fq = field_new!(Fq, "0");
pub const FQ_ONE: Fq = field_new!(Fq, "1");

+ 2
- 2
mnt6_298/src/curves/tests.rs

@ -57,8 +57,8 @@ fn test_bilinearity() {
let b: G2Projective = rng.gen(); let b: G2Projective = rng.gen();
let s: Fr = rng.gen(); let s: Fr = rng.gen();
let sa = a.mul(s);
let sb = b.mul(s);
let sa = a.mul(s.into_repr());
let sb = b.mul(s.into_repr());
let ans1 = MNT6_298::pairing(sa, b); let ans1 = MNT6_298::pairing(sa, b);
let ans2 = MNT6_298::pairing(a, sb); let ans2 = MNT6_298::pairing(a, sb);

+ 11
- 60
mnt6_298/src/fields/fq3.rs

@ -1,6 +1,5 @@
use crate::fq::Fq;
use crate::{fq::Fq, FQ_ZERO};
use ark_ff::{ use ark_ff::{
biginteger::BigInteger320 as BigInteger,
field_new, field_new,
fields::fp3::{Fp3, Fp3Parameters}, fields::fp3::{Fp3, Fp3Parameters},
}; };
@ -13,13 +12,7 @@ impl Fp3Parameters for Fq3Parameters {
type Fp = Fq; type Fp = Fq;
#[rustfmt::skip] #[rustfmt::skip]
const NONRESIDUE: Fq = field_new!(Fq, BigInteger([
0x58eefd67fea995ca,
0x12f14affbb33a004,
0x4780323da44ac69b,
0x88acf9bea707eed9,
0x14bbbb859e8,
]));
const NONRESIDUE: Fq = field_new!(Fq, "5");
const TWO_ADICITY: u32 = 34; const TWO_ADICITY: u32 = 34;
@ -43,64 +36,22 @@ impl Fp3Parameters for Fq3Parameters {
#[rustfmt::skip] #[rustfmt::skip]
const QUADRATIC_NONRESIDUE_TO_T: (Fq, Fq, Fq) = ( const QUADRATIC_NONRESIDUE_TO_T: (Fq, Fq, Fq) = (
field_new!(Fq, BigInteger([
0x44a4178610a3a4e6,
0x49321e4d00f35073,
0xbbc01b9c400c07a1,
0xd0127c4589095738,
0x3730de2a45d,
])),
field_new!(Fq, BigInteger([0, 0, 0, 0, 0])),
field_new!(Fq, BigInteger([0, 0, 0, 0, 0])),
field_new!(Fq, "154361449678783505076984156275977937654331103361174469632346230549735979552469642799720052"),
FQ_ZERO,
FQ_ZERO,
); );
#[rustfmt::skip] #[rustfmt::skip]
const FROBENIUS_COEFF_FP3_C1: &'static [Fq] = &[ const FROBENIUS_COEFF_FP3_C1: &'static [Fq] = &[
field_new!(Fq, BigInteger([
0xc3177aefffbb845c,
0x9b80c702f9961788,
0xc5df8dcdac70a85a,
0x29184098647b5197,
0x1c1223d33c3,
])),
field_new!(Fq, BigInteger([
0x1c17bb7477085b6a,
0x2621629c22e83dbb,
0x21c062106d949dd8,
0x9d5b981062164ba,
0x84ad703207,
])),
field_new!(Fq, BigInteger([
0xdc13fe3f893c203b,
0x39a7226875df158f,
0xe34ed98542eefb62,
0x6f782a843d139e3c,
0x177280f6ea9,
])),
field_new!(Fq, "1"),
field_new!(Fq, "471738898967521029133040851318449165997304108729558973770077319830005517129946578866686956"),
field_new!(Fq, "4183387201740296620308398334599285547820769823264541783190415909159130177461911693276180"),
]; ];
#[rustfmt::skip] #[rustfmt::skip]
const FROBENIUS_COEFF_FP3_C2: &'static [Fq] = &[ const FROBENIUS_COEFF_FP3_C2: &'static [Fq] = &[
field_new!(Fq, BigInteger([
0xc3177aefffbb845c,
0x9b80c702f9961788,
0xc5df8dcdac70a85a,
0x29184098647b5197,
0x1c1223d33c3,
])),
field_new!(Fq, BigInteger([
0xdc13fe3f893c203b,
0x39a7226875df158f,
0xe34ed98542eefb62,
0x6f782a843d139e3c,
0x177280f6ea9,
])),
field_new!(Fq, BigInteger([
0x1c17bb7477085b6a,
0x2621629c22e83dbb,
0x21c062106d949dd8,
0x9d5b981062164ba,
0x84ad703207,
])),
Self::FROBENIUS_COEFF_FP3_C1[0],
Self::FROBENIUS_COEFF_FP3_C1[2],
Self::FROBENIUS_COEFF_FP3_C1[1],
]; ];
} }

+ 6
- 45
mnt6_298/src/fields/fq6.rs

@ -1,6 +1,5 @@
use crate::{Fq, Fq3, Fq3Parameters, FQ_ONE, FQ_ZERO}; use crate::{Fq, Fq3, Fq3Parameters, FQ_ONE, FQ_ZERO};
use ark_ff::{ use ark_ff::{
biginteger::BigInteger320 as BigInteger,
field_new, field_new,
fields::fp6_2over3::{Fp6, Fp6Parameters}, fields::fp6_2over3::{Fp6, Fp6Parameters},
}; };
@ -12,52 +11,14 @@ pub struct Fq6Parameters;
impl Fp6Parameters for Fq6Parameters { impl Fp6Parameters for Fq6Parameters {
type Fp3Params = Fq3Parameters; type Fp3Params = Fq3Parameters;
#[rustfmt::skip]
const NONRESIDUE: Fq3 = field_new!(Fq3, FQ_ZERO, FQ_ONE, FQ_ZERO); const NONRESIDUE: Fq3 = field_new!(Fq3, FQ_ZERO, FQ_ONE, FQ_ZERO);
#[rustfmt::skip]
const FROBENIUS_COEFF_FP6_C1: &'static [Fq] = &[ const FROBENIUS_COEFF_FP6_C1: &'static [Fq] = &[
field_new!(Fq, BigInteger([
0xc3177aefffbb845c,
0x9b80c702f9961788,
0xc5df8dcdac70a85a,
0x29184098647b5197,
0x1c1223d33c3,
])),
field_new!(Fq, BigInteger([
0xdf2f366476c3dfc6,
0xc1a2299f1c7e5543,
0xe79fefde1a054632,
0x32edfa196a9cb651,
0x245cfad65ca,
])),
field_new!(Fq, BigInteger([
0x1c17bb7477085b6a,
0x2621629c22e83dbb,
0x21c062106d949dd8,
0x9d5b981062164ba,
0x84ad703207,
])),
field_new!(Fq, BigInteger([
0xf82bb9b400447ba5,
0x5fc8850498c7534a,
0x50f3b95b083993a,
0x794de405433502f7,
0x1fbd57fa0b0,
])),
field_new!(Fq, BigInteger([
0xdc13fe3f893c203b,
0x39a7226875df158f,
0xe34ed98542eefb62,
0x6f782a843d139e3c,
0x177280f6ea9,
])),
field_new!(Fq, BigInteger([
0x9f2b792f88f7a497,
0xd527e96b6f752d18,
0xa92e6752ef5fa3bc,
0x98906b1ca18eefd4,
0x3384a4ca26c,
])),
field_new!(Fq, "1"),
field_new!(Fq, "471738898967521029133040851318449165997304108729558973770077319830005517129946578866686957"),
field_new!(Fq, "471738898967521029133040851318449165997304108729558973770077319830005517129946578866686956"),
field_new!(Fq, "475922286169261325753349249653048451545124878552823515553267735739164647307408490559963136"),
field_new!(Fq, "4183387201740296620308398334599285547820769823264541783190415909159130177461911693276180"),
field_new!(Fq, "4183387201740296620308398334599285547820769823264541783190415909159130177461911693276181"),
]; ];
} }

Loading…
Cancel
Save