Duress mode allows a user to silently signal coercion.
It uses a hidden duress key.
A Pulse signed by the duress key is called a Honey-Pulse.
During registration, the client may register a duress public key.
use Pps\Client\RegistrationBuilder;
$builder = new RegistrationBuilder();
$registration = $builder
->rpId('example.com')
->nonce($nonceB64u)
->userHandle('user-123')
->withDuress(true)
->build();
The server stores:
current_pk
duress_pk
use Pps\Client\AuthenticatorClient;
$client = new AuthenticatorClient($clientState);
$pulse = $client
->rpId('example.com')
->nonce($nonceB64u)
->duress(true)
->createPulse();
The server verifies the Pulse normally.
If the signing public key matches the stored duress public key:
if ($result->honey) {
// Return normal-looking response
echo json_encode(['status' => 'ok']);
// Internally:
// - restrict account
// - block high-value operations
// - trigger silent alert
// - delay settlement
}
The outward response must be indistinguishable from normal success.
Match:
HTTP status
JSON structure
response latency
cookies
UI navigation
Do not return:
{
"status": "duress_detected"
}
Possible triggers:
duress PIN
long press
hidden gesture
alternate phrase selection
special accessibility toggle
The trigger mechanism is client-specific and not defined by the protocol.