Governance/PROTOCOL

Quorum-Enforced Governance: Authorization Proofing

How changes to authorization rules (roles, permissions, scopes, groups) are governed by multi-admin quorum approval and sealed by VVK threshold signatures.

30 min read

Overview

This protocol specifies how changes to authorization rules - roles, permissions, scopes, groups, attributes, and client configurations - are governed by multi-admin quorum approval and sealed by VVK threshold signatures. The protocol has three phases: Change Request Creation (admin proposes, TideCloak drafts instead of committing), Co-Signing (additional admins independently review and cryptographically approve), and Commit (VVK ORKs verify the entire governance lifecycle and threshold-sign the resulting authorization proofs).
The output of this protocol - VVK-signed authorization proofs - is the input to the sibling protocol Protocol: VVK JWT Signing. During real-time token issuance, VVK ORKs call gVVK.verifySig(proof,bareJWT)gVVK.\textsf{verifySig}(proof, bareJWT) to verify JWT claims against the proofs produced here. This creates the cryptographic link between asynchronous governance (this protocol, operating on the timescale of administrative decisions) and synchronous authorization (JWT signing, operating on the timescale of user logins).
The core architectural property: no single administrator, no compromised TideCloak server, and no colluding minority of VVK ORKs (\leq13 of 20) can create, modify, or forge an authorization proof. Every proof requires multi-admin quorum approval verified independently by each VVK ORK. The governance configuration itself (the signedAdminssignedAdmins group defining who can approve changes) is VVK-certified - modifying the admin roster requires the same quorum process, creating a closed loop with no external entry point.
Loading diagram...

Preconditions

The primary prerequisite is the existence of the signedAdminssignedAdmins governance configuration, which must be established and VVK-certified before any authorization changes can proceed through this protocol. The threshold is typically set to approximately 70% of the admin group (e.g., 2-of-3, 3-of-5) to balance security against operational availability.
CategoryArtifactDescription
Governance ConfigsignedAdminssignedAdminsVVK-certified admin group: list of authorized admin public keys (gCMKAuthgCMKAuth values) + quorum threshold + VVK signature. Modifying this group requires quorum approval - the closed governance loop.
signedAdmins.thresholdsignedAdmins.thresholdQuorum threshold (e.g., 2-of-3, 3-of-5, ~70%)
signedAdmins.signaturesignedAdmins.signatureVVK signature over the admin group definition
TideCloakVVIDVVID, gVVKgVVKVVK identifier and public key
VRKVRK, gVRKgVRKVendor Random Key pair (delegated communication key)
gVRKSiggVRKSigVVK-signed proof of VRK delegation
Each AdminSessKeySessKey, gSessKeyPubgSessKeyPubEphemeral session key pair from BYOiD authentication (stored in Tide Cookie)
(after BYOiD)blindSigblindSigBlind signature from BYOiD (proves identity)
gCMKAuthgCMKAuthAdmin's permanent authentication verifier (derived from CMK)

Protocol Flow

Phases 1-2: Change Request Creation and Co-Signing

Loading diagram...
Phase 1 replaces Keycloak's immediate-commit model with an asynchronous drafting pipeline. When an admin modifies any authorization-relevant record (roles, compound roles, groups, attributes, scopes, or client configurations), TideCloak intercepts the change and creates a draft record instead of committing it directly. The draft includes a precise timestamp (epochTimeUTC()epochTimeUTC()) used later for replay protection - VVK ORKs reject any change-set older than 30 days.
The affected-assignment tracing (traceAffectedAssignments(changeReq)traceAffectedAssignments(changeReq)) maps the full graph of identity relationships to identify every user-per-client pair whose JWT claims would change. A single role modification can cascade across hundreds of users and multiple clients. For each affected pair, TideCloak generates a draft authorization proof (proofDetail[i].draftproofDetail[i].draft) specifying the new entitlements. The cryptographic checksum H(proofDetail[1..z],draftRecord)H(proofDetail[1..z], draftRecord) binds the entire change-set - every affected proof plus the draft record with its timestamp - into a single immutable unit. Any modification to any proof, any addition or removal of affected pairs, or any alteration of the timestamp changes the checksum.
The admin reviews the formatted change-set in their Secure Web Enclave (SWE) and signs with their ephemeral session key, not their permanent CMK. This is a deliberate design choice documented in Algorithm 2 - session-key signing provides temporal scoping and prevents replay of permanent-key signatures against future change-sets. TideCloak verifies the signature chain (blindSig.gSessKeyPub.verifySign(proof,changeChecksum)blindSig.gSessKeyPub.\textsf{verifySign}(proof, changeChecksum)) and stores the approval.
Phase 2 repeats the review-and-sign cycle for each additional co-signer. Each admin authenticates independently via BYOiD (obtaining their own Tide Cookie with their own session key), reviews the identical change-set in their own SWE, independently re-computes the checksum, and signs it with their own session key. TideCloak accumulates signatures until the quorum threshold is met. The identical checksum computation by each SWE provides independent integrity verification - if TideCloak tampered with the change-set between signers, the checksums would diverge and subsequent verification would fail.

