Files
OpenFUT/openfut-blaze-host/Cargo.toml
T
funman300 c5807c07a9 blaze-host: passive ClientHello observer for the redirector TLS decision
The redirector TLS question cannot be answered from the cipher OpenSSL
selected: its server follows client preference by default, so FIFA preferring
static RSA does not prove ECDHE was unavailable. Choosing a TLS stack on that
inference would be a guess. This reads the actual ClientHello.

PASSIVE BY CONSTRUCTION. Bytes relay verbatim both ways, nothing is injected
or rewritten, and the handshake is still terminated by the untouched Python
redirector. A parse failure logs and relays anyway -- observation must never be
able to break the path it observes.

Reports record/client version, supported_versions, SNI, every offered suite by
name, extensions, and a verdict on whether ANY forward-secret suite is offered,
which is exactly the rustls question. Unknown suites print as hex rather than
being dropped.

Verified end to end against the live Python redirector with openssl s_client:
31 offered suites parsed, 18 classified forward-secret, and Python logged the
relayed request and served its 406B serverinstanceinfo -- proving observation
AND pass-through in one run.

Unit-tested on truncated and non-TLS input; the verdict is asserted in both
directions so a static-RSA-only hello reports RULED OUT rather than defaulting
to the permissive answer.

NOTE: that 18-suite result is from openssl s_client, NOT from FIFA. It proves
the instrument works. The actual question is still open until a retail FIFA
ClientHello is captured.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-11 03:04:13 +00:00

39 lines
1.1 KiB
TOML

[package]
name = "openfut-blaze-host"
version = "0.1.0"
edition = "2021"
license = "MIT"
description = "Thin TCP host for the FIFA 17 Blaze RPC surface; runs beside the Python backend"
publish = false
[dependencies]
openfut-protocol-blaze = { path = "../openfut-protocol-blaze" }
openfut-adapter-fifa17 = { path = "../openfut-adapter-fifa17" }
# Session keys. The client never validates them, but they must be distinct per
# connection; seeding from the clock would not be.
rand = "0.8"
# The probe replays the adapter's recorded fixture conversation.
serde_json = "1"
# No async runtime and no TLS, both deliberate:
# * A FIFA client opens a handful of connections, so a thread each mirrors the
# Python oracle and keeps the host readable.
# * The Blaze main port is plaintext — verified against the running backend.
# TLS belongs to the redirector phase.
[[bin]]
name = "openfut-blaze-host"
path = "src/main.rs"
[[bin]]
name = "blaze-probe"
path = "src/bin/blaze-probe.rs"
[[bin]]
name = "tls-observe"
path = "src/bin/tls-observe.rs"
[[bin]]
name = "blaze-sanitize"
path = "src/bin/blaze-sanitize.rs"