from ECurve import *
class ECDSA(object):
def __init__(self, ECurve, P):
self.ECurve = ECurve
self.P = P
self.n = P.order()
self.h = len(self.ECurve) // self.n
def GenKey(self, a=0):
if a == 0:
a = randrange(1, self.n - 1)
return [a, P ** a]
def Sign(self, m, a):
import EuclideanGCD
import hashlib
def randK():
kinv = 0
while kinv == 0:
k = randrange(1, self.n - 1)
U = XEuclidean(k, self.n)
if U[2] > 1:
kinv = 0
else:
kinv = int(U[0])
return [k, kinv]
H = hashlib.sha256()
H.update(repr(m).encode("utf-8"))
e = int(H.hexdigest(), 16)
r = 0
s = 0
while (r == 0) | (s == 0):
[k, kInv] = randK()
kP = P ** k
r = int(kP[0]) % self.n
s = (kInv * (e + r * a)) % self.n
if XEuclidean(s, self.n)[2] > 1:
s = 0
return [r, s]
def Verify(self, m, sig, A):
import hashlib
import EuclideanGCD
[r, s] = sig
H = hashlib.sha256()
H.update(repr(m).encode("utf-8"))
e = int(H.hexdigest(), 16)
w = int(XEuclidean(s, self.n)[0])
print(w)
u1 = (e * w) % self.n
u2 = (r * w) % self.n
Pt = (self.P) ** u1 + A ** u2
return r == (int(Pt[0]) % self.n)
# Example
# SETUP
Ec = ECurve(2, [1, 0, 1, 0, 0, 1])
Ec.EquSSing([1, 1], [0, 1], [1, 1])
P = Ec.random()
Protocol = ECDSA(Ec, P)
[SK_Alice, PK_Alice] = Protocol.GenKey()
m = "Hello"
signature = Protocol.Sign(m, SK_Alice)
check = Protocol.Verify(m, signature, PK_Alice)