bn/oldsrc/params.rs

433 lines
15 KiB
Rust

use num::{Num,BigUint};
use fields::Field;
use fields::fp::PrimeFieldParams;
use fields::fp2::Fp2Params;
use fields::fp6::Fp6Params;
use fields::fp12::Fp12Params;
use super::{Fr,Fq,Fq2};
use groups::*;
pub struct FrParams;
impl PrimeFieldParams for FrParams {
fn modulus() -> BigUint {
BigUint::from_str_radix("21888242871839275222246405745257275088548364400416034343698204186575808495617", 10).unwrap()
}
fn bits() -> usize { 254 }
fn name() -> &'static str { "Fr" }
}
pub struct FqParams;
impl PrimeFieldParams for FqParams {
fn modulus() -> BigUint {
BigUint::from_str_radix("21888242871839275222246405745257275088696311157297823662689037894645226208583", 10).unwrap()
}
fn bits() -> usize { 254 }
fn name() -> &'static str { "Fq" }
}
#[test]
fn test_fr() {
use fields;
fields::tests::field_trials::<Fr>();
}
#[test]
fn test_fq() {
use fields;
fields::tests::field_trials::<Fq>();
}
pub struct G1Params;
impl GroupParams for G1Params {
type Base = Fq;
fn name() -> &'static str {
"G1"
}
fn zero() -> Jacobian<Self> {
Jacobian::new(Fq::zero(), Fq::one(), Fq::zero()).unwrap()
}
fn one() -> Jacobian<Self> {
Jacobian::new(Fq::from("1"), Fq::from("2"), Fq::one()).unwrap()
}
fn coeff_b() -> Self::Base {
Fq::from("3")
}
}
#[test]
fn test_g1() {
use groups;
use ::G1;
groups::tests::group_trials::<G1Params>();
assert_eq!(G1::zero(), G1::one() + (G1::zero() - G1::one()));
assert_eq!(G1::zero(), G1::one() * Fr::from("21888242871839275222246405745257275088548364400416034343698204186575808495616") + G1::one());
}
#[test]
fn g1_test_vector() {
use ::G1;
let a = G1::one() * Fr::from("19797905000333868150253315089095386158892526856493194078073564469188852136946");
let b = G1::one() * Fr::from("2730506433347642574983433139433778984782882168213690554721050571242082865799");
let e = &a + &b;
let expect = G1::new(
Fq::from("18450621724990678172567114131642278789161361170999664461184794604011563728206"),
Fq::from("21329688341674583036384007811166435666174342925504675855816423131698588368496"),
Fq::one()
).unwrap();
assert_eq!(expect, e);
}
pub struct Fq2Params;
impl Fp2Params for Fq2Params {
fn non_residue() -> Fq {
Fq::from("21888242871839275222246405745257275088696311157297823662689037894645226208582")
}
fn name() -> &'static str {
"Fq2"
}
fn frobenius_coeffs_c1(n: usize) -> Fq {
match n {
0 => Fq::from("1"),
1 => Fq::from("21888242871839275222246405745257275088696311157297823662689037894645226208582"),
_ => panic!()
}
}
}
#[test]
fn test_fq2() {
use fields;
fields::tests::field_trials::<Fq2>();
}
pub struct G2Params;
impl G2Params {
pub fn twist() -> Fq2 {
Fq2::new(Fq::from("9"), Fq::from("1"))
}
pub fn twist_mul_by_q_x() -> Fq2 {
Fq2::new(Fq::from("21575463638280843010398324269430826099269044274347216827212613867836435027261"),
Fq::from("10307601595873709700152284273816112264069230130616436755625194854815875713954"))
}
pub fn twist_mul_by_q_y() -> Fq2 {
Fq2::new(Fq::from("2821565182194536844548159561693502659359617185244120367078079554186484126554"),
Fq::from("3505843767911556378687030309984248845540243509899259641013678093033130930403"))
}
}
impl GroupParams for G2Params {
type Base = Fq2;
fn name() -> &'static str {
"G2"
}
fn zero() -> Jacobian<Self> {
Jacobian::new(Fq2::zero(), Fq2::one(), Fq2::zero()).unwrap()
}
fn one() -> Jacobian<Self> {
Jacobian::new(
Fq2::new(
Fq::from("10857046999023057135944570762232829481370756359578518086990519993285655852781"),
Fq::from("11559732032986387107991004021392285783925812861821192530917403151452391805634")
),
Fq2::new(
Fq::from("8495653923123431417604973247489272438418190587263600148770280649306958101930"),
Fq::from("4082367875863433681332203403145435568316851327593401208105741076214120093531")
),
Fq2::one()
).unwrap()
}
fn coeff_b() -> Self::Base {
&G2Params::twist().inverse() * &Fq::from("3")
}
}
#[test]
fn test_g2() {
use groups;
use ::G2;
groups::tests::group_trials::<G2Params>();
assert_eq!(G2::zero(), G2::one() + (G2::zero() - G2::one()));
assert_eq!(G2::zero(), G2::one() * Fr::from("21888242871839275222246405745257275088548364400416034343698204186575808495616") + G2::one());
}
#[test]
fn g2_test_vector() {
use ::G2;
let a = G2::one() * Fr::from("19797905000333868150253315089095386158892526856493194078073564469188852136946");
let b = G2::one() * Fr::from("2730506433347642574983433139433778984782882168213690554721050571242082865799");
let e = &a + &b;
let expect = G2::new(
Fq2::new(
Fq::from("10805137482603266627116066166226222153808813611856467496561473491230213987197"),
Fq::from("11018998371825437935082073888099464993330606622517843684670450190973893289235")
),
Fq2::new(
Fq::from("371699491666579792038680273553261511891341995868329474144713691525212078012"),
Fq::from("2123259504314265904107110265140842273706723557882599408954283209162529085097")
),
Fq2::one()
).unwrap();
assert_eq!(expect, e);
}
pub struct Fq6Params;
impl Fp6Params for Fq6Params {
fn non_residue() -> Fq2 {
Fq2::new(Fq::from("9"), Fq::from("1"))
}
fn name() -> &'static str {
"Fq6"
}
fn frobenius_coeffs_c1(n: usize) -> Fq2 {
match n {
0 => Fq2::new(
Fq::from("1"),
Fq::from("0")
),
1 => Fq2::new(
Fq::from("21575463638280843010398324269430826099269044274347216827212613867836435027261"),
Fq::from("10307601595873709700152284273816112264069230130616436755625194854815875713954")
),
2 => Fq2::new(
Fq::from("21888242871839275220042445260109153167277707414472061641714758635765020556616"),
Fq::from("0")
),
3 => Fq2::new(
Fq::from("3772000881919853776433695186713858239009073593817195771773381919316419345261"),
Fq::from("2236595495967245188281701248203181795121068902605861227855261137820944008926")
),
4 => Fq2::new(
Fq::from("2203960485148121921418603742825762020974279258880205651966"),
Fq::from("0")
),
5 => Fq2::new(
Fq::from("18429021223477853657660792034369865839114504446431234726392080002137598044644"),
Fq::from("9344045779998320333812420223237981029506012124075525679208581902008406485703")
),
_ => panic!()
}
}
fn frobenius_coeffs_c2(n: usize) -> Fq2 {
match n {
0 => Fq2::new(
Fq::from("1"),
Fq::from("0")
),
1 => Fq2::new(
Fq::from("2581911344467009335267311115468803099551665605076196740867805258568234346338"),
Fq::from("19937756971775647987995932169929341994314640652964949448313374472400716661030")
),
2 => Fq2::new(
Fq::from("2203960485148121921418603742825762020974279258880205651966"),
Fq::from("0")
),
3 => Fq2::new(
Fq::from("5324479202449903542726783395506214481928257762400643279780343368557297135718"),
Fq::from("16208900380737693084919495127334387981393726419856888799917914180988844123039")
),
4 => Fq2::new(
Fq::from("21888242871839275220042445260109153167277707414472061641714758635765020556616"),
Fq::from("0")
),
5 => Fq2::new(
Fq::from("13981852324922362344252311234282257507216387789820983642040889267519694726527"),
Fq::from("7629828391165209371577384193250820201684255241773809077146787135900891633097")
),
_ => panic!()
}
}
}
#[test]
fn test_fq6() {
use fields;
fields::tests::field_trials::<::Fq6>();
}
pub struct Fq12Params;
impl Fp12Params for Fq12Params {
fn non_residue() -> Fq2 {
Fq2::new(Fq::from("9"), Fq::from("1"))
}
fn name() -> &'static str {
"Fq12"
}
fn frobenius_coeffs_c1(n: usize) -> Fq2 {
match n {
0 => Fq2::new(
Fq::from("1"),
Fq::from("0")
),
1 => Fq2::new(
Fq::from("8376118865763821496583973867626364092589906065868298776909617916018768340080"),
Fq::from("16469823323077808223889137241176536799009286646108169935659301613961712198316")
),
2 => Fq2::new(
Fq::from("21888242871839275220042445260109153167277707414472061641714758635765020556617"),
Fq::from("0")
),
3 => Fq2::new(
Fq::from("11697423496358154304825782922584725312912383441159505038794027105778954184319"),
Fq::from("303847389135065887422783454877609941456349188919719272345083954437860409601")
),
4 => Fq2::new(
Fq::from("21888242871839275220042445260109153167277707414472061641714758635765020556616"),
Fq::from("0")
),
5 => Fq2::new(
Fq::from("3321304630594332808241809054958361220322477375291206261884409189760185844239"),
Fq::from("5722266937896532885780051958958348231143373700109372999374820235121374419868")
),
6 => Fq2::new(
Fq::from("21888242871839275222246405745257275088696311157297823662689037894645226208582"),
Fq::from("0")
),
7 => Fq2::new(
Fq::from("13512124006075453725662431877630910996106405091429524885779419978626457868503"),
Fq::from("5418419548761466998357268504080738289687024511189653727029736280683514010267")
),
8 => Fq2::new(
Fq::from("2203960485148121921418603742825762020974279258880205651966"),
Fq::from("0")
),
9 => Fq2::new(
Fq::from("10190819375481120917420622822672549775783927716138318623895010788866272024264"),
Fq::from("21584395482704209334823622290379665147239961968378104390343953940207365798982")
),
10 => Fq2::new(
Fq::from("2203960485148121921418603742825762020974279258880205651967"),
Fq::from("0")
),
11 => Fq2::new(
Fq::from("18566938241244942414004596690298913868373833782006617400804628704885040364344"),
Fq::from("16165975933942742336466353786298926857552937457188450663314217659523851788715")
),
_ => panic!()
}
}
}
#[test]
fn test_fq12() {
use fields;
fields::tests::field_trials::<::Fq12>();
}
#[test]
fn fq12_test_vector() {
let start = ::Fq12::new(
::Fq6::new(
Fq2::new(
Fq::from("19797905000333868150253315089095386158892526856493194078073564469188852136946"),
Fq::from("10509658143212501778222314067134547632307419253211327938344904628569123178733")
),
Fq2::new(
Fq::from("208316612133170645758860571704540129781090973693601051684061348604461399206"),
Fq::from("12617661120538088237397060591907161689901553895660355849494983891299803248390")
),
Fq2::new(
Fq::from("2897490589776053688661991433341220818937967872052418196321943489809183508515"),
Fq::from("2730506433347642574983433139433778984782882168213690554721050571242082865799")
)
),
::Fq6::new(
Fq2::new(
Fq::from("17870056122431653936196746815433147921488990391314067765563891966783088591110"),
Fq::from("14314041658607615069703576372547568077123863812415914883625850585470406221594")
),
Fq2::new(
Fq::from("10123533891707846623287020000407963680629966110211808794181173248765209982878"),
Fq::from("5062091880848845693514855272640141851746424235009114332841857306926659567101")
),
Fq2::new(
Fq::from("9839781502639936537333620974973645053542086898304697594692219798017709586567"),
Fq::from("1583892292110602864638265389721494775152090720173641072176370350017825640703")
)
)
);
// Do a bunch of arbitrary stuff to the element
let mut next = start.clone();
for _ in 0..100 {
next = &next * &start;
}
let cpy = next.clone();
for _ in 0..10 {
next = next.squared();
}
for _ in 0..10 {
next = &next + &start;
next = &next - &cpy;
next = -&next;
}
next = next.squared();
let finally = ::Fq12::new(
::Fq6::new(
Fq2::new(
Fq::from("18388750939593263065521177085001223024106699964957029146547831509155008229833"),
Fq::from("18370529854582635460997127698388761779167953912610241447912705473964014492243")
),
Fq2::new(
Fq::from("3691824277096717481466579496401243638295254271265821828017111951446539785268"),
Fq::from("20513494218085713799072115076991457239411567892860153903443302793553884247235")
),
Fq2::new(
Fq::from("12214155472433286415803224222551966441740960297013786627326456052558698216399"),
Fq::from("10987494248070743195602580056085773610850106455323751205990078881956262496575")
)
),
::Fq6::new(
Fq2::new(
Fq::from("5134522153456102954632718911439874984161223687865160221119284322136466794876"),
Fq::from("20119236909927036376726859192821071338930785378711977469360149362002019539920")
),
Fq2::new(
Fq::from("8839766648621210419302228913265679710586991805716981851373026244791934012854"),
Fq::from("9103032146464138788288547957401673544458789595252696070370942789051858719203")
),
Fq2::new(
Fq::from("10378379548636866240502412547812481928323945124508039853766409196375806029865"),
Fq::from("9021627154807648093720460686924074684389554332435186899318369174351765754041")
)
)
);
assert_eq!(finally, next);
}
pub fn ate_loop_count() -> Fr {
Fr::from("29793968203157093288")
}
pub fn final_exponent_z() -> Fr {
Fr::from("4965661367192848881")
}