59 lines
2.1 KiB
Python
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
|