53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
|
"""
|
||
|
Blind signature chain with a top level CA
|
||
|
"""
|
||
|
|
||
|
from .eccblind import ECCBlind
|
||
|
|
||
|
|
||
|
class ECCBlindChain(object): # pylint: disable=too-few-public-methods
|
||
|
"""
|
||
|
# Class for ECC Blind Chain signature functionality
|
||
|
"""
|
||
|
|
||
|
def __init__(self, ca=None, chain=None):
|
||
|
self.chain = []
|
||
|
self.ca = []
|
||
|
if ca:
|
||
|
for i in range(0, len(ca), 35):
|
||
|
self.ca.append(ca[i:i + 35])
|
||
|
if chain:
|
||
|
self.chain.append(chain[0:35])
|
||
|
for i in range(35, len(chain), 100):
|
||
|
if len(chain[i:]) == 65:
|
||
|
self.chain.append(chain[i:i + 65])
|
||
|
else:
|
||
|
self.chain.append(chain[i:i + 100])
|
||
|
|
||
|
def verify(self, msg, value):
|
||
|
"""Verify a chain provides supplied message and value"""
|
||
|
parent = None
|
||
|
l_ = 0
|
||
|
for level in self.chain:
|
||
|
l_ += 1
|
||
|
pubkey = None
|
||
|
signature = None
|
||
|
if len(level) == 100:
|
||
|
pubkey, signature = (level[0:35], level[35:])
|
||
|
elif len(level) == 35:
|
||
|
if level not in self.ca:
|
||
|
return False
|
||
|
parent = level
|
||
|
continue
|
||
|
else:
|
||
|
signature = level
|
||
|
verifier_obj = ECCBlind(pubkey=parent)
|
||
|
if pubkey:
|
||
|
if not verifier_obj.verify(pubkey, signature, value):
|
||
|
return False
|
||
|
parent = pubkey
|
||
|
else:
|
||
|
return verifier_obj.verify(msg=msg, signature=signature,
|
||
|
value=value)
|
||
|
return None
|