Applies Shamir's Secret Sharing Scheme to BIP39 mnemonics.
Proposed specification: ethereum/EIPs#3450
Yarn:
yarn add shamir-bip39
NPM:
npm install --save shamir-bip39
Split a BIP39 mnemonic into the specified number of shares such that the threshold number of shares are required to recover the original. Each share is a BIP39 mnemonic and an id. Both the mnemonic and the id are required to recover the original mnemonic.
Accepts a BIP39 mnemonic and returns a Shares
map, in which the keys are the share id's and the values are the BIP39 mnemonics.
import { splitMnemonic } from 'shamir-bip39';
const mnemonic =
'jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge';
// Generate 3 shares and require 2 to recover the mnemonic
const shares = splitMnemonic(mnemonic, 3, 2);
// `splitMnemonic` will generate different shares on every run.
// One example result:
{
'1':
'liquid use shine dentist aspect brief neither learn hope tourist tray cinnamon',
'2':
'liberty antique mean describe wrestle man latin right gown shield decide dynamic',
'3':
'install video evil clutch butter asset answer toss noodle captain rate jacket',
};
Given a Shares
object, returns the recovered BIP39 mnemonic.
Note: If the number of shares provided does not meet the threshold, recoverMnemonic
will still return a valid BIP39 mnemonic. It just won't be the same as the initial one stored. The user is responsible for providing the minimum number of shares.
import { recoverMnemonic } from 'shamir-bip39';
const shares = {
'1':
'liquid use shine dentist aspect brief neither learn hope tourist tray cinnamon',
'3':
'install video evil clutch butter asset answer toss noodle captain rate jacket',
};
const originalMnemonic = recoverMnemonic(shares);
expect(originalMnemonic)).toBe(
'jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge'
);
Heavily borrowed from grempe's secrets.js for the implementation of Shamir's and the finite field arithmetic.
With additional inspiration from