{"service": "relay telemetry keep-alive (line discipline)", "link_id": "CTF{relay_uplink_synchronised}", "link_id_note": "diagnostic link identifier, NOT the containment code -- do not submit it as the flag; hold the full handshake to release the real code", "protocol": {"open": "POST /open  -> {session, salt, frame, nonce, deadline_ms}", "ack": "POST /ack {session, tag} -> next {frame, nonce} or, at the final frame, {flag}. A wrong or late tag re-syncs the line to frame 0 with a fresh nonce.", "check": "POST /check {salt, nonce, frame, tag} -> {ok} - untimed, for validating your tag implementation offline.", "frames_required": 24, "deadline_ms": 1500, "tag": "sha256(salt || nonce || str(frame)).hexdigest()[:16], where salt and nonce are the hex strings as sent and frame is its decimal value.", "note": "Field units re-sync constantly; a dropped frame is normal and the line just starts over. Hold the full handshake to release the containment code."}, "reference_frame": {"salt": "5df81f27f4076d2c", "nonce": "71210be4caeafa76", "frame": 7, "tag": "e8c17ed7c02bd6ce", "note": "One captured good frame, for calibration."}}
