Skip to content

Commit 3b99ab7

Browse files
authored
Merge pull request bitpay#2121 from matiu/ref/rm-bip45
Ref/rm bip45
2 parents 4b33dac + 6aa8e7f commit 3b99ab7

File tree

7 files changed

+26
-603
lines changed

7 files changed

+26
-603
lines changed

packages/bitcore-wallet-client/lib/api.js

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2386,29 +2386,6 @@ API.prototype.getWalletIdsFromOldCopay = function(username, password, blob) {
23862386
return _.uniq(ids);
23872387
};
23882388

2389-
2390-
/**
2391-
* createWalletFromOldCopay
2392-
*
2393-
* @param username
2394-
* @param password
2395-
* @param blob
2396-
* @param cb
2397-
* @return {undefined}
2398-
*/
2399-
API.prototype.createWalletFromOldCopay = function(username, password, blob, cb) {
2400-
var self = this;
2401-
var w = this._oldCopayDecrypt(username, password, blob);
2402-
if (!w) return cb(new Error('Could not decrypt'));
2403-
2404-
if (w.publicKeyRing.copayersExtPubKeys.length != w.opts.totalCopayers)
2405-
return cb(new Error('Wallet is incomplete, cannot be imported'));
2406-
2407-
this.credentials = Credentials.fromOldCopayWallet(w);
2408-
this.request.setCredentials(this.credentials);
2409-
this.recreateWallet(cb);
2410-
};
2411-
24122389
API.PayPro = PayPro;
24132390

24142391
module.exports = API;

packages/bitcore-wallet-client/lib/credentials.js

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -484,58 +484,4 @@ Credentials.prototype.clearMnemonic = function() {
484484
delete this.mnemonicEncrypted;
485485
};
486486

487-
488-
Credentials.fromOldCopayWallet = function(w) {
489-
function walletPrivKeyFromOldCopayWallet(w) {
490-
// IN BWS, the master Pub Keys are not sent to the server,
491-
// so it is safe to use them as seed for wallet's shared secret.
492-
var seed = w.publicKeyRing.copayersExtPubKeys.sort().join('');
493-
var seedBuf = new Buffer(seed);
494-
var privKey = new Bitcore.PrivateKey.fromBuffer(Bitcore.crypto.Hash.sha256(seedBuf));
495-
return privKey.toString();
496-
};
497-
498-
var credentials = new Credentials();
499-
credentials.coin = 'btc';
500-
credentials.derivationStrategy = Constants.DERIVATION_STRATEGIES.BIP45;
501-
credentials.xPrivKey = w.privateKey.extendedPrivateKeyString;
502-
credentials._expand();
503-
504-
credentials.addWalletPrivateKey(walletPrivKeyFromOldCopayWallet(w));
505-
credentials.addWalletInfo(w.opts.id, w.opts.name, w.opts.requiredCopayers, w.opts.totalCopayers)
506-
507-
var pkr = _.map(w.publicKeyRing.copayersExtPubKeys, function(xPubStr) {
508-
509-
var isMe = xPubStr === credentials.xPubKey;
510-
var requestDerivation;
511-
512-
if (isMe) {
513-
var path = Constants.PATHS.REQUEST_KEY;
514-
requestDerivation = (new Bitcore.HDPrivateKey(credentials.xPrivKey))
515-
.deriveChild(path).hdPublicKey;
516-
} else {
517-
// this
518-
var path = Constants.PATHS.REQUEST_KEY_AUTH;
519-
requestDerivation = (new Bitcore.HDPublicKey(xPubStr)).deriveChild(path);
520-
}
521-
522-
// Grab Copayer Name
523-
var hd = new Bitcore.HDPublicKey(xPubStr).deriveChild('m/2147483646/0/0');
524-
var pubKey = hd.publicKey.toString('hex');
525-
var copayerName = w.publicKeyRing.nicknameFor[pubKey];
526-
if (isMe) {
527-
credentials.copayerName = copayerName;
528-
}
529-
530-
return {
531-
xPubKey: xPubStr,
532-
requestPubKey: requestDerivation.publicKey.toString(),
533-
copayerName: copayerName,
534-
};
535-
});
536-
credentials.addPublicKeyRing(pkr);
537-
return credentials;
538-
};
539-
540-
541487
module.exports = Credentials;

