idea19-missionledger-verifi.../tests/test_csfd.py

59 lines
2.1 KiB
Python

from missionledger.dsl import PlanDelta
from missionledger.csfd import generate_csfd
def test_csfd_generation_small_plandelta():
pd = PlanDelta(delta={"move": True, "safe_buffer": 0.5}, version=2, metadata={
"invariants": {"collision": True, "energy": True},
"proof_stub_hash": "stub-abc",
"expected_resource_bounds": {"energy": [0, 100]},
})
csfd = generate_csfd(pd, signer="planner-v1", n_frames=3)
assert csfd is not None
assert csfd.signer == "planner-v1"
# frames count should be at least 1 and at most requested
assert 1 <= len(csfd.frames) <= 3
# digest hex should be a 64-char hex string
assert isinstance(csfd.digest_hex, str)
assert len(csfd.digest_hex) == 64
def test_csfd_size_bound():
# Create a PlanDelta with large metadata to force truncation path
large_meta = {f"k{i}": "v" * 200 for i in range(5)}
pd = PlanDelta(delta={"x": 1}, version=1, metadata={"invariants": {"a": True}, **large_meta})
csfd = generate_csfd(pd, signer="s", n_frames=5)
# Ensure serialized representation is <= 512 bytes as enforced
import json
serialized = json.dumps({"frames": [f.__dict__ for f in csfd.frames], "signer": csfd.signer, "digest_hex": csfd.digest_hex}, sort_keys=True, separators=(",", ":"))
assert len(serialized.encode()) <= 512
def test_csfd_signing_and_verification():
import pytest
pytest.importorskip("nacl")
# now import local helpers
from missionledger.dsl import PlanDelta
from missionledger.csfd import generate_csfd, sign_csfd, verify_csfd_signature
# create a small plandelta
pd = PlanDelta(delta={"x": 1}, version=1, metadata={"invariants": {"a": True}})
csfd = generate_csfd(pd, signer="s", n_frames=1)
# Generate an ephemeral Ed25519 keypair for signing
from nacl.signing import SigningKey
sk = SigningKey.generate()
sig_hex = sign_csfd(csfd, sk.encode())
assert isinstance(sig_hex, str)
assert len(sig_hex) > 0
vk = sk.verify_key
ok = verify_csfd_signature(csfd, sig_hex, vk.encode())
assert ok is True