33[ c2sp.org/cocktail-dkg] ( https://c2sp.org/cocktail-dkg )
44
55- ** Version** : v0.0.1
6- - ** Authors** :
6+ - ** Authors** :
77 - [ Daniel Bourdrez] ( https://github.com/bytemare )
88 - [ Soatok Dreamseeker] ( https://github.com/soatok )
99 - [ Tjaden Hess] ( https://github.com/tjade273 ) , * [ Trail of Bits] ( https://trailofbits.com ) *
@@ -41,7 +41,7 @@ COCKTAIL is an independent derivative of ChillDKG intended to be used with any F
4141
4242## Abstract
4343
44- COCKTAIL-DKG is a standalone, three-round distributed key generation protocol for threshold signature schemes like
44+ COCKTAIL-DKG is a standalone, three-round distributed key generation protocol for threshold signature schemes like
4545FROST.
4646
4747COCKTAIL-DKG allows a group of $n$ participants to securely generate a shared group public key and individual secret
@@ -90,6 +90,7 @@ throughout the COCKTAIL-DKG protocol.
9090- $x_i$: The final, long-lived secret share for participant $i$, where $x_i = \sum_ {j=1}^{n} s_ {j,i}$.
9191- $Y_i$: The public verification share for participant $i$.
9292- $Y$: The final group public key, where $Y = \sum_ {j=1}^{n} C_ {j,0}$.
93+ - $T$: The transcript of the DKG session.
9394
9495### Operations
9596
@@ -131,7 +132,7 @@ encrypted shares for all other participants.
131132 * Format: $C_ {i,0} || C_ {i,1} || \cdots || C_ {i,t-1}$
132133* $PoP_i$: The Proof of Possession, which is a signature. The size depends on the signature scheme used by the
133134 ciphersuite.
134- * $E_i$: The ephemeral public key, an elliptic curve point.
135+ * $E_i$: The ephemeral public key, an elliptic curve point.
135136 * It does not refer to isogenies. Here, E stands for "ephemeral".
136137* $c_ {i,j}$: An encrypted secret share. The size depends on the AEAD scheme used by the ciphersuite.
137138
@@ -141,7 +142,7 @@ The full message is the concatenation of these elements:
141142msg_{1|i} = C_i || PoP_i || E_i || c_{i,1} || c_{i,2} || \cdots || c_{i,n}
142143```
143144
144- ** 2. $msg2 $ (Coordinator -> All Participants, Round 2)**
145+ ** 2. $msg _ {2|i} $ (Coordinator -> All Participants, Round 2)**
145146
146147This message aggregates the public information from all participants.
147148
@@ -214,6 +215,7 @@ Each participant $i$ is assumed to have:
214215 using the secret $a_ {i,0}$ as the private key and $C_ {i,0}$ as the public key. The message to be signed is
215216 ` context || C_i || E_i ` . The specific signature algorithm is defined by the ciphersuite.
2162175 . ** Compute and Encrypt Shares:** For each participant $j$ from $1$ to $n$:
218+ <<<<<<< HEAD
217219 1. ** Compute Share:** Participant ` i ` computes the secret share $s_ {i,j} = f_i(j)$.
218220 2. ** Derive Key:** Participant ` i ` computes an ECDH shared secret with participant $j$'s static public key:
219221 $S_ {i,j} = e_i * P_j$. It then derives a symmetric key and nonce for the AEAD.
@@ -226,21 +228,27 @@ Each participant $i$ is assumed to have:
226228 * $k_ {i,j} = H("COCKTAIL-derive-key" || ikm)$
227229 * $iv_ {i,j} = H("COCKTAIL-derive-nonce" || ikm)[ 0:24] $
228230 * Here, $H(x)$ is the underlying hash function (e.g., SHA-256).
231+ =======
232+ 1. **Compute Share:** Participant $i$ computes the secret share $s_{i,j} = f_i(j)$.
233+ 2. **Derive Key:** Participant $i$ computes an ECDH shared secret with participant $j$'s static public key:
234+ $S_{i,j} = e_i * P_j$. It then derives a symmetric key and nonce for the AEAD:
235+ $(k_{i,j}, iv_{i,j}) = H6(S_{i,j}, E_i, P_j, context)$.
236+ >>>>>>> a6797b1 (More comments on the protocol)
229237 3. **Encrypt Share:** Participant $i$ encrypts the share for participant $j$:
230238 $c_{i,j} = Enc(s_{i,j}, k_{i,j}, iv_{i,j})$.
2312396 . ** Broadcast:** Participant $i$ sends their $msg_ {1|i}$ to the coordinator.
232240
233241### Round 2: Share Decryption and Verification
234242
235243The coordinator waits to receive $msg_ {1|i}$ from all $n$ participants. It then broadcasts a list of all received messages
236- to every participant. Upon receiving the list of all $msg_ {1|i}$ messages, each participant ` i ` performs the following
244+ to every participant. Upon receiving the list of all $msg_ {1|i}$ messages, each participant $i$ performs the following
237245steps:
238246
239- 1 . ** Verify All PoPs:** For each other participant $j$ from $1$ to $n$:
247+ 1 . ** Verify All PoPs:** For each participant $j \neq i $ from $1$ to $n$:
240248 - Participant $i$ verifies the proof of possession $PoP_j$. The signature is checked against the message
241249 ` context || C_j || E_j ` , using participant $j$'s public commitment $C_ {j,0}$ as the public key.
242250 - If any $PoP_j$ is invalid, participant $i$ ** MUST** abort, identifying participant $j$ as malicious.
243- 2 . ** Decrypt and Verify Shares:** For each other participant $j$ from $1$ to $n$:
251+ 2 . ** Decrypt and Verify Shares:** For each participant $j \neq i $ from $1$ to $n$:
244252 1 . ** Derive Key:** Participant $i$ computes the ECDH shared secret with participant $j$'s ephemeral public key:
245253 $S_ {j,i} = d_i * E_j$. They then derive the symmetric key and nonce:
246254 * If the hash function has an output length at least 480 bits long:
@@ -324,7 +332,7 @@ The following categories cover the most common errors:
3243323 . ** Protocol Logic Errors** :
325333 * ** Description** : These errors relate to violations of the protocol's state machine or rules, such as:
326334 * A participant sending a message at the wrong time.
327- * The coordinator broadcasting an inconsistent ` msg2 ` (e.g., omitting a participant's data).
335+ * The coordinator broadcasting an inconsistent $msg _ {2|i}$ (e.g., omitting a participant's data).
328336 * ** Action** : These errors indicate a faulty participant or coordinator. The protocol ** MUST** be aborted.
329337 If the error can be traced to a specific participant, they should be blamed.
330338
@@ -341,7 +349,7 @@ accountability in decentralized systems.
341349* ** Participant's Role and Public Proofs** : Participants ** MUST** validate all data they receive.
342350 * If participant $i$ fails to verify a share $s_ {j,i}$ from participant $j$, it ** MUST** abort. To prove that $j$
343351 is cheating, participant $i$ can broadcast a blame message containing $j$'s index and the invalid share $s_ {j,i}$.
344- Any third party can then verify this claim by checking the VSS equation
352+ Any third party can then verify this claim by checking the VSS equation
345353 ($s_ {j,i} \cdot B = \sum_ {k=0}^{t-1} i^k \cdot C_ {j,k}$)
346354 using the public commitment $C_j$. A failure of this equation is a public and undeniable proof of $j$'s misbehavior.
347355 * Similarly, if a PoP from participant $j$ is invalid, this is also a publicly verifiable proof of misbehavior,
@@ -358,7 +366,7 @@ accountability in decentralized systems.
358366 broadcasting it, the PoP will fail for all other participants, who will blame $j$. However, in Round 3,
359367 participant $j$ will construct a transcript based on their * original* , valid $msg_ {1|j}$. Their signature $sig_j$
360368 will be valid for their transcript but not for the altered transcript held by others. When this signature
361- mismatch is detected, participant $j$ can reveal their original $msg_ {1|j}$ (with its valid PoP) and their
369+ mismatch is detected, participant $j$ can reveal their original $msg_ {1|j}$ (with its valid PoP) and their
362370 transcript signature. This evidence proves their honesty and definitively identifies the coordinator as malicious.
363371
364372## Ciphersuites
@@ -370,12 +378,12 @@ Each ciphersuite defines a key derivation function $H6(x, pk1, pk2, extra)$, an
370378and a decryption method $Dec(cipher, key, iv)$. Ciphersuites ** SHOULD** use an AEAD mode for $Enc()$ and $Dec()$.
371379
372380The choice of AEAD is guided by the principle of preventing nonce reuse. For ciphersuites where the underlying hash
373- function provides a large enough output (at least 480 bits; e.g., SHA-512), we can derive both the 256-bit key and a
381+ function provides a large enough output (at least 480 bits; e.g., SHA-512), we can derive both the 256-bit key and a
37438224-byte (192-bit) nonce (which is long enough to be generated randomly with a negligible chance of collision).
375383
376384For ciphersuites based on SHA-256, where the output is smaller than 480 bits, we use $H6()$ to derive an Input Keying
377385Material (IKM), which is then used with the underlying hash function with two different prefixes. For the key, we use
378- $Sha256("COCKTAIL-derive-key" || ikm)$. For the nonce, we use the most significant 192 bits of
386+ $Sha256("COCKTAIL-derive-key" || ikm)$. For the nonce, we use the most significant 192 bits of
379387$Sha256("COCKTAIL-derive-nonce" || ikm)$. The AEAD of choice for the SHA-256 based ciphersuites we specify here is
380388[ XAES-256-GCM] ( https://github.com/C2SP/C2SP/blob/main/XAES-256-GCM.md ) .
381389
@@ -463,9 +471,9 @@ The output of $H6$ is used to derive the key and nonce for the AEAD.
463471 confidentiality against an eavesdropper on the communication channel and authenticity to prevent a man-in-the-middle
464472 from tampering with the shares. The key is derived using an ECDH key exchange, ensuring that only the intended
465473 recipient can decrypt their share.
466- - ** Cofactor Security** : As noted in the [ Ciphersuite-Specific Considerations] ( #ciphersuite-specific-considerations )
474+ - ** Cofactor Security** : As noted in the [ Ciphersuite-Specific Considerations] ( #ciphersuite-specific-considerations )
467475 section, curves like Ed25519 and Ed448 have small cofactors. It is critical that implementations use prime-order group
468- abstractions like Ristretto255 and Decaf448 to prevent small subgroup attacks, where an attacker could submit a
476+ abstractions like Ristretto255 and Decaf448 to prevent small subgroup attacks, where an attacker could submit a
469477 low-order point to leak information.
470478- ** Participant Authentication** : Throughout the protocol, participants are authenticated to each other via their
471479 long-term static key pairs. The pairwise ECDH key agreement used to encrypt shares in Round 1 provides deniable
@@ -509,7 +517,7 @@ will be too.
509517 participants, which can be complex to set up. COCKTAIL-DKG removes this requirement by building in its own encryption
510518 layer (EncPedPop), making it usable over insecure, unauthenticated channels.
511519
512- # Appendix A: Pseudocode
520+ # Appendix A: Pseudocode
513521
514522This appendix provides a series of algorithms that describe the COCKTAIL-DKG protocol in a high-level,
515523implementation-agnostic manner. The notation is meant to be illustrative rather than strictly formal.
@@ -657,7 +665,7 @@ function VerifyShare(s_ji, i, C_j, G, t):
657665 - ikm = H6(ecdh_secret, E_i, P_j, context)
658666 - key = H(" COCKTAIL-derive-key" || ikm)
659667 - nonce = H(" COCKTAIL-derive-nonce" || ikm)[0 :24 ]
660- - If the hash function used has an output size greater than equal to 480 bits, just split them:
668+ - If the hash function used has an output size greater than equal to 480 bits, just split them:
661669 - tmp = H6(ecdh_secret, E_i, P_j, context)
662670 - key = tmp[0 :32 ] (32 bytes )
663671 - nonce = tmp[32 :46 ] (24 bytes )
0 commit comments