Repository navigation
feat(AscNativeLogon): native reconstruction of Ascension's own logon protocol (build-gated) - #13
Merged
Merged
Conversation
…ed order Aura application, effect filtering and visual hiding still inserted by call site, which does not reproduce the original: registration execution order does not follow the call sites (the aura list registers AscSpellMods before AscSpellVisuals, AscSpawnVisibility before AscAppearance). Measured the three lists from the original's live list links in two independent game sessions; they now rank by the captured site order (InsertByCapturedOrder), like the two lists added earlier. The aura-application list carries one original-only sixth callback (runtime-registered, no static call site, not reconstructed) that runs after the five captured entries. Fixture, portable test (all registration permutations, vetoes, duplicates, an off-array unknown site, visual-hide consumer short-circuit) and docs/CALLBACK-ORDER-MEASURED.md extended; 3367 checks, 0 failures locally.
… / Returning Player / overhead icon)
…protocol (build-gated) AscNativeLogon.cpp/.hpp installs the original DLL's three logon hooks (0x8CCE00, 0x9A83E0, 0x9A88C0) and the four handshake length gates (0x14 -> 0x20), replacing stock SRP6 with X25519 + ChaCha20 + HMAC-SHA256. Compiled only with -DASCENSION_NATIVE_LOGON=ON; the default stays SRP6-restore. tools/ascension-auth-keygen.ps1: X25519 key pair tool (RFC 7748 self-test plus the project's live-test pair). README/docs: native-logon build section, the 2026-10-10 live-validation record (proof check PASSED -> COP_AUTHENTICATE AUTH_OK -> COP_GET_CHARACTERS result=TRUE) and the server requirement found during it (authserver must persist key_session as account.session_key for the world handoff).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A native, build-gated reconstruction of Ascension's own logon protocol — the client side of the
handshake the genuine DLL installs by hot-patching three exe thunks. It lets the client speak that
protocol against a server that implements it (the
feature/ascension-native-loginbranch of anAzerothCore CoA fork), with no runtime byte-patching — everything ships inside the DLL, behind a
build option that defaults to OFF.
What's in the branch
src/Ascension/AscNativeLogon.cpp/.hpp— the protocol module (crypto self-test, three thunkreplacements, four length gates).
tools/ascension-auth-keygen.ps1— X25519 key-pair generator (RFC 7748 self-test included).CMakeLists.txt+PatchConfig.hpp.in—-DASCENSION_NATIVE_LOGON=ON(default OFF) and-DASCENSION_NATIVE_LOGON_SERVER_KEY=<64 hex>(the server's public key / KC1 slot value).src/Ascension/AscMain.cpp— DllMain install call, option-gated.DLL_REFERENCE— build section, live-validation record, and the server requirement foundduring validation.
What it installs (only with the option ON)
0x8CCE00[size][FC F4 F4 E6][tag16][masked payload][trailer]; payload carries login, X25519 public key, nonce, password tag, ChaCha20-encrypted password0x9A83E0Kfrom challengekey_sessioninto the auth object (lands at auth-context+0xC8)0x9A88C0M2compareHMAC-SHA256(key_derived, "OK")0x8CC7FA,0x8CC856,0xDFC024,0xDFC034Crypto (byte-exact copies of the live-verified values): X25519(secret, server public) → HMAC-SHA256
KDF →
key_derived(32B) /key_session(40B); ChaCha20 record + password encryption; HMAC proof.The module runs a crypto self-test first and refuses to install on failure.
Verification (2026-10-10, live end-to-end)
Against a server with the custom auth toggle on and the matching key pair:
native-logon: proof check PASSED (HMAC-SHA256(key_derived, "OK"))Ascension custom auth: proof replied, session authorisedCOP_AUTHENTICATE ... AUTH_OK→COP_GET_CHARACTERS ... result=TRUE→ character list renderedServer requirement found during validation
After the custom proof, the authserver must persist the handshake's 40-byte
key_sessionasaccount.session_key— the worldserver'sCMSG_AUTH_SESSIONdigest and header cipher depend on it,and without it the client drops right after auth. That fix lives on the server branch
(
AuthSession.cpp, Ascension client branch), not in this PR.Build / try it
Run the client with
-extlog 1and watchLogs\Extensions.logfor thenative-logon:lines.Deliberate limits (test/translation build, not a match for the obfuscated original)
the handshake — the NVMe disk serial (
Win32_DiskDrive.SerialNumber) and a CPUID.1 snapshot — viaits token pipeline. This reconstruction deliberately does not reproduce them: the module
collects no device data (no disk, CPUID or SMBIOS queries anywhere in it), and every
per-connection field — the 16-byte record tag, the 12-byte nonce, the 16-byte password tag —
carries fresh
rand_srandomness, matching the original's measured per-connection RNG behaviourfor the tag and password tag. The server treats these fields as opaque, as the live validation
shows.
server does not read them.
only for servers that speak the custom handshake.
hooks not installed).
Stacking note: this branch currently sits on the callback-order line (#12). Once #12 lands, the diff
here narrows to the single logon commit; I can rebase on request.