Wire Sysio Wire Sysion 1.0.0
|
This library provides functionality to compute the optimal ate pairing over Barreto-Naehrig (BN) curves. It is released under the BSD 3-Clause License.
Now I'm developing a new pairing library mcl, which is more portable and supports larger primes than this library though it is a little slower.
mulx
on HaswellThe following two BN curves are supported:
By default, the first curve (we call it as CurveFp254BNb) is used; when setting the flag SUPPORT_SNARK
, the second curve (we call it as CurveSNARK) is used instead.
Pairing computations on the first curve are more efficient, and the performance numbers reported below (and in our papers) are achieved using this curve (which is prefered for applications that do not benefit from high 2-adicity). Note that the old parameters in [BDMOHT] are not used now.
The curve equation for a BN curve is:
E/Fp: y^2 = x^3 + b .
The two supported BN curves have the following parameters:
As usual,
The field Fp12 is constructed via the following tower:
> git clone git://github.com/herumi/xbyak.git > git clone git://github.com/herumi/ate-pairing.git > git clone git://github.com/herumi/cybozulib-ext.git ; compiled binary of mpir
Open ate/ate.sln
and compile test_bn
with Release mode. The produced binary is ate/x64/Release/test_bn.exe
.
Install mingw64-x86_64-gcc-g++
(run Cygwin setup and search mingw64
). Then use the following commands:
PATH=/usr/x86_64-w64-mingw32/sys-root/mingw/bin/:$PATH make -j test/bn.exe
Note that test/bn.exe
uses mulx
if possible; if you do not want to use it, run the executable as test/bn.exe -mulx 0
. (This allows you to verify the difference with/without mulx on Haswell.)
Use the following commands:
$ git clone git://github.com/herumi/xbyak.git $ git clone git://github.com/herumi/ate-pairing.git $ cd ate-pairing $ make -j $ test/bn
The library xbyak is a x86/x86-64 JIT assembler for C++, developed for efficient pairing implementations. (See also this webpage.) Note that binaries other than test/bn
are used for testing purposes only.
zmInit ERR:can't protect
if execution of code on the heap is disallowed by some modern systems. For example, on Fedora 20, run sudo setsebool -P allow_execheap 1
to allow execution to solve this.By the default, the first BN curve is used. If instead you want to use the second BN curve (specialized to SNARKs), modify the fourth line above to:
$ make -j SUPPORT_SNARK=1
BN_SUPPORT_SNARK
macro for a compile when if you use a library(libzm.a) made by SUPPORT_SNARK=1
.See the function sample2()
in sample.cpp. Also, use can use mpz_class
for scalar multiplication of points on the elliptic curves, if MIE_ATE_USE_GMP
is defined. For instance:
using namespace bn; Param::init(); const Ec2 g2(...); const Ec1 g1(...); mpz_class a("123456789"); mpz_class b("98765432"); Ec1 g1a = g1 * a; Ec2 g2b = g2 * b; Fp12 e; opt_atePairing(e, g2b, g1a);
See java.md. A sample code is BN254Test.java.
Let mu be the cost of unreduced multiplication producing double-precision result (i.e., 256-bit int x 256-bit int to 512-bit int); and let r be the cost of modular reduction of double-precision integers (i.e., 512-bit int to 256-bit int in Fp). Then, for us,
Next, we compare the costs of our library with the one of [AKLGL10]:
Phase | [AKLGL10] | This work |
---|---|---|
Miller loop | 6792mu + 3022r | 6785mu + 3022r |
Final exponentiation | 3753mu + 2006r | 3526mu + 1932r |
Optimal ate pairing | 10545mu + 5028r | 10311mu + 4954r |
Note: [Table 2 in p. 17, AKLGL10] does not contain the cost of (m, r) so we have added the costs of (282m + 6mu + 4r) and (30m + 75mu + 50r) to ML and FE respectively.
Finally, at the moment, our implementation does not support the algorithm in PSNB10.
The cost of a pairing is 1.17M clock cycles on Core i7 4700MQ (Haswell) 2.4GHz processor with TurboBoost disabled. Below, we also include clock cycle counts on Core i7 2600 3.4GHz, Xeon X5650 2.6GHz, and Core i7 4700MQ 2.4GHz. The formal benchmark is written in [ZPMRTH].
% sudo sh -c "echo 0 > /sys/devices/system/cpu/cpufreq/boost" % cat /sys/devices/system/cpu/cpufreq/boost 0
operation | i7 2600 | Xeon X5650 | Haswell | Haswell with mulx |
---|---|---|---|---|
TurboBoost | on | on | off | off |
| | | | mu | 50 |60 |42 |38 r | 80 |98 |69 |65 Fp:mul |124 |146 |98 |90 Fp2:mul |360 |412 | | Fp2:square |288 |335 | | | | | | G1::double |1150 |1300 | | G1::add |2200 |2600 | | G2::double |2500 |2900 | | G2::add |5650 |6500 | | Fp12::square|4500 |5150 | | Fp12::mul |6150 |7000 | | | | | | Miller loop |0.83M |0.97M |0.82M |0.71M final_exp |0.53M |0.63M |0.51M |0.46M | | | | pairing |1.36M |1.60M |1.33M |1.17M
herumi@nifty.com
)tadanori.teruya@gmail.com
)alexch@mit.edu
)madars@mit.edu
)