PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@vechain/sdk-core/src/vcdm

Просмотр файла: Mnemonic.ts

import * as s_bip32 from '@scure/bip32';
import * as s_bip39 from '@scure/bip39';
import { wordlist } from '@scure/bip39/wordlists/english';
import {
    InvalidDataType,
    InvalidHDKey,
    InvalidHDKeyMnemonic,
    InvalidOperation
} from '@vechain/sdk-errors';
import { type VeChainDataModel } from './VeChainDataModel';
import { HDKey } from '../hdkey';

/**
 * Type of the wordlist size.
 * Every 4 bytes produce 3 words.
 */
type WordlistSizeType = 12 | 15 | 18 | 21 | 24;

/**
 * Size of the mnemonic words in bytes.
 */
type WordListRandomGeneratorSizeInBytes = 16 | 20 | 24 | 28 | 32;

/**
 * The Mnemonic class provides functionality related to mnemonic phrases, including encoding to bytes,
 * generating, validating, and deriving keys from mnemonic words based on the BIP39 standard.
 * It implements the VeChainDataModel interface.
 *
 * @implements VeChainDataModel
 */
class Mnemonic implements VeChainDataModel<Mnemonic> {
    /**
     * A TextEncoder instance used for encoding text to bytes.
     *
     * @type {TextEncoder}
     */
    private static readonly ENCODER = new TextEncoder();

    /**
     * Throws an exception because the mnemonic cannot be represented as a big integer.
     * @returns {bigint} The BigInt representation of the mnemonic.
     * @throws {InvalidOperation} The mnemonic cannot be represented as a bigint.
     * @override {@link VeChainDataModel#bi}
     * @remark The conversion to BigInt is not supported for a mnemonic.
     */
    public get bi(): bigint {
        throw new InvalidOperation(
            'Mnemonic.bi',
            'There is no big integer representation for a mnemonic.',
            { data: '' }
        );
    }

    /**
     * Generates a mnemonic as encoded bytes.
     *
     * @returns {Uint8Array} The bytes representation of the words with spaces.
     */
    get bytes(): Uint8Array {
        return Mnemonic.ENCODER.encode(Mnemonic.of().join(' '));
    }

    /**
     * Throws an exception because the mnemonic cannot be represented as a number.
     * @returns {bigint} The number representation of the mnemonic.
     * @throws {InvalidOperation} The mnemonic cannot be represented as a number.
     * @override {@link VeChainDataModel#n}
     * @remark The conversion to number is not supported for a mnemonic.
     */
    public get n(): number {
        throw new InvalidOperation(
            'Mnemonic.n',
            'There is no number representation for a mnemonic.',
            { data: '' }
        );
    }

    /**
     * There is no comparison for a mnemonic.
     *
     * @throws {InvalidOperation} The mnemonic cannot be compared.
     */
    public compareTo(_that: Mnemonic): number {
        throw new InvalidOperation(
            'Mnemonic.compareTo',
            'There is no comparison for a mnemonic since it is not stored in memory.',
            { data: '' }
        );
    }

    /**
     * There is no comparison for a mnemonic.
     *
     * @throws {InvalidOperation} The mnemonic cannot be compared.
     */
    public isEqual(_that: Mnemonic): boolean {
        throw new InvalidOperation(
            'Mnemonic.isEqual',
            'There is no comparison for a mnemonic since it is not stored in memory.',
            { data: '' }
        );
    }

    /**
     * Convert the number of words to the corresponding strength.
     *
     * @param numberOfWords - The number of words.
     *
     * @returns {number} The corresponding strength.
     *
     * @throws {InvalidDataType} If the number of words is not valid.
     */
    private static wordsNoToStrength(numberOfWords: number): number {
        switch (numberOfWords) {
            case 12:
                return 128;
            case 15:
                return 160;
            case 18:
                return 192;
            case 21:
                return 224;
            case 24:
                return 256;
            default:
                throw new InvalidDataType(
                    'Mnemonic.wordsNoToStrength',
                    'not a valid number of words',
                    { numberOfWords }
                );
        }
    }

