import json import os import pytest from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives import serialization from railiance_clock.core import Tick from railiance_clock.protocol import sign class Timer: def __init__(self): self.n=0; self.boot=0; self.domain='boot1' def read(self): return Tick(self.n, self.n+self.boot, self.domain) @pytest.fixture def setup(tmp_path): key=ec.generate_private_key(ec.SECP256R1()) data={'status':'admitted','authority_id':'railiance01','environment':'test','epoch':'epoch1','policy_id':'test-v1','kid':'test-key', 'endpoint':'https://clock.invalid/v1/time-samples', 'public_key_pem':key.public_key().public_bytes(serialization.Encoding.PEM,serialization.PublicFormat.SubjectPublicKeyInfo).decode(), 'limits':{'max_age_ns':5_000_000_000,'max_rtt_ns':2_000_000_000,'max_width_ns':3_000_000_000,'max_server_error_ns':50_000_000,'timer_ppm':1000,'timer_resolution_ns':1000,'suspend_tolerance_ns':5_000_000,'trust_session_ns':60_000_000_000}} tmp_path.chmod(0o700) state=tmp_path/'state.json';state.write_text(json.dumps({'authority_id':'railiance01','epoch':'epoch1','lower_ns':0}));state.chmod(0o600) data.update(client_boot_id='boot1',trust_not_after_boottime_ns=60_000_000_000,rollback_state_file=str(state)) path=tmp_path/'trust.json';path.write_text(json.dumps(data));path.chmod(0o600) timer=Timer() def transport(request): timer.n+=10_000_000 return sign(dict(request,epoch='epoch1',policy_id='test-v1',quality='bounded',receive_unix_ns='100000000000',send_unix_ns='100001000000',error_ns='1000000',max_age_ns='5000000000'),key,'test-key') return path,key,timer,transport