Time-bound asymmetric authentication proofs for offline, OTP-style, transaction-signing, duress-aware, and multi-device flows.
PulseProof Sentinel Protocol, abbreviated PPS, is an experimental open authentication protocol that replaces shared-secret TOTP-style codes with signed, time-bound, asymmetric proofs called Pulses.
Instead of storing OTP secrets on the server, PPS verifiers store only public keys.
TOTP
code = HMAC(shared_secret, time)
PPS
Pulse = Sign(private_key, time + rp + nonce + counter + context + policy)
A Pulse can be verified using a public key, while being bound to a relying party, time window, nonce, counter, policy, context, and optional transaction data.
PPS is designed to complement, not replace, WebAuthn/FIDO2.
WebAuthn remains the preferred mechanism for browser-based passkey authentication.
PPS targets operational gaps where WebAuthn is unavailable or insufficient:
| Area | Use Case |
|---|---|
| Offline authentication | Terminals, IoT devices, unstable networks |
| Legacy OTP flows | Systems that still expect OTP-style input |
| QR / deep-link login | Mobile-to-web and cross-device authentication |
| Constrained hardware | POS devices, embedded modules, hardware tokens |
| Transaction signing | Human-visible transaction confirmation |
| Silent duress | Coercion-aware authentication with Honey-Pulse |
| Threshold approval | Offline multi-device authorization |
| Feature | Description |
|---|---|
| Asymmetric time-bound proofs | Authentication is based on signed Pulses, not shared OTP secrets |
| No shared server secret | Verifiers store only public keys |
| Offline-capable | Pulse generation can work without a live network round-trip |
| Forward-secure ratcheting | Optional key rotation to limit key-compromise exposure |
| Silent duress signaling | Optional Honey-Pulse mechanism for coercion scenarios |
| Threshold approval | Optional offline n-of-m multi-device authorization |
| Transaction AmountMark | Optional human-visible amount checksum inside the Trust Code |
| Dynamic policy binding | Optional server-issued policy hash bound to each Pulse |
| Context binding | Optional session, transaction, proximity, and device-context binding |
| Deterministic CBOR | Technology-neutral wire format using deterministic CBOR encoding |
Authenticator Verifier
| |
| <------- challenge / nonce ---------- |
| |
| sign Pulse with private key |
| |
| -------- Pulse Token + Trust Code --> |
| |
| verify signature |
| check nonce |
| check counter |
| check policy |
| check context |
| |
| <---------------- ok ---------------- |
| Repository | Type | Description | Links |
|---|---|---|---|
| pulseproof-sentinel | Specification | Core protocol specification, documentation, IETF materials, examples, and test vectors | Website · SPEC · Docs |
| pps-php | Core Implementation | Framework-agnostic PHP implementation of PPS | Website · Docs · Packagist |
| laravel-pps | Laravel Integration | Laravel bridge for PPS: routes, controller, facade, config, migrations, and storage integration | Website · Packagist |
Install the core PHP package:
composer require pps-protocol/pps-phpInstall the Laravel integration:
composer require pps-protocol/laravel-ppsThen publish the Laravel configuration:
php artisan pps:install| Language / Framework | Package | Status |
|---|---|---|
| PHP | pps-php | Available |
| Laravel | laravel-pps | Available |
| JavaScript / TypeScript | pps-js |
Planned |
| Python | pps-python |
Planned |
| Go | pps-go |
Planned |
| Rust | pps-rust |
Planned |
| Resource | Link |
|---|---|
| Main repository | pps-protocol/pulseproof-sentinel |
| Protocol website | pps-protocol.github.io/pulseproof-sentinel |
| Specification | SPEC.html |
| Documentation | docs/ |
| IETF Internet-Draft | draft-hezami-pulseproof-sentinel |
PPS is submitted as an individual Internet-Draft:
draft-hezami-pulseproof-sentinel
Datatracker:
https://datatracker.ietf.org/doc/draft-hezami-pulseproof-sentinel/