UNPKG

bitcore-wallet-client-dash

Version:
403 lines (359 loc) 21 kB
'use strict'; var _ = require('lodash'); var chai = chai || require('chai'); var sinon = sinon || require('sinon'); var should = chai.should(); var Constants = require('../lib/common/constants'); var Credentials = require('../lib/credentials'); var TestData = require('./testdata'); describe('Credentials', function() { describe('#create', function() { it('Should create', function() { var c = Credentials.create('btc', 'livenet'); should.exist(c.xPrivKey); should.exist(c.copayerId); }); it('Should create random credentials', function() { var all = {}; for (var i = 0; i < 10; i++) { var c = Credentials.create('btc', 'livenet'); var exist = all[c.xPrivKey]; should.not.exist(exist); all[c.xPrivKey] = 1; } }); }); describe('#getBaseAddressDerivationPath', function() { it('should return path for livenet', function() { var c = Credentials.create('btc', 'livenet'); var path = c.getBaseAddressDerivationPath(); path.should.equal("m/44'/5'/0'"); }); it('should return path for testnet account 2', function() { var c = Credentials.create('btc', 'testnet'); c.account = 2; var path = c.getBaseAddressDerivationPath(); path.should.equal("m/44'/1'/2'"); }); it('should return path for BIP45', function() { var c = Credentials.create('btc', 'livenet'); c.derivationStrategy = Constants.DERIVATION_STRATEGIES.BIP45; var path = c.getBaseAddressDerivationPath(); path.should.equal("m/45'"); }); }); describe('#getDerivedXPrivKey', function() { it('should derive extended private key from master livenet', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'xprv9s21ZrQH143K3zLpjtB4J4yrRfDTEfbrMa9vLZaTAv5BzASwBmA16mdBmZKpMLssw1AzTnm31HAD2pk2bsnZ9dccxaLD48mRdhtw82XoiBi', 0, 'BIP44'); var xpk = c.getDerivedXPrivKey().toString(); xpk.should.equal('xprv9yyTSKGrpBwXwAjcTYzmDDYRdP5x9xMrwsiikX85eBFbYDvrPJUW5247qwaDCb8DZ5cGtPYwhsXn7wEZZQDJ1G9Q7VUXFZwELiC8SWWcVLb'); }); it('should derive extended private key from master testnet', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'tprv8ZgxMBicQKsPfPX8avSJXY1tZYJJESNg8vR88i8rJFkQJm6HgPPtDEmD36NLVSJWV5ieejVCK62NdggXmfMEHog598PxvXuLEsWgE6tKdwz', 0, 'BIP44'); var xpk = c.getDerivedXPrivKey().toString(); xpk.should.equal('tprv8gBu8N7JbHZs7MsW4kgE8LAYMhGJES9JP6DHsj2gw9Tc5PrF5Grr9ynAZkH1LyWsxjaAyCuEMFKTKhzdSaykpqzUnmEhpLsxfujWHA66N93'); }); it('should derive extended private key from master BIP48 livenet', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'xprv9s21ZrQH143K3zLpjtB4J4yrRfDTEfbrMa9vLZaTAv5BzASwBmA16mdBmZKpMLssw1AzTnm31HAD2pk2bsnZ9dccxaLD48mRdhtw82XoiBi', 0, 'BIP48'); var xpk = c.getDerivedXPrivKey().toString(); xpk.should.equal('xprv9zSi7DBnJDEmh5JCd9SpeupJrmePdHA9tLcx8tiRZVmwp8EN6w34pUUWUu9vEm6VzRcAku2YFDDPuSaCB9ePusmgK9dJSEVmjuSw6gakbqD'); }); it('should derive extended private key from master livenet (BIP45)', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'xprv9s21ZrQH143K3zLpjtB4J4yrRfDTEfbrMa9vLZaTAv5BzASwBmA16mdBmZKpMLssw1AzTnm31HAD2pk2bsnZ9dccxaLD48mRdhtw82XoiBi', 0, 'BIP45'); var xpk = c.getDerivedXPrivKey().toString(); xpk.should.equal('xprv9vDaAbbvT8LHKr8v5A2JeFJrnbQk6ZrMDGWuiv2vZgSyugeV4RE7Z9QjBNYsdafdhwEGb6Y48DRrXFVKvYRAub9ExzcmJHt6Js6ybJCSssm'); }); it('should set addressType & BIP45', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'xprv9s21ZrQH143K3zLpjtB4J4yrRfDTEfbrMa9vLZaTAv5BzASwBmA16mdBmZKpMLssw1AzTnm31HAD2pk2bsnZ9dccxaLD48mRdhtw82XoiBi', 8, 'BIP45'); c.addWalletInfo(1, 'name', 1, 1, 'juan'); c.account.should.equal(8); }); it('should derive compliant child', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'tprv8ZgxMBicQKsPd8U9aBBJ5J2v8XMwKwZvf8qcu2gLK5FRrsrPeSgkEcNHqKx4zwv6cP536m68q2UD7wVM24zdSCpaJRmpowaeJTeVMXL5v5k', 0, 'BIP44'); c.compliantDerivation.should.be.true; var xpk = c.getDerivedXPrivKey().toString(); xpk.should.equal('tprv8gXvQvjGt7oYCTRD3d4oeQr9B7JLuC2B6S854F4XWCQ4pr9NcjokH9kouWMAp1MJKy4Y8QLBgbmPtk3i7RegVzaWhWsnVPi4ZmykJXt4HeV'); }); it('should derive non-compliant child', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'tprv8ZgxMBicQKsPd8U9aBBJ5J2v8XMwKwZvf8qcu2gLK5FRrsrPeSgkEcNHqKx4zwv6cP536m68q2UD7wVM24zdSCpaJRmpowaeJTeVMXL5v5k', 0, 'BIP44', { nonCompliantDerivation: true }); c.compliantDerivation.should.be.false; var xpk = c.getDerivedXPrivKey().toString(); xpk.should.equal('tprv8gSy16H5hQ1MKNHzZDzsktr4aaGQSHg4XYVEbfsEiGSBcgw4J8dEm8uf19FH4L9h6W47VBKtc3bbYyjb6HAm6QdyRLpB6fsA7bW19RZnby2'); }); }); describe('#fromExtendedPrivateKey', function() { it('Should create credentials from seed', function() { var xPriv = 'xprv9s21ZrQH143K2TjT3rF4m5AJcMvCetfQbVjFEx1Rped8qzcMJwbqxv21k3ftL69z7n3gqvvHthkdzbW14gxEFDYQdrRQMub3XdkJyt3GGGc'; var c = Credentials.fromExtendedPrivateKey('btc', xPriv, 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K2TjT3rF4m5AJcMvCetfQbVjFEx1Rped8qzcMJwbqxv21k3ftL69z7n3gqvvHthkdzbW14gxEFDYQdrRQMub3XdkJyt3GGGc'); c.xPubKey.should.equal('xpub6Ch4Yh5DJ1iiGN2f8oEV4J2HRiScn2mgcBpYH2bRq9y4Wgy9ePW8FWhrPEcshKZ6dYLYJaFK6BeHznMDS32dKp7VPTU8e5UpNNjSXYDn1Se'); c.copayerId.should.equal('73392bb9c2caf268182c5594c0c5cd65cf22411581db8e8b43b98eefa4a7d841'); c.network.should.equal('livenet'); c.personalEncryptingKey.should.equal('M4MTmfRZaTtX6izAAxTpJg=='); should.not.exist(c.walletPrivKey); }); it('Should create credentials from seed and walletPrivateKey', function() { var xPriv = 'xprv9s21ZrQH143K2TjT3rF4m5AJcMvCetfQbVjFEx1Rped8qzcMJwbqxv21k3ftL69z7n3gqvvHthkdzbW14gxEFDYQdrRQMub3XdkJyt3GGGc'; var wKey = 'a28840e18650b1de8cb83bcd2213672a728be38a63e70680b0c2be9c452e2d4d'; var c = Credentials.fromExtendedPrivateKey('btc', xPriv, 0, 'BIP44', { walletPrivKey: 'a28840e18650b1de8cb83bcd2213672a728be38a63e70680b0c2be9c452e2d4d'}); c.xPrivKey.should.equal('xprv9s21ZrQH143K2TjT3rF4m5AJcMvCetfQbVjFEx1Rped8qzcMJwbqxv21k3ftL69z7n3gqvvHthkdzbW14gxEFDYQdrRQMub3XdkJyt3GGGc'); c.walletPrivKey.should.equal(wKey); }); describe('Compliant derivation', function() { it('Should create compliant base address derivation key', function() { var xPriv = 'xprv9s21ZrQH143K4HHBKb6APEoa5i58fxeFWP1x5AGMfr6zXB3A6Hjt7f9LrPXp9P7CiTCA3Hk66cS4g8enUHWpYHpNhtufxSrSpcbaQyVX163'; var c = Credentials.fromExtendedPrivateKey('btc', xPriv, 0, 'BIP44'); c.xPubKey.should.equal('xpub6D64Vj1b48f8Tw4imnQupPLfheinLyjtjmoJ1vTGKrEkf9AztQmQR9ovAFYwhLGMtkdQQqBwxN4LU8fTEeC1pD6tPW9VXwRji49mqeyrGsQ'); }); it('Should create compliant request key', function() { var xPriv = 'xprv9s21ZrQH143K3xMCR1BNaUrTuh1XJnsj8KjEL5VpQty3NY8ufgbR8SjZS8B4offHq6Jj5WhgFpM2dcYxeqLLCuj1wgMnSfmZuPUtGk8rWT7'; var c = Credentials.fromExtendedPrivateKey('btc', xPriv, 0, 'BIP44'); c.requestPrivKey.should.equal('559371263eb0b2fd9cd2aa773ca5fea69ed1f9d9bdb8a094db321f02e9d53cec'); }); it('should accept non-compliant derivation as a parameter when importing', function() { var c = Credentials.fromExtendedPrivateKey('btc', 'tprv8ZgxMBicQKsPd8U9aBBJ5J2v8XMwKwZvf8qcu2gLK5FRrsrPeSgkEcNHqKx4zwv6cP536m68q2UD7wVM24zdSCpaJRmpowaeJTeVMXL5v5k', 0, 'BIP44', { nonCompliantDerivation: true }); c.xPrivKey.should.equal('tprv8ZgxMBicQKsPd8U9aBBJ5J2v8XMwKwZvf8qcu2gLK5FRrsrPeSgkEcNHqKx4zwv6cP536m68q2UD7wVM24zdSCpaJRmpowaeJTeVMXL5v5k'); c.compliantDerivation.should.be.false; c.xPubKey.should.equal('tpubDD919WKKqmh2CqKnSsfUAJWB9bnLbcry6r61tBuY8YEaTBBpvXSpwdXXBGAB1n4JRFDC7ebo7if3psUAMpvQJUBe3LcjuMNA6Y4nP8U9SNg'); c.getDerivedXPrivKey().toString().should.equal("tprv8gSy16H5hQ1MKNHzZDzsktr4aaGQSHg4XYVEbfsEiGSBcgw4J8dEm8uf19FH4L9h6W47VBKtc3bbYyjb6HAm6QdyRLpB6fsA7bW19RZnby2"); }); }); }); describe('#fromMnemonic', function() { it('Should create credentials from mnemonic BIP44', function() { var words = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; var c = Credentials.fromMnemonic('btc', 'livenet', words, '', 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLisriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu'); c.network.should.equal('livenet'); c.account.should.equal(0); c.derivationStrategy.should.equal('BIP44'); c.xPubKey.should.equal('xpub6CYEjsU6zPM3sADS2ubu2aZeGxCm3C5KabkCpo4rkNbXGAH9M7rRUJ4E5CKiyUddmRzrSCopPzisTBrXkfCD4o577XKM9mzyZtP1Xdbizyk'); c.getBaseAddressDerivationPath().should.equal("m/44'/5'/0'"); }); it('Should create credentials from mnemonic BIP48', function() { var words = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; var c = Credentials.fromMnemonic('btc', 'livenet', words, '', 0, 'BIP48'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLisriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu'); c.network.should.equal('livenet'); c.account.should.equal(0); c.derivationStrategy.should.equal('BIP48'); c.xPubKey.should.equal('xpub6CL6EgjiTdEgvbwZHAhbaHVoBTUJB1pfrGgSn7gmGXpPwE4mMbaX5WCjj9Fe69mwkpJup2QPuCeCLzwZYQUV1GoZc8wQnkdnVvZF1dGvNzD'); c.getBaseAddressDerivationPath().should.equal("m/48'/5'/0'"); }); it('Should create credentials from mnemonic account 1', function() { var words = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; var c = Credentials.fromMnemonic('btc', 'livenet', words, '', 1, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLisriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu'); c.account.should.equal(1); c.xPubKey.should.equal('xpub6CYEjsU6zPM3sjyA2Kfki79ceB3pHuivaAez2u3KbBwiyRMgQLayfoLCpm26YbM2TPiDdkvEZ19Mra9kXqmWYgtg5CoHfZpqnmE6ii91kDH'); c.getBaseAddressDerivationPath().should.equal("m/44'/5'/1'"); }); it('Should create credentials from mnemonic with undefined/null passphrase', function() { var words = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; var c = Credentials.fromMnemonic('btc', 'livenet', words, undefined, 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLisriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu'); c = Credentials.fromMnemonic('btc', 'livenet', words, null, 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3GJpoapnV8SFfukcVBSfeCficPSGfubmSFDxo1kuHnLisriDvSnRRuL2Qrg5ggqHKNVpxR86QEC8w35uxmGoggxtQTPvfUu'); }); it('Should create credentials from mnemonic and passphrase', function() { var words = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; var c = Credentials.fromMnemonic('btc', 'livenet', words, 'húngaro', 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K2LkGEPHqW8w5vMJ3giizin94rFpSM5Ys5KhDaP7Hde3rEuzC7VpZDtNX643bJdvhHnkbhKMNmLx3Yi6H8WEsHBBox3qbpqq'); }); it('Should create credentials from mnemonic and passphrase for testnet account 2', function() { var words = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; var c = Credentials.fromMnemonic('btc', 'testnet', words, 'húngaro', 2, 'BIP44'); c.xPrivKey.should.equal('tprv8ZgxMBicQKsPd9yntx9LfnZ5EUiFvEm14L4BigEtq43LrvSJZkT39PRJA69r7sCsbKuJ69fMTzWVkeJLpXhKaQDe5MJanrxvCGwEPnNxN85'); c.network.should.equal('testnet'); c.xPubKey.should.equal('tpubDCoAP4Ut9MXK5CakPFPudKAP4yCw6Xr7uzV2129v2LTa3eBoPoUGMqi2y3kmh83oRGX93m7EehB6LWan5GTSVD8yUnV5Jc7Kjzfa3Zsf8nE'); c.getBaseAddressDerivationPath().should.equal("m/44'/1'/2'"); }); it('Should create credentials from mnemonic (ES)', function() { var words = 'afirmar diseño hielo fideo etapa ogro cambio fideo toalla pomelo número buscar'; var c = Credentials.fromMnemonic('btc', 'livenet', words, '', 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3H3WtXCn9nHtpi7Fz1ZE9VJErWErhrGL4hV1cApFVo3t4aANoPF7ufcLLWqN168izu3xGQdLaGxXG2qYZF8wWQGNWnuSSon'); c.network.should.equal('livenet'); }); describe('Compliant derivation', function() { it('Should create compliant base address derivation key from mnemonic', function() { var words = "shoulder sphere pull seven top much black copy labor dress depth unit"; var c = Credentials.fromMnemonic('btc', 'livenet', words, '', 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3WoNK8dVjQJpcXhqfwyuBTpuZdc1ZVa9yWW2i7TmM4TLyfPrSKXctQuLgbg3U1WJmodK9yWM26JWeuh2vhT6bmsPPie688n'); c.xPubKey.should.equal('xpub6C6KUNNB8LyRvniJ2hra19WTMp5Uk4h5shKHNhuo4MsqAGtSpjE9b1iMHcjCjeaTZozyoLYEAhV78o611zxXhPe9jpJ3LeikhwT2mSmsNcn'); }); it('Should create compliant request key from mnemonic', function() { var words = "pool stomach bridge series powder mammal betray slogan pass roast neglect reunion"; var c = Credentials.fromMnemonic('btc', 'livenet', words, '', 0, 'BIP44'); c.xPrivKey.should.equal('xprv9s21ZrQH143K3ZMudFRXpEwftifDuJkjLKnCtk26pXhxQuK8bCnytJuUTGkfvaibnCxPQQ9xToUtDAZkJqjm3W62GBXXr7JwhiAz1XWgTUJ'); c.requestPrivKey.should.equal('7582efa9b71aefa831823592d753704cba9648b810b14b77ee078dfe8b730157'); }); it('should accept non-compliant derivation as a parameter when importing', function() { var c = Credentials.fromMnemonic('btc', 'testnet', 'level unusual burger hole call main basic flee drama diary argue legal', '', 0, 'BIP44', { nonCompliantDerivation: true }); c.xPrivKey.should.equal('tprv8ZgxMBicQKsPd8U9aBBJ5J2v8XMwKwZvf8qcu2gLK5FRrsrPeSgkEcNHqKx4zwv6cP536m68q2UD7wVM24zdSCpaJRmpowaeJTeVMXL5v5k'); c.compliantDerivation.should.be.false; c.xPubKey.should.equal('tpubDD919WKKqmh2CqKnSsfUAJWB9bnLbcry6r61tBuY8YEaTBBpvXSpwdXXBGAB1n4JRFDC7ebo7if3psUAMpvQJUBe3LcjuMNA6Y4nP8U9SNg'); c.getDerivedXPrivKey().toString().should.equal("tprv8gSy16H5hQ1MKNHzZDzsktr4aaGQSHg4XYVEbfsEiGSBcgw4J8dEm8uf19FH4L9h6W47VBKtc3bbYyjb6HAm6QdyRLpB6fsA7bW19RZnby2"); }); }); }); describe('#createWithMnemonic', function() { it('Should create credentials with mnemonic', function() { var c = Credentials.createWithMnemonic('btc', 'livenet', '', 'en', 0); should.exist(c.mnemonic); c.mnemonic.split(' ').length.should.equal(12); c.network.should.equal('livenet'); c.account.should.equal(0); }); it('should assume derivation compliance on new credentials', function() { var c = Credentials.createWithMnemonic('btc', 'livenet', '', 'en', 0); c.compliantDerivation.should.be.true; var xPrivKey = c.getDerivedXPrivKey(); should.exist(xPrivKey); }); it('Should create credentials with mnemonic (testnet)', function() { var c = Credentials.createWithMnemonic('btc', 'testnet', '', 'en', 0); should.exist(c.mnemonic); c.mnemonic.split(' ').length.should.equal(12); c.network.should.equal('testnet'); }); it('Should return and clear mnemonic', function() { var c = Credentials.createWithMnemonic('btc', 'testnet', '', 'en', 0); should.exist(c.mnemonic); c.getMnemonic().split(' ').length.should.equal(12); c.clearMnemonic(); should.not.exist(c.getMnemonic()); }); }); describe('#createWithMnemonic #fromMnemonic roundtrip', function() { _.each(['en', 'es', 'ja', 'zh', 'fr'], function(lang) { it('Should verify roundtrip create/from with ' + lang + '/passphrase', function() { var c = Credentials.createWithMnemonic('btc', 'testnet', 'holamundo', lang, 0); should.exist(c.mnemonic); var words = c.mnemonic; var xPriv = c.xPrivKey; var path = c.getBaseAddressDerivationPath(); var c2 = Credentials.fromMnemonic('btc', 'testnet', words, 'holamundo', 0, 'BIP44'); should.exist(c2.mnemonic); words.should.be.equal(c2.mnemonic); c2.xPrivKey.should.equal(c.xPrivKey); c2.network.should.equal(c.network); c2.getBaseAddressDerivationPath().should.equal(path); }); }); it('Should fail roundtrip create/from with ES/passphrase with wrong passphrase', function() { var c = Credentials.createWithMnemonic('btc', 'testnet', 'holamundo', 'es', 0); should.exist(c.mnemonic); var words = c.mnemonic; var xPriv = c.xPrivKey; var path = c.getBaseAddressDerivationPath(); var c2 = Credentials.fromMnemonic('btc', 'testnet', words, 'chaumundo', 0, 'BIP44'); c2.network.should.equal(c.network); c2.getBaseAddressDerivationPath().should.equal(path); c2.xPrivKey.should.not.equal(c.xPrivKey); }); }); describe('Private key encryption', function() { describe('#encryptPrivateKey', function() { it('should encrypt private key and remove cleartext', function() { var c = Credentials.createWithMnemonic('btc', 'livenet', '', 'en', 0); c.encryptPrivateKey('password'); c.isPrivKeyEncrypted().should.be.true; should.exist(c.xPrivKeyEncrypted); should.exist(c.mnemonicEncrypted); should.not.exist(c.xPrivKey); should.not.exist(c.mnemonic); }); it('should fail to encrypt private key if already encrypted', function() { var c = Credentials.create('btc', 'livenet'); c.encryptPrivateKey('password'); var err; try { c.encryptPrivateKey('password'); } catch (ex) { err = ex; } should.exist(err); }); }); describe('#decryptPrivateKey', function() { it('should decrypt private key', function() { var c = Credentials.createWithMnemonic('btc', 'livenet', '', 'en', 0); c.encryptPrivateKey('password'); c.isPrivKeyEncrypted().should.be.true; c.decryptPrivateKey('password'); c.isPrivKeyEncrypted().should.be.false; should.exist(c.xPrivKey); should.exist(c.mnemonic); should.not.exist(c.xPrivKeyEncrypted); should.not.exist(c.mnemonicEncrypted); }); it('should fail to decrypt private key with wrong password', function() { var c = Credentials.createWithMnemonic('btc', 'livenet', '', 'en', 0); c.encryptPrivateKey('password'); var err; try { c.decryptPrivateKey('wrong'); } catch (ex) { err = ex; } should.exist(err); c.isPrivKeyEncrypted().should.be.true; should.exist(c.mnemonicEncrypted); should.not.exist(c.mnemonic); }); it('should fail to decrypt private key when not encrypted', function() { var c = Credentials.create('btc', 'livenet'); var err; try { c.decryptPrivateKey('password'); } catch (ex) { err = ex; } should.exist(err); c.isPrivKeyEncrypted().should.be.false; }); }); describe('#getKeys', function() { it('should get keys regardless of encryption', function() { var c = Credentials.createWithMnemonic('btc', 'livenet', '', 'en', 0); var keys = c.getKeys(); should.exist(keys); should.exist(keys.xPrivKey); should.exist(keys.mnemonic); keys.xPrivKey.should.equal(c.xPrivKey); keys.mnemonic.should.equal(c.mnemonic); c.encryptPrivateKey('password'); c.isPrivKeyEncrypted().should.be.true; var keys2 = c.getKeys('password'); should.exist(keys2); keys2.should.deep.equal(keys); c.decryptPrivateKey('password'); c.isPrivKeyEncrypted().should.be.false; var keys3 = c.getKeys(); should.exist(keys3); keys3.should.deep.equal(keys); }); it('should get derived keys regardless of encryption', function() { var c = Credentials.createWithMnemonic('btc', 'livenet', '', 'en', 0); var xPrivKey = c.getDerivedXPrivKey(); should.exist(xPrivKey); c.encryptPrivateKey('password'); c.isPrivKeyEncrypted().should.be.true; var xPrivKey2 = c.getDerivedXPrivKey('password'); should.exist(xPrivKey2); xPrivKey2.toString('hex').should.equal(xPrivKey.toString('hex')); c.decryptPrivateKey('password'); c.isPrivKeyEncrypted().should.be.false; var xPrivKey3 = c.getDerivedXPrivKey(); should.exist(xPrivKey3); xPrivKey3.toString('hex').should.equal(xPrivKey.toString('hex')); }); }); }); });