Authenticator App: Device-Bound Passwordless Login

Protocol specification for the QR-mediated, device-key-bound passwordless authentication flow: channel establishment, BRK cross-verification, and blind signature delivery.

22 min read

Overview

This document specifies the Authenticator App protocol - a device-bound, passwordless authentication flow that eliminates the browser as a credential surface. In standard PRISM authentication (Protocol: CMK Authentication), the user enters a password into the Secure Web Enclave (SWE). If the browser is compromised, the password could be captured before blinding. The Authenticator App removes this vector: the user authenticates via biometrics on a mobile device, the App executes threshold authentication against the CMK ORK swarm using a hardware-protected Device Key (DVK), and the resulting blind signature is relayed to the SWE through a transient Home ORK channel.
The App and the SWE cross-verify each other: the App checks Browser Key (BRK) signatures and the return URL TLD before proceeding; the SWE verifies the blind signature cryptographically. ORK responses use three-layer onion encryption, ensuring neither the Home ORK relay nor the browser can read the internal state.
The Authenticator App is a user-facing mobile application for identity verification. It must not be confused with Asgard, which is the backend Dealer Library for server-side cryptographic operations - a separate component.
Loading diagram...

Preconditions

On the Authenticator App

ArtifactDescription
DVK (aa)Device private key, protected by biometrics/secure element
A=GaA = \mathcal{G} \cdot aDevice public key
knownGBRK[]List of recognized Browser Key public keys (device memory)

On the CMK ORKs (per ORK ii)

ArtifactDescription
AppAuthKeyi\text{AppAuthKey}_iSHA256(mSecORKiA)\textsf{SHA256}(\text{mSecORK}_i \cdot A) - per-ORK device verification value
CMKi\text{CMK}_iORK ii's shard of the user's CMK
gCMK\text{gCMK}GCMK\mathcal{G} \cdot \text{CMK} - user's CMK public key
mSecORKi\text{mSecORK}_i, mgORKi\text{mgORK}_iORK long-term private/public keys
mAesORKi\text{mAesORK}_iORK symmetric key (derived from ORK seed)

On TideCloak

ArtifactDescription
VUIDSHA512(gUserCMK).last32bytes\textsf{SHA512}(\text{gUserCMK}).\text{last32bytes}
gCMKAuthgCMKCMKmul\text{gCMK} \cdot \text{CMKmul}
gVVK, gVRKVendor public keys; gVRK signed by VVK
SignedSettingsVVK-signed vendor configuration

Setup Phase: Device Key Registration

One-time operation during account creation, password migration, or account recovery. For new Tide users, the App creates a fresh DVK and registers a new CMK identity (no password is ever set). For existing password-based users, the App verifies the user's password one final time, creates and stores the DVK, pairs the device with the existing CMK, and disables password authentication.
Loading diagram...
Each ORK validates the proof of possession, stores AA alongside the user's CMK shard, and computes AppAuthKeyi=DH(mSecORKi,A)\text{AppAuthKey}_i = \textsf{DH}(\text{mSecORK}_i, A). After setup, each ORK can verify the device key without any ORK knowing aa - the verification is DH-based, using each ORK's own private key with the device's public key.

Phases 1-3: Initialization, Channel, and Cross-Verification

Loading diagram...

Phase 1 - Non-obvious aspects

The sessKeyProof creates a chain: BRK → VendorSessionKey → session identity → User auth. The sigAppReq proves the request came from the BRK holder where the user signed in. Together they prevent session hijack: a MITM cannot swap session keys without breaking the signature chain.
If no BRK exists in localStorage (new browser, cleared cache), the SWE generates one. This triggers an "unfamiliar browser" warning in Phase 3.

Phase 3 - BRK cross-verification

The four checks form an anti-phishing defense. A phishing page cannot extract the legitimate BRK from another origin's localStorage - it must generate a new one. The App detects the unfamiliar key and exposes the fraudulent TLD. Over time, the App accumulates a list of trusted browser keys (the user's work laptop, home desktop), forming a decentralized device registry without any central authority.
After biometric confirmation unlocks the DVK, the App computes σa=SignBRK(S,τ)\sigma_a = \textsf{Sign}_{BRK}(S, \tau) - a device-key signature over the session context.

Phase 4: Threshold Authentication from App

Loading diagram...

Onion encryption (3 layers - per ORK ii)

