Welcome to bplib’s documentation!¶
The bplib is a library implementing support for computations on groups supporting
bilinear pairings, as used in modern cryptography.
It is based on the OpenPairing library by
Diego Aranha (https://github.com/dfaranha/OpenPairing), which is itself based on, and compatible
with, OpenSSL math functions (bn and ec). The bplib is compatible with petlib types
including petlib.bn and the group G1 is a petlib.ec EC group. Along with petlib,
they provide easy to use
support for maths and ciphers used in modern Privacy Enhancing Technologies.”
A set of bilinear EC groups is defined as:
>>> G = bp.BpGroup()
Such a BpGroup describes 3 groups G1, G2 and GT such that pair(G1,G2)->GT. Generators for the groups G1 and G2 are denoted by:
>>> g1, g2 = G.gen1(), G.gen2()
The special pair operation computes to pairing into GT:
>>> gt = G.pair(g1, g2)
Operations are defined on all elements of G1, G2 or GT in a natural additive infix notation for G1 and G2, and a multiplicative notation for GT:
>>> gt6 = gt**6
As expected the pair operations is additive:
>>> G.pair(g1, 6*g2) == gt6
True
>>> G.pair(6*g1, g2) == gt6
True
>>> G.pair(2*g1, 3*g2) == gt6
True
Reference¶
Module bplib.bp.BpGroup¶
-
class
bplib.bp.BpGroup(nid=1, optimize_mult=True)¶ A class representing all groups involved in the bilinear pairing: G1, G2, and GT.
-
gen1()¶ Returns the generator for G1.
-
gen2()¶ Returns the generator for G2.
-
hashG1(sbin)¶ Hashes a byte string into a point of G1.
- Example:
>>> G = BpGroup() >>> g1 = G.gen1() >>> g1p = G.hashG1(b"Hello") >>> x = g1 + g1p
-
order()¶ Returns the order of the group as a Big Number.
- Example:
>>> G = BpGroup() >>> print(G.order()) 16798108731015832284940804142231733909759579603404752749028378864165570215949
-
pair(g1, g2)¶ The pairing operation e(G1, G2) -> GT.
- Example:
>>> G = BpGroup() >>> g1, g2 = G.gen1(), G.gen2() >>> gt = G.pair(g1, g2) >>> gt6 = G.pair(g1.mul(2), g2.mul(3)) >>> gt.exp(6).eq( gt6 ) True >>> gt**6 == G.pair(2*g1, 3*g2) True
-
Module bplib.bp.GXElem¶
-
class
bplib.bp.G1Elem(group)¶ -
add(other)¶ Returns the sum of two points.
-
double()¶ Returns the double of the G1 point.
-
eq(other)¶ Returns True if points are equal.
- Example:
>>> G = BpGroup() >>> g1 = G.gen1() >>> g1.add(g1).eq(g1.double()) True >>> g1.eq(g1.double()) False >>> g1+g1 == 2*g1 True >>> g1+g1 == Bn(2)*g1 True
-
export(form=0)¶ Export a point to a byte representation.
-
static
from_bytes(sbin, group)¶ Import a G1 point from bytes.
- Export:
>>> G = BpGroup() >>> g1 = G.gen1() >>> buf = g1.export() >>> g1p = G1Elem.from_bytes(buf, G) >>> g1 == g1p True
-
static
inf(group)¶ Returns the element at infinity for G1
-
isinf()¶ Returns True if the element is infinity.
-
mul(scalar)¶ Multiplies the point with a scalar.
- Example:
>>> g1 = BpGroup().gen1() >>> g1.mul(2).eq(g1.double()) True
-
neg()¶ Returns the inverse point.
- Example:
>>> G = BpGroup() >>> g1 = G.gen1() >>> g1.add(g1.neg()).isinf() True >>> g1 - g1 == G1Elem.inf(G) True
-
-
class
bplib.bp.G2Elem(group)¶ -
add(other)¶ Returns the sum of two points.
-
double()¶ Returns the double of the G2 point.
-
eq(other)¶ Returns True if points are equal.
- Example:
>>> G = BpGroup() >>> g2 = G.gen2() >>> g2.add(g2).eq(g2.double()) True >>> g2.add(g2) == g2.double() True >>> g2.eq(g2.double()) False >>> g2 != g2.double() True
-
export(form=1)¶ Export a point to a byte representation.
-
static
from_bytes(sbin, group)¶ Import a G2 point from bytes.
- Export:
>>> G = BpGroup() >>> g2 = G.gen2() >>> buf = g2.export() >>> g2p = G2Elem.from_bytes(buf, G) >>> g2.eq(g2p) True
-
static
inf(group)¶ Returns the element at infinity for G2.
-
isinf()¶ Returns True if the element is infinity.
-
mul(scalar)¶ Multiplies the point with a scalar.
- Example:
>>> g2 = BpGroup().gen2() >>> g2.mul(2).eq(g2.double()) True
-
neg()¶ Returns the inverse point.
- Example:
>>> g2 = BpGroup().gen2() >>> g2.add(g2.neg()).isinf() True
-
-
class
bplib.bp.GTElem(group)¶ -
add(other)¶ Returns the sum of two GT elements.
- Example:
>>> G = BpGroup() >>> zero = GTElem.zero(G) >>> x = zero.add(zero) >>> x.iszero() True >>> zero + zero == zero True >>> one = GTElem.one(G) >>> zero + one == one True
-
eq(other)¶ Returns True if elements are equal.
-
exp(scalar)¶ Exponentiates the element with a scalar.
- Example:
>>> G = BpGroup() >>> g = G.pair(G.gen1(), G.gen2()) >>> g**0 == g.one(G) True >>> g**3 * g**5 == g**8 True >>> g**10 * g**(-13) == g**(-3) True >>> g**2 * g**(-2) == g.one(G) True
-
export()¶ Export a GT element to a byte representation.
-
static
from_bytes(sbin, group)¶ Import a GT element from bytes.
- Export:
>>> G = BpGroup() >>> gt = G.pair(G.gen1(), G.gen2()) >>> buf = gt.export() >>> gtp = GTElem.from_bytes(buf, G) >>> gt.eq(gtp) True
-
inv()¶ Returns the inverse element.
- Example:
>>> G = BpGroup() >>> gt = G.pair(G.gen1(), G.gen2()) >>> gt2 = gt.mul(gt) >>> gtp = gt.sqr() >>> gtp.eq(gt2) True
-
isone()¶ Return zero if the element is one.
-
iszero()¶ Return True if the element is zero.
-
mul(other)¶ Returns the product of two elements.
- Example:
>>> G = BpGroup() >>> gt = G.pair(G.gen1(), G.gen2()) >>> gtinv = gt.inv() >>> x = gt.mul(gtinv) >>> x.isone() True >>> gt * gtinv == GTElem.one(G) True
-
static
one(group)¶ Returns the element at infinity for GT.
-
sqr()¶ Returns the square of an element.
-
sub(other)¶ Returns the difference of two GT elements.
- Example:
>>> G = BpGroup() >>> zero = GTElem.zero(G) >>> one = GTElem.one(G) >>> x = one.sub(one) >>> x.iszero() True >>> one - one == zero True
-
static
zero(group)¶ Returns the element at infinity for GT.
-
Encoding and decoding bplib objects¶
The petlib.pack functions encode and decode may be used to get byte representations of BpGroup, G1Elem, G2Elem, and GTElem. Just ensure you import bplib before calling those functions.