BYOiD/PROTOCOL

Double-Blind Threshold Signature Scheme

Formal specification of the novel two-sided blinding construction that produces vendor-unlinkable identity tokens via threshold signing - without any signer learning the message or verification key.

22 min read

Overview

This document specifies the Double-Blind Threshold Signature Scheme - a novel modified Schnorr blind signature adapted for threshold signing with key morphing. The construction achieves three simultaneous properties:
  1. Signer-blindness. The threshold signers (ORKs) learn neither the message mm, the verification key gCMKAuth\mathit{gCMKAuth}, nor the key morphing scalar CMKmul\mathit{CMKmul}.
  2. Verifier-blindness. The verifier (vendor) cannot link the verification key back to the user's master public key gCMK\mathit{gCMK}, or correlate identities across vendors.
  3. Key morphing. The ORKs hold shares of master key xx, but the signature verifies under a vendor-specific derived key xCMKmulx \cdot \mathit{CMKmul} - without any party reconstructing either key.
The output is a standard Schnorr signature (R,S)(R, S) that any verifier can validate against gCMKAuth\mathit{gCMKAuth}, paired with a Vendor User ID (VUID) that is mathematically unlinkable to the user's master identity or to identities at other vendors.
The scheme is pending joint publication with RMIT University. All blind-signature operations use a specialized twisted Edwards curve (BEd255475BEd255475), not Edwards25519.
Loading diagram...

The Problem

The SWE needs to obtain a Schnorr signature on token message mm, verifiable against a vendor-specific public key gCMKAuth\mathit{gCMKAuth}, using partial signatures from ORKs that hold shares xix_i of master ineffable key xx. Three constraints make this non-trivial:
  1. Key morphing. The verification key is gCMKAuth=gCMKCMKmul\mathit{gCMKAuth} = \mathit{gCMK} \cdot \mathit{CMKmul}, where CMKmul\mathit{CMKmul} is vendor-specific. The ORKs hold shares of xx, not shares of xCMKmulx \cdot \mathit{CMKmul}. The blinding must incorporate CMKmul\mathit{CMKmul} so that partial signatures over xix_i produce a valid signature under xCMKmulx \cdot \mathit{CMKmul}.
  2. Signer-blindness. The ORKs must not learn mm, gCMKAuth\mathit{gCMKAuth}, or CMKmul\mathit{CMKmul}. Any of these would leak which vendor the user is authenticating to or allow cross-session correlation.
  3. Verifier-blindness. The vendor must not link gCMKAuth\mathit{gCMKAuth} back to gCMK\mathit{gCMK}, or derive CMKmul\mathit{CMKmul} - either would enable cross-vendor correlation.

Preconditions

Identity Recovery (from PRISM sub-protocol)

Before blind signing begins, the SWE must have recovered the user's vendor-specific identity. This occurs during the Convert phase, in parallel with PRISM authentication (Protocol: PRISM).
Each ORK returns an encrypted identity share as part of its Convert response:
userPRISMi=Ytagxi\mathit{userPRISM}_i = Y_{\text{tag}} \cdot x_i
encrypted under the PRISM verifier viv_i - coupling identity recovery to successful password verification. The SWE interpolates these shares and applies voucher deobfuscation:
The result gUserCMK\mathit{gUserCMK} equals gVVKCMK\mathit{gVVK} \cdot CMK after deobfuscation - the user's CMK public key projected through this vendor's identity space. At no point is the CMKCMK private key reconstructed.

Per-ORK State

Each ORK ii holds:
  • xix_i - Shamir share of the joint CMKCMK private key.
  • gCMK=GCMK\mathit{gCMK} = G \cdot CMK - the user's master public key (public value, computed during registration).

Nonce Commitment

During the Convert phase, each ORK generates and commits a fresh nonce:
ri$r_i \overset{\$}{\gets},RiGri_\ell, \quad R_i \leftarrow G \cdot r_i
RiR_i is returned to the SWE. rir_i is cached server-side and destroyed after use.

Protocol Flow

Blind Message Preparation (SWE)

