mirror of
https://github.com/monero-project/research-lab.git
synced 2024-11-16 15:57:37 +00:00
100 lines
3 KiB
Python
100 lines
3 KiB
Python
#see https://eprint.iacr.org/2015/1098.pdf
|
|
#this one is same as MLSAG.py, I'm just experimenting with
|
|
#how to best implement it..
|
|
import MiniNero
|
|
import PaperWallet
|
|
|
|
def keyVector(rows):
|
|
return [None] * rows
|
|
|
|
def keyMatrix(rows, cols):
|
|
#first index is columns (so slightly backward from math)
|
|
rv = [None] * cols
|
|
for i in range(0, cols):
|
|
rv[i] = keyVector(rows)
|
|
return rv
|
|
|
|
def hashKeyVector(v):
|
|
return [MiniNero.hashToPoint_cn(vi) for vi in v]
|
|
|
|
def vScalarMultBase(v):
|
|
return [MiniNero.scalarmultBase(a) for a in v]
|
|
|
|
def keyImageV(x):
|
|
#takes as input a keyvector, returns the keyimage-vector
|
|
return [MiniNero.scalarmultKey(MiniNero.hashToPoint_cn(MiniNero.scalarmultBase(xx)), xx) for xx in x]
|
|
|
|
def skvGen(n):
|
|
return [PaperWallet.skGen() for i in range(0, n)]
|
|
|
|
def skmGen(r, c):
|
|
rv = keyMatrix(r, c)
|
|
for i in range(0, c):
|
|
rv[i] = skvGen(r)
|
|
return rv
|
|
|
|
def MLSAG_Gen(pk, xx, index ):
|
|
rows = len(xx)
|
|
cols = len(pk)
|
|
print("Generating MG sig of size ", rows, "x", cols)
|
|
print("index is:", index)
|
|
print("checking if I can actually sign")
|
|
print(pk[index])
|
|
print([MiniNero.scalarmultBase(x) for x in xx])
|
|
c= [None] * cols
|
|
alpha = skvGen(rows)
|
|
I = keyImageV(xx)
|
|
L = keyMatrix(rows, cols)
|
|
R = keyMatrix(rows, cols)
|
|
s = keyMatrix(rows, cols)
|
|
m = ''.join(pk[0])
|
|
for i in range(1, cols):
|
|
m = m + ''.join(pk[i])
|
|
L[index] = [MiniNero.scalarmultBase(aa) for aa in alpha] #L = aG
|
|
Hi = hashKeyVector(pk[index])
|
|
R[index] = [MiniNero.scalarmultKey(Hi[ii], alpha[ii]) for ii in range(0, rows)] #R = aI
|
|
oldi = index
|
|
i = (index + 1) % cols
|
|
c[i] = MiniNero.cn_fast_hash(m+''.join(L[oldi]) + ''.join(R[oldi]))
|
|
|
|
while i != index:
|
|
s[i] = skvGen(rows)
|
|
L[i] = [MiniNero.addKeys1(s[i][j], c[i], pk[i][j]) for j in range(0, rows)]
|
|
|
|
Hi = hashKeyVector(pk[i])
|
|
R[i] = [MiniNero.addKeys2( s[i][j], Hi[j], c[i], I[j]) for j in range(0, rows)]
|
|
oldi = i
|
|
i = (i + 1) % cols
|
|
c[i] = MiniNero.cn_fast_hash(m+''.join(L[oldi]) + ''.join(R[oldi]))
|
|
print("L", L)
|
|
print("R", R)
|
|
s[index] = [MiniNero.sc_mulsub_keys(alpha[j], c[index], xx[j]) for j in range(0, rows)] #alpha - c * x
|
|
return I, c[0], s
|
|
|
|
def MLSAG_Ver(pk, I, c0, s ):
|
|
rows = len(pk[0])
|
|
cols = len(pk)
|
|
print("verifying MG sig of dimensions ",rows ,"x ", cols)
|
|
c= [None] * (cols + 1)
|
|
c[0] = c0
|
|
L = keyMatrix(rows, cols)
|
|
R = keyMatrix(rows, cols)
|
|
m = ''.join(pk[0])
|
|
for i in range(1, cols):
|
|
m = m + ''.join(pk[i])
|
|
i = 0
|
|
while i < cols:
|
|
L[i] = [MiniNero.addKeys1(s[i][j], c[i], pk[i][j]) for j in range(0, rows)]
|
|
|
|
Hi = hashKeyVector(pk[i])
|
|
R[i] = [MiniNero.addKeys2( s[i][j], Hi[j], c[i], I[j]) for j in range(0, rows)]
|
|
|
|
oldi = i
|
|
i = i + 1
|
|
c[i] = MiniNero.cn_fast_hash(m+''.join(L[oldi]) + ''.join(R[oldi]))
|
|
print("L", L)
|
|
print("R", R)
|
|
print("c", c)
|
|
|
|
return (c0 == c[cols])
|
|
|