packages/bitcore-wallet-client/test/client.js

Lines changed: 0 additions & 231 deletions
Original file line numberDiff line numberDiff line change
@@ -4866,237 +4866,6 @@ describe('client API', function() {
48664866
});
48674867
});
48684868

4869-
describe('Legacy Copay Import', function() {
4870-
var db2;
4871-
before( (done) => {
4872-
helpers.newDb(2,(err,in_db) => {
4873-
db2 = in_db;
4874-
return done(err);
4875-
});
4876-
});
4877-
4878-
it('Should get wallets from profile', function(done) {
4879-
var t = ImportData.copayers[0];
4880-
var c = helpers.newClient(app);
4881-
var ids = c.getWalletIdsFromOldCopay(t.username, t.password, t.ls['profile::4872dd8b2ceaa54f922e8e6ba6a8eaa77b488721']);
4882-
ids.should.deep.equal([
4883-
'8f197244e661f4d0',
4884-
'4d32f0737a05f072',
4885-
'e2c2d72024979ded',
4886-
'7065a73486c8cb5d'
4887-
]);
4888-
done();
4889-
});
4890-
it('Should import a 1-1 wallet', function(done) {
4891-
var t = ImportData.copayers[0];
4892-
var c = helpers.newClient(app);
4893-
c.createWalletFromOldCopay(t.username, t.password, t.ls['wallet::e2c2d72024979ded'], function(err) {
4894-
should.not.exist(err);
4895-
c.credentials.m.should.equal(1);
4896-
c.credentials.n.should.equal(1);
4897-
4898-
c.createAddress(function(err, x0) {
4899-
should.not.exist(err);
4900-
// This is the first 'shared' address, created automatically
4901-
// by old copay
4902-
x0.address.should.equal('2N3w8sJUyAXCQirqNsTayWr7pWADFNdncmf');
4903-
c.getStatus({}, function(err, status) {
4904-
should.not.exist(err);
4905-
status.wallet.name.should.equal('1-1');
4906-
status.wallet.status.should.equal('complete');
4907-
c.credentials.walletId.should.equal('e2c2d72024979ded');
4908-
c.credentials.walletPrivKey.should.equal('c3463113c6e1d0fc2f2bd520f7d9d62f8e1fdcdd96005254571c64902aeb1648');
4909-
c.credentials.sharedEncryptingKey.should.equal('x3D/7QHa4PkKMbSXEvXwaw==');
4910-
status.wallet.copayers.length.should.equal(1);
4911-
status.wallet.copayers[0].name.should.equal('123');
4912-
done();
4913-
});
4914-
});
4915-
});
4916-
});
4917-
4918-
it('Should to import the same wallet twice with different clients', function(done) {
4919-
var t = ImportData.copayers[0];
4920-
var c = helpers.newClient(app);
4921-
c.createWalletFromOldCopay(t.username, t.password, t.ls['wallet::4d32f0737a05f072'], function(err) {
4922-
should.not.exist(err);
4923-
c.getStatus({}, function(err, status) {
4924-
should.not.exist(err);
4925-
status.wallet.status.should.equal('complete');
4926-
c.credentials.walletId.should.equal('4d32f0737a05f072');
4927-
var c2 = helpers.newClient(app);
4928-
c2.createWalletFromOldCopay(t.username, t.password, t.ls['wallet::4d32f0737a05f072'], function(err) {
4929-
should.not.exist(err);
4930-
c2.getStatus({}, function(err, status) {
4931-
should.not.exist(err);
4932-
status.wallet.status.should.equal('complete');
4933-
c2.credentials.walletId.should.equal('4d32f0737a05f072');
4934-
done();
4935-
});
4936-
});
4937-
});
4938-
});
4939-
});
4940-
4941-
it('Should not fail when importing the same wallet twice, same copayer', function(done) {
4942-
var t = ImportData.copayers[0];
4943-
var c = helpers.newClient(app);
4944-
c.createWalletFromOldCopay(t.username, t.password, t.ls['wallet::4d32f0737a05f072'], function(err) {
4945-
should.not.exist(err);
4946-
c.getStatus({}, function(err, status) {
4947-
should.not.exist(err);
4948-
status.wallet.status.should.equal('complete');
4949-
c.credentials.walletId.should.equal('4d32f0737a05f072');
4950-
c.createWalletFromOldCopay(t.username, t.password, t.ls['wallet::4d32f0737a05f072'], function(err) {
4951-
should.not.exist(err);
4952-
done();
4953-
});
4954-
});
4955-
});
4956-
});
4957-
4958-
it('Should import and complete 2-2 wallet from 2 copayers, and create addresses', function(done) {
4959-
var t = ImportData.copayers[0];
4960-
var c = helpers.newClient(app);
4961-
c.createWalletFromOldCopay(t.username, t.password, t.ls['wallet::4d32f0737a05f072'], function(err) {
4962-
should.not.exist(err);
4963-
c.getStatus({}, function(err, status) {
4964-
should.not.exist(err);
4965-
status.wallet.status.should.equal('complete');
4966-
c.credentials.sharedEncryptingKey.should.equal('Ou2j4kq3z1w4yTr9YybVxg==');
4967-
4968-
var t2 = ImportData.copayers[1];
4969-
var c2 = helpers.newClient(app);
4970-
c2.createWalletFromOldCopay(t2.username, t2.password, t2.ls['wallet::4d32f0737a05f072'], function(err) {
4971-
should.not.exist(err);
4972-
c2.credentials.sharedEncryptingKey.should.equal('Ou2j4kq3z1w4yTr9YybVxg==');
4973-
4974-
// This should pull the non-temporary keys
4975-
c2.getStatus({}, function(err, status) {
4976-
should.not.exist(err);
4977-
status.wallet.status.should.equal('complete');
4978-
c2.createAddress(function(err, x0) {
4979-
x0.address.should.be.equal('2Mv1DHpozzZ9fup2nZ1kmdRXoNnDJ8b1JF2');
4980-
c.createAddress(function(err, x0) {
4981-
x0.address.should.be.equal('2N2dZ1HogpxHVKv3CD2R4WrhWRwqZtpDc2M');
4982-
done();
4983-
});
4984-
});
4985-
});
4986-
});
4987-
});
4988-
});
4989-
});
4990-
4991-
it('Should import and complete 2-3 wallet from 2 copayers, and create addresses', function(done) {
4992-
var w = 'wallet::7065a73486c8cb5d';
4993-
var key = 'fS4HhoRd25KJY4VpNpO1jg==';
4994-
var t = ImportData.copayers[0];
4995-
var c = helpers.newClient(app);
4996-
c.createWalletFromOldCopay(t.username, t.password, t.ls[w], function(err) {
4997-
should.not.exist(err);
4998-
c.getStatus({}, function(err, status) {
4999-
should.not.exist(err);
5000-
status.wallet.status.should.equal('complete');
5001-
c.credentials.sharedEncryptingKey.should.equal(key);
5002-
5003-
var t2 = ImportData.copayers[1];
5004-
var c2 = helpers.newClient(app);
5005-
c2.createWalletFromOldCopay(t2.username, t2.password, t2.ls[w], function(err) {
5006-
should.not.exist(err);
5007-
c2.credentials.sharedEncryptingKey.should.equal(key);
5008-
5009-
c2.getStatus({}, function(err, status) {
5010-
should.not.exist(err);
5011-
status.wallet.status.should.equal('complete');
5012-
5013-
var t3 = ImportData.copayers[2];
5014-
var c3 = helpers.newClient(app);
5015-
c3.createWalletFromOldCopay(t3.username, t3.password, t3.ls[w], function(err) {
5016-
should.not.exist(err);
5017-
c3.credentials.sharedEncryptingKey.should.equal(key);
5018-
5019-
// This should pull the non-temporary keys
5020-
c3.getStatus({}, function(err, status) {
5021-
should.not.exist(err);
5022-
status.wallet.status.should.equal('complete');
5023-
done();
5024-
});
5025-
});
5026-
});
5027-
});
5028-
});
5029-
});
5030-
});
5031-
5032-
it('Should import a 2-3 wallet from 2 copayers, and recreate it, and then on the recreated other copayers should be able to access', function(done) {
5033-
var w = 'wallet::7065a73486c8cb5d';
5034-
var key = 'fS4HhoRd25KJY4VpNpO1jg==';
5035-
var t = ImportData.copayers[0];
5036-
var c = helpers.newClient(app);
5037-
c.createWalletFromOldCopay(t.username, t.password, t.ls[w], function(err) {
5038-
should.not.exist(err);
5039-
var t2 = ImportData.copayers[1];
5040-
var c2 = helpers.newClient(app);
5041-
c2.createWalletFromOldCopay(t2.username, t2.password, t2.ls[w], function(err) {
5042-
should.not.exist(err);
5043-
5044-
// New BWS server...
5045-
var storage = new Storage({
5046-
db: db2,
5047-
});
5048-
var newApp;
5049-
var expressApp = new ExpressApp();
5050-
expressApp.start({
5051-
storage: storage,
5052-
blockchainExplorer: blockchainExplorerMock,
5053-
disableLogs: true,
5054-
},
5055-
function() {
5056-
newApp = expressApp.app;
5057-
});
5058-
var recoveryClient = helpers.newClient(newApp);
5059-
recoveryClient.import(c.export());
5060-
5061-
/*
5062-
* This is to export 2 old BIP45 wallets
5063-
var b= c.export();
5064-
5065-
var e = sjcl.encrypt('hola', b, {
5066-
iter: 10000
5067-
});
5068-
console.log("[client.js.4813] C EXPORT\n", e); //TODO
5069-
5070-
b= c2.export();
5071-
e= sjcl.encrypt('hola', b, {
5072-
iter: 10000
5073-
});
5074-
5075-
console.log("[client.js.4813] C2 EXPORT\n", e); //TODO
5076-
*/
5077-
5078-
recoveryClient.recreateWallet(function(err) {
5079-
should.not.exist(err);
5080-
recoveryClient.getStatus({}, function(err, status) {
5081-
should.not.exist(err);
5082-
_.map(status.wallet.copayers, 'name').sort().should.deep.equal(['123', '234', '345']);
5083-
var t2 = ImportData.copayers[1];
5084-
var c2p = helpers.newClient(newApp);
5085-
c2p.createWalletFromOldCopay(t2.username, t2.password, t2.ls[w], function(err) {
5086-
should.not.exist(err);
5087-
c2p.getStatus({}, function(err, status) {
5088-
should.not.exist(err);
5089-
_.map(status.wallet.copayers, 'name').sort().should.deep.equal(['123', '234', '345']);
5090-
done();
5091-
});
5092-
});
5093-
});
5094-
});
5095-
});
5096-
});
5097-
});
5098-
});
5099-
51004869
describe('Private key encryption', function() {
51014870
var password = 'jesuissatoshi';
51024871
var c1, c2;

packages/bitcore-wallet-service/src/lib/expressapp.ts

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -244,19 +244,7 @@ export class ExpressApp {
244244
// DEPRECATED
245245
router.post('/v1/wallets/', createWalletLimiter, (req, res) => {
246246
logDeprecated(req);
247-
let server;
248-
try {
249-
server = getServer(req, res);
250-
} catch (ex) {
251-
return returnError(ex, res, req);
252-
}
253-
req.body.supportBIP44AndP2PKH = false;
254-
server.createWallet(req.body, (err, walletId) => {
255-
if (err) return returnError(err, res, req);
256-
res.json({
257-
walletId
258-
});
259-
});
247+
return returnError(new ClientError('BIP45 wallet creation no longer supported'), res, req);
260248
});
261249

262250
router.post('/v2/wallets/', createWalletLimiter, (req, res) => {
@@ -291,19 +279,7 @@ export class ExpressApp {
291279
// DEPRECATED
292280
router.post('/v1/wallets/:id/copayers/', (req, res) => {
293281
logDeprecated(req);
294-
req.body.walletId = req.params['id'];
295-
req.body.supportBIP44AndP2PKH = false;
296-
let server;
297-
try {
298-
server = getServer(req, res);
299-
} catch (ex) {
300-
return returnError(ex, res, req);
301-
}
302-
server.joinWallet(req.body, (err, result) => {
303-
if (err) return returnError(err, res, req);
304-
305-
res.json(result);
306-
});
282+
return returnError(new ClientError('BIP45 wallet creation no longer supported'), res, req);
307283
});
308284

309285
router.post('/v2/wallets/:id/copayers/', (req, res) => {
@@ -944,4 +920,4 @@ export class ExpressApp {
944920

945921
WalletService.initialize(opts, cb);
946922
}
947-
}
923+
}

0 commit comments

Comments
 (0)