Phase 3: Commit - VVK ORK Verification and Proof Signing

Loading diagram...
Phase 3 is the core cryptographic ceremony. Any admin can trigger the commit once they observe sufficient approvals. TideCloak sends the complete package - draft record, proof details, and all admin signatures - to the VVK ORK swarm via preSignProofs.
Each VVK ORK independently executes Algorithm 1 (the Governance Gate). The ORK does not trust TideCloaks's assertion that the quorum was met - it mathematically re-verifies the entire governance lifecycle. First, VRK delegation and ECDH decryption (proving TideCloak is authorized). Then replay protection - the draft timestamp must fall within the last 30 days (draftRecord.timestamp>now()2628000draftRecord.timestamp > now() - 2628000), preventing resurrection of old, legitimately approved but subsequently reversed change-sets. Then, for each co-signing admin, the full 4-link signature chain (Algorithm 2): identity verification (gCMKAuthgCMKAuth matches blindSigblindSig), group validation (signedAdminssignedAdmins is VVK-certified), membership check (admin is in the VVK-certified group), and co-signature verification (session key signed this specific checksum). Only verified admins increment the approversapprovers count. Finally, the quorum threshold check: approverssignedAdmins.thresholdapprovers \geq signedAdmins.threshold.
A critical detail in the preSignProofs payload: the ORK receives the draftRecorddraftRecord (which contains the changeChecksumchangeChecksum), the admin signatures, and the signedAdminssignedAdmins group definition - but NOT the individual proof details. The proof content is only sent in the subsequent SignProofs call. This is the two-phase split: preSignProofs verifies governance legitimacy and commits nonces; SignProofs delivers the actual content to be signed.
During SignProofs, each ORK performs a critical integrity check: it re-computes H(proofDetail[1..numOfProofs])H(proofDetail[1..numOfProofs]) from the proof details received in this phase and verifies the result matches the changeChecksumchangeChecksum from its preSignProofs cache. This ensures TideCloak did not swap or alter the proof details between the two phases. The ORK then iterates over each proof, computing a partialSign using its VVK shard, the committed nonce, the aggregate nonce, and the proof draft content. See Article 6: Authority in Action for the general threshold signing construction.
TideCloak aggregates the partial signatures per proof (approved[j]=approvedi[j][1..I]approved[j] = \sum approved_i[j][1..I]), verifies each assembled signature against gVVKgVVK, and attaches the VVK signatures ({approved[i],gVVKR[i]}\{approved[i], gVVKR[i]\}) to the proof details, commits them to the database, and archives the draft records and admin signatures for audit. The proofs are now available for retrieval during JWT signing: DBlookup(proofDetails,RealmID,userID,clientID)DBlookup(proofDetails, RealmID, userID, clientID).
Batching: If the change affects more than 30 user-client pairs, TideCloak breaks the workload into sequential rounds of at most 30 proofs each. The 30-proof cap mitigates Wagner birthday attacks on the threshold signing scheme - with more concurrent nonces per round, an adversary gains computational advantage in finding forgeries. Each round follows the complete preSignProofs → SignProofs cycle independently, with fresh nonces committed and destroyed per round. For a role change affecting 500 users across 3 clients, this produces 1,500 proofs requiring 50 sequential rounds - every affected authorization relationship is individually sealed by the VVK.

Algorithms

Algorithm 1

Algorithm 2

