PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-core/dist/test/unit/bitgo/trading/network
Просмотр файла: encrypt.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert_1 = __importDefault(require("assert"));
const crypto_1 = __importDefault(require("crypto"));
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const decrypt_rsa_1 = require("../../../../../src/bitgo/trading/network/decrypt-rsa");
const encrypt_rsa_1 = require("../../../../../src/bitgo/trading/network/encrypt-rsa");
const encrypt_rsa_browser_1 = require("../../../../../src/bitgo/trading/network/encrypt-rsa-browser");
const decrypt_aes_gcm_1 = require("../../../../../src/bitgo/trading/network/decrypt-aes-gcm");
const encrypt_aes_gcm_1 = require("../../../../../src/bitgo/trading/network/encrypt-aes-gcm");
const network_1 = require("../../../../../src/bitgo/trading/network");
describe('network encrypt', () => {
const privateKey = fs_1.default.readFileSync(path_1.default.resolve(__dirname, './private-key.pem'));
const publicKey = fs_1.default.readFileSync(path_1.default.resolve(__dirname, './public-key.pub'));
const password = 'password';
let encryptedRsa;
let decryptedRsa;
let encryptedBrowserRsa;
it('should encrypt the string with a rsa public key', async () => {
encryptedRsa = await (0, encrypt_rsa_1._encryptRsa)(publicKey.toString(), password);
(0, assert_1.default)(encryptedRsa);
});
it('should decrypt the string with a rsa public key', async () => {
decryptedRsa = await (0, decrypt_rsa_1._decryptRsa)(privateKey.toString(), encryptedRsa);
(0, assert_1.default)(decryptedRsa);
assert_1.default.strictEqual(decryptedRsa, password);
});
it('should encrypt the string with a rsa public key for the browser', async () => {
encryptedBrowserRsa = await (0, encrypt_rsa_browser_1._encryptBrowserRsa)(publicKey.toString(), password);
(0, assert_1.default)(encryptedBrowserRsa);
});
it('should encrypt and decrypt aes-gcm', async () => {
// Use encryptAesGcm and decryptAesGcm
const text = 'secret';
const gcmKey = crypto_1.default.randomBytes(32).toString('base64');
const encrypted = await (0, encrypt_aes_gcm_1._encryptAesGcm)(gcmKey, text);
const decrypted = await (0, decrypt_aes_gcm_1._decryptAesGcm)(gcmKey, encrypted);
assert_1.default.strictEqual(decrypted, text);
});
let encryptedRsaWithAesGcm;
let decryptedRsaWithAesGcm;
let encryptedBrowserRsaWithAesGcm;
let decryptedBrowserRsaWithAesGcm;
it('should encrypt and decrypt RsaWithAesGcm', async () => {
encryptedRsaWithAesGcm = await (0, network_1.encryptRsaWithAesGcm)(publicKey.toString(), password);
decryptedRsaWithAesGcm = await (0, network_1.decryptRsaWithAesGcm)(privateKey.toString(), encryptedRsaWithAesGcm);
(0, assert_1.default)(encryptedRsaWithAesGcm);
(0, assert_1.default)(decryptedRsaWithAesGcm);
});
it('should encrypt and decrypt RsaWithAesGcm for the browser', async () => {
encryptedBrowserRsaWithAesGcm = await (0, network_1.encryptBrowserRsaWithAesGcm)(publicKey.toString(), password);
decryptedBrowserRsaWithAesGcm = await (0, network_1.decryptRsaWithAesGcm)(privateKey.toString(), encryptedBrowserRsaWithAesGcm);
assert_1.default.strictEqual(decryptedBrowserRsaWithAesGcm, password);
assert_1.default.strictEqual(decryptedRsaWithAesGcm, decryptedBrowserRsaWithAesGcm);
});
it('should check that the encryptions for node and browser work with each other', async () => {
// We only care about browser and node encryption working with node decryption
// We will never decrypt in the browser
const browserEncrypted = await (0, encrypt_rsa_browser_1._encryptBrowserRsa)(publicKey.toString(), password);
const nodeDecrypted = await (0, decrypt_rsa_1._decryptRsa)(privateKey.toString(), browserEncrypted);
assert_1.default.strictEqual(nodeDecrypted, password);
const browserEncryptedWithAesGcm = await (0, network_1.encryptBrowserRsaWithAesGcm)(publicKey.toString(), password);
const nodeDecryptedWithAesGcm = await (0, network_1.decryptRsaWithAesGcm)(privateKey.toString(), browserEncryptedWithAesGcm);
assert_1.default.strictEqual(nodeDecryptedWithAesGcm, password);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby90cmFkaW5nL25ldHdvcmsvZW5jcnlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixzRkFBbUY7QUFDbkYsc0ZBQW1GO0FBQ25GLHNHQUFrRztBQUNsRyw4RkFBMEY7QUFDMUYsOEZBQTBGO0FBQzFGLHNFQUlrRDtBQUVsRCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLE1BQU0sVUFBVSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sU0FBUyxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRS9FLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLFlBQVksQ0FBQztJQUNqQixJQUFJLFlBQVksQ0FBQztJQUNqQixJQUFJLG1CQUFtQixDQUFDO0lBRXhCLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRCxZQUFZLEdBQUcsTUFBTSxJQUFBLHlCQUFXLEVBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUEsZ0JBQU0sRUFBQyxZQUFZLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRCxZQUFZLEdBQUcsTUFBTSxJQUFBLHlCQUFXLEVBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FB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QSw4QkFBb0IsRUFBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUM5RyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgX2RlY3J5cHRSc2EgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrL2RlY3J5cHQtcnNhJztcbmltcG9ydCB7IF9lbmNyeXB0UnNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3RyYWRpbmcvbmV0d29yay9lbmNyeXB0LXJzYSc7XG5pbXBvcnQgeyBfZW5jcnlwdEJyb3dzZXJSc2EgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrL2VuY3J5cHQtcnNhLWJyb3dzZXInO1xuaW1wb3J0IHsgX2RlY3J5cHRBZXNHY20gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrL2RlY3J5cHQtYWVzLWdjbSc7XG5pbXBvcnQgeyBfZW5jcnlwdEFlc0djbSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby90cmFkaW5nL25ldHdvcmsvZW5jcnlwdC1hZXMtZ2NtJztcbmltcG9ydCB7XG4gIGRlY3J5cHRSc2FXaXRoQWVzR2NtLFxuICBlbmNyeXB0QnJvd3NlclJzYVdpdGhBZXNHY20sXG4gIGVuY3J5cHRSc2FXaXRoQWVzR2NtLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdHJhZGluZy9uZXR3b3JrJztcblxuZGVzY3JpYmUoJ25ldHdvcmsgZW5jcnlwdCcsICgpID0+IHtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9wcml2YXRlLWtleS5wZW0nKSk7XG4gIGNvbnN0IHB1YmxpY0tleSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9wdWJsaWMta2V5LnB1YicpKTtcblxuICBjb25zdCBwYXNzd29yZCA9ICdwYXNzd29yZCc7XG5cbiAgbGV0IGVuY3J5cHRlZFJzYTtcbiAgbGV0IGRlY3J5cHRlZFJzYTtcbiAgbGV0IGVuY3J5cHRlZEJyb3dzZXJSc2E7XG5cbiAgaXQoJ3Nob3VsZCBlbmNyeXB0IHRoZSBzdHJpbmcgd2l0aCBhIHJzYSBwdWJsaWMga2V5JywgYXN5bmMgKCkgPT4ge1xuICAgIGVuY3J5cHRlZFJzYSA9IGF3YWl0IF9lbmNyeXB0UnNhKHB1YmxpY0tleS50b1N0cmluZygpLCBwYXNzd29yZCk7XG4gICAgYXNzZXJ0KGVuY3J5cHRlZFJzYSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVjcnlwdCB0aGUgc3RyaW5nIHdpdGggYSByc2EgcHVibGljIGtleScsIGFzeW5jICgpID0+IHtcbiAgICBkZWNyeXB0ZWRSc2EgPSBhd2FpdCBfZGVjcnlwdFJzYShwcml2YXRlS2V5LnRvU3RyaW5nKCksIGVuY3J5cHRlZFJzYSk7XG4gICAgYXNzZXJ0KGRlY3J5cHRlZFJzYSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlY3J5cHRlZFJzYSwgcGFzc3dvcmQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY3J5cHQgdGhlIHN0cmluZyB3aXRoIGEgcnNhIHB1YmxpYyBrZXkgZm9yIHRoZSBicm93c2VyJywgYXN5bmMgKCkgPT4ge1xuICAgIGVuY3J5cHRlZEJyb3dzZXJSc2EgPSBhd2FpdCBfZW5jcnlwdEJyb3dzZXJSc2EocHVibGljS2V5LnRvU3RyaW5nKCksIHBhc3N3b3JkKTtcbiAgICBhc3NlcnQoZW5jcnlwdGVkQnJvd3NlclJzYSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZW5jcnlwdCBhbmQgZGVjcnlwdCBhZXMtZ2NtJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFVzZSBlbmNyeXB0QWVzR2NtIGFuZCBkZWNyeXB0QWVzR2NtXG4gICAgY29uc3QgdGV4dCA9ICdzZWNyZXQnO1xuICAgIGNvbnN0IGdjbUtleSA9IGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IF9lbmNyeXB0QWVzR2NtKGdjbUtleSwgdGV4dCk7XG4gICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgX2RlY3J5cHRBZXNHY20oZ2NtS2V5LCBlbmNyeXB0ZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChkZWNyeXB0ZWQsIHRleHQpO1xuICB9KTtcblxuICBsZXQgZW5jcnlwdGVkUnNhV2l0aEFlc0djbTtcbiAgbGV0IGRlY3J5cHRlZFJzYVdpdGhBZXNHY207XG4gIGxldCBlbmNyeXB0ZWRCcm93c2VyUnNhV2l0aEFlc0djbTtcbiAgbGV0IGRlY3J5cHRlZEJyb3dzZXJSc2FXaXRoQWVzR2NtO1xuXG4gIGl0KCdzaG91bGQgZW5jcnlwdCBhbmQgZGVjcnlwdCBSc2FXaXRoQWVzR2NtJywgYXN5bmMgKCkgPT4ge1xuICAgIGVuY3J5cHRlZFJzYVdpdGhBZXNHY20gPSBhd2FpdCBlbmNyeXB0UnNhV2l0aEFlc0djbShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGRlY3J5cHRlZFJzYVdpdGhBZXNHY20gPSBhd2FpdCBkZWNyeXB0UnNhV2l0aEFlc0djbShwcml2YXRlS2V5LnRvU3RyaW5nKCksIGVuY3J5cHRlZFJzYVdpdGhBZXNHY20pO1xuICAgIGFzc2VydChlbmNyeXB0ZWRSc2FXaXRoQWVzR2NtKTtcbiAgICBhc3NlcnQoZGVjcnlwdGVkUnNhV2l0aEFlc0djbSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZW5jcnlwdCBhbmQgZGVjcnlwdCBSc2FXaXRoQWVzR2NtIGZvciB0aGUgYnJvd3NlcicsIGFzeW5jICgpID0+IHtcbiAgICBlbmNyeXB0ZWRCcm93c2VyUnNhV2l0aEFlc0djbSA9IGF3YWl0IGVuY3J5cHRCcm93c2VyUnNhV2l0aEFlc0djbShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGRlY3J5cHRlZEJyb3dzZXJSc2FXaXRoQWVzR2NtID0gYXdhaXQgZGVjcnlwdFJzYVdpdGhBZXNHY20ocHJpdmF0ZUtleS50b1N0cmluZygpLCBlbmNyeXB0ZWRCcm93c2VyUnNhV2l0aEFlc0djbSk7XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkQnJvd3NlclJzYVdpdGhBZXNHY20sIHBhc3N3b3JkKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkUnNhV2l0aEFlc0djbSwgZGVjcnlwdGVkQnJvd3NlclJzYVdpdGhBZXNHY20pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIHRoYXQgdGhlIGVuY3J5cHRpb25zIGZvciBub2RlIGFuZCBicm93c2VyIHdvcmsgd2l0aCBlYWNoIG90aGVyJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBicm93c2VyIGFuZCBub2RlIGVuY3J5cHRpb24gd29ya2luZyB3aXRoIG5vZGUgZGVjcnlwdGlvblxuICAgIC8vIFdlIHdpbGwgbmV2ZXIgZGVjcnlwdCBpbiB0aGUgYnJvd3NlclxuXG4gICAgY29uc3QgYnJvd3NlckVuY3J5cHRlZCA9IGF3YWl0IF9lbmNyeXB0QnJvd3NlclJzYShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGNvbnN0IG5vZGVEZWNyeXB0ZWQgPSBhd2FpdCBfZGVjcnlwdFJzYShwcml2YXRlS2V5LnRvU3RyaW5nKCksIGJyb3dzZXJFbmNyeXB0ZWQpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChub2RlRGVjcnlwdGVkLCBwYXNzd29yZCk7XG5cbiAgICBjb25zdCBicm93c2VyRW5jcnlwdGVkV2l0aEFlc0djbSA9IGF3YWl0IGVuY3J5cHRCcm93c2VyUnNhV2l0aEFlc0djbShwdWJsaWNLZXkudG9TdHJpbmcoKSwgcGFzc3dvcmQpO1xuICAgIGNvbnN0IG5vZGVEZWNyeXB0ZWRXaXRoQWVzR2NtID0gYXdhaXQgZGVjcnlwdFJzYVdpdGhBZXNHY20ocHJpdmF0ZUtleS50b1N0cmluZygpLCBicm93c2VyRW5jcnlwdGVkV2l0aEFlc0djbSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5vZGVEZWNyeXB0ZWRXaXRoQWVzR2NtLCBwYXNzd29yZCk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!