"""Length-framed SHA-512 KDF (docs/protocol.md).""" from __future__ import annotations import hashlib __all__ = ["kdf"] def kdf(*data: str | bytes, length: int = 32) -> bytes: """kdf(info, *items, length<=64) -> SHA-512 over length-framed items.""" if not 1 <= length <= 64: raise ValueError("length must be in 1..64") items = [d.encode() if isinstance(d, str) else bytes(d) for d in data] h = hashlib.sha512(len(items).to_bytes(8, "little")) for item in items: h.update(len(item).to_bytes(8, "little")) h.update(item) return h.digest()[:length]