fields/arithmetic_params/bls12.hpp
Go to the documentation of this file.
1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2020-2021 Mikhail Komarov <nemo@nil.foundation>
3 // Copyright (c) 2020-2021 Nikita Kaskov <nbering@nil.foundation>
4 //
5 // MIT License
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
8 // of this software and associated documentation files (the "Software"), to deal
9 // in the Software without restriction, including without limitation the rights
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 // copies of the Software, and to permit persons to whom the Software is
12 // furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in all
15 // copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 // SOFTWARE.
24 //---------------------------------------------------------------------------//
25 
26 #ifndef CRYPTO3_ALGEBRA_FIELDS_BLS12_ARITHMETIC_PARAMS_HPP
27 #define CRYPTO3_ALGEBRA_FIELDS_BLS12_ARITHMETIC_PARAMS_HPP
28 
30 
34 
36 
37 namespace nil {
38  namespace crypto3 {
39  namespace algebra {
40  namespace fields {
41 
42  /************************* BLS12-381 ***********************************/
43 
44  template<>
45  struct arithmetic_params<bls12_base_field<381>> : public params<bls12_base_field<381>> {
46  private:
48 
49  public:
53 
54  constexpr static const std::size_t s = 0x01;
55  constexpr static const integral_type t =
56  0xD0088F51CBFF34D258DD3DB21A5D66BB23BA5C279C2895FB39869507B587B120F55FFFF58A9FFFFDCFF7FFFFFFFD555_cppui380;
57  constexpr static const integral_type t_minus_1_over_2 =
58  0x680447A8E5FF9A692C6E9ED90D2EB35D91DD2E13CE144AFD9CC34A83DAC3D8907AAFFFFAC54FFFFEE7FBFFFFFFFEAAA_cppui379;
59  constexpr static const integral_type arithmetic_generator = 0x01;
60  constexpr static const integral_type geometric_generator = 0x02;
61  constexpr static const integral_type multiplicative_generator = 0x02;
62  constexpr static const integral_type root_of_unity =
63  0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA_cppui381;
64  constexpr static const integral_type nqr = 0x02;
65  constexpr static const integral_type nqr_to_t =
66  0x1A0111EA397FE69A4B1BA7B6434BACD764774B84F38512BF6730D2A0F6B0F6241EABFFFEB153FFFFB9FEFFFFFFFFAAAA_cppui381;
67  constexpr static const integral_type Rsquared =
68  0x11988FE592CAE3AA9A793E85B519952D67EB88A9939D83C08DE5476C4C95B6D50A76E6A609D104F1F4DF1F341C341746_cppui381;
69  constexpr static const integral_type Rcubed =
70  0xAA6346091755D4D2512D4356572472834C04E5E921E17619A53352A615E29DD315F831E03A7ADF8ED48AC6BD94CA1E0_cppui380;
71 
72  constexpr static const integral_type modulus = policy_type::modulus;
73  constexpr static const integral_type group_order =
74  0xD0088F51CBFF34D258DD3DB21A5D66BB23BA5C279C2895FB39869507B587B120F55FFFF58A9FFFFDCFF7FFFFFFFD555_cppui380;
75  };
76 
77  template<>
78  struct arithmetic_params<fp2<bls12_base_field<381>>> : public params<bls12_base_field<381>> {
79  private:
81 
82  public:
87 
88  constexpr static const std::size_t s = 0x03;
89  constexpr static const extended_integral_type t =
90  0x5486F497186BF8E97A4F1D5445E4BD3C5B921CA1CE08D68CDCB3C92693D17A0A14C59FA2DBB94DDEA62926612F1DE023AD0C3390C30B8F6525D0B50E1234092CD7F23DA7CE36E862C586706C42279FAF9DAD63AEC705D564D54000038E31C7_cppui759;
91  constexpr static const extended_integral_type t_minus_1_over_2 =
92  0x2A437A4B8C35FC74BD278EAA22F25E9E2DC90E50E7046B466E59E49349E8BD050A62CFD16DDCA6EF53149330978EF011D68619C86185C7B292E85A87091A04966BF91ED3E71B743162C338362113CFD7CED6B1D76382EAB26AA00001C718E3_cppui758;
93  constexpr static const std::array<integral_type, 2> nqr = {1, 1};
94  constexpr static const std::array<integral_type, 2> nqr_to_t = {
95  0x6AF0E0437FF400B6831E36D6BD17FFE48395DABC2D3435E77F76E17009241C5EE67992F72EC05F4C81084FBEDE3CC09_cppui379,
96  0x135203E60180A68EE2E9C448D77A2CD91C3DEDD930B1CF60EF396489F61EB45E304466CF3E67FA0AF1EE7B04121BDEA2_cppui381};
97 
98  constexpr static const integral_type modulus = policy_type::modulus;
99  constexpr static const extended_integral_type group_order =
100  0x1521BD25C61AFE3A5E93C75511792F4F16E48728738235A3372CF249A4F45E82853167E8B6EE5377A98A49984BC77808EB430CE430C2E3D949742D43848D024B35FC8F69F38DBA18B1619C1B1089E7EBE76B58EBB1C1755935500000E38C71C_cppui761;
101  };
102 
103  template<>
104  struct arithmetic_params<bls12_scalar_field<381>> : public params<bls12_scalar_field<381>> {
105  private:
107 
108  public:
112 
113  constexpr static const std::size_t s = 0x20;
114  constexpr static const integral_type t =
115  0x73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF_cppui223;
116  constexpr static const integral_type t_minus_1_over_2 =
117  0x39F6D3A994CEBEA4199CEC0404D0EC02A9DED2017FFF2DFF7FFFFFFF_cppui222;
118  constexpr static const integral_type arithmetic_generator = 0x01;
119  constexpr static const integral_type geometric_generator = 0x02;
120  constexpr static const integral_type multiplicative_generator = 0x07;
121  constexpr static const integral_type root_of_unity =
122  0x16A2A19EDFE81F20D09B681922C813B4B63683508C2280B93829971F439F0D2B_cppui253;
123  constexpr static const integral_type nqr = 0x05;
124  constexpr static const integral_type nqr_to_t =
125  0x212D79E5B416B6F0FD56DC8D168D6C0C4024FF270B3E0941B788F500B912F1F_cppui250;
126  constexpr static const integral_type Rsquared =
127  0x748D9D99F59FF1105D314967254398F2B6CEDCB87925C23C999E990F3F29C6D_cppui251;
128  constexpr static const integral_type Rcubed =
129  0x6E2A5BB9C8DB33E973D13C71C7B5F4181B3E0D188CF06990C62C1807439B73AF_cppui255;
130 
131  constexpr static const integral_type modulus = policy_type::modulus;
132  constexpr static const integral_type group_order =
133  0x39F6D3A994CEBEA4199CEC0404D0EC02A9DED2017FFF2DFF7FFFFFFF80000000_cppui254;
134  };
135 
136  /************************* BLS12-377 ***********************************/
137 
138  template<>
139  struct arithmetic_params<bls12_base_field<377>> : public params<bls12_base_field<377>> {
140  private:
142 
143  public:
147 
148  constexpr static const std::size_t s = 0x2E;
149  constexpr static const integral_type t =
150  0x6B8E9185F1443AB18EC1701B28524EC688B67CC03D44E3C7BCD88BEE82520005C2D7510C00000021423_cppui331;
151  constexpr static const integral_type t_minus_1_over_2 =
152  0x35C748C2F8A21D58C760B80D94292763445B3E601EA271E3DE6C45F741290002E16BA88600000010A11_cppui330;
153  constexpr static const integral_type arithmetic_generator = 0x01;
154  constexpr static const integral_type geometric_generator = 0x02;
155  constexpr static const integral_type multiplicative_generator = 0x0F;
156  constexpr static const integral_type root_of_unity =
157  0x36A92E05198A8030F152488AEFFC9B40FBE05B4512A3D4B44D994A0DDFF8C606DF0A4306FE0BC37ECA603CC563B9A1_cppui374;
158  constexpr static const integral_type nqr = 0x05;
159  constexpr static const integral_type nqr_to_t =
160  0x382D3D99CDBC5D8FE9DEE6AA914B0AD14FCACA7022110EC6EAA2BC56228AC41EA03D28CC795186BA6B5EF26B00BBE8_cppui374;
161  constexpr static const integral_type Rsquared =
162  0x6DFCCB1E914B88837E92F041790BF9BFDF7D03827DC3AC22A5F11162D6B46D0329FCAAB00431B1B786686C9400CD22_cppui375;
163  constexpr static const integral_type Rcubed =
164  0x1065AB4C0E7DDA53F72540713590CB96A2A9516C804A20E2BE8B1180449F513E50F4148BE329585581F532F8815DE20_cppui377;
165 
166  constexpr static const integral_type modulus = policy_type::modulus;
167  constexpr static const integral_type group_order =
168  0xD71D230BE28875631D82E03650A49D8D116CF9807A89C78F79B117DD04A4000B85AEA2180000004284600000000000_cppui376;
169  };
170 
171  template<>
172  struct arithmetic_params<fp2<bls12_base_field<377>>> : public params<bls12_base_field<377>> {
173  private:
175 
176  public:
181 
182  constexpr static const std::size_t s = 0x2F;
183  constexpr static const extended_integral_type t =
184  0x5A60FA1775FF644AD227766C24C78977170FB495DD27E3EBCE2827BB49AB813A0315F720CC19B8029CE24A0549AD88C155555176E15C063064972B0C7193AD797F7A46BE3813495B44D1E5C37B000E671A4A9E00000021423_cppui707;
185  constexpr static const extended_integral_type t_minus_1_over_2 =
186  0x2D307D0BBAFFB2256913BB361263C4BB8B87DA4AEE93F1F5E71413DDA4D5C09D018AFB90660CDC014E712502A4D6C460AAAAA8BB70AE0318324B958638C9D6BCBFBD235F1C09A4ADA268F2E1BD8007338D254F00000010A11_cppui706;
187  constexpr static const std::array<integral_type, 2> nqr = {0x00, 0x01};
188  constexpr static const std::array<integral_type, 2> nqr_to_t = {
189  0x00,
190  0x1ABEF7237D62007BB9B2EDA5AFCB52F9D179F23DBD49B8D1B24CF7C1BF8066791317689172D0F4CB90CF47182B7D7B2_cppui377};
191 
192  constexpr static const integral_type modulus = policy_type::modulus;
193  constexpr static const extended_integral_type group_order =
194  0x16983E85DD7FD912B489DD9B0931E25DC5C3ED257749F8FAF38A09EED26AE04E80C57DC833066E00A7389281526B62305555545DB857018C1925CAC31C64EB5E5FDE91AF8E04D256D1347970DEC00399C692A780000008508C00000000000_cppui753;
195  };
196 
197  template<>
198  struct arithmetic_params<bls12_scalar_field<377>> : public params<bls12_scalar_field<377>> {
199  private:
201 
202  public:
206 
207  constexpr static const std::size_t s = 0x2F;
208  constexpr static const integral_type t =
209  0x2556CABD34594AACC1689A3CB86F6002B354EDFDA00000021423_cppui206;
210  constexpr static const integral_type t_minus_1_over_2 =
211  0x12AB655E9A2CA55660B44D1E5C37B00159AA76FED00000010A11_cppui205;
212  constexpr static const integral_type arithmetic_generator = 0x01;
213  constexpr static const integral_type geometric_generator = 0x02;
214  constexpr static const integral_type multiplicative_generator = 0x16;
215  constexpr static const integral_type root_of_unity =
216  0x11D4B7F60CB92CC160C69477D1A8A12F9B506EE363E3F04A476EF4A4EC2A895E_cppui253;
217  constexpr static const integral_type nqr = 0x0B;
218  constexpr static const integral_type nqr_to_t =
219  0xF4F58D6B338DB36480B0DA08D4FF39BE5C1F1B84059D4CD726869AAA623875C_cppui252;
220  constexpr static const integral_type Rsquared =
221  0x11FDAE7EFF1C939A7CC008FE5DC8593CC2C27B58860591F25D577BAB861857B_cppui249;
222  constexpr static const integral_type Rcubed =
223  0x601DFA555C48DDAB1E55EF6F1C9D713624D23FFAE2716996A4295C90F65454C_cppui251;
224 
225  constexpr static const integral_type modulus = policy_type::modulus;
226  constexpr static const integral_type group_order =
227  0x955B2AF4D1652AB305A268F2E1BD800ACD53B7F680000008508C00000000000_cppui252;
228  };
229 
230  /************************* BLS12-381 definitions ***********************************/
231 
232  constexpr std::size_t const arithmetic_params<bls12_base_field<381>>::s;
233  constexpr std::size_t const arithmetic_params<fp2<bls12_base_field<381>>>::s;
234  constexpr std::size_t const arithmetic_params<bls12_scalar_field<381>>::s;
235 
236  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
238  constexpr typename arithmetic_params<fp2<bls12_base_field<381>>>::extended_integral_type const
240  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
242 
243  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
244  arithmetic_params<bls12_base_field<381>>::t_minus_1_over_2;
245  constexpr typename arithmetic_params<fp2<bls12_base_field<381>>>::extended_integral_type const
247  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
249 
250  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
251  arithmetic_params<bls12_base_field<381>>::arithmetic_generator;
252  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
253  arithmetic_params<bls12_scalar_field<381>>::arithmetic_generator;
254 
255  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
256  arithmetic_params<bls12_base_field<381>>::geometric_generator;
257  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
258  arithmetic_params<bls12_scalar_field<381>>::geometric_generator;
259 
260  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
261  arithmetic_params<bls12_base_field<381>>::multiplicative_generator;
262  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
263  arithmetic_params<bls12_scalar_field<381>>::multiplicative_generator;
264 
265  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
267  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
269 
270  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
272  constexpr std::array<typename arithmetic_params<fp2<bls12_base_field<381>>>::integral_type, 2> const
274  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
276 
277  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
279  constexpr std::array<typename arithmetic_params<fp2<bls12_base_field<381>>>::integral_type, 2> const
281  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
283 
284  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
286  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
288 
289  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
291  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
293 
294  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
296  constexpr typename arithmetic_params<fp2<bls12_base_field<381>>>::integral_type const
298  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
300 
301  constexpr typename arithmetic_params<bls12_base_field<381>>::integral_type const
303  constexpr typename arithmetic_params<fp2<bls12_base_field<381>>>::extended_integral_type const
305  constexpr typename arithmetic_params<bls12_scalar_field<381>>::integral_type const
307 
308  /************************* BLS12-377 definitions ***********************************/
309 
310  constexpr std::size_t const arithmetic_params<bls12_base_field<377>>::s;
311  constexpr std::size_t const arithmetic_params<fp2<bls12_base_field<377>>>::s;
312  constexpr std::size_t const arithmetic_params<bls12_scalar_field<377>>::s;
313 
314  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
316  constexpr typename arithmetic_params<fp2<bls12_base_field<377>>>::extended_integral_type const
318  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
320 
321  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
322  arithmetic_params<bls12_base_field<377>>::t_minus_1_over_2;
323  constexpr typename arithmetic_params<fp2<bls12_base_field<377>>>::extended_integral_type const
325  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
327 
328  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
329  arithmetic_params<bls12_base_field<377>>::arithmetic_generator;
330  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
331  arithmetic_params<bls12_scalar_field<377>>::arithmetic_generator;
332 
333  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
334  arithmetic_params<bls12_base_field<377>>::geometric_generator;
335  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
336  arithmetic_params<bls12_scalar_field<377>>::geometric_generator;
337 
338  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
339  arithmetic_params<bls12_base_field<377>>::multiplicative_generator;
340  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
341  arithmetic_params<bls12_scalar_field<377>>::multiplicative_generator;
342 
343  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
345  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
347 
348  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
350  constexpr std::array<typename arithmetic_params<fp2<bls12_base_field<377>>>::integral_type, 2> const
352  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
354 
355  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
357  constexpr std::array<typename arithmetic_params<fp2<bls12_base_field<377>>>::integral_type, 2> const
359  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
361 
362  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
364  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
366 
367  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
369  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
371 
372  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
374  constexpr typename arithmetic_params<fp2<bls12_base_field<377>>>::integral_type const
376  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
378 
379  constexpr typename arithmetic_params<bls12_base_field<377>>::integral_type const
381  constexpr typename arithmetic_params<fp2<bls12_base_field<377>>>::extended_integral_type const
383  constexpr typename arithmetic_params<bls12_scalar_field<377>>::integral_type const
385 
386  } // namespace fields
387  } // namespace algebra
388  } // namespace crypto3
389 } // namespace nil
390 
391 #endif // CRYPTO3_ALGEBRA_FIELDS_BLS12_ARITHMETIC_PARAMS_HPP
Definition: pair.hpp:31
policy_type::modular_backend modular_backend
Definition: fields/arithmetic_params/bls12.hpp:145
policy_type::integral_type integral_type
Definition: fields/arithmetic_params/bls12.hpp:146
policy_type::modular_type modular_type
Definition: fields/arithmetic_params/bls12.hpp:144
policy_type::modular_type modular_type
Definition: fields/arithmetic_params/bls12.hpp:50
policy_type::modular_backend modular_backend
Definition: fields/arithmetic_params/bls12.hpp:51
policy_type::integral_type integral_type
Definition: fields/arithmetic_params/bls12.hpp:52
policy_type::modular_backend modular_backend
Definition: fields/arithmetic_params/bls12.hpp:204
policy_type::integral_type integral_type
Definition: fields/arithmetic_params/bls12.hpp:205
policy_type::modular_type modular_type
Definition: fields/arithmetic_params/bls12.hpp:203
policy_type::integral_type integral_type
Definition: fields/arithmetic_params/bls12.hpp:111
policy_type::modular_type modular_type
Definition: fields/arithmetic_params/bls12.hpp:109
policy_type::modular_backend modular_backend
Definition: fields/arithmetic_params/bls12.hpp:110
policy_type::extended_integral_type extended_integral_type
Definition: fields/arithmetic_params/bls12.hpp:180
policy_type::modular_type modular_type
Definition: fields/arithmetic_params/bls12.hpp:177
policy_type::integral_type integral_type
Definition: fields/arithmetic_params/bls12.hpp:179
policy_type::modular_backend modular_backend
Definition: fields/arithmetic_params/bls12.hpp:178
policy_type::extended_integral_type extended_integral_type
Definition: fields/arithmetic_params/bls12.hpp:86
policy_type::integral_type integral_type
Definition: fields/arithmetic_params/bls12.hpp:85
policy_type::modular_type modular_type
Definition: fields/arithmetic_params/bls12.hpp:83
policy_type::modular_backend modular_backend
Definition: fields/arithmetic_params/bls12.hpp:84
Definition: fields/params.hpp:58
IETF IPsec groups.
Definition: bls12/base_field.hpp:46
Definition: bls12/scalar_field.hpp:46
Definition: fields/params.hpp:35
field_type::modular_backend modular_backend
Definition: fields/params.hpp:38
field_type::integral_type integral_type
Definition: fields/params.hpp:42
field_type::modular_type modular_type
Definition: fields/params.hpp:37
field_type::extended_integral_type extended_integral_type
Definition: fields/params.hpp:44