verify pass: resolve VERIFY flags (corrections + citations + honest UNCONFIRMED)

Corrected real errors: several 1.7.x release dates, resource_pack_send version,
config packet ordering, structured-component count (56), PLAYER_LOADED (1.21.4),
entity_sound_effect field order. Confirmed+cited the rest; remaining ~19 items
re-marked UNCONFIRMED (third-party/ViaLegacy/26.2 internals unreachable from refs).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
claude-timemachine
2026-06-19 15:03:44 +02:00
parent d73c1c9537
commit a3d5f64ef5
25 changed files with 179 additions and 119 deletions
+8 -6
View File
@@ -69,7 +69,7 @@ Fields:
- `nextState` — VarInt enum:
- `1` → STATUS
- `2` → LOGIN
- `3` → LOGIN after server transfer (≥1.20.5 / protocol 766) <!-- VERIFY exact version of Transfer -->
- `3` → LOGIN after server transfer (≥1.20.5 / protocol 766). Source: Velocity `HandshakeIntent.java:16` (`TRANSFER(3)`), `StateRegistry.java:883` (`TRANSFER_ID = 3`), `ProtocolVersion.java:89` (`MINECRAFT_1_20_5(766, "1.20.5", "1.20.6")`); ViaVersion `InitialBaseProtocol.java:133` rejects intent=3 for servers older than v1_20_5.
The server reads `nextState` and immediately switches its decoder to the corresponding state. There is no server response in the Handshaking state.
@@ -247,7 +247,7 @@ Source: `node-minecraft-protocol/src/client/play.js:43-55`
- **Algorithm**: AES-128-CFB8, symmetric, both directions use the same 16-byte shared secret.
- **Key exchange**: RSA (server's ephemeral keypair, ≥1024-bit); client encrypts shared secret and verify token with server's public key.
- **Activation point**: immediately after Encryption Response is sent/received — before the next byte on the wire. Encryption applies to all subsequent data including Set Compression and Login Success.
- **Online-mode only** (vanilla): offline-mode servers skip the Encryption Request/Response entirely. As of 1.21, vanilla offline-mode servers do not use encryption. <!-- VERIFY: whether any version change altered this for 1.21 specifically -->
- **Online-mode only** (vanilla): offline-mode servers skip the Encryption Request/Response entirely. This is version-independent behaviour — node-minecraft-protocol gates the entire Encryption Request/Response exchange on `needToVerify` (`server/login.js:52,88`), with no protocol-version branch. <!-- UNCONFIRMED: the "as of 1.21" qualifier in original text — no source found for a 1.21-specific change; behaviour has been stable since at least 1.8. If the wiki introduced this qualifier, it may reflect documentation style rather than a protocol change. -->
- Source: `node-minecraft-protocol/src/client/encrypt.js` (client), `node-minecraft-protocol/src/server/login.js:88-155` (server)
---
@@ -280,8 +280,10 @@ Sources: Velocity `StateRegistry.java` import block (lines 21-50); minecraft.wik
---
## VERIFY flags
## Resolution notes (formerly VERIFY flags)
<!-- VERIFY: intent=3 (Transfer) exact minimum version — wiki says ≥1.20.5 (protocol 766); Velocity TRANSFER_ID=3 at StateRegistry.java:883 consistent, but the Transfer login packet path vs. the Transfer clientbound packet in Play/Config should be distinguished. -->
<!-- VERIFY: "offline-mode servers do not use encryption as of 1.21" — wiki claim; node-minecraft-protocol skips encryption if !needToVerify regardless of version, which is correct, but the "as of 1.21" qualifier may be wiki-specific. -->
<!-- VERIFY: exact packet IDs for Configuration-state packets shift between 1.20.2, 1.20.3, 1.20.5 — the table at StateRegistry.java:163-261 is authoritative for Velocity's mapping but wiki IDs may differ for vanilla. -->
**intent=3 (Transfer) minimum version — CONFIRMED** ≥1.20.5 (protocol 766). Sources: Velocity `HandshakeIntent.java:16`, `StateRegistry.java:883`, `ProtocolVersion.java:89`; ViaVersion `InitialBaseProtocol.java:55,133`. Distinction: the *Handshake intent=3* is a serverbound signal from the transferring client; the *Transfer clientbound packet* (Play state, 0x73 in 1.20.5/1.21) is what the originating server sends to instruct the client to reconnect. Both ship in 1.20.5. Velocity registers the clientbound `TransferPacket` from `MINECRAFT_1_20_5` in both CONFIG (0x0B) and PLAY (0x73) state (`StateRegistry.java:239-240, 819-821`).
**offline-mode encryption "as of 1.21" — UNCONFIRMED** (see §8 note). Behaviour is version-stable; no source found for a 1.21-specific change.
**CONFIG packet IDs shift between 1.20.2 / 1.20.3 / 1.20.5 — CONFIRMED** true. Velocity `StateRegistry.java:163-261` documents the shifts (e.g. `Disconnect` stays 0x01 in 1.20.2, shifts to 0x02 in 1.20.5; `FinishConfiguration` shifts from 0x02→0x03). These are Velocity's values; vanilla wiki IDs may differ per-snapshot but the shift pattern is confirmed.