PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/@celo/utils/lib

Просмотр файла: ecies.js

/**
 * ECIES encrypt/decrypt with Ethereum keys
 * A Typescript implementation of geth/crypto/ecies/ecies.go
 * Modified from https://github.com/LimelabsTech/eth-ecies/blob/master/index.js
 * At commit c858cbd021e9a99d8afa629de33c8c30d923b3e5.
 */
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
exports.ECIES = exports.Decrypt = exports.Encrypt = exports.AES128DecryptAndHMAC = exports.AES128Decrypt = exports.AES128EncryptAndHMAC = exports.AES128Encrypt = exports.IV_LENGTH = void 0;
var crypto_1 = require("crypto");
exports.IV_LENGTH = 16;
/**
 * Increments big endian uint32
 *
 * @param {Buffer} ctr 32 bit unsigned big endian integer to increment.
 * @returns Incremented counter.
 */
var IncCounter = function (ctr) {
    for (var i = ctr.length - 1; i >= 0; i--) {
        ctr[i]++;
        if (ctr[i] !== 0) {
            return ctr;
        }
    }
    return ctr;
};
/**
 * NIST 8000-56C Rev 1 One Step KDF with the following parameters:
 * - H(x) is SHA-256(x)
 * - Fixed info is null
 *
 * TODO:
 * - Implement proper ceiling on reps.
 *
 * @param {Buffer} px Input keying material to derive key from.
 * @param {number} kdLen Length of output in bytes
 * @returns {Buffer} Output keying material of length kdLen bytes.
 */
var ConcatKDF = function (px, kdLen) {
    var blockSize = 32;
    var reps = ((kdLen + 7) * 8) / (blockSize * 8);
    var counter = Buffer.from('00000001', 'hex');
    var k = Buffer.from('00', 'hex');
    for (var i = 0; i <= reps; i++) {
        var hash = (0, crypto_1.createHash)('sha256');
        hash.update(counter);
        hash.update(px);
        k = Buffer.concat([k, hash.digest()]);
        counter = IncCounter(counter);
    }
    return k.slice(1, kdLen + 1);
};
/**
 * AES-128 CTR encrypt
 * @param {Buffer} encryptionKey
 * @param {Buffer} iv
 * @param {Buffer} plaintext
 * @returns {Buffer} ciphertext
 */
function AES128Encrypt(encryptionKey, iv, plaintext) {
    var cipher = (0, crypto_1.createCipheriv)('aes-128-ctr', encryptionKey, iv);
    var firstChunk = cipher.update(plaintext);
    var secondChunk = cipher.final();
    return Buffer.concat([iv, firstChunk, secondChunk]);
}
exports.AES128Encrypt = AES128Encrypt;
/**
 * AES-128 CTR encrypt with message authentication
 * @param {Buffer} encryptionKey
 * @param {Buffer} macKey
 * @param {Buffer} plaintext
 * @returns {Buffer} ciphertext
 */
function AES128EncryptAndHMAC(encryptionKey, macKey, plaintext) {
    var iv = (0, crypto_1.randomBytes)(exports.IV_LENGTH);
    var dataToMac = AES128Encrypt(encryptionKey, iv, plaintext);
    var mac = (0, crypto_1.createHmac)('sha256', macKey).update(dataToMac).digest();
    return Buffer.concat([dataToMac, mac]);
}
exports.AES128EncryptAndHMAC = AES128EncryptAndHMAC;
/**
 * AES-128 CTR decrypt
 * @param {Buffer} encryptionKey
 * @param {Buffer} iv
 * @param {Buffer} ciphertext
 * @returns {Buffer} plaintext
 */
function AES128Decrypt(encryptionKey, iv, ciphertext) {
    var cipher = (0, crypto_1.createDecipheriv)('aes-128-ctr', encryptionKey, iv);
    var firstChunk = cipher.update(ciphertext);
    var secondChunk = cipher.final();
    return Buffer.concat([firstChunk, secondChunk]);
}
exports.AES128Decrypt = AES128Decrypt;
/**
 * AES-128 CTR decrypt with message authentication
 * @param {Buffer} encryptionKey
 * @param {Buffer} macKey
 * @param {Buffer} ciphertext
 * @returns {Buffer} plaintext
 */
