# toy implementation of BLS signatures in Sage
|
|
#
|
|
# Scheme overview: https://arnaucube.com/blog/kzg-commitments.html
|
|
# Go implementation: https://github.com/arnaucube/kzg-commitments-study
|
|
|
|
load("bls12-381.sage")
|
|
|
|
e = Pairing()
|
|
|
|
def new_ts(l):
|
|
Fr = GF(e.r)
|
|
s = Fr.random_element()
|
|
print("s", s)
|
|
tauG1 = [None] * l
|
|
tauG2 = [None] * l
|
|
for i in range(0, l): # TODO probably duplicate G1 & G2 instead of first powering s^i and then * G_j
|
|
sPow = Integer(s)^i
|
|
tauG1[i] = sPow * e.G1
|
|
tauG2[i] = sPow * e.G2
|
|
|
|
return (tauG1, tauG2)
|
|
|
|
def commit(taus, p):
|
|
return evaluate_at_tau(p, taus)
|
|
|
|
# evaluates p at tau
|
|
def evaluate_at_tau(p, taus):
|
|
e = 0
|
|
for i in range(0, len(p.list())):
|
|
e = e + p[i] * taus[i]
|
|
return e
|
|
|
|
def evaluation_proof(tau, p, z, y):
|
|
# (p - y)
|
|
n = p - y
|
|
# (t - z)
|
|
d = (t-z)
|
|
# q, rem = n / d
|
|
q = n / d
|
|
print("q", q)
|
|
q = q.numerator()
|
|
den = q.denominator()
|
|
print("q", q)
|
|
print("den", den)
|
|
# check that den = 1
|
|
assert(den==1) # rem=0
|
|
# proof: e = [q(t)]₁
|
|
return evaluate_at_tau(q, tau)
|
|
|
|
def verify(tau, c, proof, z, y):
|
|
# [t]₂ - [z]₂
|
|
sz = tau[1] - z*e.G2
|
|
|
|
# c - [y]₁
|
|
cy = c - y*e.G1
|
|
|
|
print("proof", proof)
|
|
print("sz", sz)
|
|
print("cy", cy)
|
|
lhs = e.pair(proof, sz)
|
|
rhs = e.pair(cy, e.G2)
|
|
print("lhs", lhs)
|
|
print("rhs", rhs)
|
|
return lhs == rhs
|
|
|
|
|
|
(tauG1, tauG2) = new_ts(5)
|
|
|
|
R.<t> = PolynomialRing(e.F1)
|
|
p = t^3 + t + 5
|
|
|
|
c = commit(tauG1, p)
|
|
|
|
z = 3
|
|
y = p(z) # = 35
|
|
|
|
proof = evaluation_proof(tauG1, p, z, y)
|
|
print("proof", proof)
|
|
|
|
v = verify(tauG2, c, proof, z, y)
|
|
print(v)
|
|
assert(v)
|