import hashlib
import struct
import sys
SIGNATURE_DOMAIN_TAG = b"mnemes/mutation-envelope/signature/v1\x00"
DIGEST_DOMAIN_TAG = b"mnemes/mutation-envelope/v1\x00"
def build_preimage(
protocol_version: int,
artifact_kind: int,
operation_schema_version: int,
semantic_schema_generation: int,
operation_id: str,
idempotency_key: str,
home_device_id: str,
store_id: str,
actor_id: str,
store_epoch: int,
writer_epoch: int,
sequence: int,
previous_envelope_digest: bytes,
fencing_token: str,
namespace: str,
operation_kind: str,
payload_digest: bytes,
payload_length: int,
requested_effect_digest: bytes,
policy_version: int,
authorization_snapshot_id: bytes,
authorization_snapshot_digest: bytes,
authority_receipt_digest: bytes,
signer_principal_id: str,
signer_role: int,
signer_key_version: int,
observed_at: int,
valid_from: int,
valid_to: int,
) -> bytes:
out = bytearray()
out.extend(SIGNATURE_DOMAIN_TAG)
def encode_bytes(data: bytes) -> bytes:
if len(data) > 0xFFFFFFFF:
raise ValueError(f"field too long: {len(data)} bytes")
return struct.pack(">I", len(data)) + data
out.extend(struct.pack(">H", protocol_version))
out.extend(struct.pack("B", artifact_kind))
out.extend(struct.pack(">H", operation_schema_version))
out.extend(struct.pack(">H", semantic_schema_generation))
out.extend(encode_bytes(operation_id.encode("utf-8")))
out.extend(encode_bytes(idempotency_key.encode("utf-8")))
out.extend(encode_bytes(home_device_id.encode("utf-8")))
out.extend(encode_bytes(store_id.encode("utf-8")))
out.extend(encode_bytes(actor_id.encode("utf-8")))
out.extend(struct.pack(">Q", store_epoch))
out.extend(struct.pack(">Q", writer_epoch))
out.extend(struct.pack(">Q", sequence))
out.extend(previous_envelope_digest)
out.extend(encode_bytes(fencing_token.encode("utf-8")))
out.extend(encode_bytes(namespace.encode("utf-8")))
out.extend(encode_bytes(operation_kind.encode("utf-8")))
out.extend(payload_digest)
out.extend(struct.pack(">Q", payload_length))
out.extend(requested_effect_digest)
out.extend(struct.pack(">Q", policy_version))
out.extend(encode_bytes(authorization_snapshot_id))
out.extend(authorization_snapshot_digest)
out.extend(authority_receipt_digest)
out.extend(encode_bytes(signer_principal_id.encode("utf-8")))
out.extend(struct.pack("B", signer_role))
out.extend(struct.pack(">Q", signer_key_version))
out.extend(struct.pack(">Q", observed_at))
out.extend(struct.pack(">Q", valid_from))
out.extend(struct.pack(">Q", valid_to))
return bytes(out)
GOLDEN_CANONICAL_PAYLOAD = b"golden-payload"
expected_payload_digest = hashlib.sha256(GOLDEN_CANONICAL_PAYLOAD).digest()
print(f"payload_digest (hex): {expected_payload_digest.hex()}")
print(f"payload_digest (len): {len(expected_payload_digest)}")
assert len(expected_payload_digest) == 32
golden_preimage = build_preimage(
protocol_version=1,
artifact_kind=0, operation_schema_version=1,
semantic_schema_generation=1,
operation_id="golden-op",
idempotency_key="golden-idem",
home_device_id="golden-device",
store_id="golden-store",
actor_id="golden-actor",
store_epoch=1,
writer_epoch=1,
sequence=1,
previous_envelope_digest=b"\x00" * 32,
fencing_token="golden-fence",
namespace="golden-ns",
operation_kind="golden-kind",
payload_digest=expected_payload_digest,
payload_length=14, requested_effect_digest=b"\x02" * 32,
policy_version=1,
authorization_snapshot_id=b"\x00" * 16,
authorization_snapshot_digest=b"\x03" * 32,
authority_receipt_digest=b"\x04" * 32,
signer_principal_id="golden-principal",
signer_role=0, signer_key_version=1,
observed_at=1_000_000,
valid_from=1_000_000,
valid_to=2_000_000,
)
print(f"preimage (len): {len(golden_preimage)} bytes")
fields = golden_preimage[len(SIGNATURE_DOMAIN_TAG):]
print(f"fields (len): {len(fields)} bytes")
envelope_digest = hashlib.sha256(DIGEST_DOMAIN_TAG + fields).digest()
print(f"envelope_digest (hex): {envelope_digest.hex()}")
print(f"preimage (hex): {golden_preimage.hex()}")
assert expected_payload_digest.hex() == hashlib.sha256(b"golden-payload").hexdigest()
assert len(GOLDEN_CANONICAL_PAYLOAD) == 14, "payload length must be 14"
assert golden_preimage.startswith(SIGNATURE_DOMAIN_TAG), (
"preimage must start with signature domain tag"
)
EXPECTED_PAYLOAD_DIGEST_HEX = expected_payload_digest.hex()
EXPECTED_ENVELOPE_DIGEST_HEX = envelope_digest.hex()
EXPECTED_PREIMAGE_HEX = golden_preimage.hex()
print("\n=== ALL PYTHON GOLDEN VECTOR CHECKS PASSED ===")
print(f" payload_digest (fixed): {EXPECTED_PAYLOAD_DIGEST_HEX}")
print(f" envelope_digest (fixed): {EXPECTED_ENVELOPE_DIGEST_HEX}")
print(f" preimage (fixed): {EXPECTED_PREIMAGE_HEX[:64]}... (truncated)")
print(f" Signature domain tag: {SIGNATURE_DOMAIN_TAG}")
print(f" Digest domain tag: {DIGEST_DOMAIN_TAG}")
sys.exit(0)