funman300 84e81f2037 tls: extract a shared listener; move FIFA 17's profile into its adapter
The redirector was the only host that spoke TLS, so its TLS lived inside
it. The roster host needs the same listener, and that made the choice
explicit: share this code or copy it.

Copying it is what already went wrong. On 2026-08-11 the Rust redirector
served one certificate while the container served another. ProtoSSL
caches the server certificate per backend, so the redirector -- the first
TLS connection of a session -- decided what the client expected, and
every later service failed its handshake. Silently: Python's socketserver
swallows ssl.SSLError as OSError. Three gates went to it. One place to
configure TLS is the structural fix, so it exists before the second host
does rather than after.

Split along the line the architecture already draws:

  openfut-tls               how to build an acceptor. Game-independent.
                            Knows nothing about which suites any client
                            offers.
  adapter-fifa17::tls       what FIFA 17 was OBSERVED to offer: the six
                            enabled suites, the two refused, the TLS 1.2
                            window, the EA SNI. Plain strings, so the
                            adapter keeps its lean dependencies -- reading
                            a card table should not build OpenSSL.
  redirector-host           joins the two. Chooses no cipher of its own.

Behaviour is unchanged, and shown to be:

* tests/fifa17_tls_profile.rs carries over every case from the deleted
  module -- FIFA's eight suites negotiate AES256-GCM-SHA384, each enabled
  suite works alone, RC4-only is refused, ECDHE-only is refused. Deleting
  a module must not quietly delete its evidence.
* one test pins the composed values literally against the host as it was
  when gates 1-14 passed. A "pure refactor" that cannot fail is not a
  claim, it is an assumption.
* the rebuilt binary self-tests to the same TLSv1.2 / AES256-GCM-SHA384
  the retail client negotiated at 17:09 today.

Two improvements fall out of having one place to look:

* the startup banner now prints cert_sha256. The mismatch above raised no
  error at startup and broke the client much later with nothing logged;
  it is now the first line of the log.
* tls_min/tls_max print as TLSv1.2 rather than SslVersion(771). This line
  is gate evidence and gets read by people.

Nothing deployed and nothing restarted: FIFA is mid-session on the
running redirector, which is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 17:30:01 +00:00

OpenFUT

Offline Ultimate Team — like SPT, but for FIFA 23.

OpenFUT replaces EA's retired FUT servers with a fully offline, single-player backend. You own FIFA 23 legitimately. You just want to keep playing after EA shut down the servers.


Repositories

Repo Purpose
openfut-core Game-independent offline FUT backend
openfut-bridge FIFA 23 integration layer + reverse-engineering proxy

Architecture

FIFA 23 client
      │
      ▼
┌─────────────────┐
│  openfut-bridge │  ← intercepts FUT traffic, maps routes, logs unknown
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  openfut-core   │  ← offline FUT backend: profiles, packs, squads, SBCs
└─────────────────┘
         │
         ▼
   SQLite database

Core is game-independent. It speaks a clean REST API and knows nothing about FIFA 23 internals.

Bridge is FIFA-specific. It speaks FIFA 23's wire protocol and translates it into Core API calls. Bridge is where all reverse engineering work happens.


Current Status

Feature Status
Local profiles + clubs Working
Coin system Working
Pack generator Working
Card collection Working
Squad builder Working
Objectives engine Working
SBC engine Working
Match rewards Working
NPC transfer market Working
Statistics Working
FIFA 23 integration 🔴 Reverse engineering in progress
Chemistry calculation 🟡 In progress
Full Draft mode 🟡 In progress
Squad Battles AI generator 🟡 In progress
Objectives claim flow 🟡 In progress

Running

# Start the offline backend
cd openfut-core
cargo run

# Start the proxy (for traffic capture / FIFA integration)
cd openfut-bridge
cargo run

Core listens on http://127.0.0.1:8080 by default. Bridge listens on http://127.0.0.1:8443 by default.


Design Principles

  • Offline-first. No EA account required. No internet connection needed.
  • Single-player only. This is not a multiplayer server emulator.
  • Data-driven. All cards, packs, SBCs, and objectives are JSON files. Everything is moddable.
  • Clean architecture. Core has zero knowledge of FIFA 23. Bridge has zero game logic.
  • No copyrighted assets. No real player images, no EA trademarks in data files.

Disclaimer

This project is not affiliated with EA Sports. You must own FIFA 23 legitimately to use this software. This project does not bypass any ownership verification and is intended only to restore offline playability of a game whose online services have been retired.

S
Description
No description provided
Readme 25 MiB
Languages
Python 54.8%
Rust 41.2%
Shell 3.3%
Lua 0.3%
PowerShell 0.2%
Other 0.1%