-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_ring.py
More file actions
52 lines (40 loc) · 1.67 KB
/
test_ring.py
File metadata and controls
52 lines (40 loc) · 1.67 KB
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
43
44
45
46
47
48
49
50
51
52
from jam_vrf import RingVerifier, get_ring_commitment
import pytest
import json
def test_commitment_generation():
# load mock data
with open("mocks.json", "r") as f:
mock = json.load(f)["ring"]["commitment"]
# compose list of public key bytes
public_keys = []
for key in mock["keys"]:
public_keys.append(bytes.fromhex(key))
# generate commitment
commitment = get_ring_commitment(public_keys)
# verify commitment
assert commitment.hex() == mock["expected_commitment"]
def test_signature_verification():
# load mock data
with open("mocks.json", "r") as f:
mock = json.load(f)["ring"]["safrole_ticket"]
data = b"jam_ticket_seal" + bytes.fromhex(mock["entropy"]) + bytes([mock["attempt"]])
ad = b""
signature = bytes.fromhex(mock["signature"])
# construct ring verifier
verifier = RingVerifier(bytes.fromhex(mock["root"]), mock["ring_size"])
# generate batch of valid signatures
signatures = []
for _ in range(2):
signatures.append((data, ad, signature))
# verify valid signatures
verifier.verify(signatures)
# verify batch that contains invalid signatures
signatures.append((b"wrong_data", ad, signature))
signatures.append((data, b"wrong_ad", signature))
# signature verification should raise a ValueError
with pytest.raises(ValueError) as e:
verifier.verify(signatures)
# verify the ValueError contains a dict identifying each of the invalid signatures
assert len(e.value.args[0]) == 2
assert str(e.value.args[0][2]) == str(ValueError("VRF verification failed"))
assert str(e.value.args[0][3]) == str(ValueError("VRF verification failed"))