Overview
This protocol specifies how JWTs are threshold-signed by the VVK ORK swarm after a user completes BYOiD authentication. The protocol has two architecturally distinct halves: the authentication preamble (standard OIDC + BYOiD, covered in Protocol: CMK Authentication) produces the user's authenticated identity; the VVK authorization ceremony verifies claims and threshold-signs the JWT.
The core architectural property: the VVK ORKs are independent verifiers, not blind signers. Before contributing a partial signature, each VVK ORK independently executes a 12-gate verification chain. It verifies the VRK delegation (proving TideCloak is authorized to communicate), the user's CMK authentication proof (cross-key verification linking the CMK domain to the VVK domain), validates the JWT draft's claims against the VVK-signed authorization proof, and rejects the request entirely if any claim exceeds what the proof authorizes. It further validates temporal binding (5-minute recency), session binding (JWT bound to ), and identity matching (VUID consistency).
A compromised TideCloak cannot forge a JWT with unauthorized claims - it does not hold the VVK, and the VVK ORKs will reject any JWT whose claims are not a subset of the quorum-approved proof.
Loading diagram...
Preconditions
| Category | Artifact | Description |
|---|---|---|
| From BYOiD | VendorEncryptedData | Encrypted package containing blindSign, AuthToken, VUID, optionally RagnarokEncrypted data. Produced by the Secure Web Enclave (SWE) during Protocol: CMK Authentication. |
| TideCloak | VVID, gVVK | VVK identifier and public key |
VRK, gVRK | Vendor Random Key pair (delegated communication key) | |
gVRKSig | VVK-signed proof of VRK delegation | |
SignedSettings | Static vendor config (vURL, gVRK, Model, regOn, backupOn), signed | |
proof | VVK-signed authorization proof for this user-client pair. Retrieved via DBlookup(proofDetails, RealmID, userID, clientID). Created during Protocol: Authorization Proofing. | |
JWTdraft | Draft JWT containing all claims TideCloak would normally sign | |
| Each VVK ORK | VVK_i | This ORK's VVK shard |
gVVK | VVK public key | |
vSecORK_i, vgORK_i | ORK's key pair (derived from TideKey_i) | |
vAesORK_i | ORK's symmetric key (derived from TideKey_i) |
Protocol Flow
Phase 1: Authentication Preamble (Reference Only)
The standard OIDC Authorization Code Flow enhanced by BYOiD. The user authenticates via PRISM + Double-Blind TSS against their CMK ORK swarm. The SWE produces
VendorEncryptedData and redirects to TideCloak with an authorization code. At this point the user is authenticated but no JWT has been signed. See Protocol: CMK Authentication for the full specification.Phases 2-4: VendorEncryptedData Decryption through preSignJWT
Loading diagram...
Phase 2 picks up after BYOiD. TideCloak receives
VendorEncryptedData and decrypts it - the SWE encrypted the payload specifically for TideCloak's VRK during authentication. This ensures end-to-end transport confidentiality: a network adversary or malicious intermediary intercepting the browser redirect cannot extract the blindSign or session context.Phase 3 is where TideCloak transitions from authentication acknowledgment to authorization drafting. It formulates the JWT payload from its local database (mapping the user to groups, roles, and scopes) and retrieves the VVK-signed authorization proof for this user-client pair. This proof is a cryptographic attestation created during the asynchronous IGA governance workflow - it defines exactly which claims this user-client pair is entitled to. TideCloak bundles the JWT draft, proof, and authentication artifacts in a signing request for the VVK ORKs.
Phase 4 is the core of Tamper-Proof Authorization. TideCloak first resolves the VVK ORK swarm via the TWELVE-MAP key lookup (conditional - if the roster is already in memory from a recent operation, the lookup is skipped). The TWELVE-MAP response provides the swarm's public key (), the list of ORK URLs (), their identifiers (), and their public keys (). TideCloak then establishes per-ORK ECDH channels using its VRK private key against each ORK's public key, producing unique pairwise secrets. The entire verification payload (blindSign, AuthToken, VUID, gCMKAuth, JWTdraft, proof) is encrypted individually for each ORK - no ORK can read another ORK's request.
TideCloak dispatches
preSignJWT to all ORKs simultaneously. Each ORK independently executes Algorithm 1 - the 12-gate verification chain described below. Any single failed assertion causes the ORK to abort, drop the connection, and log an anomaly. Only ORKs where all 12 assertions pass generate a nonce and cache their state.The cache is strictly bounded by two constraints. A 30-second TTL ensures that if TideCloak does not follow up with the
SignJWT call within 30 seconds, the committed nonces are destroyed and the signing must restart from scratch. A maximum of 30 entries per VVID constrains the number of concurrent signing operations an attacker can attempt against a single vendor's VVK - limiting the adversary's probability space for Wagner birthday attacks. The cache stores three items per entry: the committed nonce private key (), the ECDH session key (), and the verified JWT draft (), indexed by with as a sub-index.Phases 5-7: SignJWT through JWT Delivery
Loading diagram...
Phase 5: TideCloak waits for preSignJWT responses - optimistically for 1 second (hoping all respond) or up to 5 seconds to reach at least the threshold . It maps participation into the array and records the total responding count . TideCloak decrypts the returned nonces using the ECDH session keys, then aggregates the public nonce points: . This aggregate nonce is the binding commitment that ties all ORKs to a single signing operation.
TideCloak then dispatches
SignJWT to only the participating ORKs (not all ), providing the aggregate nonce, the participation bitmap, and the crypto model specification. Each ORK retrieves and permanently destroys its cached state (the 30-second window is consumed; the cache entry cannot be replayed). The ORK loads its shard into ephemeral memory, serializes the previously verified JWTdraft according to the specified Model, and computes its partial threshold Ed25519 signature. The partialSign function takes seven parameters: the aggregate nonce (), the VVK public key (), the serialized JWT, the ORK's committed nonce (), the ORK's VVK shard (), the full ORK identity list (), and the participation bitmap (). The participation bitmap is essential - it ensures every ORK computes its Lagrange interpolation coefficient against the same participant set. See Article 6: Authority in Action for the general threshold signing mechanism.The partial signature is ECDH-encrypted for return to TideCloak. At no point does the VVK private key materialize - each ORK exercises its shard independently, and the partial signatures are designed to aggregate into a valid signature without ever combining the key shares.
Phase 6: TideCloak waits up to 5 seconds for all participating ORKs to return their partial signatures. It decrypts each using the ECDH session keys, then aggregates: . Before releasing the token, TideCloak performs a critical self-verification - it checks the assembled signature against the organization's public key: . This catches any aggregation errors, corrupted partial signatures, or Byzantine ORK behavior. If valid, the JWT is canonically encoded with the header, payload, signature, and aggregate nonce according to the specified Model.
Refresh Token Authorization
When TideCloak issues a refresh token alongside the access token, it also requests a VVK threshold signature over a refresh authorization message containing the VUID, session ID, session expiry, and session key. This signature serves as a pre-authorization for future token refreshes: when the user's access token expires and TideCloak presents the refresh token, the VVK ORKs verify the refresh authorization signature instead of requiring a fresh BYOiD blind signature. The ORKs check that the refresh authorization was VVK-signed, that its expiry has not passed (with a 2-second buffer for clock skew), and that the session identifiers match. If verification passes, the ORKs proceed with the standard 12-gate verification using the refresh authorization as the authentication gate.
This avoids forcing a full BYOiD re-authentication on every token refresh while maintaining threshold verification. The refresh authorization is scoped to the SSO session lifetime and bound to the session key, preventing cross-session replay.
Default User Context Fallback
When TideCloak looks up the authorization proof for a user-client pair, it follows a two-level resolution: first, it queries for a user-specific access proof (a VVK-signed attestation created during the IGA governance workflow for this specific user and client). If no user-specific proof exists, it falls back to the client's default user context, a VVK-signed baseline authorization that applies to all users of that client. If neither a user-specific proof nor a default context exists, TideCloak cannot construct a valid signing request and the authenticated session is removed. No JWT is issued.
This fallback ensures that newly created clients have a functional authorization baseline before administrators have assigned user-specific roles, while still requiring every authorization to be backed by a VVK-signed proof.
Phase 7: Two delivery modes based on the vendor's security posture. The standard implementation returns the JWT through TideCloak to the Vendor via the normal OIDC Access Token Response. This path relies on TLS for transit security and exposes the signed token to TideCloak on the return path. The secure (non-standard) implementation encrypts the JWT under the vendor's session key (), delivering directly from TideCloak to the Vendor. Only the Vendor holding can decrypt the token. This eliminates the TideCloak-to-Vendor leg as an attack surface - a compromised TideCloak on the delivery path cannot read, modify, or replay the token. The choice between modes is a deployment decision: the standard mode maintains full OIDC compatibility, while the secure mode trades compatibility for stronger transit guarantees.
Algorithms
Algorithm 1
Cross-key-population verification (step 4): The VVK ORKs (authorization domain) verify a signature produced by the CMK ORKs (authentication domain). This is the critical bridge between two entirely independent key populations: the user's identity is governed by CMK shards held by one set of ORKs, while the organization's authorization is governed by VVK shards held by a different set. The VVK ORKs have no access to CMK material - they verify the authentication proof using only the public verifier . A compromised TideCloak cannot simulate or bypass a user login because it cannot produce a valid without the user's CMK shares cooperating. Neither domain can be forged independently.
JWT claim validation (step 6): The ORK validates the JWT draft against the VVK-signed user context. Every claim in the draft must be a subset of what the user context authorizes. If a compromised TideCloak adds unauthorized claims to the JWT draft (elevated roles, expanded scopes, additional group memberships), the ORK detects the discrepancy and rejects the request entirely. The ORK does not modify or strip the JWT; it validates and either accepts or aborts. TideCloak constructs compliant JWT drafts by including only ACTIVE governance-approved roles and restricting audience to authorized clients. The ORK's validation is the enforcement backstop: even if TideCloak is fully compromised, unauthorized claims cannot survive the threshold verification because each ORK independently rejects non-compliant drafts.
Authorization proof (step 7): The
proof was signed by the VVK during the IGA governance workflow after multi-admin quorum approval (Protocol: Authorization Proofing). The VVK ORKs treat it as ground truth: must hold, meaning the stripped JWT's claims must match exactly what the admin quorum approved for this user-client pair. Claims not covered by the proof are rejected regardless of what TideCloak requests. This is the closed loop between the two governance pillars - the proofs produced by quorum governance become the constraints enforced during real-time authorization.Nonce commitment (step 12): The nonce is generated fresh for every signing operation and committed before the ORK sees the aggregate nonce from other ORKs. This ordering is essential: in threshold Ed25519 signing, an adversary who observes nonces before choosing the message can exploit the birthday paradox (Wagner attack) to forge signatures. By committing nonces in the
preSignJWT phase and only revealing the aggregate in the SignJWT phase, the protocol closes this attack vector.The Wagner Birthday Attack Mitigation
Threshold Schnorr-based signatures face a known theoretical vulnerability: if an adversary controls the message and can observe nonces before choosing the message content, they can exploit the birthday paradox to forge signatures. This is relevant to the bulk signing workflow, where a single policy change may require the VVK ORKs to sign hundreds of updated proofs simultaneously.
Tide mitigates this through two mechanisms:
-
Two-phase signing. All VVK threshold ceremonies use a strict commit-then-sign pattern. In the
preSignphase, ORKs validate the request, verify all proofs, and commit their ephemeral signing nonces. These nonces are locked before the signing computation begins. Only after all committed nonces are aggregated by TideCloak does theSignphase proceed, with each ORK producing its partial signature. The adversary cannot manipulate the message after observing nonces without invalidating the constraints established in the first phase. This same two-phase pattern (preSignJWT/SignJWTfor authorization,preSignProofs/SignProofsfor governance) is applied consistently across both pillars. -
The 30-signature cap. The protocol caps batch signing at 30 proofs per
preSign/Signround. If a governance change affects 3,000 user proofs, TideCloak paginates the workload into 100 isolated rounds. This constrains the mathematical probability space available for a birthday attack. Even if an adversary could control the message and observe nonces, they would have to generate a collision within a batch of 30 signatures, which is computationally infeasible with properly sized keys.
Notation Reference
| Symbol | Description |
|---|---|
| , | Vendor Verifiable Key / ORK 's shard |
| VVK public key: | |
| VVK identifier | |
| , | Vendor Random Key pair (TideCloak's delegated communication key) |
| VVK-signed proof of VRK delegation | |
| , | Vendor's session key pair |
| Vendor User ID: | |
| User's authentication verifier: | |
| Blind signature from BYOiD authentication | |
| Authentication token (contains , , ) | |
| Draft JWT before VVK signing | |
| VVK-signed authorization proof for user-client pair | |
| JWT draft validated against user context (must be a subset of proof-authorized claims) | |
| , | Per-ORK signing nonce (private / public) |
| Aggregate nonce: | |
| ORK 's partial signature | |
| Aggregate signature: | |
| , | VVK ORK 's key pair |
| Pairwise ECDH secret: | |
| X25519-based El-Gamal encryption of message with public key | |
| X25519-based El-Gamal encryption of message with private key | |
| AES256 encryption of message with key | |
| AES256 decryption of message with key | |
| Crypto model specification (signature scheme) | |
| Bitwise array of participating ORKs | |
| , , | Total ORKs (20) / threshold (14) / responding count |
Actors and Trust Assumptions
| Actor | Description | Trust Assumption |
|---|---|---|
| User | End user who completed BYOiD authentication. | Standard credentials; relies on SWE. |
| Vendor Platform | Web application requesting authorization. Holds . Initiates OIDC flow. | Standard web app trust. |
| SWE | Browser agent. Orchestrates BYOiD, produces . | Potentially adversarial. Cannot forge BYOiD artifacts. |
| Home ORK | Entry point for TWELVE-MAP key lookups. Provides VVK swarm roster. | Routing only. No elevated trust. |
| CMK ORKs | 20 nodes holding user's CMK shards. Execute BYOiD (preceding protocol). | Not directly involved in VVK signing. Their output is verified here. |
| TideCloak | The Authorization / OIDC server. Issues auth codes, manages sessions, drafts JWT. Aggregates partial signatures. | Holds VRK, NOT VVK. Cannot alter claims - VVK ORKs verify independently. Can be fully compromised without enabling token forgery. |
| VVK ORKs | 20 nodes holding VVK shards. The signing authority. Each independently verifies all 12 conditions. | Standard threshold trust (13 may collude). |
| mimDB | Mimir Database - The Fabric's synced repository. | Append-only integrity. Provides VVK swarm roster via TWELVE-MAP directory. |
| TWELVE-MAP | Tide Wide Enumerated Ledger of Verifiable Entries - Mapping Authoritative Pointers is the self-verifying directory service on mimDB mapping key identifiers to ORK swarms. | Each entry includes a ZK proof attesting to its authenticity against the master registry. |
Layer Traversal
| Layer | How VVK JWT Signing Engages It |
|---|---|
| Legitimacy | VRK delegation verification (). ECDH session establishment. Temporal binding (5-min recency, 30s cache TTL). |
| Authority | VVK shard management. ORKs load into ephemeral memory for partial signing. |
| Agency | Primary layer. Threshold signing ceremony - each ORK contributes using its VVK shard. The Agency operation is JWT signing with independent claim verification. |
| Settlement | Session binding via . Voucher validation for the signing operation. |
Security Properties
| Property | Mechanism | Assumption |
|---|---|---|
| Claim verification against proof | VVK ORKs verify and validate JWT claims are a subset of the VVK-signed user context. Non-compliant drafts are rejected entirely. Compromised TideCloak cannot inject unauthorized claims. | Hash/signature collision resistance |
| Cross-key authentication | VVK ORKs verify - a CMK-domain signature verified in the VVK domain. Forged authentication → no JWT. | DLP hardness |
| VRK delegation ≠ authority | VRK enables ECDH communication. Every ORK verifies before processing. Compromised VRK → can talk to ORKs but cannot pass the 12-gate verification. | - |
| Wagner birthday mitigation | Two-phase commit: nonces committed in preSignJWT before signing in SignJWT. 30-entry cache limit per VVID constrains adversarial permutations. | DLP hardness |
| Temporal binding | and within 5 minutes. in the future. 30s cache TTL. Prevents replay of stale artifacts. | ORK NTP accuracy |
| Session binding | , , must match and . Prevents cross-session token replay. | - |
| Independent ORK verification | Each of 20 ORKs verifies all 12 conditions independently. No ORK trusts another's result. | Node independence |
| Threshold signing | 14-of-20 must agree. Compromising ≤13 is insufficient. | Threshold assumption |
| No key reconstruction | VVK never materializes. Partial signatures aggregated; key exercised but never assembled. | - |
| Transport encryption | All ORK communication ECDH-encrypted (). Independent of TLS. | ECDH + AES security |
| Endpoint confidentiality (secure mode) | JWT encrypted under . Only the Vendor holding can read the token. | - |
Call Summary
| Call | Direction | Purpose |
|---|---|---|
DBlookup | TideCloak → Local DB | Retrieve VVK-signed authorization proof for user-client pair. |
keyLookup | TideCloak → Home ORK | Resolve VVK ORK swarm roster (, , , ). |
preSignJWT | TideCloak → all VVK ORKs | Phase 1 commitment. Delivers JWT draft, proof, and CMK auth artifacts. Each ORK executes Algorithm 1 (12-gate verification) and commits nonce. |
SignJWT | TideCloak → participating ORKs | Phase 2 execution. Delivers aggregate nonce and triggers over verified JWT. |
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.
- Komlo, C. & Goldberg, I. (2020). FROST: Flexible Round-Optimized Schnorr Threshold Signatures. SAC 2020.
- Wagner, D. (2002). A Generalized Birthday Problem. CRYPTO 2002.
- Tide Developer Documentation: docs.tidecloak.com
Related Protocol Articles:
- Protocol: CMK Authentication - The authentication preamble. Produces the
blindSignandAuthTokenverified by VVK ORKs in this protocol. - Protocol: Authorization Proofing - The IGA workflow that produces the VVK-signed
proofconsumed during JWT signing. - Article 6: Authority in Action - The general threshold signing construction (
partialSign) used in Phase 5.