The admin signature chain (Algorithm 2) deserves explanation. Each admin signs with their ephemeral session key (SessKeySessKey), not their permanent CMK directly. The chain links four artifacts:
gCMKAuthblindSiggSessKeyPubproofgCMKAuth \rightarrow blindSig \rightarrow gSessKeyPub \rightarrow proof
The admin's permanent identity (gCMKAuthgCMKAuth, derived from their CMK) is verified via the BYOiD blind signature (blindSigblindSig). The session key (gSessKeyPubgSessKeyPub) is embedded in that blind signature, binding it to a specific authenticated session. The proofproof is the session key's signature over the changeChecksumchangeChecksum, binding this admin's approval to this specific change-set. The VVK ORKs verify each link independently - no link can be forged without the preceding link's private material.
This provides temporal scoping: the signature is valid only within the authenticated session. An attacker cannot harvest a permanent CMK signature and reuse it against future change-sets, because the admin never signs the changeset with their CMK - only with the ephemeral session key. The session key also provides separation of concerns: the admin's permanent identity root is never directly exposed to TideCloak during the signing operation.
The closed governance loop is enforced through signedAdminssignedAdmins. The VVK ORKs verify both that the admin group definition is VVK-certified (gVVK.verifySig(signedAdmins.signature)gVVK.\textsf{verifySig}(signedAdmins.signature)) and that each co-signer is a member. Because modifying the signedAdminssignedAdmins group is itself an authorization change requiring the same quorum process, there is no way to inject an unauthorized admin into the governance group without existing admin consensus. The VVK certifies the admins; the admins approve changes; the VVK signs the proofs; the proofs constrain authorization. Every link in this chain is cryptographically sealed.

Notation Reference

SymbolDescription
changeReqchangeReqTriggering change (role/group/scope/attribute/client modification)
draftRecorddraftRecordProposed change record: {ID,req,timestamp,checksum}\{ID, req, timestamp, checksum\}
Assignment[1..z]Assignment[1..z]Affected user-client pairs: {kcUserID,kcClientID}\{kcUserID, kcClientID\}
proofDetail[i]proofDetail[i]Draft authorization proof for pair ii: {recordID,draft}\{recordID, draft\}
proofDetail[i].sigproofDetail[i].sigVVK signature over proof: {approved,gVVKR}\{approved, gVVKR\} (output of this protocol)
changeChecksumchangeChecksumH(proofDetail[1..z],draftRecord)H(proofDetail[1..z], draftRecord)
draftAdmin[j]draftAdmin[j]Co-signing admin jj: {recordID,adminID,publicKey,sig,proof}\{recordID, adminID, publicKey, sig, proof\}
signedAdminssignedAdminsVVK-certified admin group (member keys + threshold + VVK signature)
SessKeySessKey, gSessKeyPubgSessKeyPubAdmin's ephemeral session key pair (from BYOiD, in Tide Cookie)
blindSigblindSigAdmin's BYOiD blind signature
gCMKAuthgCMKAuthAdmin's permanent authentication verifier (derived from CMK)
VVKVVK, gVVKgVVK, VVKiVVK_iVendor Verifiable Key (aggregate / public / shard)
VVIDVVIDVVK identifier
VRKVRK, gVRKgVRK, gVRKSiggVRKSigVendor Random Key (delegate, VVK-certified)
VVKRi[j]VVKR_i[j], gVVKRi[j]gVVKR_i[j]ORK ii's nonce for proof jj (private / public)
gVVKR[j]gVVKR[j]Aggregate nonce for proof jj
approvedi[j]approved_i[j]ORK ii's partial signature for proof jj
approved[j]approved[j]Aggregate signature for proof jj
ECDHiECDH_iPairwise ECDH secret: vgORKi.DH(VRK)vgORK_i.\textsf{DH}(VRK)
AES_ENCa(B)\textsf{AES\_ENC}_{a}(B)AES256 encryption of message BB with key aa
AES_DECa(B)\textsf{AES\_DEC}_{a}(B)AES256 decryption of message BB with key aa
ORKsBitwiseORKsBitwiseBitwise array of participating ORKs
numOfProofsnumOfProofsProofs in this batch (max 30)
nn, tt, IITotal ORKs (20) / threshold (14) / responding count

Actors and Trust Assumptions

ActorDescriptionTrust Assumption
Admin (Proposer)Initiates the change. Authenticates via BYOiD. Signs with session key.Cannot unilaterally commit - requires quorum.
Admin (Co-signers)Review and co-sign. Each authenticates independently via BYOiD.Each admin's identity is Tide-protected. No impersonation possible.
Admin SWEBrowser agent. Formats change-set for review. Signs changeChecksumchangeChecksum with session key.Cannot forge signatures without session key from authenticated BYOiD session.
TideCloakDetects changes, creates drafts, manages approval queue, stores signatures, Holds VRK, Encrypts requests. Aggregates partial signatures.Can be compromised - but cannot forge admin signatures or bypass VVK ORK verification. Holds VRK, not VVK. Cannot forge VVK signatures or bypass quorum.
VVK ORKs20 nodes holding VVK shards. Final authority. Independently verify VRK delegation, replay, admin chain, group membership, quorum threshold.Standard threshold trust (\leq13 may collude).

