---
title: "Packet 105: SteamSessionTicket"
description: "The retail client's first application handshake packet. It carries the opaque Steam session ticket that a Steam-enabled game server must validate before accepting the player's identity."
canonical: "https://aosplay.net/protocol-168/packets/105"
markdown: "https://aosplay.net/docs/protocol-168/packets/105.md"
last_updated: "2026-07-16"
protocol: "Ace of Spades Battle Builder 168"
packet_id_decimal: "105"
packet_id_hex: "0x69"
direction: "C→S"
family: "Authentication"
implementation_status: "Handshake"
evidence: "Live-verified"
wire_size: "5 + N bytes"
---

# Packet 105: SteamSessionTicket

> The retail client's first application handshake packet. It carries the opaque Steam session ticket that a Steam-enabled game server must validate before accepting the player's identity.

- **Decimal ID:** 105
- **Hex ID:** 0x69
- **Direction:** C→S
- **Family:** Authentication
- **Status:** Handshake
- **Evidence:** Live-verified
- **Wire size:** 5 + N bytes

## Implementation note

Wire layout is packet id 0x69, signed i32 little-endian length, then exactly N ticket bytes. The retail client uses those bytes as the repeating XOR key for subsequent application payloads. That obfuscation is not authentication. Packet 105 carries no separate SteamID; the recovered retail wrapper therefore matches Valve's legacy connect-auth flow, which returns a candidate SteamID and completes through GSClientApprove or GSClientDeny. A modern BeginAuthSession flow requires a claimed SteamID from a separate authenticated channel and must not be mixed with the legacy API. Never authenticate a peer merely because packet 105 parsed successfully.

## Exact wire layout

The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects.

| # | Field | Encoding | Bytes | Purpose | Condition |
| ---: | --- | --- | ---: | --- | --- |
| 0 | `packet_id` | u8 | 1 | Always 105 (0x69). | — |
| 1 | `ticket_size` | i32 LE | 4 | N: ticket length; reject negative values and lengths beyond the remaining packet. | — |
| 2 | `ticket` | opaque Steam ticket bytes | N | Ticket bytes supplied by the Steam client API. Treat as secret, bounded binary data rather than text. | — |

## Encoding conventions

- `LE` means least-significant byte first.
- `fixed16` is two-byte sign-magnitude at 1/64 precision.
- `orientation16` uses the measured 1/8192 orientation mapping.
- NUL strings consume their encoded byte length plus one `00` terminator.
- Counted arrays repeat immediately in the documented order.

## Related resources

- [HTML packet page](https://aosplay.net/protocol-168/packets/105)
- [Complete packet catalog](https://aosplay.net/protocol-168/packets)
- [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md)
- [Protocol 168 guide](https://aosplay.net/protocol-168)
