@ -0,0 +1,82 @@ |
|||||
|
# 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) |