Layer Traversal

LayerHow Authorization Proofing Engages It
LegitimacyAdmin authentication via BYOiD (Tide Cookie / session key). ECDH channels (VRKORKVRK \leftrightarrow ORK). Replay protection (30-day timestamp). VRK delegation verification.
AuthorityVVK shard management. ORKs load VVKiVVK_i for partial signing. The signedAdminssignedAdmins group is VVK-certified - Authority Layer maintains governance configuration.
AgencyPrimary layer. Two Agency operations: (1) admin co-signing via session-key signatures, (2) VVK threshold signing of authorization proofs (partialSign\textsf{partialSign} per proof).
SettlementVoucher validation for signing operations. Archive of draftRecorddraftRecord and draftAdmindraftAdmin signatures provides audit trail.

Security Properties

PropertyMechanismAssumption
Quorum enforcementVVK ORKs independently count valid approvers against signedAdmins.thresholdsignedAdmins.threshold. Below-threshold commits rejected.DLP hardness
Admin identity verificationEach admin's gCMKAuthgCMKAuth verified against their blindSigblindSig. Forged identities fail.DLP hardness
Admin group membershipVVK ORKs verify signedAdminssignedAdmins is VVK-signed and each admin is a member. Non-members rejected.-
Session-bound signaturesAdmin signs with ephemeral session key, not permanent CMK. Temporal scoping prevents replay.Session key randomness
Closed governance loopAdmin group is VVK-certified. Adding/removing admins requires quorum → no external entry.-
Replay protection30-day timestamp window (draftRecord.timestamp>now()2628000draftRecord.timestamp > now() - 2628000). Stale change-sets rejected.ORK NTP accuracy
Checksum integritychangeChecksumchangeChecksum computed independently by SWE, TideCloak, and VVK ORKs. During SignProofs, ORKs re-compute H(proofDetail[1..numOfProofs])H(proofDetail[1..numOfProofs]) and verify against the cached checksum from preSignProofs - detecting any payload swaps between phases.SHA-256 collision resistance
Wagner birthday mitigationTwo-phase signing (preSignProofs → SignProofs). 30-proof batch cap. Nonce commitment before signing.DLP hardness
Per-proof signingEach affected user-client pair gets an individual VVK-signed proof. No mass-assignment shortcuts.-
No single-admin bypassRogue admin can draft and sign but cannot commit without quorum co-signatures.Threshold assumption
No TideCloak bypassCompromised TideCloak cannot forge admin session signatures or bypass VVK ORK verification.-
VRK delegation ≠ authorityVRK enables communication. Compromised VRK cannot bypass quorum verification on VVK ORKs.-
Audit trailDraft records and admin signatures archived after commit. Full forensic traceability.Database integrity

Call Summary

CallDirectionPurpose
traceAffectedAssignmentsTideCloak → Local DBIdentify all user-client pairs whose JWT claims are affected by the change.
SessKey.signSWE (client-side)Admin signs changeChecksumchangeChecksum with ephemeral session key.
SignChangeTideCloakSubmit complete governance package for VVK signing.
keyLookupTideCloak → Home ORKResolve VVK ORK swarm roster via the TWELVE-MAP directory (the self-verifying, Merkle-anchored mapping of key IDs to ORK sets).
preSignProofsTideCloak → all nn VVK ORKsPhase 1 commitment. Each ORK executes Algorithm 1 (Governance Gate) and commits nonces.
SignProofsTideCloak → II participating ORKsPhase 2 execution. Each ORK re-verifies checksum and computes partialSign\textsf{partialSign} per proof.
commitChangeToDatabaseTideCloak → Local DBPersist VVK-signed proofs. Archive draft records and admin signatures.

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: VVK JWT Signing - The sibling protocol that consumes the authorization proofs produced here. VVK ORKs verify JWT claims against these proofs during real-time token issuance.
  • Protocol: CMK Authentication - Admin authentication. Produces the blindSigblindSig, gSessKeyPubgSessKeyPub, and gCMKAuthgCMKAuth artifacts used in this protocol.
  • Article 10: TideCloak - How the IGA governance workflow integrates with Keycloak's admin console.