Source code for pksig_ecdsa
"""
Digital Signature Algorithm (DSA)
| From: "NIST proposed in Aug 1991 for use in DSS."
| Published in: FIPS 186
| Available from:
| Notes:
* type: signature
* setting: elliptic curve groups
:Authors: J. Ayo Akinyele
:Date: 5/2011
"""
from charm.toolbox.ecgroup import ECGroup,ZR,G
from charm.toolbox.PKSig import PKSig
debug = False
[docs]class ECDSA(PKSig):
"""
>>> from charm.toolbox.eccurve import prime192v2
>>> group = ECGroup(prime192v2)
>>> ecdsa = ECDSA(group)
>>> (public_key, secret_key) = ecdsa.keygen(0)
>>> msg = "hello world! this is a test message."
>>> signature = ecdsa.sign(public_key, secret_key, msg)
>>> ecdsa.verify(public_key, signature, msg)
True
"""
def __init__(self, groupObj):
PKSig.__init__(self)
global group
group = groupObj
[docs] def keygen(self, bits):
group.paramgen(bits)
x, g = group.random(), group.random(G)
y = (g ** x)
return ({'g':g, 'y':y}, x)
[docs] def sign(self, pk, x, M):
while True:
k = group.random()
r = group.zr(pk['g'] ** k)
e = group.hash(M)
s = (k ** -1) * (e + x * r)
if (r == 0 or s == 0):
print ("unlikely error r = %s, s = %s" % (r,s))
continue
else:
break
return { 'r':r, 's':s }
[docs] def verify(self, pk, sig, M):
w = sig['s'] ** -1
u1 = group.hash(M) * w
u2 = sig['r'] * w
v = (pk['g'] ** u1) * (pk['y'] ** u2)
if group.zr(v) == sig['r']:
return True
else:
return False