title | subtitle | author | date | sidebar_label | sidebar_position | paper | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Wamu: A Protocol for Computation of Threshold Signatures by Multiple Decentralized Identities |
Technical Specification |
David Semakula \
[email protected] \
https://davidsemakula.com
|
Published: 15th May, 2023 \
Last Updated: 13th November, 2023 \
Version: 1.6
|
Technical Specification |
2 |
|
This document describes the Wamu protocol which augments a state-of-the-art non-interactive threshold signature scheme (e.g. CGGMP20 [@cggmp20]) by cryptographically associating each signing party with a decentralized identity. This is achieved by:
- Splitting the secret share for each party between the party and the output of a signing operation by its associated decentralized identity, thus making the signing operation a requirement for reconstructing the party's secret share.
- Adding peer-to-peer decentralized identity authentication to the key generation and signing protocols (and optionally to the key refresh protocol) of the threshold signature scheme.
- Defining protocols for identity rotation, access structure modification (i.e. share addition and removal and threshold modification) and share recovery that build on top of the above 2 augmentations.
Wamu is designed to operate in a decentralized, trust-minimized and asynchronous setting with:
- no centralized or trust-based identity infrastructure.
- signing parties being mainstream consumer devices communicating asynchronously.
NOTE: For interoperability with existing wallet solutions, the only requirement for decentralized identity providers is the ability to compute cryptographic signatures for any arbitrary message in such a way that the output signature is 1) deterministic and 2) can be verified in a non-interactive manner.
The rest of this document describes the Wamu protocol in technical detail. For these descriptions, we'll use the following notation:
-
$P$ denotes a party. -
$I$ denotes a decentralized identity. -
$vk$ denotes the verifying key (or address) of a decentralized identity. -
$sk$ denotes the secret key of a decentralized identity. -
$\mathtt{Sig}$ denotes a signing algorithm. -
$\mathtt{Ver}$ denotes a signature verification algorithm. -
$q$ denotes the prime order of the cyclic group of the elliptic curve. -
$\mathcal{S}$ denotes the set of verified decentralized identities for all parties. -
$t$ denotes the threshold (i.e. the minimum number of signatories required to jointly compute a valid signature using the threshold signature scheme). -
$A$ denotes a predefined prefix chosen to ensure that signatures computed for identity authentication cannot be valid transaction signatures. -
$\Vert$ denotes concatenation using an unambiguous encoding scheme.
NOTE: While the augmenting protocols in this document are described in relation to the current (circa. 2023) state-of-the-art CGGMP20 [@cggmp20] non-interactive threshold signature scheme for ECDSA signatures, Wamu is a generic protocol that can be adapted to any non-interactive threshold signature scheme (e.g. GG20 [@gg20], CMP20 [@cmp20] and FROST20 [@frost20]) that allows for asynchronous communication between signing parties.
Given a secret share
This is achieved by generating a message
NOTE: Share splitting and reconstruction is a single-party localized concern that happens after (and is not related to) the distributed key generation (DKG) protocol of the threshold signature scheme.
Given a secret share
- Sample a random message
$k$ (i.e. the signing share). - Compute a signature
$(r, s) \leftarrow \mathtt{Sig}(sk, k)$ . - Compute the first sub-share of
$x$ as the point$\alpha = (r, s) \pmod q$ . - Generate a line
$L$ (i.e a polynomial of degree 1) such that$\alpha$ is a point on the line and$x$ is the constant term (i.e. Polynomial Interpolation [@wiki:interpolation]) - Compute another point
$\beta$ from$L$ such that$\beta \neq \alpha$ ,$\beta$ becomes the second sub-share of$x$ . - Erase both
$\alpha$ and$L$ from memory. - Return the signing share
$k$ and the sub-share$\beta$ .
Given a signing share
- Compute a signature
$(r, s) \leftarrow \mathtt{Sig}(sk, k)$ . - Compute a sub-share
$\alpha$ as the point$\alpha = (r, s) \pmod q$ . - Generate the line
$L$ by performing Polynomial Interpolation [@wiki:interpolation] using$\alpha$ and$\beta$ as inputs. - Compute
$x$ as the constant term of$L$ . - Erase both
$\alpha$ and$L$ from memory. - Return
$x$ as the secret share.
NOTE: The signature parameters
The general approach for augmenting threshold signature protocols (i.e. key generation and signing - and optionally key refresh) is for each party to sign a non-interactive replay resistant challenge during the first round of communication to prove that it currently controls the associated decentralized identity. The other parties then verify the challenge signature at the beginning of the next round or identify the culprit and halt.
Key generation and key refresh protocols typically include a commitment to secret and random values in their first round while signing includes an arbitrary message, so either a commitment (e.g. for key generation and key refresh) or the message (e.g. for signing) is unambiguously concatenated with a protocol specific prefix and the current timestamp to generate a non-interactive replay resistant challenge.
NOTE: While most threshold signature schemes don't define a key refresh protocol (e.g. GG20 [@gg20] and FROST20 [@frost20]), it is relatively straightforward to derive such a protocol from a standard proactive secret sharing scheme like HJKY95 [@hjky95]. However, for applications that require support for access structure modification, it is preferable to derive a key refresh protocol from a share redistribution scheme like DJ97 [@dj97] or WW01 [@ww01], as the latter are more flexible and allow for both proactive security and access structure changes (see section 6 for details and additional considerations).
NOTE: While general
Follow the key generation protocol described in section 3.1 and figure 5 of CGGMP20 [@cggmp20] to generate ECDSA secret shares with the following modifications:
- At the end of Round 1, broadcast 2 additional parameters for each
$P_i$ associated with the decentralized identity$I_i$ with verifying key$vk_i$ and secret key$sk_i$ as follows:- The decentralized identity verifying key
$vk_i$ . - The current UTC timestamp
$\Delta$ . - The signature
$\sigma _i \leftarrow \mathtt{Sig}(sk_i, A \Vert \Delta \Vert V_i)$ .
- The decentralized identity verifying key
- At the beginning of Round 2, for each
$P_i$ , verify$\sigma _j$ from all$P_j$ where$j \neq i$ :- Verify that
$vk_i \in \mathcal{S}$ or report the culprit and halt. - Verify
$\sigma _j$ by checking that the output of$\mathtt{Ver}(vk_j, A \Vert \Delta \Vert V_j, \sigma _j)$ is valid or report the culprit and halt.
- Verify that
- After the Output phase, follow the share splitting protocol in section 3.1 to split secret share
$x_i$ into a signing share$k_i$ and a sub-share$\beta _i$ for each party$P_i$ . - Modify Stored State for each
$P_i$ as follows:- Don't store
$x_i$ . - Add
$vk_i$ ,$k_i$ and$\beta _i$ .
- Don't store
Follow the signing protocol described in sections 4.2 and 4.3 and figure 8 of CGGMP20 [@cggmp20] to generate an ECDSA signature with the following modifications:
- Before Round 1, for each party
$P_i$ , follow the share reconstruction protocol in section 3.2 to reconstruct secret share$x_i$ . - At the end of Round 1, for each
$P_i$ associated with the decentralized identity$I_i$ with verifying key$vk_i$ and secret key$sk_i$ , send 2 additional parameters to all$P_j$ where$j \neq i$ as follows:- The decentralized identity verifying key
$vk_i$ . - The current UTC timestamp
$\Delta$ . - The signature
$\sigma _i \leftarrow \mathtt{Sig}(sk_i, A \Vert \Delta \Vert m)$ .
- The decentralized identity verifying key
- At the beginning of the Output phase, verify
$\sigma _j$ from all$P_j$ where$j \neq i$ as follows:- Verify that
$vk_i \in \mathcal{S}$ or report the culprit and halt. - Verify that
$t$ is within the current epoch for identity authenticated requests or report the culprit and halt. - Verify
$\sigma _i$ by checking that the output of$\mathtt{Ver}(vk_i, A \Vert \Delta \Vert m, \sigma _i)$ is valid or report the culprit and halt.
- Verify that
Follow the key refresh protocol described in section 3.2 and figure 6 of CGGMP20 [@cggmp20] to generate new ECDSA secret shares with the following modifications:
- At the end of Round 1, broadcast 2 additional parameters for each
$P_i$ associated with the decentralized identity$I_i$ with verifying key$vk_i$ and secret key$sk_i$ as follows:- The decentralized identity verifying key
$vk_i$ . - The current UTC timestamp
$\Delta$ . - The signature
$\sigma _i \leftarrow \mathtt{Sig}(sk_i, A \Vert \Delta \Vert V_i)$ .
- The decentralized identity verifying key
- At the beginning of Round 2, for each
$P_i$ , verify$\sigma _j$ from all$P_j$ where$j \neq i$ as follows:- Verify that
$vk_i \in \mathcal{S}$ or report the culprit and halt. - Verify
$\sigma _i$ by checking that the output of$\mathtt{Ver}(vk_j, A \Vert \Delta \Vert V_j, \sigma _j)$ is valid or report the culprit and halt.
- Verify that
- After the Output phase, follow the share splitting protocol in section 3.1 to split the new secret share
$x_i^\ast$ into a new signing share$k_i^\ast$ and a new sub-share$\beta _i^\ast$ for each party$P_i$ . - Modify Stored State for each
$P_i$ as follows:- Don't store
$x_i^\ast$ . - Replace
$k_i$ with$k_i^\ast$ and$\beta _i$ with$\beta _i^\ast$ .
- Don't store
Decentralized identity authenticated requests allow parties to perform or request actions based on their associated decentralized identity.
To initiate an identity authenticated request with a command
- Read the current UTC timestamp
$\Delta$ . - Compute the signature
$\sigma \leftarrow \mathtt{Sig}(sk_i, A \Vert \Delta \Vert C)$ . - Broadcast
$C$ ,$vk_i$ ,$\Delta$ and$\sigma$ .
To verify an identity authenticated request with a command
- Verify that
$vk_i \in \mathcal{S}$ or report the culprit and halt. - Verify that
$t$ is within the current epoch for identity authenticated requests or report the culprit and halt. - Verify
$\sigma$ by checking that the output of$\mathtt{Ver}(vk_i, A \Vert \Delta \Vert C, \sigma)$ is valid or report the culprit and halt.
Identity challenges are used to verify that a party controls a decentralized identity.
To issue an identity challenge to a party
- Sample a random
$v_j$ . - Broadcast
$v_j$ ,$C$ and$\Delta$ to all parties, such that all parties can compute$v = \Vert _{j \neq i} : v_j$ .
For a party
- Compute
$v = \Vert _{j \neq i} : v_j$ . - Compute the signature
$\sigma \leftarrow \mathtt{Sig}(sk_i, A \Vert \Delta \Vert C \Vert v)$ . - Broadcast
$C$ ,$vk_i$ ,$\Delta$ and$\sigma$ to all verifying parties$P_j$ .
To verify an identity challenge response from a party
- Compute
$v = \Vert _{j \neq i} : v_j$ . - Verify
$\sigma$ by checking that the output of$\mathtt{Ver}(vk_i, A \Vert \Delta \Vert C \Vert v, \sigma)$ is valid or report the culprit and halt.
Identity rotation allows any party to change the decentralized identity associated with its secret share.
Identity rotation for a party
- For
$P_i$ , initiate an "identity-rotation" request by following the protocol in section 5.1.1. - For all
$P_j$ where$j \neq i$ :- Verify the "identity-rotation" request by following the protocol in section 5.1.2.
- Initiate an identity challenge for
$P_i$ by following the protocol in section 5.2.1.
- For
$P_i$ , respond to the identity challenge by following the protocol in section 5.2.2 with the following augmentations:- Compute an additional signature
$\sigma _i^ \ast \leftarrow \mathtt{Sig}(sk_i^ \ast, A \Vert \Delta \Vert C \Vert v)$ . - Add
$vk_i^ \ast$ and$\sigma _i^ \ast$ to the broadcast parameters.
- Compute an additional signature
- For all
$P_j$ where$j \neq i$ :- Verify the identity challenge response from
$P_i$ by following the protocol in section 5.2.3. - Verify that
$P_i$ controls the new decentralized identity verifying key$vk_i^ \ast$ as follows:- Compute
$v = \Vert _{j \neq i} : v_j$ : - Verify
$\sigma ^ \ast$ by checking that the output of$\mathtt{Ver}(vk_i^ \ast, A \Vert \Delta \Vert C \Vert v, \sigma ^ \ast)$ is valid or report the culprit and halt.
- Compute
- Modify Stored State as follows:
- Create
$\mathcal{S} ^ \ast$ by replacing$vk_i$ with$vk_i^ \ast$ in$\mathcal{S}$ . - Replace
$\mathcal{S}$ with$\mathcal{S} ^ \ast$ .
- Create
- Broadcast confirmation of successful rotation of the verifying key for
$P_i$ .
- Verify the identity challenge response from
- For
$P_i$ , upon receiving confirmation of successful rotation from a quorum of$P_j$ :- Compute the new signing share
$k_i^ \ast$ and sub-share$\beta _i^ \ast$ based on the new decentralized identity$I_i^ \ast$ as follows:- Compute the secret share
$x_i$ by following the share reconstruction protocol in section 3.2. - Follow the share splitting protocol in section 3.1 to split
$x_i$ into a new signing share$k_i^ \ast$ and a new sub-share$\beta _i^ \ast$ based on the new decentralized identity$I_i^ \ast$ .
- Compute the secret share
- Modify Stored State as follows:
- Replace
$vk_i$ with$vk_i^ \ast$ in$\mathcal{S}$ . - Replace
$k_i$ with$k_i^ \ast$ . - Replace
$\beta _i$ with$\beta _i^ \ast$ .
- Replace
- Compute the new signing share
Quorum approved requests allow any verified party to initiate actions that require explicit approval from a quorum of verified parties before execution (e.g. share addition and removal, and threshold modification).
A quorum approved request with a command
- For
$P_i$ , initiate an identity authenticated request by following the protocol in section 5.1.1. - For all
$P_j$ where$j \neq i$ that approve the requested action:- Verify the identity authenticated request by following the protocol in section 5.1.2.
- Initiate an identity challenge for
$P_i$ by following the protocol in section 5.2.1 with the following augmentations:- Compute a signature
$\sigma _j \leftarrow \mathtt{Sig}(sk_j, A \Vert \Delta \Vert C \Vert v_j)$ . - Add
$vk_j$ and$\sigma _j$ to the broadcast parameters.
- Compute a signature
- For
$P_i$ , upon receiving an augmented identity challenge from a quorum$\mathcal{S} _c$ such that$\mathcal{S} _c \subseteq \mathcal{S} \land |\mathcal{S} _c| \geq t - 1$ , respond to the identity challenge by following the protocol in section 5.2.2 with the following modifications:- At the beginning of the identity challenge response protocol, verify that approvals have been received from a valid quorum of signatories by checking that
$\exists , \mathcal{S} _c \subseteq \mathcal{S}$ such that$|\mathcal{S} _c| \geq t - 1$ and$\forall , vk_j \in \mathcal{S} _c$ where$j \neq i$ , the output of$\mathtt{Ver}(vk_j, A \Vert t \Vert C \Vert v_j, \sigma _j)$ is valid or report the culprit and halt. - Compute
$v$ as$v = \Vert _{j \neq i} : v_j$ where$v_j \in \mathcal{S} _c$ . - Add
$\mathcal{S} _c$ to the broadcast parameters.
- At the beginning of the identity challenge response protocol, verify that approvals have been received from a valid quorum of signatories by checking that
- For all
$P_j$ where$j \neq i$ :- Verify the augmented identity challenge response from
$P_i$ by following the protocol in section 5.2.3 with the following modifications:- Compute
$v$ as$v = \Vert _{j \neq i} : v_j$ where$v_j \in \mathcal{S} _c$ .
- Compute
- Verify that a valid quorum of signatories has approved the request as follows:
- Verify that
$|\mathcal{S} _c| \geq t - 1$ or report the culprit and halt. - Verify that
$\mathcal{S} _c \subseteq \mathcal{S} \land vk_i \notin \mathcal{S} _c$ or report the culprit and halt. - Verify that
$\forall , vk_j \in \mathcal{S} _c$ where$j \neq i$ , the output of$\mathtt{Ver}(vk_j, A \Vert \Delta \Vert C \Vert v_j, \sigma _j)$ is valid or report the culprit and halt.
- Verify that
- Verify the augmented identity challenge response from
Access structure modification allows a quorum of verified parties to perform any of the following actions:
- share addition - issue a secret share to a new party and its associated decentralized identity
- share removal - revoke the secret share of any party.
- threshold modification - change the threshold (i.e. change the size of the quorum).
As noted in section 4, most threshold signature schemes don't define a key refresh protocol, and this is also the case for access structure modification protocols. However, it is similarly relatively straightforward to derive a suitable access structure modification protocol from a standard share redistribution scheme like DJ97 [@dj97] or WW01 [@ww01].
In fact, for applications that require support for access structure modification, it is preferable to replace a key refresh protocol based on (or similar to) a proactive secret sharing scheme like HJKY95 [@hjky95] (as is the case for CGGMP20 [@cggmp20] key refresh) with a protocol based on (or similar to) a share redistribution scheme like DJ97 [@dj97] or WW01 [@ww01] as the latter are more flexible and allow for both proactive security and access structure changes.
NOTE: For threshold signature schemes with identifiable aborts (e.g. CGGMP20 [@cggmp20], GG20 [@gg20] and FROST20 [@frost20]), key refresh protocols should be derived from verifiable share redistribution schemes like WW01 [@ww01] to preserve the same security model.
Therefore, access structure modification can be achieved by following the augmented key refresh protocol described in section 4.3 of this document,
with some modifications based on a verifiable share redistribution scheme like WW01 [@ww01] (or similar) as described above.
In particular, this entails each party (from a suitable subset of parties) performing a
Share addition for a new party
- Initiate a quorum approved "share-addition" request by following the protocol in section 5.4.
- Follow the augmented key refresh protocol described in section 4.3, with verifiable share redistribution modifications as described above and with
$P_i$ included as a participant, if the quorum approved request above succeeds.
Share removal for a party
- Initiate a quorum approved "share-removal" request by following the protocol in section 5.4.
- Follow the augmented key refresh protocol described in section 4.3, with verifiable share redistribution modifications as described above and without
$P_i$ , if the quorum approved request above succeeds.
Threshold modification proceeds as follows:
- Initiate a quorum approved "threshold-modification" request by following the protocol in section 5.4.
- Follow the augmented key refresh protocol described in section 4.3, with verifiable share redistribution modifications as described above, if the quorum approved request succeeds.
Share recovery is only possible if the user's decentralized identity either survived or can be recovered after the disastrous event. In either case, there are two options for share recovery depending on:
- A quorum of honest parties surviving the disastrous event.
- A backup (preferably encrypted) of a signing share
$k$ and sub-share$\beta$ pair on user-controlled secondary or device-independent storage.
If a quorum of honest parties survives the disastrous event, share recovery can be accomplished based on peer-to-peer decentralized identity authentication.
Share recovery for a party
- For
$P_i$ , Initiate a "share-recovery" request by following the protocol in section 5.1.1. - For all
$P_j$ where$j \neq i$ :- Verify the "share-recovery" request by following the protocol in section 5.1.2.
- Initiate an identity challenge for
$P_i$ by following the protocol in section 5.2.1.
- For
$P_i$ , respond to the identity challenge by following the protocol in section 5.2.2. - For all
$P_j$ where$j \neq i$ , verify the identity challenge response from$P_i$ by following the protocol in section 5.2.3. - Follow the key refresh protocol described in section 4.3 if all verifications above pass.
From the share splitting and reconstruction protocol in section 3, we note that for any party
Therefore, a signing share
For increased security, a signature of a standardized phrase can be used as entropy for generating an encryption secret which can then be used to encrypt the signing share
Given a standardized phrase
- Compute the signature
$\sigma \leftarrow \mathtt{Sig}(sk, u)$ . - Generate the encryption secret
$\varepsilon = \mathtt{H}(\sigma)$ . - Compute the ciphertext for the signing share
$k$ as$k_c = \mathtt{E} _{enc}(k, \varepsilon)$ . - Compute the ciphertext for the sub-share
$\beta$ as$\beta _c = \mathtt{E} _{enc}(\beta, \varepsilon)$ . - Erase both
$\sigma$ and$\varepsilon$ from memory. - Save
$k_c$ and$\beta _c$ to backup storage.
Share recovery would then start by signing this standardized phrase, using the signature to recreate the encryption secret and then decrypting the encrypted backup to retrieve the signing share
Given a standardized phrase
- Compute the signature
$\sigma \leftarrow \mathtt{Sig}(sk, u)$ . - Generate the encryption secret
$\varepsilon = \mathtt{H}(\sigma)$ . - Compute the signing share
$k = \mathtt{E} _{dec}(k_c, \varepsilon)$ . - Compute the sub-share
$\beta = \mathtt{E} _{dec}(\beta _c, \varepsilon)$ . - Erase both
$\sigma$ and$\varepsilon$ from memory. - Return the signing share
$k$ and the sub-share$\beta$ .
7.2.4. Further security and usability considerations for share recovery with a backup {#share-recovery-backup-enhancements}
For further improved security and usability, the signing share
Additionally, it's possible to rerun the share splitting protocol to generate a new pair of a signing share
Lastly, the "backup" signing share
This work is funded by a grant from the Ethereum Foundation 5.
::: {#refs} :::
Footnotes
-
Apple iCloud. https://www.icloud.com. ↩
-
Google Drive. https://drive.google.com. ↩
-
Microsoft OneDrive. https://www.microsoft.com/en-us/microsoft-365/onedrive/online-cloud-storage. ↩
-
Dropbox. https://www.dropbox.com. ↩
-
Ethereum Foundation: Ecosystem Support Program. https://esp.ethereum.foundation. ↩