UNPKG

bitgo

Version:
91 lines • 13.9 kB
"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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZW5jcnlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOztHQUVHO0FBQ0gsaUNBQWtDO0FBRWxDLG1DQUFxQztBQUNyQyw0Q0FBK0Q7QUFDL0QsOENBQTBDO0FBRTFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO0lBQzNCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7UUFDbEQsSUFBSSxRQUFRLEdBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEscUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLHFCQUFXLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFN0MsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEscUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7UUFDeEQsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxxQkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTdDLFFBQVEsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJ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QUVoRCxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDeEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO3dCQUNsQyxJQUFJLFFBQVEsS0FBSyxhQUFhLEVBQUUsQ0FBQzs0QkFDL0IsSUFBQSxpQkFBTyxFQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNuRCxDQUFDOzZCQUFNLENBQUM7NEJBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGlCQUFPLEVBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7d0JBQzVFLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBzaG91bGQgPSByZXF1aXJlKCdzaG91bGQnKTtcblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCwgYnl0ZXNUb1dvcmQgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBnZXRTZWVkIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcblxuZGVzY3JpYmUoJ2J5dGVzVG9Xb3JkJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGZhaWwgaWYgaW5wdXQgaXMgbm90IGEgVWludDhBcnJheScsICgpID0+IHtcbiAgICBsZXQgaW5wdXRBcnI6IGFueSA9IFswLCAwLCAwLCAwXTtcbiAgICAoKCkgPT4gYnl0ZXNUb1dvcmQoaW5wdXRBcnIpKS5zaG91bGQudGhyb3coKTtcblxuICAgIGlucHV0QXJyID0ge307XG4gICAgKCgpID0+IGJ5dGVzVG9Xb3JkKGlucHV0QXJyKSkuc2hvdWxkLnRocm93KCk7XG5cbiAgICBpbnB1dEFyciA9ICdhYmMnO1xuICAgICgoKSA9PiBieXRlc1RvV29yZChpbnB1dEFycikpLnNob3VsZC50aHJvdygpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgaW5wdXQgaXMgbm90IGV4YWN0bHkgNCBlbGVtZW50cycsICgpID0+IHtcbiAgICBsZXQgaW5wdXRBcnIgPSBVaW50OEFycmF5Lm9mKDB4ZmYsIDB4ZmYsIDB4ZmYpO1xuICAgICgoKSA9PiBieXRlc1RvV29yZChpbnB1dEFycikpLnNob3VsZC50aHJvdygpO1xuXG4gICAgaW5wdXRBcnIgPSBVaW50OEFycmF5Lm9mKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpO1xuICAgICgoKSA9PiBieXRlc1RvV29yZChpbnB1dEFycikpLnNob3VsZC50aHJvdygpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvbnZlcnQgdG8gMCcsICgpID0+IHtcbiAgICBjb25zdCBpbnB1dEFyciA9IFVpbnQ4QXJyYXkub2YoMCwgMCwgMCwgMCk7XG5cbiAgICBjb25zdCByZXMgPSBieXRlc1RvV29yZChpbnB1dEFycik7XG4gICAgcmVzLnNob3VsZC5lcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb252ZXJ0IHRvIDIgXiAzMiAtIDEnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXRBcnIgPSBVaW50OEFycmF5Lm9mKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpO1xuXG4gICAgY29uc3QgcmVzID0gYnl0ZXNUb1dvcmQoaW5wdXRBcnIpO1xuICAgIHJlcy5zaG91bGQuZXF1YWwoTWF0aC5wb3coMiwgMzIpIC0gMSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY29udmVydCB0byAyIF4gMTYnLCAoKSA9PiB7XG4gICAgY29uc3QgaW5wdXRBcnIgPSBVaW50OEFycmF5Lm9mKDB4MDAsIDB4MDEsIDB4MDAsIDB4MDApO1xuXG4gICAgY29uc3QgcmVzID0gYnl0ZXNUb1dvcmQoaW5wdXRBcnIpO1xuICAgIHJlcy5zaG91bGQuZXF1YWwoTWF0aC5wb3coMiwgMTYpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb252ZXJ0IDEwMDAgcmFuZG9tIG51bWJlcnMnLCAoKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHtcbiAgICAgIGNvbnN0IGlucHV0QXJyID0gcmFuZG9tQnl0ZXMoNCk7XG4gICAgICBjb25zdCByZXNTdHIgPSBieXRlc1RvV29yZChpbnB1dEFycikudG9TdHJpbmcoMTYpO1xuICAgICAgY29uc3QgYXJyU3RyID0gaW5wdXRBcnIudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgcGFyc2VJbnQocmVzU3RyLCAxNikuc2hvdWxkLmVxdWFsKHBhcnNlSW50KGFyclN0ciwgMTYpKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdlbmNyeXB0LCBkZWNyeXB0JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwYXNzd29yZHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyIH0pLm1hcCgoXywgaSkgPT4gYGtleS8ke2l9YCk7XG4gIGNvbnN0IHBsYWludGV4dHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyIH0pLm1hcCgoXywgaSkgPT4gYHBsYWludGV4dC8ke2l9YCk7XG5cbiAgaXQoJ21hdGNoZXMgZml4dHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZHNbMF0sIHBsYWludGV4dHNbMF0sIHtcbiAgICAgIHNhbHQ6IGdldFNlZWQoYHJhbmRvbVNhbHRgKS5zbGljZSgwLCA4KSxcbiAgICAgIGl2OiBnZXRTZWVkKGByYW5kb21JVmApLnNsaWNlKDAsIDE2KSxcbiAgICB9KTtcbiAgICBjaXBoZXJ0ZXh0LnNob3VsZC5lcWwoXG4gICAgICAne1wiaXZcIjpcIkJWRE4xSXBPZUo2RTVrU1Y4OE1zSEE9PVwiLFwidlwiOjEsXCJpdGVyXCI6MTAwMDAsXCJrc1wiOjI1NixcInRzXCI6NjQsXCJtb2RlXCI6XCJjY21cIixcImFkYXRhXCI6XCJcIixcImNpcGhlclwiOlwiYWVzXCIsXCJzYWx0XCI6XCJhSmpsSCttS1cxRT1cIixcImN0XCI6XCJsb0pFc0Z1eXBLWk1aK2lncUNVbWJ3UWZNdz09XCJ9J1xuICAgICk7XG4gICAgSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KS5zaG91bGQuZXFsKHtcbiAgICAgIGFkYXRhOiAnJyxcbiAgICAgIGNpcGhlcjogJ2FlcycsXG4gICAgICBjdDogJ2xvSkVzRnV5cEtaTVoraWdxQ1VtYndRZk13PT0nLFxuICAgICAgaXRlcjogMTAwMDAsXG4gICAgICBpdjogJ0JWRE4xSXBPZUo2RTVrU1Y4OE1zSEE9PScsXG4gICAgICBrczogMjU2LFxuICAgICAgbW9kZTogJ2NjbScsXG4gICAgICBzYWx0OiAnYUpqbEgrbUtXMUU9JyxcbiAgICAgIHRzOiA2NCxcbiAgICAgIHY6IDEsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdlbmNyeXB0cyBhbmQgZGVjcnlwdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgcGFzc3dvcmRzLmZvckVhY2goKHBhc3N3b3JkKSA9PiB7XG4gICAgICBwbGFpbnRleHRzLmZvckVhY2goKHBsYWludGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBjaXBoZXJ0ZXh0MSA9IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCk7XG4gICAgICAgIGNvbnN0IGNpcGhlcnRleHQyID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgICAgKGNpcGhlcnRleHQxID09PSBjaXBoZXJ0ZXh0Mikuc2hvdWxkLmVxbChmYWxzZSk7XG5cbiAgICAgICAgW2NpcGhlcnRleHQxLCBjaXBoZXJ0ZXh0Ml0uZm9yRWFjaCgoY3QpID0+IHtcbiAgICAgICAgICBwYXNzd29yZHMuZm9yRWFjaCgob3RoZXJQYXNzd29yZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09PSBvdGhlclBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgIGRlY3J5cHQob3RoZXJQYXNzd29yZCwgY3QpLnNob3VsZC5lcWwocGxhaW50ZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gZGVjcnlwdChvdGhlclBhc3N3b3JkLCBjdCksIC9jY206IHRhZyBkb2Vzbid0IG1hdGNoLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=