mirror of
https://github.com/arnaucube/math.git
synced 2026-01-11 16:31:32 +01:00
Add KZG commitments Sage impl
This commit is contained in:
82
kzg.sage
Normal file
82
kzg.sage
Normal file
@@ -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)
|
||||
Reference in New Issue
Block a user