On provably fair crypto baccarat tables (such as Stake Originals), you do not have to take the operator's word that cards were dealt honestly. Every finished session leaves behind a cryptographic audit trail—a pre-committed SHA-256 hash, a revealed server seed, your client seed, and a hand counter called the nonce—that lets anyone recompute every single card from scratch.
Our free Provably Fair Baccarat Verifier runs that entire verification pipeline locally inside your browser using the Web Crypto API, replaying up to 5,000 hands at once onto all five baccarat roads without ever sending your seeds over the network. Here is how the math works and how to verify a real seed pair step by step.
The 4-stage cryptographic pipeline
Every coup replayed on /verify passes through four deterministic stages:
Stage 1 — Verify the SHA-256 commitment hash
Before dealing Hand 0, the casino shows you a 64-character hexadecimal hashed server seed. Once you rotate your seed pair in the casino's Fairness panel, it reveals the plaintext serverSeed. The verifier computes:
SHA-256(UTF8(serverSeed)) === committedHash.trim().toLowerCase()
Because SHA-256 is collision-resistant, a matching 64-hex-character digest proves the casino could not swap or edit the server seed after seeing your bet sizes or your client seed.
Stage 2 — Generate 24 deterministic bytes via HMAC-SHA256
A baccarat coup never draws more than six cards (up to three for Player and three for Banker), and each card draw consumes four bytes—24 bytes in total. For each hand nonce from 0 to count − 1, the engine signs:
key = UTF8(serverSeed)
message = "${clientSeed}:${nonce}:0"
digest = HMAC-SHA256(key, message) // 32 bytes (24 bytes consumed)Because a single HMAC-SHA256 round outputs 32 bytes, all six card slots for a baccarat hand fit inside round = 0.
Stage 3 — Convert 4-byte chunks into floats and 52-card indices
Each consecutive 4-byte slice [b0, b1, b2, b3] becomes a floating-point number in [0, 1) and maps onto Stake's rank-major 52-card deck (0 = 2♦, 1 = 2♥, 2 = 2♠, 3 = 2♣ … 51 = A♣):
float = b0 / 256^1 + b1 / 256^2 + b2 / 256^3 + b3 / 256^4 cardIndex = Math.floor(float * 52) // 0..51 (infinite-deck draw)
Notice an important difference from a physical eight-deck shoe: each float independently picks 1 of 52 cards with replacement (an infinite-deck RNG draw). Earlier hands do not deplete cards from later nonces at all.
Stage 4 — Apply the Punto Banco third-card tableau
Card indices [0, 1] form Player's initial two cards, and indices [2, 3] form Banker's initial two cards. Our locked Punto Banco engine resolves Naturals first; if no Natural occurred, index 4 is drawn if Player takes a third card, and the next cursor (4 if Player stood, or 5 if Player drew) is drawn if Banker takes a third card.
A real 24-hand test vector you can paste into /verify right now
Do not take any guide's math on trust—test it directly. Copy these exact audit inputs into /verify:
- Server seed:
baccarat-smart-audit-seed-2026 - Pre-commitment SHA-256 hash:
75f93510406eb1212ceb3b86791253db1faebe5941981cc90f0232d4c328a2bc - Client seed:
player-verify-demo - Number of hands:
24(nonces0through23)
Here is what happens on the first two nonces down to the byte:
- Nonce 0 (Hand #1 — Player wins 9 to 7):
HMAC-SHA256("baccarat-smart-audit-seed-2026", "player-verify-demo:0:0")starts with bytes[41, 133, 79, 76](float0.162190…→ index8 = 4♦) and[64, 155, 115, 0](float0.252371…→ index13 = 5♥), giving Player4♦ + 5♥ = 9(Natural 9). Banker receives indices25 = 8♥and28 = 9♦(total7). Because Player holds a Natural 9, neither side draws a third card, and Hand #1 resolves P. - Nonce 1 (Hand #2 — Banker wins 6 to 5): Player receives indices
0 = 2♦and4 = 3♦(total5); Banker receives indices2 = 2♠and11 = 4♣(total6). Player draws index33 = 10♥(0 points, staying at5). Under the official tableau, Banker stands on6when Player's third card is a10(Banker only draws on a two-card total of 6 against a Player third card of 6 or 7), so Hand #2 resolves B.
Across all 24 nonces (0..23), the seed pair produces PBBBBBPTBPBBTBPBPPBBPTTT (12 Banker, 7 Player, 5 Ties):
Bead Plate
Big Road
Big Eye Boy
Small Road
Cockroach Pig
Checklist before trusting a session audit
- Save the SHA-256 hash before you play: Copy the active hashed server seed at the start of your session so you can confirm the post-rotation seed matches what was committed upfront.
- Set your own non-default client seed: Typing a custom client seed before Hand 0 guarantees the operator could not pre-select a favourable seed combination on their own.
- Match the exact nonce range: Nonces start at
0on a fresh seed pair and increment by 1 per bet. On/verify, click any bead on the Virtualized Bead Plate to open the dealt cards, point totals, and raw floats for that exact nonce.
Want to inspect how a finite eight-deck shoe differs mathematically from an infinite-deck provably fair RNG stream? Read our eight-deck combinatorial math breakdown next, or test this 24-hand replay in the interactive road sandbox below.