Whether a raw cnf claim value carries BOTH a well-formed jkt and a
well-formed x5t#S256 — an ambiguous compound binding.
This AS never mints one: a grant emits exactly one mechanism's
confirmation. A compound cnf therefore indicates a forged token (signing-key
compromise) or an AS bug, and the response is to refuse the token rather
than to pick a winner — the same structural stance the refresh path already
takes (grants/refreshToken.mts rejects a compound RT cnf with
invalid_grant).
Member validation matches extractConfirmation: a cnf whose second
member is empty-string or non-string is a single-mechanism binding with junk
attached, not an ambiguous one, so it is NOT compound and extractConfirmation
narrows it to the well-formed member as usual.
Whether a raw
cnfclaim value carries BOTH a well-formedjktand a well-formedx5t#S256— an ambiguous compound binding.This AS never mints one: a grant emits exactly one mechanism's confirmation. A compound cnf therefore indicates a forged token (signing-key compromise) or an AS bug, and the response is to refuse the token rather than to pick a winner — the same structural stance the refresh path already takes (
grants/refreshToken.mtsrejects a compound RT cnf withinvalid_grant).Member validation matches extractConfirmation: a cnf whose second member is empty-string or non-string is a single-mechanism binding with junk attached, not an ambiguous one, so it is NOT compound and
extractConfirmationnarrows it to the well-formed member as usual.