    // Legacy method, probably should be part of a Private Key class (ofMnemonic) #1122
    /**
     * Derives a private key from a given list of
     * [BIP39 Mnemonic Words](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)
     * and a derivation path as in the examples.
     *
     * @example `m/0` (default)
     * @example `m/0/2`
     * @example `m/0/2/4/6`
     *
     * @param {string[]} words - The set of words used for mnemonic generation.
     * @param {string} [path='m/0'] - The derivation path from the current node.
     *
     * @returns {Uint8Array} - The derived private key as a Uint8Array.
     *
     * @throws {InvalidHDKey}
     *
     * @remarks Security auditable method, depends on
     * * {@link HDKey}.
     */
    public static toPrivateKey(
        words: string[],
        path: string = HDKey.VET_DERIVATION_PATH
    ): Uint8Array {
        const master = s_bip32.HDKey.fromMasterSeed(
            s_bip39.mnemonicToSeedSync(words.join(' ').toLowerCase())
        );
        // Any exception involving mnemonic words is thrown before this point: words are not leaked next.
        try {
            // Derived from root, private key is always available.
            return master.derive(path).privateKey as Uint8Array;
        } catch (error) {
            throw new InvalidHDKey(
                'mnemonic.derivePrivateKey()',
                'Invalid derivation path given as input.',
                { derivationPath: path },
                error
            );
        }
    }

    /**
     * Generates a
     * [BIP39 Mnemonic Words](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)
     * phrase using the specified wordlist size and random generator.
     *
     * @param {WordlistSizeType} wordlistSize - The number of words to generate the mnemonic.
     * @param {function} [randomGenerator] - The random generator function used to generate the entropy.
     *
     * @returns {Mnemonic} The generated mnemonic.
     *
     * @throws {InvalidDataType} If the number of words is not valid.
     *
     * @remarks Security auditable method, depends on
     * * [entropyToMnemonic](https://github.com/paulmillr/scure-bip39);
     * * [generateMnemonic](https://github.com/paulmillr/scure-bip39);
     * * `randomGenerator` - **Must provide a cryptographic secure source of entropy
     *    else any secure audit certification related with this software is invalid.**
     */
    public static of(
        wordlistSize: WordlistSizeType = 12,
        randomGenerator?: (
            numberOfBytes: WordListRandomGeneratorSizeInBytes
        ) => Uint8Array
    ): string[] {
        try {
            const strength: number = Mnemonic.wordsNoToStrength(wordlistSize);
            if (randomGenerator != null) {
                const numberOfBytes = (strength /
                    8) as WordListRandomGeneratorSizeInBytes;
                return s_bip39
                    .entropyToMnemonic(randomGenerator(numberOfBytes), wordlist)
                    .split(' ');
            }
            return s_bip39.generateMnemonic(wordlist, strength).split(' ');
        } catch (error) {
            throw new InvalidHDKeyMnemonic(
                'Mnemonic.of',
                'error while generating mnemonic',
                { wordlistSize },
                error
            );
        }
    }

    /**
     * Check if the given mnemonic words are valid.
     *
     * @param {string | string[]} words - The mnemonic words to check.
     *
     * @returns {boolean} true if the words are valid, false otherwise.
     *
     * @remarks Security auditable method, depends on
     * * [validateMnemonic](https://github.com/paulmillr/scure-bip39).
     */
    public static isValid(words: string | string[]): boolean {
        const wordsToValidate = Array.isArray(words) ? words.join(' ') : words;
        return s_bip39.validateMnemonic(wordsToValidate, wordlist);
    }
}

export { Mnemonic };
export type { WordListRandomGeneratorSizeInBytes, WordlistSizeType };

Выполнить команду


Для локальной разработки. Не используйте в интернете!