-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
153 lines (122 loc) · 4.61 KB
/
main.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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
from blspy import (PrivateKey, AugSchemeMPL, PopSchemeMPL, G1Element, G2Element)
import time
if __name__ == '__main__':
# Seed for private key generation (has to be random and 32 bytes or more)
seed: bytes = bytes([0, 50, 6, 244, 24, 199, 1, 25, 52, 88, 192,
19, 18, 12, 89, 6, 220, 18, 102, 58, 209, 82,
12, 62, 89, 110, 182, 9, 44, 20, 254, 22])
# generate some private keys and messages
message: bytes = bytes([1, 2, 3, 4, 5])
seed = bytes([1]) + seed[1:]
sk1: PrivateKey = AugSchemeMPL.key_gen(seed)
seed = bytes([2]) + seed[1:]
sk2: PrivateKey = AugSchemeMPL.key_gen(seed)
message2: bytes = bytes([1, 2, 3, 4, 5, 6, 7])
# Generate first sig
pk1: G1Element = sk1.get_g1()
sig1: G2Element = AugSchemeMPL.sign(sk1, message)
# Generate second sig
pk2: G1Element = sk2.get_g1()
sig2: G2Element = AugSchemeMPL.sign(sk2, message2)
# Signatures can be non-interactively combined by anyone
agg_sig: G2Element = AugSchemeMPL.aggregate([sig1, sig2])
# verify
start_time = time.time()
ok = AugSchemeMPL.aggregate_verify([pk1, pk2], [message, message2], agg_sig)
end_time = time.time()
total_time = end_time - start_time
print("simple aggregate verify:", ok)
print("total time: ", total_time)
# Multi-signatures
# generate some private keys
seed = bytes([1]) + seed[1:]
sk1: PrivateKey = PopSchemeMPL.key_gen(seed)
pk1: G1Element = sk1.get_g1()
seed = bytes([2]) + seed[1:]
sk2: PrivateKey = PopSchemeMPL.key_gen(seed)
pk2: G1Element = sk2.get_g1()
# generate multi-signatures
sig1: G2Element = PopSchemeMPL.sign(sk1, message)
sig2: G2Element = PopSchemeMPL.sign(sk2, message)
# aggregate signatures
sig_agg: G2Element = PopSchemeMPL.aggregate([sig1, sig2])
# verify
start_time = time.time()
ok = PopSchemeMPL.fast_aggregate_verify([pk1, pk2], message, sig_agg)
end_time = time.time()
total_time = end_time - start_time
print("Multi-signatures aggregate verify: ", ok)
print("total time: ", total_time)
# aggregate public keys and then verify
agg_pk: G1Element = pk1 + pk2
start_time = time.time()
ok = PopSchemeMPL.verify(agg_pk, message, sig_agg)
end_time = time.time()
total_time = end_time - start_time
print("Multi-signatures aggregate verify with aggregate public keys: ", ok)
print("total time: ", total_time)
# scaled versions
# Simple aggregate signatures
sigs = []
pks = []
msgs = []
for i in range(0, 100):
m = bytes([i, i+1, i+2, i+3, i+4])
seed = bytes([i]) + seed[1:]
sk: PrivateKey = AugSchemeMPL.key_gen(seed)
pk: G1Element = sk.get_g1()
sig: G2Element = AugSchemeMPL.sign(sk, m)
sigs.append(sig)
pks.append(pk)
msgs.append(m)
# aggregate signatures
sig_agg: G2Element = AugSchemeMPL.aggregate(sigs)
# verify
start_time = time.time()
ok = AugSchemeMPL.aggregate_verify(pks, msgs, sig_agg)
end_time = time.time()
total_time = end_time - start_time
print("Simple aggregate verify with 100 elements: ", ok)
print("total time: ", total_time)
# Multi-signatures
sigs = []
pks = []
for i in range(0, 100):
seed = bytes([i]) + seed[1:]
sk: PrivateKey = PopSchemeMPL.key_gen(seed)
pk: G1Element = sk.get_g1()
sig: G2Element = PopSchemeMPL.sign(sk, message)
sigs.append(sig)
pks.append(pk)
# aggregate signatures
sig_agg: G2Element = PopSchemeMPL.aggregate(sigs)
# verify
start_time = time.time()
ok = PopSchemeMPL.fast_aggregate_verify(pks, message, sig_agg)
end_time = time.time()
total_time = end_time - start_time
print("Multi-signatures aggregate verify with 100 elements: ", ok)
print("total time: ", total_time)
# Multi-signatures
sigs = []
pks = []
for i in range(0, 100):
seed = bytes([i]) + seed[1:]
sk: PrivateKey = PopSchemeMPL.key_gen(seed)
pk: G1Element = sk.get_g1()
sig: G2Element = PopSchemeMPL.sign(sk, message)
sigs.append(sig)
pks.append(pk)
# aggregate signatures
sig_agg: G2Element = PopSchemeMPL.aggregate(sigs)
# aggregate public keys
agg_pk: G1Element = G1Element()
for pk in pks:
agg_pk += pk
# verify
start_time = time.time()
ok = PopSchemeMPL.verify(agg_pk, message, sig_agg)
end_time = time.time()
total_time = end_time - start_time
print("Multi-signatures aggregate verify with aggregate public keys, 100 elements: ", ok)
print("total time: ", total_time)