After recovering gCMKAuth\mathit{gCMKAuth}, CMKmul\mathit{CMKmul}, and VUID\mathit{VUID} (Algorithm 1), the SWE aggregates nonces and prepares the blinded signing request.
The blinded challenge blurH\mathit{blurH} absorbs three values the ORKs must not learn: the real challenge ee (encoding RR, gCMKAuth\mathit{gCMKAuth}, and mm), the key morphing scalar CMKmul\mathit{CMKmul}, and the blinding factor j4j_4. To any ORK, blurH\mathit{blurH} is indistinguishable from a random scalar.

Partial Blind Signing (per-ORK)

Loading diagram...
Each ORK computes a standard Schnorr partial signature structure - its Lagrange-weighted nonce plus its Lagrange-weighted share multiplied by the blinded challenge. The ORK sees only blurH\mathit{blurH} (opaque) and uses its own rir_i and xix_i. No inter-node communication is required.
Rogue-key resistance: The SWE sends a single blurH\mathit{blurH} to all ORKs; each computes Lagrange coefficients locally from ORKsBitwise\mathit{ORKsBitwise}, preventing a malicious dealer from injecting crafted coefficients.
What the ORK verifies before signing: PRISM authentication succeeded. The voucher is valid. It has not already signed for this session (nonce cache destroyed on use).

Signature Aggregation and Unblinding (SWE)

Algebraic correctness proof:
blindS=(ri+blurHLixi)=ri=r+blurHLixi=x\mathit{blindS} = \sum (r_i + \mathit{blurH} \cdot L_i \cdot x_i) = \underbrace{\sum r_i}_{= r} + \mathit{blurH} \cdot \underbrace{\sum L_i \cdot x_i}_{= x}
By Shamir reconstruction, ri=r\sum r_i = r (joint nonce) and Lixi=x\sum L_i \cdot x_i = x (joint CMK private key) - both reconstructed only as implicit terms within the sum, never as explicit values.
Substituting blurH=eCMKmulj4\mathit{blurH} = e \cdot \mathit{CMKmul} \cdot j_4:
blindS=r+eCMKmulj4x\mathit{blindS} = r + e \cdot \mathit{CMKmul} \cdot j_4 \cdot x
Unblinding:
S=blindSj41=rj41+eCMKmulxS = \mathit{blindS} \cdot j_4^{-1} = r \cdot j_4^{-1} + e \cdot \mathit{CMKmul} \cdot x
R=gCMKRj41=Grj41R = \mathit{gCMKR} \cdot j_4^{-1} = G \cdot r \cdot j_4^{-1}
Verification (standard Schnorr, any party holding gCMKAuth\mathit{gCMKAuth}):
GS=G(rj41+eCMKmulx)=R+egCMKAuthG \cdot S = G \cdot (r \cdot j_4^{-1} + e \cdot \mathit{CMKmul} \cdot x) = R + e \cdot \mathit{gCMKAuth} \quad \checkmark
where e=H(R,gCMKAuth,m)e = H(R, \mathit{gCMKAuth}, m). The signature is mathematically indistinguishable from one produced by a single holder of private key xCMKmulx \cdot \mathit{CMKmul}.

Curve Architecture

The protocol operates over two elliptic curves with strict separation of purpose:
CurveUsed For
Curve25519PRISM password verification, ECDH session keys, challenge encryption (Protocol: PRISM)
BEd255475All blind-signature operations: nonce generation, partial signing, aggregation, verification

Curve Parameters

