-
Notifications
You must be signed in to change notification settings - Fork 0
/
additiveSignatures.py
60 lines (41 loc) · 1.85 KB
/
additiveSignatures.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
def additive_signature():
global verify_sum,verify_p,verify_challenge,verify_verifier,verify_response,verify_generator
verify_challenge, verify_response = [],[]
verify_p = additiveSignature.init(n)
verify_sum = additiveSignature.pick_sum(max(additive_shares)+1)
verify_challenge,verify_verifier, verify_generator = additiveSignature.challenge(additive_shares,verify_p,verify_sum) #instead of passing shares, reuse witness generated g^di values
def additive_signature_verify():
global verify_sum,verify_p,verify_challenge,verify_verifier,verify_response,verify_generator,share_status
verify_response = additiveSignature.response(verify_challenge,additive_shares,verify_p,verify_sum,verify_verifier,verify_generator)
share_status = verify_response
print("ADDITIVE SHARE STATUS:",verify_response)
if verify_response.count(True) != add_shares_no:
print("INVALID SIGNATURE!\nALERT: INVOKE BACKUP")
import nextprime
import random
import modinverse
def init(n):
'''generate prime group with order > n'''
p = nextprime.next_prime(n)
return n
def pick_sum(p):
'''pick a sum such that di+di_dash = sum and p < sum < 2p'''
return random.randrange(p,2*p)
def challenge(shares,p,c):
'''generate challenge and vezrifier, return as [challenge(list),verifier(int)]'''
challenge = []
a = random.randrange(2,p)
verifier = pow(a,c,p)
for di in shares:
challenge.append(pow(a,di,p))
return [challenge,verifier,a]
def response(challenge,share,p,c,verifier,gen):
'''generates response by a party holding a 'share' to the challenge[i] for all additive shares'''
res = []
for i in range(len(challenge)):
response = (pow(gen,c-share[i],p)*challenge[i])%p
if response == verifier:
res.append(True)
else:
res.append(False)
return res