PHP WebShell

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

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

/**
 * Implements the JSON Keystore v3 Wallet encryption, decryption, and validation functionality.
 */
import {
    InvalidKeystore,
    InvalidKeystoreParams,
    stringifyData
} from '@vechain/sdk-errors';
import { ethers } from 'ethers';
import { Secp256k1 } from '../../../secp256k1';
import { Address, HexUInt } from '../../../vcdm';
import { type Keystore, type KeystoreAccount } from '../../types';
import { SCRYPT_PARAMS } from './const';

/**
 * Encrypts a given private key into a keystore format using the specified password.
 *
 * @param privateKey - The private key to be encrypted.
 * @param password - The password used for the encryption.
 * @returns A Promise that resolves to the encrypted keystore.
 */
async function encrypt(
    privateKey: Uint8Array,
    password: string
): Promise<Keystore> {
    // Public and Address are derived from a private key
    const derivePublicKey = Secp256k1.derivePublicKey(privateKey);
    const deriveAddress = Address.ofPublicKey(derivePublicKey).toString();

    // Create keystore account compatible with ethers
    const keystoreAccount: ethers.KeystoreAccount = {
        address: deriveAddress,
        privateKey: HexUInt.of(privateKey).toString()
    };

    // Scrypt options
    const encryptOptions: ethers.EncryptOptions = {
        scrypt: {
            N: SCRYPT_PARAMS.N,
            r: SCRYPT_PARAMS.r,
            p: SCRYPT_PARAMS.p
        }
    };

    // String version of keystore
    const keystoreJsonString = await ethers.encryptKeystoreJson(
        keystoreAccount,
        password,
        encryptOptions
    );

    return JSON.parse(keystoreJsonString) as Keystore;
}

/**
 * Decrypts a keystore to obtain the private key using the given password.
 *
 * @param keystore - The keystore containing the encrypted private key.
 * @param password - The password used to decrypt the keystore.
 * @returns A Promise that resolves to the decrypted KeystoreAccount or rejects if the keystore or password is invalid.
 * @throws {InvalidKeystore, InvalidKeystoreParams}
 */
async function decrypt(
    keystore: Keystore,
    password: string
): Promise<KeystoreAccount> {
    // Invalid keystore
    if (!isValid(keystore)) {
        throw new InvalidKeystore(
            'keystore.decrypt()',
            'Invalid keystore. Ensure the keystore is properly formatted and contains the necessary data.',
            { keystore }
        );
    }

    try {
        return (await ethers.decryptKeystoreJson(
            stringifyData(keystore),
            password
        )) as KeystoreAccount;
    } catch {
        throw new InvalidKeystoreParams(
            'keystore.decrypt()',
            'Decryption failed: Invalid Password for the given keystore.',
            // @NOTE: We are not exposing the password in the error data for security reasons.
            {
                keystore
            }
        );
    }
}

/**
 * Validates if the provided keystore adheres to the expected format and structure.
 *
 * @param keystore - The keystore to be validated.
 * @returns A boolean indicating whether the keystore is valid or not.
 */
function isValid(keystore: Keystore): boolean {
    return ethers.isKeystoreJson(stringifyData(keystore));
}

/**
 * Exports the keystore functions for encryption, decryption, and validation.
 */
const keystore = { encrypt, decrypt, isValid };
export { keystore };

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


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