UNPKG

secrets.js-34r7h

Version:

Shamir's threshold secret sharing scheme for JavaScript.

167 lines (141 loc) 5.12 kB
interface SecretsConfig { radix: number bits: number maxShares: number hasCSPRNG: boolean typeCSPRNG: string } interface ShareComponents { bits: number id: number data: string } type RNGType = | "nodeCryptoRandomBytes" | "browserCryptoGetRandomValues" | "testRandom" type Shares = Array<string> interface Share { x: number y: number } type RNGFunction = (bits: number) => string /** * Initialize secrets with default settings. */ export function init(bits: number, rngType: string): void /** * Get the current config. */ export function getConfig(): SecretsConfig /** * Evaluates the Lagrange interpolation polynomial at x=`at` for individual * config.bits-length segments of each share in the `shares` Array. Each * share is expressed in base `inputRadix`. The output is expressed in base * `outputRadix'. */ export function combine(shares: Shares, at?: number): string /** * Given a public share, extract the bits (Integer), share ID (Integer), * and share data (Hex) and return an Object containing those components. */ export function extractShareComponents(share: string): ShareComponents /** * Set the PRNG to use. If no RNG function is supplied, pick a default using getRNG() * @param rng One of the acceptable RNG types. */ export function setRNG(rng?: RNGType): void /** * Converts a given UTF16 character string to the HEX representation. * Each character of the input string is represented by * `bytesPerChar` bytes in the output string which defaults to 2. */ export function str2hex(str: string, bytesPerChar?: number): string /** * Converts a given HEX number string to a UTF16 character string. * Each character of the output string is represented by * `bytesPerChar` bytes in the input string which defaults to 2. */ export function hex2str(str: string, bytesPerChar?: number): string /** * Generates a random bits-length number string using the PRNG */ export function random(bits: number): string /** * Divides a `secret` number String str expressed in radix `inputRadix` (optional, default 16) * into `numShares` shares, each expressed in radix `outputRadix` (optional, default to `inputRadix`), * requiring `threshold` number of shares to reconstruct the secret. * Optionally, zero-pads the secret to a length that is a multiple of padLength before sharing. */ export function share( secret: string, numShares: number, threshold: number, padLength?: number ): Shares /** * Generate a new share with id `id` (a number between 1 and 2^bits-1) * `id` can be a Number or a String in the default radix (16) */ export function newShare(id: number, shares: Shares): string export function _reset(): void /** * Pads a string `str` with zeros on the left so that its length is a multiple of `bits` */ export function _padLeft(str: string, multipleOfBits?: number): string export function _hex2bin(str: string): string export function _bin2hex(str: string): string /** * Returns a pseudo-random number generator of the form function(bits){} * which should output a random string of 1's and 0's of length `bits`. * `type` (Optional) : A string representing the CSPRNG that you want to * force to be loaded, overriding feature detection. Can be one of: * "nodeCryptoRandomBytes" * "browserCryptoGetRandomValues" */ export function _getRNG(type?: RNGType): RNGFunction export function _isSetRNG(): boolean /** * Splits a number string `bits`-length segments, after first * optionally zero-padding it to a length that is a multiple of `padLength. * Returns array of integers (each less than 2^bits-1), with each element * representing a `bits`-length segment of the input string from right to left, * i.e. parts[0] represents the right-most `bits`-length segment of the input string. */ export function _splitNumStringToIntArray( str: string, padLength?: number ): Array<number> /** * Polynomial evaluation at `x` using Horner's Method * NOTE: fx=fx * x + coeff[i] -> exp(log(fx) + log(x)) + coeff[i], * so if fx===0, just set fx to coeff[i] because * using the exp/log form will result in incorrect value */ export function _horner(x: number, coeffs: number): number /** * Evaluate the Lagrange interpolation polynomial at x = `at` * using x and y Arrays that are of the same length, with * corresponding elements constituting points on the polynomial. */ export function _lagrange( at: number, x: Array<number>, y: Array<number> ): number /** * This is the basic polynomial generation and evaluation function * for a `config.bits`-length secret (NOT an arbitrary length) * Note: no error-checking at this stage! If `secret` is NOT * a NUMBER less than 2^bits-1, the output will be incorrect! */ export function _getShares( secret: number, numShares: number, threshold: number ): Array<Share> export function _constructPublicShareString( bits: string, id: string, data: string ): string