Issuing a Privacy Pass requires implementing a challenge-response protocol based on RFC 9578 and RFC 9577.
If you don’t want to implement this yourself, use the Server SDK or Gateway Service — they handle the cryptography for you.
Call generate-claim without a PrivateToken authorization header. Persona responds with 401 Unauthorized. This is not an error — it is the first step of the protocol, called a challenge-response flow (RFC 9110 §11.3).
Decode challenge from base64url to get the following JSON:
The mac binds the expiry and endpoint scope into the signed token — if a client tries to forge a challenge with a longer expiry, the MAC fails and the token is rejected at issuance.
Construct a 98-byte token input. Each component is SHA-256 hashed before concatenation:
Spec deviation: RFC 9578 §6.1 puts raw bytes directly into token_input.
We hash each component to SHA-256 first. Your implementation must match this
exactly — using the raw values will produce an invalid token.
See Blind RSA for a full explanation of the protocol. In summary:
token-key), producing blindedMsg and blinding inverse invPOST /api/v1/privacy-passes for signing (see API Usage)blind-sig using inv to produce the final RSA-PSS signatureAssemble the final token payload:
Base64url-encode this JSON object. The result is your privacy-pass-token, ready to be used in the redemption call.
Use the same nonce string here that you used in token_input. The verifier
recomputes SHA256(nonce) during redemption — using a different value will
fail signature verification.
When you submit the PrivateToken, Persona performs these checks in order:
challenge.macchallenge.expires_at hasn’t passed (challenges are valid for 1–2 hours)challenge.origin_info matches /api/privacy/v1/relaystoken_input and verifies the unblinded signature against Persona’s public keytoken_nonce against a one-time-use tracker. The same token cannot be redeemed twiceIf all checks pass, the claim is returned. Persona never learns which customer made the request — only that a valid token was presented.