demo · v132

Nonce Validator

Chrome 132 hardens Protected Audience auction nonces: each runAdAuction() call requires a unique, single-use nonce. An attacker who captured a signed additional bid from one auction can no longer replay it in a second auction to learn user signals via negative targeting. This demo generates real cryptographic nonces, binds them to simulated auctions, and demonstrates how replay attempts are rejected.

Checking SubtleCrypto and Protected Audience support…

Current auction nonce

— not yet generated —
Generate a nonce, then bind it to see the validation state.
Auction # Nonce Created Status Replay attempt
Generate a nonce to begin.
// Chrome 132: nonce must be unique per runAdAuction() call
// The nonce binds signed additional bids to a specific auction.

// Step 1: Generate a fresh nonce for this auction
const nonceBytes = crypto.getRandomValues(new Uint8Array(16));
const nonce = btoa(String.fromCharCode(...nonceBytes));

// Step 2: Share nonce with contextual bid server
const ctxResponse = await fetch('/contextual-bid', {
  method: 'POST',
  body: JSON.stringify({ auctionNonce: nonce }),
});
const { signedBids } = await ctxResponse.json();
// Server signs each bid with the nonce — binding it to THIS auction

// Step 3: Run auction — nonce validates signed bids
const adFrame = await navigator.runAdAuction({
  seller: 'https://ssp.example',
  interestGroupBuyers: ['https://buyer.example'],
  auctionNonce: nonce,          // Chrome 132: required for signed bids
  additionalBids: signedBids,   // each bid contains the nonce signature
});

// Pre-132 vulnerability: attacker replays bid from auction 1 into auction 2.
// Chrome 132: nonce mismatch causes the browser to reject replayed bids.

see also