Each ORK wraps its PreSign response in three encryption layers:
text
┌─────────────────────────────────────────────────────────┐
│  OUTER: ENC_AppAuthᵢ(...)                               │
│  AppAuthᵢ = mgORKᵢ.DH(DVK) - only the App can peel      │
│                                                         │
│  ┌───────────────────────────────────────────────────┐  │
│  │  MIDDLE: ENC_prkECDHᵢ(...)                        │  │
│  │  prkECDHᵢ = NetworkSessionKey.pub.DH(mSecORKᵢ)    │  │
│  │  Transit protection - bound to this session       │  │
│  │                                                   │  │
│  │  ┌─────────────────────────────────────────────┐  │  │
│  │  │ INNER: ENC_mAesORKᵢ(AuthRequest)            │  │  │
│  │  │ ORK's own symmetric key - self-verification │  │  │
│  │  └─────────────────────────────────────────────┘  │  │
│  └───────────────────────────────────────────────────┘  │
│                                                         │
│  timestampᵢ, extᵢ, userPRISMᵢ (alongside middle layer)  │
└─────────────────────────────────────────────────────────┘
The outer layer guarantees only the App (holding DVK) can access ORK responses. The middle layer binds to the NetworkSessionKey (transport protection). The inner layer is self-sealed - only the originating ORK can later decrypt it during the Authenticate phase (challenge solution proof).

Non-obvious aspects

Two-phase signing (PreSign → Authenticate): The separation with nonce commitment (ORK caches gCMKRᵢ indexed by gSessKeyPub) mitigates Wagner birthday attacks on the blind signature scheme. The ORK destroys the cache entry on use, preventing replay.
PRISM interpolation derivation chain: The App Lagrange-interpolates the userPRISMᵢ partials to derive userPRISM, applies voucher-derived deobfuscation (qPub, uDeObf) to recover gUserCMK, then derives CMKmul, VUID, and gCMKAuth. This follows the same CMK authentication pattern specified in Protocol: CMK Authentication.
Authenticate wait timing: The Authenticate call waits 5 seconds for the same II ORKs that responded to PreSign (not a fresh threshold), since the cached nonce entries exist only on those nodes.

Phases 5-6: Delivery and Completion

The App encrypts all session artifacts (VUID, blind signature SS, gRmul, AuthToken, ORK routing data, prkRequest_i values) under gSessKeyPub and relays the SWEEncryptedData through the Home-ORK channel with the negotiated ID. The Home-ORK cannot read the payload.
The App updates its BRK list: if the BRK was new, it is added to knownGBRK[] (evicting the oldest if at capacity); if already known, moved to the top of the LRU cache.
The Secure Web Enclave (SWE) decrypts with sessKey, recovers selfRequestᵢ values by peeling the middle layer (DH(mgORKᵢ, SessKey)), and constructs
VendorEncryptedData=ENCgVRK(VUID,S,gRmul,AuthToken)= ENC_{gVRK}(VUID, S, gRmul, AuthToken).
The SWE redirects to TideCloak with VendorEncryptedData.
localStorage: The SWE stores the BRK (always, after App authentication). Session metadata (username, sessKey, ORK addresses, expiry) is stored only if rememberMe is set. TideCloak proceeds with the standard VVK JWT signing flow (Article 5, Protocol: VVK JWT Signing).

Algorithms

Notation Reference

SymbolDescription
G\mathcal{G}Generator point on the elliptic curve
DVK / aaDevice private key (biometric-protected)
A=GaA = \mathcal{G} \cdot aDevice public key
BRK / ddBrowser Key (persistent, localStorage)
D=GdD = \mathcal{G} \cdot dBrowser Key public point
σd\sigma_dBRK signature: Signd(S,τ)\textsf{Sign}_d(S, \tau) (MATH); BRK.sign(appReq) (LLD)
σa\sigma_aDevice signature: Signa(S,τ)\textsf{Sign}_a(S, \tau)
knownGBRK[]App's list of recognized BRK public keys
NetworkSessionKey / ssEphemeral ORK communication key
S=GsS = \mathcal{G} \cdot sNetworkSessionKey public point (= gSessKeyPub)
VendorSessionKeyEphemeral key for BRK proof signing and App cross-verification
sessKeyProofVendorSessionKey.sign(BRK.pub)\textsf{VendorSessionKey.sign}(\text{BRK.pub})
AppAuthi\text{AppAuth}_iSHA256(mSecORKiA)\textsf{SHA256}(\text{mSecORK}_i \cdot A) - per-ORK device verification
prkECDHi\text{prkECDH}_iDH(S,mSecORKi)\textsf{DH}(S, \text{mSecORK}_i) - transit ECDH key
userPRISMi\text{userPRISM}_iYtagCMKi\text{Ytag} \cdot \text{CMK}_i - partial PRISM contribution
SiS_i / SSPartial / final unblinded authentication signature
gCMKAuthgCMKCMKmul\text{gCMK} \cdot \text{CMKmul} - user's authentication verifier
VUIDSHA512(gUserCMK).last32bytes\textsf{SHA512}(\text{gUserCMK}).\text{last32bytes}
SWEEncryptedDataSession artifacts encrypted under gSessKeyPub\text{gSessKeyPub}
VendorEncryptedDataAuth artifacts encrypted under gVRK\text{gVRK}

