import hashlib import binascii class HashDerivedKey: @staticmethod def from_hex(hex_str): return HashDerivedKey(bytes(bytearray.fromhex(hex_str))) def __init__(self, master): def ensure_bytes(b): assert isinstance(b, bytes) return b ensure_bytes(master) def derive(seed): ensure_bytes(seed) sha = hashlib.sha256() sha.update(master) sha.update(seed) return sha.digest() def hex(b): return binascii.hexlify(b).decode("utf-8") self.master = master self.master_hex = lambda: hex(master) self.derive = derive self.derive_hex = lambda seed: hex(derive(seed)) def derive_metadata(self, seed): key = self.derive(seed) return (key, {"key_seed": binascii.hexlify(seed).decode("utf-8")})