The BEd255475 specialized curve operates with the following parameters:
ParameterValue
Curve formTwisted Edwards: ax2+y2=1+dx2y2ax^2 + y^2 = 1 + dx^2y^2
Field prime pp22554752^{255} - 475 = 57896044618658097711785492504343953926634992332820282019728792003956564819493
Coefficient aa1-1
Coefficient dd26879-26879
Subgroup order \ell14474011154664524427946373126085988481619609633285553862260303847718958643849
Cofactor hh44
Generator GG(x,y)=(x, y) = (52206735679238871955591785439564750012055913480585550766900356151549289562200, 6)
Generator (compressed)0600000000000000000000000000000000000000000000000000000000000000
Design notes:
The coefficient a=1a = -1 matches Edwards25519, permitting the same optimized twisted Edwards arithmetic (extended coordinates, unified addition formulas). The coefficient d=26879d = -26879 defines the curve's distinct algebraic structure - the group of points on this curve and the group of points on Edwards25519 are mathematically independent, which is the property that makes cross-domain signature transfer impossible.
The subgroup order \ell is approximately twice that of Edwards25519's subgroup order (255197.24×1075\ell_{25519} \approx 7.24 \times 10^{75}), yielding a marginally larger security margin under Pollard's rho (both curves fall within the ~128-bit security class).
The more significant practical advantage is the cofactor. At h=4h = 4 (compared to Edwards25519's h=8h = 8), the small-subgroup structure is simpler: fewer low-order points, fewer edge cases in point validation and signature verification, and a smaller cofactor clearing multiplier during verification (4GS4 \cdot G \cdot S rather than 8GS8 \cdot G \cdot S). The cofactor-8 complications that motivated the Ristretto abstraction for Edwards25519 are reduced - the curve requires standard cofactor clearing but not the additional algebraic machinery needed to safely handle an order-8 cofactor group.
Why curve-level domain separation is required:
Without it, a malicious Secure Web Enclave (SWE) could craft a blinded message that, when signed by the ORK swarm, yields a valid standard Ed25519 signature on an attacker-chosen payload - weaponizing the signing network as a general-purpose signing oracle with no verifier able to distinguish the result from a legitimate signature. Standard domain separation techniques (hash prefixing, DOM flags) operate within the same algebraic group and were found to be malleable by a malicious SWE during adversarial analysis at RMIT University. Curve-level separation places the blind-signature ceremony in a mathematically distinct algebraic structure, making cross-domain signature transfer impossible regardless of SWE behavior. The specialized curve also provides a larger number space and better performance for the blind-signature operation.

Double-Blind Analysis

Blind Toward Signers (ORKs)

The ORKs see only blurH=eCMKmulj4\mathit{blurH} = e \cdot \mathit{CMKmul} \cdot j_4. To extract any useful value, an ORK would need to separate three unknown scalars multiplied together:
  • Message mm is hidden. It is an input to e=H(R,gCMKAuth,m)e = H(R, \mathit{gCMKAuth}, m). The ORKs know gCMKR\mathit{gCMKR} but not j4j_4, so cannot compute R=gCMKRj41R = \mathit{gCMKR} \cdot j_4^{-1}. Without RR or gCMKAuth\mathit{gCMKAuth}, the hash cannot be computed.
  • Verification key gCMKAuth\mathit{gCMKAuth} is hidden. Same reasoning - it is a hash input, never transmitted to ORKs.
  • Key morphing scalar CMKmul\mathit{CMKmul} is hidden. Multiplied by random j4j_4 in blurH\mathit{blurH}. Recovering CMKmul\mathit{CMKmul} requires j4j_4, held only by the SWE.

Blind Toward Verifier (Vendor)

The vendor receives (R,S)(R, S), gCMKAuth\mathit{gCMKAuth}, and VUID\mathit{VUID}. It can verify the signature but:
  • Master key xx is hidden. Standard Schnorr DLP hardness.
  • Master public key gCMK\mathit{gCMK} is hidden. The vendor sees gCMKAuth=gCMKCMKmul\mathit{gCMKAuth} = \mathit{gCMK} \cdot \mathit{CMKmul}. Recovering gCMK\mathit{gCMK} requires CMKmul\mathit{CMKmul}, derived from gUserCMK=gVVKx\mathit{gUserCMK} = \mathit{gVVK} \cdot x. The vendor knows gVVK\mathit{gVVK} but not xx, so cannot compute gUserCMK\mathit{gUserCMK} or derive CMKmul\mathit{CMKmul}.
  • Cross-vendor correlation is impossible. Different vendors have different gVVK\mathit{gVVK} values, producing different gUserCMK\mathit{gUserCMK}, different CMKmul\mathit{CMKmul}, and different gCMKAuth\mathit{gCMKAuth} - all unlinkable under DLP hardness.

Bidirectional Identity Isolation

The derivation chain enforces strict compartmentalization:
  • CMK ORKs hold only user key shares (xix_i, sis_i). They have no data about which vendors a user is associated with - the identity shares userPRISMi\mathit{userPRISM}_i are obfuscated by voucher tags and indistinguishable from random curve points.
  • Vendors and VVK ORKs hold VUID\mathit{VUID} and gCMKAuth\mathit{gCMKAuth} for their own users. They have no knowledge of which CMK ORKs serve their users, and no vendor knows which other vendors their users are associated with.
  • Compromised password, limited reach. Even with a correct password, an attacker who compromises the PRISM product can derive gUserCMK\mathit{gUserCMK} for a specific vendor (the one whose voucher was used) - but cannot discover which other vendors the user is associated with, because that requires separate vouchers from separate vendors.

Malicious SWE Analysis

A malicious SWE controls j4j_4, CMKmul\mathit{CMKmul}, gCMKAuth\mathit{gCMKAuth}, and mm. After receiving blindS\mathit{blindS}, it can produce a valid signature on any message under any gCMKAuth\mathit{gCMKAuth} of its choosing - but only on the specialized curve.
Without curve separation: The SWE could set CMKmul=1\mathit{CMKmul} = 1 and gCMKAuth=gCMK\mathit{gCMKAuth} = \mathit{gCMK}, producing a valid Ed25519 signature by the user's master key on an attacker-chosen message. This turns the ORK swarm into a general-purpose Ed25519 signing oracle.
With curve separation BEd255475: The signature is valid only on the specialized curve. No standard Ed25519 verifier will accept it. Within the Tide system, a rogue signature for a fraudulent vendor produces an identity bound to that fraudulent vendor's gVVK\mathit{gVVK}' - it cannot impersonate an honest vendor because VUID\mathit{VUID} and gCMKAuth\mathit{gCMKAuth} are derived from the vendor's own public key via the voucher system.
Standard domain separation techniques (hash prefixing, DOM flags) were evaluated during adversarial analysis at RMIT and found insufficient - they operate within the same algebraic group, and a malicious SWE could craft inputs to bypass them. Curve separation places the ceremony in a distinct algebraic structure, making cross-domain signature transfer impossible regardless of SWE behavior.

Notation Reference

SymbolDescription
GGGenerator point on specialized twisted Edwards curve (P=2255475P = 2^{255} - 475)
AbA \cdot bScalar-point multiplication
H()H(\cdot)SHA-256 unless stated otherwise
xx, xix_iJoint CMK private key / ORK ii's Shamir share
gCMK\mathit{gCMK}User's master public key: GxG \cdot x
CMKmul\mathit{CMKmul}Vendor-specific key morphing scalar: SHA-512(gUserCMK).first256bits\textsf{SHA-512}(\mathit{gUserCMK}).\text{first256bits}
gCMKAuth\mathit{gCMKAuth}Vendor-specific authentication public key: gCMKCMKmul\mathit{gCMK} \cdot \mathit{CMKmul}
VUID\mathit{VUID}Vendor User ID: SHA-512(gUserCMK).last256bits\textsf{SHA-512}(\mathit{gUserCMK}).\text{last256bits}
gUserCMK\mathit{gUserCMK}User's CMK projected through vendor's identity space: gVVKx\mathit{gVVK} \cdot x (after deobfuscation)
gVVK\mathit{gVVK}Vendor's long-term public key
rir_i, RiR_iORK ii's nonce scalar / public point: Ri=GriR_i = G \cdot r_i
gCMKR\mathit{gCMKR}Aggregate nonce point: Ri\sum R_i
j4j_4Random blinding scalar (SWE-generated)
eeSchnorr challenge: H(R,gCMKAuth,m)H(R, \mathit{gCMKAuth}, m)
blurH\mathit{blurH}Blinded challenge: eCMKmulj4e \cdot \mathit{CMKmul} \cdot j_4
LiL_iLagrange coefficient for ORK ii
mmToken message: {VUID,“auth”,expiry,K,sessionId}\{\mathit{VUID}, \text{``auth''}, \mathit{expiry}, K, \mathit{sessionId}\}
KKVendor session public key (DPoP binding)
nn, tt, IITotal ORKs / threshold / responding ORKs

Actors & Trust Assumptions

ActorRoleTrust Assumption
Secure Web EnclaveGenerates j4j_4, prepares blurH\mathit{blurH}, aggregates and unblinds partial signatures, performs local verification.Potentially adversarial. Malicious SWE can produce blind signatures on arbitrary messages - but only on the specialized curve. Cannot weaponize ORK swarm for Ed25519 signing.
CMK ORK SwarmEach computes partial blind signature using its share xix_i and committed nonce rir_i.Up to ntn - t may be malicious. Learns nothing about mm, gCMKAuth\mathit{gCMKAuth}, or CMKmul\mathit{CMKmul}.
Vendor (Verifier)Verifies standard Schnorr signature against gCMKAuth\mathit{gCMKAuth}.Learns VUID\mathit{VUID} and gCMKAuth\mathit{gCMKAuth} for its own users only. Cannot link to master identity or other vendors.

Security Properties

PropertyMechanismAssumption
No party holds the signing keyCMK Shamir-shared; xx never reconstructed; only gCMK\mathit{gCMK} exists in the SWEThreshold assumption. DLP hardness on specialized curve
No party can forge a tokenForgery requires 14 simultaneous compromises within a single ceremony windowThreshold + DLP
Double-blind constructionblurH=eCMKmulj4\mathit{blurH} = e \cdot \mathit{CMKmul} \cdot j_4 absorbs challenge, morphing scalar, and blinding factor into a single opaque scalar. ORKs cannot decompose; vendor cannot recover gCMK\mathit{gCMK} from gCMKAuth\mathit{gCMKAuth}DLP hardness. Blinding factor randomness
Vendor-unlinkable identityVUID\mathit{VUID} and gCMKAuth\mathit{gCMKAuth} derived from gVVKCMK\mathit{gVVK} \cdot CMK; different vendors yield different, uncorrelatable identifiersDLP hardness. Voucher-enforced vendor binding
Bidirectional identity isolationCMK ORKs: no vendor metadata. Vendors: no CMK ORK metadata. Compromised password: no vendor discovery beyond the specific voucher usedStructural property
Malicious SWE containmentRogue signatures valid only on specialized curve; rogue identities bound to attacker's own gVVK\mathit{gVVK}'Curve independence (distinct algebraic groups)
Signature domain separationAll blind-signature operations on BEd255475BEd255475; cannot be repurposed as valid Ed25519Ed25519Curve independence
Rogue-key resistanceEach ORK computes Lagrange coefficients locally from declared participation set-
Nonce securityPer-ceremony fresh rir_i; cached and destroyed after single use; j4j_4 blinding prevents ORKs from predicting aggregate RRNonce randomness. Cache destruction

Call Summary

CallDirectionPayload (Blind-Signature component)State Change
ConvertSWE → all nn ORKsReceive: RiR_i, encrypted userPRISMi\mathit{userPRISM}_iORK caches rir_i
AuthenticateSWE → II participating ORKsSend: blurH\mathit{blurH}, ORKsBitwise\mathit{ORKsBitwise}. Receive: encSigi\mathit{encSig}_iORK destroys rir_i cache
Between calls, the SWE recovers identity (Algorithm 1), derives credentials, and prepares the blind message (Algorithm 2).

References

  • Komlo, C. & Goldberg, I. (2020). FROST: Flexible Round-Optimized Schnorr Threshold Signatures. SAC 2020.
  • 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.
  • RMIT University - Double-Blind Threshold Signature Scheme. (Paper pending publication.)
  • Tide Developer Documentation: docs.tidecloak.com
Related Protocol Articles: