Peter Surda
ff1f451691
- added serializing and deserializing - added a signature chain class `ECCBlindSigChain` - added more tests
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
|