This document serves primarily as a guide to Torus Key Infrastructure, and not as a technical specification. It may become outdated. For the latest and greatest, check out our open-source code.
Torus nodes provide a user-specific key based on some form of attestation from the user. This attestation could come in the form of an OAuth login from an existing account, a traditional email account login, or even biometrics. Torus nodes need not return a private key, but need to fufill the interface:
For ease of illustration the rest of this document assumes that this is implemented with secp256k1 keys and ECIES. The key retrieved from the Torus nodes is refered to as an encryption key or .
The storage layer serves as a persistent data store for storing encrypted metadata. Examples of such systems include IPFS, Arweave, Sia, or even BFT layers. Data availability and cost are the main factors to consider but the choice of storage layer is ultimately up to the implementer.
TKI utilizes from the torus nodes as an entry point to retrieve the private key. is used to retrieve encrypted user-specific data from the storage layer, refered to as metadata. This data includes a user's threshold, polynomial commitments, associated devices, and so on.
TKI is dependent on user devices to store shares. The base flow accomodates a single device, but users can use multiple devices to increase the threshold once they have an initial setup. Access to device storage on the user's device is implementation specific. For example, for native applications on mobile, they can make use of the device keychain.
This is generally not used during normal operation, and is intended for use in key recovery / share refresh if the user loses his/her device or shares.
A key is initialized upon a user-triggered action (eg. login to Torus nodes). We then attempt to retrieve associated metadata for the user. If none exists, the user is a new one and we generate a corresponding SSS 2/3 polynomial with its respective key and shares. If it exists, we decrypt the metadata using the Torus nodes and read the metadata to verify user information and associated secret sharing parameters.
We select a polynomial over where:
- denotes the private key scalar to be used by the user
- is a coefficient to
- and are ShareA, ShareB and ShareC respectively
ShareA is stored on the user's device, ShareB is encrypted with the and stored on the storage layer for future retrieval, and ShareC dependent on user input or handled as a recovery share.
If a user has logged in previously, he/she reconstructs their key by decrypting ShareB (retrieved through the storage layer) and combining it with ShareA on the user's current device using Lagrange interpolation.
Provided with a user input, , we can pre-determine a single share in the generation of the SSS polynomial, where we peg ShareC or to a users input. Let be a cryptographically secure hash function.
In the case of secret resharing, we can also conduct the deterministic generation of the polynomial with a given and . We are able to peg given values to the key or shares as long as where is the degree of the SSS polynomial .
It is important that has sufficent entropy in its generation. A potential way to guarentee this is via using several security questions (for example three of them) with answers to derive . This can be implemented with a repository of questions, of which order and index can be defined in metadata.
Candidate qualified questions are suggested to be ones with deterministic answers (i.e. "your parent's birthday" or "your city of birth"), rather than "what's your favorite singer?". To accomodate for cases that users tend to forget their answers. There is a further potential of splitting the answers themselves via SSS such that the user can answer 3/5 questions, giving redundancy.
In the case of a new device the user needs to migrate a share to the device to reconstruct their key. This can be done user input or through a login to a current device.
On reconstruction of on the new device we set ShareD to .
Utilizing the storage layer, we are able to generate new shares for all devices, regardless if they are online or offline. This allows us to remove devices from the sharing, allow the user to change their security questions and/or adjust their security threshold. The key concept here is utilizing published Share commitments as encryption keys to retrieve shares on the most updated SSS polynomial.
This is illustrated from a 2/4 SSS sharing with shares kept on 3 user devices and the Torus nodes. Let be a generator of a multiplicative subgroup where the discrete log problem is assumed hard to solve. During initialization of the key we create share commitments to be stored on the storage layer. These share commitments are analgous to public keys derived from the share scalars.
Given the user loses device D holding , and wants to make that share redundant. He/she first reconstructs their key on device A. We utilize a public key based encryption scheme (eg. ECIES).
The user generates a new 2/3 SSS polynomial on the same with shares and encrypts the newly generated shares for each respective share commitment, except for the lost commitment.
, the resulting ciphertext from the encryption, is then stored on the storage layer for retrieval on other devices.
On login to device B, the user retrieves is able to use to decrypt the new and reconstruct their key with derived from the Torus nodes in a similar fashion. Using the allows to also be deprecated as a share.
Resharing allows us to share a key on a new polynomial with a different degree/threshold, allowing us to also increase a user's security/factor devices or inputs to reconstruct thier key as they require it. This can be incrementally done as needed.
Compared to traditional key management, TKI improves on recoverability, usability, and flexibility. It also allows revocability of shares and edits of access structures to a user's key. Today, we do have multi-sigs and smart contract wallets (SCW) that hold assets which provide similar properties. They work well and TKI can be used as an external key to these contructions. Relative to these tools, because TKI revolves around managing a native private key it is far more composable.
While an onchain multi-sig/SCW can fufill most functions, there are nuances to consider implementation-wise. For example, being on-chain, they are limited to the layer-1 chain they are implemented on, limiting interoperability with other layer-2 scalability solutions or other blockchains. Deployment fees for smart contract wallets can also be expensive and slow, which increases user-friction.
The model is also flexible, and different configurations of SSS thresholds can help to balance convenience, security, and redundancy, according to the user's needs.
TKI can be implemented with threshold signature schemes such that the key need not be constructed in an existing front-end when signing transactions, which helps to improve security. The initial private key can also be generated via distributed key generation, to ensure that the private key is never reconstructed at all. In this case resharing of shares for a new polynomial could be done through proactive secret sharing schemes with dynamic participants.