2019-05-13 23:15:02 +02:00
|
|
|
from py_ecc import bls
|
|
|
|
|
|
|
|
# Flag to make BLS active or not. Used for testing, do not ignore BLS in production unless you know what you are doing.
|
|
|
|
bls_active = True
|
|
|
|
|
2019-05-21 22:28:47 +02:00
|
|
|
STUB_SIGNATURE = b'\x11' * 96
|
|
|
|
STUB_PUBKEY = b'\x22' * 48
|
2019-08-11 10:05:17 -07:00
|
|
|
STUB_COORDINATES = bls.api.signature_to_G2(bls.sign(b"", 0, b"\0" * 8))
|
2019-05-13 23:15:02 +02:00
|
|
|
|
2019-05-21 22:28:47 +02:00
|
|
|
|
|
|
|
def only_with_bls(alt_return=None):
|
|
|
|
"""
|
|
|
|
Decorator factory to make a function only run when BLS is active. Otherwise return the default.
|
|
|
|
"""
|
|
|
|
def runner(fn):
|
|
|
|
def entry(*args, **kw):
|
|
|
|
if bls_active:
|
|
|
|
return fn(*args, **kw)
|
|
|
|
else:
|
|
|
|
return alt_return
|
|
|
|
return entry
|
|
|
|
return runner
|
|
|
|
|
|
|
|
|
|
|
|
@only_with_bls(alt_return=True)
|
2019-12-17 12:04:56 +02:00
|
|
|
def Verify(PK, message, signature):
|
|
|
|
return bls.verify(message_hash=message, pubkey=PK, signature=signature, domain=b'')
|
|
|
|
|
|
|
|
|
2019-12-17 15:33:37 +02:00
|
|
|
@only_with_bls(alt_return=True)
|
|
|
|
def AggregateVerify(PKs, messages, signature):
|
|
|
|
return bls.verify_multiple(pubkeys=PKs, message_hashes=messages, signature=signature, domain=b'')
|
2019-05-13 23:15:02 +02:00
|
|
|
|
|
|
|
|
2019-05-21 22:28:47 +02:00
|
|
|
@only_with_bls(alt_return=True)
|
2019-12-17 12:04:56 +02:00
|
|
|
def FastAggregateVerify(PKs, message, signature):
|
|
|
|
aggregate_pubkey = bls.aggregate_pubkeys(PKs)
|
|
|
|
return bls.verify(pubkey=aggregate_pubkey, message_hash=message, signature=signature, domain=b'')
|
2019-05-13 23:15:02 +02:00
|
|
|
|
|
|
|
|
2019-05-21 22:28:47 +02:00
|
|
|
@only_with_bls(alt_return=STUB_SIGNATURE)
|
2019-12-17 12:04:56 +02:00
|
|
|
def Aggregate(signatures):
|
2019-05-21 22:28:47 +02:00
|
|
|
return bls.aggregate_signatures(signatures)
|
2019-05-15 18:37:11 +02:00
|
|
|
|
|
|
|
|
2019-05-21 22:28:47 +02:00
|
|
|
@only_with_bls(alt_return=STUB_SIGNATURE)
|
2019-12-17 12:04:56 +02:00
|
|
|
def Sign(SK, message):
|
2019-12-19 15:47:42 +02:00
|
|
|
return bls.sign(message_hash=message, privkey=SK, domain=b'')
|
2019-08-11 10:05:17 -07:00
|
|
|
|
|
|
|
|
|
|
|
@only_with_bls(alt_return=STUB_COORDINATES)
|
2019-12-20 08:41:46 +02:00
|
|
|
def signature_to_G2(signature):
|
2019-08-11 10:05:17 -07:00
|
|
|
return bls.api.signature_to_G2(signature)
|