Actors

ActorDescriptionTrust Assumption
UserInitiates login via browser, confirms via mobile biometrics.Physically possesses registered device and passes biometric.
Secure Web Enclave (SWE)Browser JS module. Generates session keys + BRK, opens relay channel, renders QR, receives blind signature.Operates as untrusted dealer. App cross-verifies via BRK signatures and TLD.
Authenticator AppMobile application. Holds DVK, maintains knownGBRK (encrypted at rest with DVK), enforces biometric gating, executes threshold auth.Trusted with biometrics (device OS security). DVK protected by secure element.
Home ORKRelay node facilitating the QR-mediated channel.Untrusted relay. Forwards encrypted messages; cannot decrypt (lacks session keys).
CMK ORKs20 nodes holding CMK shards. Validate device identity, produce partial blind signatures.Standard threshold trust (13\leq 13 may collude). Each validates independently.
TideCloakIssues vouchers; receives VendorEncryptedData after completion.Trustless agent. Cannot observe credentials or blind signature in cleartext.

Layer Traversal

LayerHow the 2FA Protocol Engages It
LegitimacyBRK cross-verification establishes browser identity. Biometric gating establishes user presence. VVK-signed settings verification establishes vendor authenticity.
AuthorityCMK ORKs hold user key shards. DVK-derived AppAuthKey enables per-ORK device verification without exposing the private key.
AgencyPrimary layer. The App executes threshold authentication (partial blind signatures from CMK ORKs). Forseti governs ORK participation via voucher validation.
SettlementVoucher acquisition from TideCloak. Each ORK validates voucher with "signin" action before participating. See Article 8: The Settlement Layer.

Security Properties

PropertyMechanismAssumption
Credential-free browserPassword/biometric never enters the browser. SWE receives only the blind signature.-
Device key bindingDVK protected by secure element + biometrics. Per-ORK AppAuthKey verification (SHA256(mSecORKiA)\textsf{SHA256}(\text{mSecORK}_i \cdot A)) confirms device without exposing aa.Mobile OS secure element integrity
BRK cross-verificationUnfamiliar BRKs trigger user warning. Known BRKs provide device memory (decentralized device registry).-
Anti-phishingTLD extraction + BRK recognition. Phishing pages generate new BRKs (cannot extract from legitimate origin's localStorage) and expose fraudulent TLDs.Browser same-origin policy
Onion encryption (3 layers)Outer: AppAuth (device binding). Middle: prkECDH (transit). Inner: mAesORK (self-verification). Home ORK relay and SWE cannot read internal state.ECDH and AES security
Transient channelHome ORK channel is session-scoped. No persistent state after use.-
Threshold resilience14 of 20 CMK ORKs must participate. Standard threshold assumptions.13\leq 13 compromised nodes
Two-phase signingPreSign → Authenticate with nonce commitment (Committed=TRUE). Mitigates Wagner birthday attacks. Cache destroyed on use (replay prevention).DLP hardness
Biometric gatingDVK access requires biometric confirmation. Two factors: device possession + biometric.Device biometric sensor integrity
Cross-verification (mutual)App verifies SWE (BRK chain, VVK settings, TLD). SWE verifies App (blind signature against gCMKAuth). ORKs verify both (AppAuthKey, Forseti).-

Call Summary

CallDirectionPurpose
Initiate channelSWE → Home ORKEstablish transient relay tunnel
QR codeSWE → User screenEncode HomeORK URI + channel ID
getDetailsApp → Home ORK → SWERetrieve session context, BRK signatures, TLD for cross-verification
PreSign/DeviceAuthApp → all nn CMK ORKsInitiate threshold auth. ORKs validate device + return onion-encrypted state
AuthenticateApp → II CMK ORKsSubmit blinded challenge. ORKs return partial blind signatures
RelayApp → Home ORK → SWEDeliver SWEEncryptedData (blind signature + routing data)
Redirect302SWE → TideCloakForward VendorEncryptedData to complete OIDC flow

References

  • Hall, J. L., Hertzog, Y., et al. (2023). Manifesting Unobtainable Secrets: Threshold Elliptic Curve Key Generation using Nested Shamir Secret Sharing. arXiv:2309.00915. Presented at AustMS 2021.
  • Tide Developer Documentation: docs.tidecloak.com
Related Protocol Articles: