PHP WebShell

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

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

//
// Tests for Keychains
//
// Copyright 2014, BitGo, Inc.  All Rights Reserved.
//
/* eslint-disable @typescript-eslint/no-empty-function */

import { strict as assert } from 'assert';
import 'should';
import * as _ from 'lodash';

const TestBitGo = require('../lib/test_bitgo');

describe('Keychains', function () {
  let bitgo;
  let keychains;

  before(function (done) {
    bitgo = new TestBitGo();
    bitgo.initializeTestVars();
    keychains = bitgo.keychains();
    bitgo.authenticateTestUser(bitgo.testUserOTP(), function (err, response) {
      if (err) {
        throw err;
      }
      done();
    });
  });

  describe('Local', function () {
    it('isValid', function () {
      assert.throws(function () {
        keychains.isValid('');
      });
      assert.throws(function () {
        keychains.isValid({});
      });
      assert.equal(keychains.isValid({ key: 'hello world' }), false);
      assert.equal(keychains.isValid({ key: 'xpub123123' }), false);
      assert.equal(keychains.isValid({ key: 'xprv123123' }), false);

      assert.equal(
        keychains.isValid({
          key: 'xpub661MyMwAqRbcH5xFjpBfCe74cj5tks4nxE8hSMepNfsMVsBkx8eT1m9mnR1tAMGdbbdsE8yMDcuZ3NgVJbTzCYDiu8rcc3sqLF6vzi9yfTB',
        }),
        true
      );
      assert.equal(
        keychains.isValid({
          key: 'xprv9s21ZrQH143K2hrPzWSx6ZXUbcq6Skc22ZsACrjzx6wae8fV63x9gbixpv89ssBvcYLju8BSbjSVF1q2DM1BnFdhi65fgbYrS5WE9UzZaaw',
        }),
        true
      );
    });

    it('create', function () {
      // must use seed of at least 128 bits
      // standard test vector taken from bip32 spec
      const seed = Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex');
      assert.equal(
        keychains.create({ seed: seed }).xprv,
        'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi'
      );

      // two keys created one after the other with no seed should have
      // non-equivalent xprivs, i.e. check that the RNG is actually working.
      assert.notEqual(keychains.create().xprv, keychains.create().xprv);
    });

    it('deriveLocal', function () {
      assert.throws(function () {
        keychains.deriveLocal('');
      });
      assert.throws(function () {
        keychains.deriveLocal({});
      });
      assert.throws(function () {
        keychains.deriveLocal({ path: 'm/0/1' });
      });
      assert.throws(function () {
        keychains.deriveLocal({
          path: 'm/0/1',
          xprv: 'xprv9xDfxS6Lqhq1CHyU5RouJbbBTjtv2GUwfQ5Xg14vWuj4YizffPA2G8HVyoNNyqTrfdN47QHJnP9bjwn7G9d6oAxDnbRyugouXmNeVZHfJ6P',
          xpub: 'xpub6BD2MwdEg5PJQn3wBTLufjXv1mjQRjCo2d18UPUY5FG3RXKpCvUGovbyq6oa1hWuvGb5P4F5mG3tKZYh7chDkQrdBTfKhH5iXPR5g4men9L',
        });
      });

      const xprvDerivation = keychains.deriveLocal({
        path: 'm/0/1',
        xprv: 'xprv9s21ZrQH143K2JF8RafpqtKiTbsbaxEeUaMnNHsm5o6wCW3z8ySyH4UxFVSfZ8n7ESu7fgir8imbZKLYVBxFPND1pniTZ81vKfd45EHKX73',
      });
      assert.equal(
        xprvDerivation.xprv,
        'xprv9xDfxS6Lqhq1CHyU5RouJbbBTjtv2GUwfQ5Xg14vWuj4YizffPA2G8HVyoNNyqTrfdN47QHJnP9bjwn7G9d6oAxDnbRyugouXmNeVZHfJ6P'
      );
      assert.equal(
        xprvDerivation.xpub,
        'xpub6BD2MwdEg5PJQn3wBTLufjXv1mjQRjCo2d18UPUY5FG3RXKpCvUGovbyq6oa1hWuvGb5P4F5mG3tKZYh7chDkQrdBTfKhH5iXPR5g4men9L'
      );

      const xpubDerivation = keychains.deriveLocal({
        path: 'm/0/1',
        xpub: 'xpub6BD2MwdEg5PJQn3wBTLufjXv1mjQRjCo2d18UPUY5FG3RXKpCvUGovbyq6oa1hWuvGb5P4F5mG3tKZYh7chDkQrdBTfKhH5iXPR5g4men9L',
      });
      assert.equal(
        xpubDerivation.xpub,
        'xpub6Ee6yTYU8n4jBALmLc7jn88vQkuEUEN4xEyre8Y8f4UeTE9Wv4kQoVBc2EBkDN4bHSf5TrHFEUFM6ZWboxrDXuthejjm61ukBSnM3sEYtM9'
      );
      assert.equal(xpubDerivation.xprv, undefined);
    });
  });

  describe('List', function () {
    it('arguments', function () {
      assert.throws(function () {
        keychains.list({}, 'invalid');
      });
      assert.throws(function () {
        keychains.list('invalid');
      });
      assert.throws(function () {
        keychains.list('invalid', function () {});
      });
    });

    it('all', function (done) {
      keychains.list({}, function (err, keychains) {
        assert.equal(err, null);
        assert.equal(Array.isArray(keychains), true);
        done();
      });
    });
  });

  describe('Update Password', function () {
    let bitgo;
    let keychains;
    let correctPassword;

    before(async function beforeUpdatePassword() {
      bitgo = new TestBitGo({ env: 'test' });
      bitgo.initializeTestVars();
      keychains = bitgo.keychains();
      const loginPasswords = await bitgo.authenticateChangePWTestUser(bitgo.testUserOTP());
      correctPassword = loginPasswords.password;
      await bitgo.unlock({ otp: bitgo.testUserOTP() });
    });

    it('successful update the password for all v1 keychains that are encrypted with the old password', async function itUpdatePassword() {
      const newPassword = 'newPassword';
      const result = await keychains.updatePassword({ oldPassword: correctPassword, newPassword });
      _.forOwn(result.keychains, function (encryptedXprv, xpub) {
        xpub.should.startWith('xpub');
        try {
          const decryptedPrv = bitgo.decrypt({ input: encryptedXprv, password: newPassword });
          decryptedPrv.should.startWith('xprv');
        } catch (e) {
          // the decryption didn't work because of the wrong password, this is one of the keychains that wasn't
          // encrypted with the old password
          e.message.should.startWith('password error');
        }
      });
      result.should.hasOwnProperty('version');
    });
  });

  describe('Get', function () {
    it('arguments', function () {
      assert.throws(function () {
        keychains.get('invalid');
      });
      assert.throws(function () {
        keychains.get({}, function () {});
      });
    });

    it('non existent keychain', function (done) {
      const newKey = keychains.create();
      const options = {
        xpub: newKey.xpub,
      };
      keychains.get(options, function (err, keychain) {
        assert.ok(err);
        done();
      });
    });
  });

  describe('Add', function () {
    it('arguments', function () {
      assert.throws(function () {
        keychains.create('invalid');
      });
      assert.throws(function () {
        keychains.add();
      });
      assert.throws(function () {
        keychains.add('invalid');
      });
      assert.throws(function () {
        keychains.add({}, 0);
      });
    });

    describe('public', function () {
      let extendedKey;

      before(function (done) {
        // Generate a new keychain
        extendedKey = keychains.create();

        bitgo.unlock({ otp: bitgo.testUserOTP() }, function (err) {
          assert.equal(err, null);
          done();
        });
      });

      it('add', function (done) {
        const options = {
          xpub: extendedKey.xpub,
        };
        keychains.add(options, function (err, keychain) {
          assert.equal(err, null);
          assert.equal(keychain.xpub, extendedKey.xpub);
          assert.equal(keychain.path, 'm');
          done();
        });
      });

      it('get', function (done) {
        const options = {
          xpub: extendedKey.xpub,
        };
        keychains.get(options, function (err, keychain) {
          assert.equal(err, null);
          assert.equal(keychain.xpub, extendedKey.xpub);
          assert.equal(keychain.path, 'm');
          done();
        });
      });
    });

    describe('private', function () {
      let extendedKey;

      before(function () {
        // Generate a new keychain
        extendedKey = keychains.create();
      });

      it('add', function (done) {
        const options = {
          xpub: extendedKey.xpub,
          encryptedXprv: 'xyzzy',
        };
        keychains.add(options, function (err, keychain) {
          assert.equal(err, null);
          assert.equal(keychain.xpub, extendedKey.xpub);
          assert.equal(keychain.path, 'm');
          assert.equal(keychain.encryptedXprv, 'xyzzy');
          done();
        });
      });

      it('get', function (done) {
        const options = {
          xpub: extendedKey.xpub,
        };
        keychains.get(options, function (err, keychain) {
          assert.equal(err, null);
          assert.equal(keychain.xpub, extendedKey.xpub);
          assert.equal(keychain.path, 'm');
          assert.equal(keychain.encryptedXprv, 'xyzzy');
          done();
        });
      });
    });
  });

  describe('Create Backup', function () {
    it('arguments', function () {
      assert.throws(function () {
        keychains.createBackup('invalid');
      });
      assert.throws(function () {
        keychains.createBackup();
      });
      assert.throws(function () {
        keychains.createBackup({}, 0);
      });
    });

    describe('prederived key', function () {
      let generatedXPub;
      it('add', function () {
        const options = {
          provider: 'bitgo',
        };
        return keychains.createBackup(options).then(function (keychain) {
          keychain.should.have.property('xpub');
          keychain.should.have.property('path');
          generatedXPub = keychain.xpub;
        });
      });

      it('get', function () {
        const options = {
          xpub: generatedXPub,
        };
        return keychains.get(options).then(function (keychain) {
          keychain.should.have.property('xpub');
          keychain.should.have.property('path');
          keychain.xpub.should.eql(generatedXPub);
        });
      });
    });
  });

  describe('Update', function () {
    let newKey;

    before(function () {
      newKey = keychains.create();
    });

    it('arguments', function () {
      assert.throws(function () {
        keychains.get('invalid');
      });
      assert.throws(function () {
        keychains.get({}, function () {});
      });
    });

    it('non existent keychain', function (done) {
      const options = {
        xpub: newKey.xpub,
      };
      keychains.get(options, function (err, keychain) {
        assert.ok(err);
        done();
      });
    });

    it('update ', function (done) {
      const options: any = {
        xpub: newKey.xpub,
      };
      keychains.add(options, function (err, keychain) {
        assert.equal(err, null);
        assert.equal(keychain.xpub, newKey.xpub);
        assert.equal(keychain.path, 'm');

        options.label = 'new label';
        options.encryptedXprv = 'abracadabra';
        keychains.update(options, function (err, keychain) {
          assert.equal(err, null);
          assert.equal(keychain.xpub, newKey.xpub);
          assert.equal(keychain.encryptedXprv, 'abracadabra');
          assert.equal(keychain.path, 'm');
          done();
        });
      });
    });
  });
});

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


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