-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsignatures.py
42 lines (31 loc) · 1.04 KB
/
signatures.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import binascii
import ecdsa
def generate_keypair():
sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
vk = sk.get_verifying_key()
return sk.to_string().hex(), vk.to_string().hex()
def sign_message(message, sk_string):
try:
sk_bytes = binascii.unhexlify(sk_string)
sk = ecdsa.SigningKey.from_string(sk_bytes, curve=ecdsa.SECP256k1)
except:
raise Exception('Invalid Signing Key. Try again with Hex!')
sig = sk.sign(message)
return sig.hex()
def verify(message, sig, vk_string):
vk_bytes = binascii.unhexlify(vk_string)
vk = ecdsa.VerifyingKey.from_string(vk_bytes, curve=ecdsa.SECP256k1)
sig_bytes = binascii.unhexlify(sig)
try:
# Good Signature
return vk.verify(sig_bytes, message) # True
except ecdsa.keys.BadSignatureError:
# Bad Signature
return False
def test():
sk, vk = generate_keypair()
sig = sign_message(b'test', sk)
assert verify(b'test', sig, vk) == True
print('Tests Passed')
if __name__ == '__main__':
test()