Skip to content

Auth#1386

Closed
MrTheShy wants to merge 2 commits intosmartcmd:mainfrom
MrTheShy:auth
Closed

Auth#1386
MrTheShy wants to merge 2 commits intosmartcmd:mainfrom
MrTheShy:auth

Conversation

@MrTheShy
Copy link
Contributor

Description

Adds a proper authentication system (Mojang, Ely.by, offline) to replace the old hardcoded fake XUID identity on Windows64.

Previous Behavior

The Windows64 port had no real player authentication. It used hardcoded fake XUIDs, which allowed anyone to impersonate any player. There was no session verification or multi-account support.

Root Cause

The original console codebase relied on platform-specific identity systems (Xbox Live, PSN) that do not exist on PC. The Windows64 port previously stubbed these out with static values, leaving the game without actual identity verification.

New Behavior

Players can now authenticate using:

  • Mojang (MSA device code flow)
  • Ely.by (Yggdrasil + 2FA)
  • Offline mode (Java Edition-compatible UUID generation)

The server now verifies sessions via hasJoined APIs. Player identity uses a 128-bit GameUUID instead of a 64-bit XUID. Additionally, old saves will auto-migrate on first access.

Implementation

  • MCAuth library (new MCAuth/): Handles Mojang MSA device code flow (XBL → SISU → MC services), Ely.by Yggdrasil auth with 2FA, and offline UUID generation via MD5 v3. Features a multi-account manager with background token refresh, per-slot sessions, on-disk token persistence, and skin fetching with PNG validation.
  • Network Protocol (version bumped to 80): Introduced three new packets (AuthScheme, AuthResponse, AuthResult) to implement a server-driven auth handshake. readPlayerUID and writePlayerUID now serialize 16 bytes. Old and new clients will correctly reject each other at PreLogin.
  • Save Migration: Map data mappings automatically migrate from the old 64-bit XUID format to the new 128-bit UUID format. Sentinel-based detection upgrades entries on their first real access. The format is detected by file size (2080/2112/4160 bytes).
  • UI: Added UIScene_MSAuth for the login flow, NativeUIRenderer for rendering authentication screens, and updated the skin selection menu for authenticated accounts.

AI Use Disclosure

AI was used during the development of this PR to:

  • Write Markdown files.
  • Search for specific code snippets.
  • Analyze and debug issues.
  • Write this PR and commit.

The old Windows64 port had no real player identity — it used hardcoded
fake XUIDs, so anyone could impersonate anyone. This replaces that with
proper auth supporting Mojang, Ely.by, and offline accounts.

MCAuth library (new, MCAuth/):
  Mojang auth via MSA device code flow (XBL, SISU, MC services),
  Ely.by via Yggdrasil with 2FA, offline UUID generation matching
  Java Edition (MD5 v3 from "OfflinePlayer:<name>"). Multi-account
  manager with background token refresh, per-slot sessions, and
  on-disk token persistence. Server-side session verification via
  Mojang/Ely.by hasJoined API. Skin fetching and PNG validation
  from texture servers.

Network protocol (version bumped to 80):
  Three new packets (AuthScheme, AuthResponse, AuthResult) implement
  a server-driven auth handshake before login completes. Player
  identity migrated from 64-bit XUID to 128-bit GameUUID backed by
  two uint64 fields (hi/lo). readPlayerUID/writePlayerUID now
  serialize 16 bytes on the wire. Old and new clients cannot connect
  to each other — version mismatch is rejected at PreLogin.

Save migration:
  Map data mappings auto-migrate from old format: the old 64-bit
  XUID is placed in hi, lo is set to 0 as a sentinel. On first
  access by the real player, the sentinel entry is upgraded in-place
  to the full 128-bit UUID. Format detection is by file size (2080,
  2112, or 4160 bytes). Player .dat filenames inside saveData.ms
  change from decimal XUID to dashed UUID — old saves need manual
  entry renaming in the archive.

UI:
  NativeUIRenderer: immediate-mode drawing system (quads, text,
  9-slice panels, scrollbars, focus lists) for rendering auth
  screens without Flash/Scaleform. UIScene_MSAuth handles device
  code display, Ely.by credential input with 2FA, per-account
  skin head preview, and multi-account add/remove/switch.

Server:
  online-mode and auth-provider (mojang/elyby) in server.properties.
  Whitelist and ban checks validate against the server-verified UUID.
  Incompatible auth scheme logs which provider the server expects
  vs what the client is using.

Also fixes a pre-existing exploit where any client could send a
DebugOptionsPacket to grant themselves CraftAnything and other debug
privileges on any server — now requires OP status server-side.
@MrTheShy MrTheShy closed this Mar 23, 2026
@MrTheShy MrTheShy deleted the auth branch March 23, 2026 00:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant