device_id and authenticated via ES256 (ECDSA P-256 + SHA-256) digital signatures. A device’s public key is provisioned at manufacture and registered with Sentinel before the device ships — the private key never leaves the device.
How It Works
Sentinel registers the device at manufacture
Each device’s ES256 keypair is generated and its public key is registered with Sentinel during manufacturing. Devices are sold directly to gamers and arrive pre-registered — no setup is required by the publisher or the gamer.
Device signs a session payload
At the start of each game session, the device constructs a small JSON payload containing a timestamp and a unique nonce, then signs it with its private key.
Game client forwards the payload
Your game client (using the Sentinel SDK or a direct API call) receives the signed payload from the device and passes it — unchanged — to your game server.
Payload Signing
The device produces two values that your game client passes through to the game server:| Value | Description |
|---|---|
payload_b64 | Base64-encoded JSON payload (timestamp + nonce) |
sig_b64 | Base64-encoded ES256 signature over the payload bytes |
/v1/device/check request.
What the payload contains
| Field | Type | Description |
|---|---|---|
ts_unix_ms | integer | Unix timestamp in milliseconds — must be within an acceptable window of server time. |
jti | string | Unique UUID for this check, used for replay protection. |
device_fw | string | Device firmware version (informational). |
telemetry | object | Optional telemetry data. |
Check request format
Signature Verification
When your game server submits a check, Sentinel performs these steps in order:- Base64 decoding — decodes
payload_b64andsig_b64 - Signature verification — verifies the signature against the device’s registered public key using ES256
- Payload parsing — deserializes the JSON payload
- Timestamp validation — ensures
ts_unix_msis within an acceptable range of server time - JTI check — ensures this nonce has not been seen before (replay protection)
- Publisher/game match — verifies the
publisher_idandgame_idmatch the authenticated request
400 with a descriptive error code:
| Error Code | Description |
|---|---|
bad_base64 | Invalid base64 encoding |
bad_signature | Signature verification failed |
bad_payload_json | Payload is not valid JSON |
timestamp_out_of_range | Timestamp too far from server time |
missing_jti | No JTI in payload |
replay_detected | JTI already used |
publisher_game_mismatch | Body IDs don’t match headers |
device_public_key_missing | No public key registered for this device |
Replay Protection
Each payload includes a uniquejti nonce. After successful verification, Sentinel stores it for 10 minutes. Any request reusing the same JTI within that window is rejected with replay_detected.
Device Revocation
Devices can be revoked from the dashboard. Once revoked, all checks for that device return"status": "revoked" instead of "ok". Bans and reputation are still returned for informational purposes.
Sandbox Simulator
For development and integration testing, Sentinel provides a software simulator that generates cryptographically validDeviceCheckRequest payloads without requiring physical hardware.
The simulator generates a real EC P-256 key pair and a sim_-prefixed device ID on first run, then persists them so the same identity is reused across test sessions. It signs payloads identically to real hardware, so your server-side verification code works unchanged against simulated devices.
See the Client SDK — Sandbox Testing section for usage instructions.