UNPKG

ssv-keys

Version:

Tool for splitting a validator key into a predefined threshold of shares via Shamir-Secret-Sharing (SSS), and encrypt them with a set of operator keys.

42 lines (37 loc) 1.25 kB
import bls from '../../../BLS'; import Threshold, { IShares } from '../../../Threshold'; export interface Shares { privateKey: any, publicKey: any, signatures: any[], ids: any[], } export const sharesSignatures = async (_privateKey: string, operators: number[], message: string, isThreshold: boolean): Promise<Shares> => { if (!bls.deserializeHexStrToSecretKey) { await bls.init(bls.BLS12_381); } const threshold = await new Threshold().create(_privateKey, operators); const privateKey = bls.deserializeHexStrToSecretKey(_privateKey.replace('0x', '')); const publicKey = privateKey.getPublicKey(); const signatures: any[] = []; const ids: any[] = []; const randomIndex: number = getRandomInt(4); threshold.shares.forEach((share: IShares, index: number) => { if (isThreshold && index === randomIndex) { return; } const sharePrivateKey = share.privateKey.substr(2); const shareBlsPrivateKey = bls.deserializeHexStrToSecretKey(sharePrivateKey); signatures.push(shareBlsPrivateKey.sign(message)); ids.push(share.id); }); return { privateKey, publicKey, signatures, ids, }; }; function getRandomInt(max: number): number { return Math.floor(Math.random() * max); }