• Stars
    star
    132
  • Rank 274,205 (Top 6 %)
  • Language
    C++
  • Created almost 13 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

High-Speed Software Implementation of the Optimal Ate Pairing over Barreto-Naehrig Curves

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.

History

Overview

The following two BN curves are supported:

  1. a BN curve over the 254-bit prime p = 36z^4 + 36z^3 + 24z^2 + 6z + 1 where z = -(2^62 + 2^55 + 1); and
  2. a BN curve over a 254-bit prime p such that n := p + 1 - t has high 2-adicity.

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.

  • CurveFp254BNb The value of z is found by [NASKM] first. The curve instantiated by z is investigated by [PSNB] for an efficient implementation. Our library implements a fast algorithm, which is proposed by [AKLGL] for this curve. The performance of this library is competitive to the state-of-the-art implementation report in [ABLR].

  • CurveSNARK Support for the second curve builds on code provided by SCIPR Lab in libsnark. The curve was specifically selected for speeding up Succinct Non-interactive ARguments of Knowledge (SNARKs), which benefit from its high 2-adicity (see [BCGTV13] and [BCTV14]).

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.

Parameters

The curve equation for a BN curve is:

E/Fp: y^2 = x^3 + b .

The two supported BN curves have the following parameters:

  1. b = 2 and p = 16798108731015832284940804142231733909889187121439069848933715426072753864723; and
  2. b = 3 and p = 21888242871839275222246405745257275088696311157297823662689037894645226208583.

As usual,

  • the cyclic group G1 (aka Ec1) is instantiated as E(Fp)[n] where n := p + 1 - t;
  • the cyclic group G2 (aka Ec2) is instantiated as the inverse image of E'(Fp^2)[n] under a twisting isomorphism from E' to E; and
  • the pairing e: G1 x G2 -> Fp12 is the optimal ate pairing.

The field Fp12 is constructed via the following tower:

  • Fp2 = Fp[u] / (u^2 + 1)
  • Fp6 = Fp2[v] / (v^3 - Xi) where Xi = u + 1
  • Fp12 = Fp6[w] / (w^2 - v)

Requirements

  • OS: 64-bit Windows; 64-bit Linux; Mac OS X
  • CPU: x64 Intel; AMD processor
  • C++ compiler: Visual Studio 2012; gcc 4.4.1 or later

Build instructions

Windows

> 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.

Cygwin

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.)

Linux

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.

  • This implementation uses dynamically-generated code, so you will get the error 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
  • REMARK. You defined BN_SUPPORT_SNARK macro for a compile when if you use a library(libzm.a) made by SUPPORT_SNARK=1.

Usage

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);

Usage for Java

See java.md. A sample code is BN254Test.java.

Operation costs

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,

  • Fp::mul = mu + r
  • Fp2::mul = 3mu + 2r
  • Fp2::square = 2mu + 2r

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.

Benchmark

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

References

Authors

Contributors

More Repositories

1

xbyak

a JIT assembler for x86(IA-32)/x64(AMD64, x86-64) MMX/SSE/SSE2/SSE3/SSSE3/SSE4/FPU/AVX/AVX2/AVX-512 by C++ header
C++
1,949
star
2

mcl

a portable and fast pairing-based cryptography library
C++
431
star
3

prml

TeX
367
star
4

bls

C++
284
star
5

msoffice

C++
228
star
6

fmath

fast log and exp functions for x86/x64 SSE
C++
210
star
7

ango-src

TeX
87
star
8

cybozulib

a tiny library for C++
C++
63
star
9

she-wasm

Two-level homomorphic encryption for Node.js by WebAssembly
JavaScript
62
star
10

bls-eth-go-binary

Go
61
star
11

mcl-wasm

TypeScript
58
star
12

ango

51
star
13

misc

C++
51
star
14

bls-wasm

BLS signature for Node.js by WebAssembly
JavaScript
46
star
15

emcjp

C++
44
star
16

x86opti

37
star
17

blog

C++
36
star
18

bls-eth-wasm

JavaScript
30
star
19

opti

C++
29
star
20

xbyak_riscv

C++
26
star
21

bls-go-binary

Go
21
star
22

bls-eth-rust

Rust
20
star
23

simdgen

A library to generate a SIMD code for AVX-512/SVE from a given function string.
C++
19
star
24

ecdsa-motoko

Motoko
14
star
25

mie_string

C++
13
star
26

mie

C++
11
star
27

s_xbyak

ASM generation tool for GAS/NASM/MASM with Xbyak-like syntax in Python
Python
11
star
28

ecdsa-wasm

ECDSA/secp256k1 + SHA-256
JavaScript
9
star
29

fmindex

forked fmindex-plus-plus
C++
7
star
30

anninbon

HTML
7
star
31

ahe-demo

additive homomorphic encryption demo to compute an edge of an image
C++
5
star
32

add_he

additive homomorphic encryption demo using lifted ElGamal encryption
C++
5
star
33

test-picotls

C
4
star
34

mcl-rust

Rust
4
star
35

edit-dist

C++
4
star
36

gogo

obsolete
4
star
37

pairing-doc

TeX
4
star
38

faster-csidh

The original is https://gitlab.cs.hs-rm.de/pqcrypto/faster-csidh
C
4
star
39

walb-tools

C
3
star
40

mcl-android

sample of mcl on Android
CMake
3
star
41

l2-to-l1

C++
3
star
42

obsolete-bls-all-in-one

Assembly
2
star
43

gmp-android

C++
2
star
44

mcl-ff

arithmetic operations of a finite field
Python
2
star
45

ot-by-l2he

Oblivious Transfer demo by L2-HE
C++
2
star
46

she-rust

Rust
2
star
47

test-harmony-bls

test of harmony-bls for jaa
C++
2
star
48

cybozulib_ext

a collection for cybozulib
C
2
star
49

debug_mcl

debug mcl for travis
Assembly
1
star
50

mcladt

Java
1
star
51

test-bls-go-binary

Go
1
star
52

sample-wasm-cpp

JavaScript
1
star