Packets/Login/TheBurningCrusade: Difference between revisions

From wowdev
Jump to navigation Jump to search
(→‎Reconnection proof packets: Add links to client and server)
(Redirect page to vanilla version. With packets being moved to their own pages it does make sense to maintain two identical legacy versions.)
Tag: New redirect
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Opcodes and Errors ==
#REDIRECT [[Packets/Login/Vanilla]]
 
See [[Login Packet]]s. The opcode value corresponds to the packet name.
 
{| class="wikitable"
|+ Error codes
! Name
! Value
! Client Message
|-
| SUCCESS || 0x00
|-
| FAIL_UNKNOWN0 || 0x01 || "Unable to Connect"
|-
| FAIL_UNKNOWN1 || 0x02 || "Unable to Connect"
|-
| FAIL_BANNED || 0x03 || "The World of Warcraft account has been closed and is no longer available for use.<br>Please go to http://www.wow-europe.com/en/misc/banned.html for further information.
|-
| FAIL_UNKNOWN_ACCOUNT || 0x04 || "The information you have entered is not valid.<br>Please check the spelling of the account name and password.<br>If you need help in retrieving a lost or stolen password and account,<br>see http://www.wow-europe.com for more information."
|-
| FAIL_INCORRECT_PASSWORD || 0x05 || "The information you have entered is not valid.<br>Please check the spelling of the account name and password.<br>If you need help in retrieving a lost or stolen password and account,<br>see http://www.wow-europe.com for more information."
|-
| FAIL_ALREADY_ONLINE || 0x06 || "This account is already logged into World of Warcraft.<br>Please check the spelling and try again."
|-
|  FAIL_NO_TIME || 0x07 || "You have used up your prepaid time for this account.<br>Please purchase more to continue playing."
|-
| FAIL_DB_BUSY || 0x08 || "Could not log in to World of Warcraft at this time.<br>Please try again later."
|-
| FAIL_VERSION_INVALID || 0x09 || "Unable to validate game version.<br>This may be caused by file corruption or the interference of another program.<br>Please visit http://www.wow-europe.com/en/support/ for more information and possible solutions to this issue."
|-
| LOGIN_DOWNLOAD_FILE || 0x0A || "Downloading"
|-
| FAIL_INVALID_SERVER  || 0x0B || "Unable to Connect"
|-
| FAIL_SUSPENDED  || 0x0C || "The World of Warcraft account has been temporarily suspended.<br>Please go to http://www.wow-europe.com/en/misc/banned.html for further information.
|-
| FAIL_NO_ACCESS || 0x0D || "Unable to Connect"
|-
| SUCCESS_SURVEY || 0x0E || "Success!"<br>Pressing cancel either shows a cached realmlist or "Retrieving realm list".
|-
| FAIL_PARENTALCONTROL || 0x0F || "Access to this account has been blocked by parental controls.<br>Your settings may be changed in your account preferences at http://www.worldofwarcraft.com."
|-
| FAIL_LOCKED_ENFORCED || 0x10 || Does not appear to be valid on 1.12.1.
|}
 
{| class="wikitable"
|+ Security Flags
! Name
! Value
! Description
|-
| NONE || 0x00 || No additional checks verification.
|-
| PIN || 0x01 || TOTP verification entered as a PIN.
|-
| UNKNOWN0 || 0x02 || Unknown. Referred to as "Matrix input" in Mangos source.
|-
| AUTHENTICATOR || 0x04 || Authenticator.
|}
 
==Challenge packets==
 
=== Client ===
 
See [[CMD_AUTH_LOGON_CHALLENGE_Client]].
 
=== Server ===
 
See [[CMD_AUTH_LOGON_CHALLENGE_Server]].
 
==Proof packets==
 
=== Client ===
 
{| class="wikitable"
|+ AuthLogonProof_Client
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x0 || 1 / - || uint8 || command || LOGIN_PROOF (0x1)
|-
| 0x1 || 32 / Little  || uint8[32] || a || SRP6 Client public key. Called A (capital A) in RFC2945.
|-
| 0x21 || 20 / Little || uint8[20] || m1 || SRP6 Client proof.
|-
| 0x35 || 20 / Little || uint8[20] || crc_hash || Hash of arbitrary files. Can be safely ignored.
|-
| 0x49 || 1 / - || uint8 || num_keys || Used for unknown telemetry. Can be expected to always be 0.<br>See the table below for when it is not 0.
|-
!colspan="5"| num_keys amounts of num_key fields, if applicable.
|-
| 0x4A || 1 / - || bool (size 1 byte) || security_flags || Bit pattern for optional authentication features.<br>More than one feature can be used,<br> and the fields are just appended in the bit pattern order from lowest first.<br>See security_flag. tables below for specifics. If 0 the packet ends here.
|-
!colspan="5"| security_flags.PIN fields, if applicable.
|-
!colspan="5"| security_flags.unknown fields, if applicable.
|-
!colspan="5"| security_flags.Authenticator field, if applicable.
|}
 
