-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathEC_BN128_InitFields.hpp
118 lines (100 loc) · 7.53 KB
/
EC_BN128_InitFields.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#ifndef _SNARKLIB_EC_BN128_INIT_FIELDS_HPP_
#define _SNARKLIB_EC_BN128_INIT_FIELDS_HPP_
#include <snarklib/EC.hpp>
#include <snarklib/EC_BN128_Modulus.hpp>
namespace snarklib {
////////////////////////////////////////////////////////////////////////////////
// Barreto-Naehrig (128 bits)
// initialize fields
//
// MODULUS is: modulus_r; modulus_q
template <mp_size_t N, const BigInt<N>& MODULUS>
class BN128_InitFields : public ECInitField<N, MODULUS, BN128_InitFields<N, MODULUS>> // CRTP
{
typedef ECInitField<N, MODULUS, BN128_InitFields<N, MODULUS>> BASE;
public:
static const BigInt<BN128_Modulus::r_limbs>& modulus_r() {
return BN128_Modulus::modulus_r();
}
static const BigInt<BN128_Modulus::q_limbs>& modulus_q() {
return BN128_Modulus::modulus_q();
}
typedef typename BASE::Fp F;
typedef typename BASE::Fp2 F2;
typedef typename BASE::Fp23 F6;
typedef typename BASE::Fp232 F12;
static void initModulusR()
{
if (8 == sizeof(mp_limb_t)) {
F::params.Rsquared("944936681149208446651664254269745548490766851729442924617792859073125903783");
F::params.Rcubed("5866548545943845227489894872040244720403868105578784105281690076696998248512");
F::params.inv(0xc2e1f593efffffff);
}
if (4 == sizeof(mp_limb_t)) {
F::params.Rsquared("944936681149208446651664254269745548490766851729442924617792859073125903783");
F::params.Rcubed("5866548545943845227489894872040244720403868105578784105281690076696998248512");
F::params.inv(0xefffffff);
}
F::params.num_bits(254);
F::params.s(28);
F::params.t_minus_1_over_2("40770029410420498293352137776570907027550720424234931066070132305055");
F::params.multiplicative_generator("5");
F::params.root_of_unity("19103219067921713944291392827692070036145651957329286315305642004821462161904");
F::params.nqr_to_t("19103219067921713944291392827692070036145651957329286315305642004821462161904");
}
static void initModulusQ()
{
if (8 == sizeof(mp_limb_t))
{
F::params.Rsquared("3096616502983703923843567936837374451735540968419076528771170197431451843209");
F::params.Rcubed("14921786541159648185948152738563080959093619838510245177710943249661917737183");
F::params.inv(0x87d20782e4866389);
}
if (4 == sizeof(mp_limb_t))
{
F::params.Rsquared("3096616502983703923843567936837374451735540968419076528771170197431451843209");
F::params.Rcubed("14921786541159648185948152738563080959093619838510245177710943249661917737183");
F::params.inv(0xe4866389);
}
F::params.num_bits(254);
F::params.s(1);
F::params.t_minus_1_over_2("5472060717959818805561601436314318772174077789324455915672259473661306552145");
F::params.multiplicative_generator("3");
F::params.root_of_unity("21888242871839275222246405745257275088696311157297823662689037894645226208582");
F::params.nqr_to_t("21888242871839275222246405745257275088696311157297823662689037894645226208582");
F2::params.s(4);
F2::params.t_minus_1_over_2("14971724250519463826312126413021210649976634891596900701138993820439690427699319920245032869357433499099632259837909383182382988566862092145199781964621");
F2::params.non_residue("21888242871839275222246405745257275088696311157297823662689037894645226208582");
F2::params.nqr_to_t("5033503716262624267312492558379982687175200734934877598599011485707452665730", "314498342015008975724433667930697407966947188435857772134235984660852259084");
F2::params.Frobenius_coeffs_c1(0, "1");
F2::params.Frobenius_coeffs_c1(1, "21888242871839275222246405745257275088696311157297823662689037894645226208582");
F6::params.non_residue("9", "1");
F6::params.Frobenius_coeffs_c1(0, "1", "0");
F6::params.Frobenius_coeffs_c1(1, "21575463638280843010398324269430826099269044274347216827212613867836435027261", "10307601595873709700152284273816112264069230130616436755625194854815875713954");
F6::params.Frobenius_coeffs_c1(2, "21888242871839275220042445260109153167277707414472061641714758635765020556616", "0");
F6::params.Frobenius_coeffs_c1(3, "3772000881919853776433695186713858239009073593817195771773381919316419345261", "2236595495967245188281701248203181795121068902605861227855261137820944008926");
F6::params.Frobenius_coeffs_c1(4, "2203960485148121921418603742825762020974279258880205651966", "0");
F6::params.Frobenius_coeffs_c1(5, "18429021223477853657660792034369865839114504446431234726392080002137598044644", "9344045779998320333812420223237981029506012124075525679208581902008406485703");
F6::params.Frobenius_coeffs_c2(0, "1", "0");
F6::params.Frobenius_coeffs_c2(1, "2581911344467009335267311115468803099551665605076196740867805258568234346338", "19937756971775647987995932169929341994314640652964949448313374472400716661030");
F6::params.Frobenius_coeffs_c2(2, "2203960485148121921418603742825762020974279258880205651966", "0");
F6::params.Frobenius_coeffs_c2(3, "5324479202449903542726783395506214481928257762400643279780343368557297135718", "16208900380737693084919495127334387981393726419856888799917914180988844123039");
F6::params.Frobenius_coeffs_c2(4, "21888242871839275220042445260109153167277707414472061641714758635765020556616", "0");
F6::params.Frobenius_coeffs_c2(5, "13981852324922362344252311234282257507216387789820983642040889267519694726527", "7629828391165209371577384193250820201684255241773809077146787135900891633097");
F12::params.non_residue("9", "1");
F12::params.Frobenius_coeffs_c1(0, "1", "0");
F12::params.Frobenius_coeffs_c1(1, "8376118865763821496583973867626364092589906065868298776909617916018768340080", "16469823323077808223889137241176536799009286646108169935659301613961712198316");
F12::params.Frobenius_coeffs_c1(2, "21888242871839275220042445260109153167277707414472061641714758635765020556617", "0");
F12::params.Frobenius_coeffs_c1(3, "11697423496358154304825782922584725312912383441159505038794027105778954184319", "303847389135065887422783454877609941456349188919719272345083954437860409601");
F12::params.Frobenius_coeffs_c1(4, "21888242871839275220042445260109153167277707414472061641714758635765020556616", "0");
F12::params.Frobenius_coeffs_c1(5, "3321304630594332808241809054958361220322477375291206261884409189760185844239", "5722266937896532885780051958958348231143373700109372999374820235121374419868");
F12::params.Frobenius_coeffs_c1(6, "21888242871839275222246405745257275088696311157297823662689037894645226208582", "0");
F12::params.Frobenius_coeffs_c1(7, "13512124006075453725662431877630910996106405091429524885779419978626457868503", "5418419548761466998357268504080738289687024511189653727029736280683514010267");
F12::params.Frobenius_coeffs_c1(8, "2203960485148121921418603742825762020974279258880205651966", "0");
F12::params.Frobenius_coeffs_c1(9, "10190819375481120917420622822672549775783927716138318623895010788866272024264", "21584395482704209334823622290379665147239961968378104390343953940207365798982");
F12::params.Frobenius_coeffs_c1(10, "2203960485148121921418603742825762020974279258880205651967", "0");
F12::params.Frobenius_coeffs_c1(11, "18566938241244942414004596690298913868373833782006617400804628704885040364344", "16165975933942742336466353786298926857552937457188450663314217659523851788715");
}
};
} // namespace snarklib
#endif