function AES128DecryptAndHMAC(encryptionKey, macKey, ciphertext) {
    var iv = ciphertext.slice(0, exports.IV_LENGTH);
    var message = ciphertext.slice(exports.IV_LENGTH, ciphertext.length - 32);
    var mac = ciphertext.slice(ciphertext.length - 32, ciphertext.length);
    var dataToMac = Buffer.concat([iv, message]);
    var computedMac = (0, crypto_1.createHmac)('sha256', macKey).update(dataToMac).digest();
    if (!mac.equals(computedMac)) {
        throw new Error('MAC mismatch');
    }
    return AES128Decrypt(encryptionKey, iv, message);
}
exports.AES128DecryptAndHMAC = AES128DecryptAndHMAC;
/**
 * ECIES encrypt
 * @param {Buffer} pubKeyTo Ethereum pub key, 64 bytes.
 * @param {Buffer} plaintext Plaintext to be encrypted.
 * @returns {Buffer} Encrypted message, serialized, 113+ bytes
 */
function Encrypt(pubKeyTo, plaintext) {
    // NOTE: elliptic is disabled elsewhere in this library to prevent
    // accidental signing of truncated messages.
    // tslint:disable-next-line:import-blacklist
    var EC = require('elliptic').ec;
    var ec = new EC('secp256k1');
    var ephemPrivKey = ec.keyFromPrivate((0, crypto_1.randomBytes)(32));
    var ephemPubKey = ephemPrivKey.getPublic(false, 'hex');
    var ephemPubKeyEncoded = Buffer.from(ephemPubKey, 'hex');
    var px = ephemPrivKey.derive(ec.keyFromPublic(Buffer.concat([Buffer.from([0x04]), pubKeyTo])).getPublic());
    var hash = ConcatKDF(px.toArrayLike(Buffer), 32);
    var encryptionKey = hash.slice(0, 16);
    var macKey = (0, crypto_1.createHash)('sha256').update(hash.slice(16)).digest();
    var message = AES128EncryptAndHMAC(encryptionKey, macKey, plaintext);
    var serializedCiphertext = Buffer.concat([
        ephemPubKeyEncoded,
        message, // iv + ciphertext + mac (min 48 bytes)
    ]);
    return serializedCiphertext;
}
exports.Encrypt = Encrypt;
/**
 * ECIES decrypt
 * @param {Buffer} privKey Ethereum private key, 32 bytes.
 * @param {Buffer} encrypted Encrypted message, serialized, 113+ bytes
 * @returns {Buffer} plaintext
 */
function Decrypt(privKey, encrypted) {
    // Read iv, ephemPubKey, mac, ciphertext from encrypted message
    var ephemPubKeyEncoded = encrypted.slice(0, 65);
    var symmetricEncrypted = encrypted.slice(65);
    // NOTE: elliptic is disabled elsewhere in this library to prevent
    // accidental signing of truncated messages.
    // tslint:disable-next-line:import-blacklist
    var EC = require('elliptic').ec;
    var ec = new EC('secp256k1');
    var ephemPubKey = ec.keyFromPublic(ephemPubKeyEncoded).getPublic();
    var px = ec.keyFromPrivate(privKey).derive(ephemPubKey);
    var hash = ConcatKDF(px.toBuffer(), 32);
    // km, ke
    var encryptionKey = hash.slice(0, 16);
    var macKey = (0, crypto_1.createHash)('sha256').update(hash.slice(16)).digest();
    return AES128DecryptAndHMAC(encryptionKey, macKey, symmetricEncrypted);
}
exports.Decrypt = Decrypt;
exports.ECIES = {
    Encrypt: Encrypt,
    Decrypt: Decrypt,
    AES128EncryptAndHMAC: AES128EncryptAndHMAC,
    AES128DecryptAndHMAC: AES128DecryptAndHMAC,
};
//# sourceMappingURL=ecies.js.map

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


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