When num_keys is not 0, the field is followed by 4 key data fields that repeat num_key times.
 
{| class="wikitable"
|+ num_keys Fields
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| || 2 / - || uint16 || unk1 || Used for unknown telemetry. Can be expected to not be present.
|-
| || 4 / - || uint32 || unk2 || Used for unknown telemetry. Can be expected to not be present.
|-
| || 4 / - || uint8[4] || unk3 || Used for unknown telemetry. Can be expected to not be present.
|-
| || 20 / - || uint8[20] || unk4 || Used for unknown telemetry. Can be expected to not be present.
|}
 
When security_flags is not 0 the following fields can appear.
 
{| class="wikitable"
|+ security_flags.PIN Fields
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x00 || 4 / Little || uint32 || pin_grid_seed || Seed value for the PIN grid on the client.<br> Only here if the two_factor_authentication field is true.
|-
| 0x04 || 16 / Little || uint8[16] || pin_salt || Salt value for the client.<br> Only here if the two_factor_authentication field is true.
|}
 
{| class="wikitable"
|+ security_flags.Unknown0 Fields
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x00 || 1 / - || uint8 || unknown0 || Unknown. Statically set to 0 in Mangos.
|-
| 0x01 || 1 / - || uint8 || unknown1 || Unknown. Statically set to 0 in Mangos.
|-
| 0x02 || 1 / - || uint8 || unknown2 || Unknown. Statically set to 0 in Mangos.
|-
| 0x03 || 1 / - || uint8 || unknown3 || Unknown. Statically set to 0 in Mangos.
|-
| 0x04 || 8 / - || uint64 || unknown4 || Unknown. Statically set to 0 in Mangos.
|}
 
{| class="wikitable"
|+ security_flags.Authenticator Fields
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x00 || 1 / - || uint8 || unknown0 || Statically set to 1 in Mangos.
|}
 
 
=== Server ===
 
{| class="wikitable"
|+ AuthLogonProof_Server
! Offset
! Size
! Type
! Name
! Description
|-
!colspan="5"| Header
|-
| 0x0 || 1 / - || uint8 || command || LOGIN_PROOF (0x1)
|-
| 0x1 || 1 / - || uint8 || error || The fields below are only included if this is SUCCESS (0x0).<br>If this is not SUCCESS (0x0) two padding bytes are added after this.
|-
| - || 2 / - || uint16 || error_padding || Only included if error is not SUCCESS (0x00).
|-
!colspan="5"| Body
|-
| 0x2 || 20 / Little || uint8[20] || m2 || SRP6 Server proof.
|-
| 0x16 || 4 / Little || uint32 || account_flag || ACCOUNT_FLAG_GM = 0x00000001,<br>ACCOUNT_FLAG_TRIAL = 0x00000008,<br>ACCOUNT_FLAG_PROPASS = 0x00800000<br>Mangos statically sets this to PROPASS.
|-
| 0x20 || 4 / Little || uint32 || hardware_survey_id || ID of a hardware survey that the client should perform. <br>Set to 0 to not use. Can safely be set to 0.
|-
| 0x24 || 2 / Little || uint16 || unknown_flags || Mangos describes as "some flags (AccountMsgAvailable = 0x01)" and statically sets to 0.
|}
 
==Reconnection challenge packets==
 
=== Client ===
 
The reconnect client packet has the same format as [[CMD_AUTH_LOGON_CHALLENGE_Client]] except that the opcode field is 0x2 instead of 0x0.
 
=== Server ===
 
See [[CMD_AUTH_RECONNECT_CHALLENGE_Server]].
 
==Reconnection proof packets==
 
=== Client ===
 
See [[CMD_AUTH_RECONNECT_PROOF_Client]].
 
To check if the client proof is correct, the server must calculate SHA1(account_name | proof_data | challenge_data | session_key) and compare it to client_proof.
 
