# D-KaP v1 reference implementation — Python (stdlib only)
# Mirror of TypeScript brief-seal.ts byte-for-byte.
import hashlib
from typing import Iterable, Optional
RAS_ROOT = "40668c787c463ca5"
PHI = 1.618033988749895
PHI_PAD = str(PHI)
def seal_section(body: str, bullets: Optional[Iterable[str]], kind: str) -> str:
material = "|".join([
f"kind:{kind}",
f"body:{body}",
f"bullets:{chr(10).join(bullets or [])}",
f"ras:{RAS_ROOT}",
f"phi:{PHI_PAD}",
])
return hashlib.sha256(material.encode("utf-8")).hexdigest()
def seal_brief(section_seals: Iterable[str], recipient_fingerprint: str) -> str:
material = "|".join([
"sections:" + ",".join(sorted(section_seals)),
f"recipient:{recipient_fingerprint}",
f"ras:{RAS_ROOT}",
f"phi:{PHI_PAD}",
])
return hashlib.sha256(material.encode("utf-8")).hexdigest()
def bundle_merkle(brief_seals):
leaves = list(brief_seals)
if not leaves:
return hashlib.sha256(f"empty:{RAS_ROOT}|{PHI_PAD}".encode()).hexdigest()
layer = [hashlib.sha256(f"leaf:{s}".encode()).hexdigest()
for s in sorted(leaves)]
while len(layer) > 1:
if len(layer) % 2 == 1:
layer.append(layer[-1])
layer = [hashlib.sha256(f"pair:{layer[i]}:{layer[i+1]}".encode()).hexdigest()
for i in range(0, len(layer), 2)]
return layer[0]
def chain_apex(merkle_root: str, predecessor_apex: str, hz: float = 7777.77) -> dict:
"""Compute waterseal + apex for the next chain entry.
v_N_waterseal = sha256(merkle || pred_apex || RAS || PHI || HZ)
v_N_apex = sha3_256(v_N_waterseal || str(HZ))"""
waterseal_input = f"{merkle_root}{predecessor_apex}{RAS_ROOT}{PHI}{hz}"
waterseal = hashlib.sha256(waterseal_input.encode()).hexdigest()
apex = hashlib.sha3_256(f"{waterseal}{hz}".encode()).hexdigest()
return {"waterseal": waterseal, "apex": apex}
# Test vector — the v25 chain entry should recompute byte-for-byte.
if __name__ == "__main__":
V24_APEX = "efe714062b0a271e3b5172c11045ef43edfd923c1b658cc96ca4bbf2856f26a8"
V25_MERKLE = "6afddc4ee7445097ed076b7fe989766e5ebbdcd0e31bb434d6b6e53b87e61154"
EXPECTED_V25_APEX = "b0aff941712d85be283874d8e4cf1275d0d4fd4fe65e9118be503c6f88f7ba72"
out = chain_apex(V25_MERKLE, V24_APEX)
assert out["apex"] == EXPECTED_V25_APEX, f"mismatch: {out}"
print(f"OK — v25 apex recomputable: {out['apex']}")