from collections import namedtuple from typing import Union LEGACY = namedtuple('Legacy', 'payload') NAMED_SECP256K1 = namedtuple('NamedSECP256k1', 'raw_signature certificate_id payload') FLAGS = { LEGACY: 0x80, NAMED_SECP256K1: 0x01 } class Signature: def __init__(self, data: Union[LEGACY, NAMED_SECP256K1]): self.data = data @property def payload(self): return self.data.payload @property def certificate_id(self): if type(self.data) == NAMED_SECP256K1: return self.data.certificate_id @property def raw_signature(self): if type(self.data) == NAMED_SECP256K1: return self.data.raw_signature @classmethod def flagged_parse(cls, binary: bytes): flag = binary[0] if flag == FLAGS[NAMED_SECP256K1]: return cls(NAMED_SECP256K1(binary[1:65], binary[65:85], binary[85:])) else: return cls(LEGACY(binary)) @property def serialized(self): if isinstance(self.data, NAMED_SECP256K1): return (bytes([FLAGS[type(self.data)]]) + self.data.raw_signature + self.data.certificate_id + self.payload) elif isinstance(self.data, LEGACY): return self.payload