PHP WebShell

Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * @prettier
 */
const should = require("should");
const crypto_1 = require("crypto");
const sdk_api_1 = require("@bitgo/sdk-api");
const sdk_test_1 = require("@bitgo/sdk-test");
describe('bytesToWord', () => {
    it('should fail if input is not a Uint8Array', () => {
        let inputArr = [0, 0, 0, 0];
        (() => (0, sdk_api_1.bytesToWord)(inputArr)).should.throw();
        inputArr = {};
        (() => (0, sdk_api_1.bytesToWord)(inputArr)).should.throw();
        inputArr = 'abc';
        (() => (0, sdk_api_1.bytesToWord)(inputArr)).should.throw();
    });
    it('should fail if input is not exactly 4 elements', () => {
        let inputArr = Uint8Array.of(0xff, 0xff, 0xff);
        (() => (0, sdk_api_1.bytesToWord)(inputArr)).should.throw();
        inputArr = Uint8Array.of(0xff, 0xff, 0xff, 0xff, 0xff);
        (() => (0, sdk_api_1.bytesToWord)(inputArr)).should.throw();
    });
    it('should convert to 0', () => {
        const inputArr = Uint8Array.of(0, 0, 0, 0);
        const res = (0, sdk_api_1.bytesToWord)(inputArr);
        res.should.equal(0);
    });
    it('should convert to 2 ^ 32 - 1', () => {
        const inputArr = Uint8Array.of(0xff, 0xff, 0xff, 0xff);
        const res = (0, sdk_api_1.bytesToWord)(inputArr);
        res.should.equal(Math.pow(2, 32) - 1);
    });
    it('should convert to 2 ^ 16', () => {
        const inputArr = Uint8Array.of(0x00, 0x01, 0x00, 0x00);
        const res = (0, sdk_api_1.bytesToWord)(inputArr);
        res.should.equal(Math.pow(2, 16));
    });
    it('should convert 1000 random numbers', () => {
        for (let i = 0; i < 1000; i++) {
            const inputArr = (0, crypto_1.randomBytes)(4);
            const resStr = (0, sdk_api_1.bytesToWord)(inputArr).toString(16);
            const arrStr = inputArr.toString('hex');
            parseInt(resStr, 16).should.equal(parseInt(arrStr, 16));
        }
    });
});
describe('encrypt, decrypt', function () {
    const passwords = Array.from({ length: 2 }).map((_, i) => `key/${i}`);
    const plaintexts = Array.from({ length: 2 }).map((_, i) => `plaintext/${i}`);
    it('matches fixture', function () {
        const ciphertext = (0, sdk_api_1.encrypt)(passwords[0], plaintexts[0], {
            salt: (0, sdk_test_1.getSeed)(`randomSalt`).slice(0, 8),
            iv: (0, sdk_test_1.getSeed)(`randomIV`).slice(0, 16),
        });
        ciphertext.should.eql('{"iv":"BVDN1IpOeJ6E5kSV88MsHA==","v":1,"iter":10000,"ks":256,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"aJjlH+mKW1E=","ct":"loJEsFuypKZMZ+igqCUmbwQfMw=="}');
        JSON.parse(ciphertext).should.eql({
            adata: '',
            cipher: 'aes',
            ct: 'loJEsFuypKZMZ+igqCUmbwQfMw==',
            iter: 10000,
            iv: 'BVDN1IpOeJ6E5kSV88MsHA==',
            ks: 256,
            mode: 'ccm',
            salt: 'aJjlH+mKW1E=',
            ts: 64,
            v: 1,
        });
    });
    it('encrypts and decrypts', function () {
        passwords.forEach((password) => {
            plaintexts.forEach((plaintext) => {
                const ciphertext1 = (0, sdk_api_1.encrypt)(password, plaintext);
                const ciphertext2 = (0, sdk_api_1.encrypt)(password, plaintext);
                (ciphertext1 === ciphertext2).should.eql(false);
                [ciphertext1, ciphertext2].forEach((ct) => {
                    passwords.forEach((otherPassword) => {
                        if (password === otherPassword) {
                            (0, sdk_api_1.decrypt)(otherPassword, ct).should.eql(plaintext);
                        }
                        else {
                            should.throws(() => (0, sdk_api_1.decrypt)(otherPassword, ct), /ccm: tag doesn't match/);
                        }
                    });
                });
            });
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZW5jcnlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOztHQUVHO0FBQ0gsaUNBQWlDO0FBRWpDLG1DQUFxQztBQUNyQyw0Q0FBK0Q7QUFDL0QsOENBQTBDO0FBRTFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO0lBQzNCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7UUFDbEQsSUFBSSxRQUFRLEdBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEscUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLHFCQUFXLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFN0MsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEscUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7UUFDeEQsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxxQkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTdDLFFBQVEsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJ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QUVoRCxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDeEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO3dCQUNsQyxJQUFJLFFBQVEsS0FBSyxhQUFhLEVBQUUsQ0FBQzs0QkFDL0IsSUFBQSxpQkFBTyxFQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNuRCxDQUFDOzZCQUFNLENBQUM7NEJBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGlCQUFPLEVBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7d0JBQzVFLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBkZWNyeXB0LCBlbmNyeXB0LCBieXRlc1RvV29yZCB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IGdldFNlZWQgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuXG5kZXNjcmliZSgnYnl0ZXNUb1dvcmQnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgZmFpbCBpZiBpbnB1dCBpcyBub3QgYSBVaW50OEFycmF5JywgKCkgPT4ge1xuICAgIGxldCBpbnB1dEFycjogYW55ID0gWzAsIDAsIDAsIDBdO1xuICAgICgoKSA9PiBieXRlc1RvV29yZChpbnB1dEFycikpLnNob3VsZC50aHJvdygpO1xuXG4gICAgaW5wdXRBcnIgPSB7fTtcbiAgICAoKCkgPT4gYnl0ZXNUb1dvcmQoaW5wdXRBcnIpKS5zaG91bGQudGhyb3coKTtcblxuICAgIGlucHV0QXJyID0gJ2FiYyc7XG4gICAgKCgpID0+IGJ5dGVzVG9Xb3JkKGlucHV0QXJyKSkuc2hvdWxkLnRocm93KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiBpbnB1dCBpcyBub3QgZXhhY3RseSA0IGVsZW1lbnRzJywgKCkgPT4ge1xuICAgIGxldCBpbnB1dEFyciA9IFVpbnQ4QXJyYXkub2YoMHhmZiwgMHhmZiwgMHhmZik7XG4gICAgKCgpID0+IGJ5dGVzVG9Xb3JkKGlucHV0QXJyKSkuc2hvdWxkLnRocm93KCk7XG5cbiAgICBpbnB1dEFyciA9IFVpbnQ4QXJyYXkub2YoMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZik7XG4gICAgKCgpID0+IGJ5dGVzVG9Xb3JkKGlucHV0QXJyKSkuc2hvdWxkLnRocm93KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY29udmVydCB0byAwJywgKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0QXJyID0gVWludDhBcnJheS5vZigwLCAwLCAwLCAwKTtcblxuICAgIGNvbnN0IHJlcyA9IGJ5dGVzVG9Xb3JkKGlucHV0QXJyKTtcbiAgICByZXMuc2hvdWxkLmVxdWFsKDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvbnZlcnQgdG8gMiBeIDMyIC0gMScsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dEFyciA9IFVpbnQ4QXJyYXkub2YoMHhmZiwgMHhmZiwgMHhmZiwgMHhmZik7XG5cbiAgICBjb25zdCByZXMgPSBieXRlc1RvV29yZChpbnB1dEFycik7XG4gICAgcmVzLnNob3VsZC5lcXVhbChNYXRoLnBvdygyLCAzMikgLSAxKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb252ZXJ0IHRvIDIgXiAxNicsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dEFyciA9IFVpbnQ4QXJyYXkub2YoMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCk7XG5cbiAgICBjb25zdCByZXMgPSBieXRlc1RvV29yZChpbnB1dEFycik7XG4gICAgcmVzLnNob3VsZC5lcXVhbChNYXRoLnBvdygyLCAxNikpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvbnZlcnQgMTAwMCByYW5kb20gbnVtYmVycycsICgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykge1xuICAgICAgY29uc3QgaW5wdXRBcnIgPSByYW5kb21CeXRlcyg0KTtcbiAgICAgIGNvbnN0IHJlc1N0ciA9IGJ5dGVzVG9Xb3JkKGlucHV0QXJyKS50b1N0cmluZygxNik7XG4gICAgICBjb25zdCBhcnJTdHIgPSBpbnB1dEFyci50b1N0cmluZygnaGV4Jyk7XG4gICAgICBwYXJzZUludChyZXNTdHIsIDE2KS5zaG91bGQuZXF1YWwocGFyc2VJbnQoYXJyU3RyLCAxNikpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2VuY3J5cHQsIGRlY3J5cHQnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHBhc3N3b3JkcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDIgfSkubWFwKChfLCBpKSA9PiBga2V5LyR7aX1gKTtcbiAgY29uc3QgcGxhaW50ZXh0cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDIgfSkubWFwKChfLCBpKSA9PiBgcGxhaW50ZXh0LyR7aX1gKTtcblxuICBpdCgnbWF0Y2hlcyBmaXh0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3Jkc1swXSwgcGxhaW50ZXh0c1swXSwge1xuICAgICAgc2FsdDogZ2V0U2VlZChgcmFuZG9tU2FsdGApLnNsaWNlKDAsIDgpLFxuICAgICAgaXY6IGdldFNlZWQoYHJhbmRvbUlWYCkuc2xpY2UoMCwgMTYpLFxuICAgIH0pO1xuICAgIGNpcGhlcnRleHQuc2hvdWxkLmVxbChcbiAgICAgICd7XCJpdlwiOlwiQlZETjFJcE9lSjZFNWtTVjg4TXNIQT09XCIsXCJ2XCI6MSxcIml0ZXJcIjoxMDAwMCxcImtzXCI6MjU2LFwidHNcIjo2NCxcIm1vZGVcIjpcImNjbVwiLFwiYWRhdGFcIjpcIlwiLFwiY2lwaGVyXCI6XCJhZXNcIixcInNhbHRcIjpcImFKamxIK21LVzFFPVwiLFwiY3RcIjpcImxvSkVzRnV5cEtaTVoraWdxQ1VtYndRZk13PT1cIn0nXG4gICAgKTtcbiAgICBKU09OLnBhcnNlKGNpcGhlcnRleHQpLnNob3VsZC5lcWwoe1xuICAgICAgYWRhdGE6ICcnLFxuICAgICAgY2lwaGVyOiAnYWVzJyxcbiAgICAgIGN0OiAnbG9KRXNGdXlwS1pNWitpZ3FDVW1id1FmTXc9PScsXG4gICAgICBpdGVyOiAxMDAwMCxcbiAgICAgIGl2OiAnQlZETjFJcE9lSjZFNWtTVjg4TXNIQT09JyxcbiAgICAgIGtzOiAyNTYsXG4gICAgICBtb2RlOiAnY2NtJyxcbiAgICAgIHNhbHQ6ICdhSmpsSCttS1cxRT0nLFxuICAgICAgdHM6IDY0LFxuICAgICAgdjogMSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2VuY3J5cHRzIGFuZCBkZWNyeXB0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBwYXNzd29yZHMuZm9yRWFjaCgocGFzc3dvcmQpID0+IHtcbiAgICAgIHBsYWludGV4dHMuZm9yRWFjaCgocGxhaW50ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpcGhlcnRleHQxID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgICAgY29uc3QgY2lwaGVydGV4dDIgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgICAoY2lwaGVydGV4dDEgPT09IGNpcGhlcnRleHQyKS5zaG91bGQuZXFsKGZhbHNlKTtcblxuICAgICAgICBbY2lwaGVydGV4dDEsIGNpcGhlcnRleHQyXS5mb3JFYWNoKChjdCkgPT4ge1xuICAgICAgICAgIHBhc3N3b3Jkcy5mb3JFYWNoKChvdGhlclBhc3N3b3JkKSA9PiB7XG4gICAgICAgICAgICBpZiAocGFzc3dvcmQgPT09IG90aGVyUGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgZGVjcnlwdChvdGhlclBhc3N3b3JkLCBjdCkuc2hvdWxkLmVxbChwbGFpbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBkZWNyeXB0KG90aGVyUGFzc3dvcmQsIGN0KSwgL2NjbTogdGFnIGRvZXNuJ3QgbWF0Y2gvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==

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


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