=== Server ===
 
See [[CMD_AUTH_RECONNECT_PROOF_Server]].
 
==Realm list packets==
 
=== Client ===
 
{| class="wikitable"
|+ RealmList_Client
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x0 || 1 / - || uint8 || cmd || REALMLIST (0x10)
|-
| 0x1 || 4 / - || uint32 || unknown || Hardcoded to 0 in the client. Can be expected to always be 0.
|-
|}
 
=== Server ===
 
The server answers with a packet composed of a RealmHeader_Server, as many
RealmInfo_Server as specified and a RealmFooter_Server.
 
==== Header ====
 
{| class="wikitable"
|+ RealmHeader_Server
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x0 || 1 / - || uint8 || command || REALMLIST (0x10)
|-
| 0x1 || 2 / Little || uint16 || size || Size of the rest of packet, without the command and size fields (3 bytes).
|-
| 0x3 || 4 / - || uint32 || unknown || Not used in public clients. Set to 0.
|-
| 0x7 || 2 / Little || uint16 || num_realms || Number of RealmInfo_Server.
|-
|}
 
The size value can be computed with the part of the header taken into account
plus the footer (6+2 bytes) and the size of every RealmInfo_Server which is
variable.
 
==== Body ====
 
{| class="wikitable"
|+ RealmInfo_Server
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x0 || 1 / Little || uint8 || realm_type || Mangos just says "realm type (this is second column in Cfg_Configs.dbc)".
|-
| 0x1 || 1 / - || bool || locked || Show realm as locked in client.
|-
| 0x2 || 1 / - || uint8 || realm_flags || See RealmInfo_Server.flags table below.<br>Setting SPECIFY_BUILD requires the additional fields at the bottom.
|-
| 0x3 || - / Big || char[] || realm_name || Zero terminated string; name of the Realm
|-
| || - / Big || char[] || address_port || Zero terminated string; address of the Realm ("ip:port")
|-
| || 4 / Little || float || population || Population value.<br>200 is always green "Recommended", <br>400 is always red "Full",<br>600 is always blue "Recommended".<br>Low/Medium/High are calculated based on the population values sent.
|-
| || 1 / - || uint8 || num_chars || The number of characters the client has on the server.
|-
| || 1 / - || uint8 || realm_category || The language or region of the server.<br>How this is interpreted depends on the locale of the client.<br>It is shown as tabs at the bottom of the realmlist screen.<br>If there are only realms of one category no tabs are shown.<br>See table RealmInfo_Server.realm_category Values.
|-
| || 1 / - || uint8 || realm_id || Used for the initial sorting of the realms. Identical values are not a problem.
|-
!colspan="5"| realm_flags SPECIFY_BUILD fields
|-
| || 1 / - || uint8 || major_version || Major version of the server.
|-
| || 1 / - || uint8 || minor_version || Minor version of the server.
|-
| || 1 / - || uint8 || patch_version || Patch version of the server.
|-
| || 1 / Little || uint16 || revision || [[Rev|Revision]] of the server.<br>Revision is not shown after the name, but mousing over will show it.
|}
 
{| class="wikitable"
|+ RealmInfo_Server.flags Values
! Value
! Name
! Description
|-
| 0x00 || NONE || No changes.
|-
| 0x01 || INVALID || Color realm name in read.
|-
| 0x02 || OFFLINE || Gray out name and prevent selection.
|-
| 0x04 || SPECIFY_BUILD || Shows the build on the realm list. Requires additional fields in realmlist body.
|-
| 0x08 || UNK1 || Unused.
|-
| 0x10 || UNK2 || Unused.
|-
| 0x20 || FORCE_RECOMMENDED || Forces the client to show the server as "Recommended" in blue text,<br> no matter what the population value is.
|-
| 0x40 || FORCE_NEW_PLAYERS || Forces the client to show the server as "Recommended" in green text,<br> no matter what the population value is.
|-
| 0x80 || FORCE_FULL || Forces the client to show the population as "Full" in red text,<br> no matter what the population value is.
|-
|}
 
==== Footer ====
 
{| class="wikitable"
|+ RealmFooter_Server
! Offset
! Size / Endianness
! Type
! Name
! Description
|-
| 0x0 || 2 / ? || uint16 || unknown || Ignored in public clients. Set to 0.
|-
|}
 
[[Category:Packet]]
[[Category:Packet/Login]]
[[Category:Login]]

Latest revision as of 21:02, 21 May 2021