1 /** @file
2  *****************************************************************************
3  * @author     This file is part of libff, developed by SCIPR Lab
4  *             and contributors (see AUTHORS).
5  * @copyright  MIT license (see LICENSE file)
6  *****************************************************************************/
7 
8 #include <libff/algebra/curves/bn128/bn128_pp.hpp>
9 #include <libff/common/profiling.hpp>
10 
11 namespace libff {
12 
init_public_params()13 void bn128_pp::init_public_params()
14 {
15     init_bn128_params();
16 }
17 
final_exponentiation(const bn128_GT & elt)18 bn128_GT bn128_pp::final_exponentiation(const bn128_GT &elt)
19 {
20     return bn128_final_exponentiation(elt);
21 }
22 
precompute_G1(const bn128_G1 & P)23 bn128_ate_G1_precomp bn128_pp::precompute_G1(const bn128_G1 &P)
24 {
25     return bn128_ate_precompute_G1(P);
26 }
27 
precompute_G2(const bn128_G2 & Q)28 bn128_ate_G2_precomp bn128_pp::precompute_G2(const bn128_G2 &Q)
29 {
30     return bn128_ate_precompute_G2(Q);
31 }
32 
miller_loop(const bn128_ate_G1_precomp & prec_P,const bn128_ate_G2_precomp & prec_Q)33 bn128_Fq12 bn128_pp::miller_loop(const bn128_ate_G1_precomp &prec_P,
34                                  const bn128_ate_G2_precomp &prec_Q)
35 {
36     enter_block("Call to miller_loop<bn128_pp>");
37     bn128_Fq12 result = bn128_ate_miller_loop(prec_P, prec_Q);
38     leave_block("Call to miller_loop<bn128_pp>");
39     return result;
40 }
41 
double_miller_loop(const bn128_ate_G1_precomp & prec_P1,const bn128_ate_G2_precomp & prec_Q1,const bn128_ate_G1_precomp & prec_P2,const bn128_ate_G2_precomp & prec_Q2)42 bn128_Fq12 bn128_pp::double_miller_loop(const bn128_ate_G1_precomp &prec_P1,
43                                         const bn128_ate_G2_precomp &prec_Q1,
44                                         const bn128_ate_G1_precomp &prec_P2,
45                                         const bn128_ate_G2_precomp &prec_Q2)
46 {
47     enter_block("Call to double_miller_loop<bn128_pp>");
48     bn128_Fq12 result = bn128_double_ate_miller_loop(prec_P1, prec_Q1, prec_P2, prec_Q2);
49     leave_block("Call to double_miller_loop<bn128_pp>");
50     return result;
51 }
52 
pairing(const bn128_G1 & P,const bn128_G2 & Q)53 bn128_Fq12 bn128_pp::pairing(const bn128_G1 &P,
54                              const bn128_G2 &Q)
55 {
56     enter_block("Call to pairing<bn128_pp>");
57     bn128_ate_G1_precomp prec_P = bn128_pp::precompute_G1(P);
58     bn128_ate_G2_precomp prec_Q = bn128_pp::precompute_G2(Q);
59 
60     bn128_Fq12 result = bn128_pp::miller_loop(prec_P, prec_Q);
61     leave_block("Call to pairing<bn128_pp>");
62     return result;
63 }
64 
reduced_pairing(const bn128_G1 & P,const bn128_G2 & Q)65 bn128_GT bn128_pp::reduced_pairing(const bn128_G1 &P,
66                                    const bn128_G2 &Q)
67 {
68     enter_block("Call to reduced_pairing<bn128_pp>");
69     const bn128_Fq12 f = bn128_pp::pairing(P, Q);
70     const bn128_GT result = bn128_pp::final_exponentiation(f);
71     leave_block("Call to reduced_pairing<bn128_pp>");
72     return result;
73 }
74 
75 } // libff
76