From 23e473b6886c457781949c825b3ff48b3984e51f Mon Sep 17 00:00:00 2001 From: Geert Weening Date: Thu, 2 Oct 2014 17:25:48 -0700 Subject: [PATCH] [FEATURE] make maxLoops in seed.get_key optional default to 1 or the index of the requested account +1 --- src/js/ripple/seed.js | 18 ++++++++++++------ test/seed-test.js | 30 ++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/js/ripple/seed.js b/src/js/ripple/seed.js index 386458f4..7755d661 100644 --- a/src/js/ripple/seed.js +++ b/src/js/ripple/seed.js @@ -93,9 +93,14 @@ function SHA256_RIPEMD160(bits) { * * {Uint160} (from_json able), specifies the address matching the KeyPair * that is desired. +* +* @param maxLoops (optional) +* {Number} specifies the amount of attempts taken to generate +* a matching KeyPair */ -Seed.prototype.get_key = function (account) { +Seed.prototype.get_key = function (account, maxLoops) { var account_number = 0, address; + var max_loops = maxLoops || 1; if (!this.is_valid()) { throw new Error('Cannot generate keys from invalid seed!'); @@ -103,6 +108,7 @@ Seed.prototype.get_key = function (account) { if (account) { if (typeof account === 'number') { account_number = account; + max_loops = account_number+1; } else { address = UInt160.from_json(account); } @@ -121,9 +127,9 @@ Seed.prototype.get_key = function (account) { var sec; var key_pair; - var max_loops = 1000; // TODO do { + i = 0; do { @@ -135,15 +141,15 @@ Seed.prototype.get_key = function (account) { sec = sec.add(private_gen).mod(curve.r); key_pair = KeyPair.from_bn_secret(sec); - if (--max_loops <= 0) { + if (max_loops-- <= 0) { // We are almost certainly looking for an account that would take same // value of $too_long {forever, ...} throw new Error('Too many loops looking for KeyPair yielding '+ address.to_json() +' from ' + this.to_json()); - }; - } while (address && !key_pair.get_address().equals(address)); + } - return key_pair; + } while (address && !key_pair.get_address().equals(address)); + return key_pair; }; exports.Seed = Seed; diff --git a/test/seed-test.js b/test/seed-test.js index 972de19c..551a1447 100644 --- a/test/seed-test.js +++ b/test/seed-test.js @@ -5,7 +5,6 @@ var config = require('./testutils').get_config(); describe('Seed', function() { it('can generate many addresses', function () { - var seed = Seed.from_json("masterpassphrase"); var test_data = [ // Format: @@ -28,10 +27,10 @@ describe('Seed', function() { function assert_helper(seed_json, address_or_nth, expected) { var seed = Seed.from_json(seed_json); - var keypair = seed.get_key(address_or_nth); - assert.strictEqual(keypair.to_hex_pub(), - expected); + var keypair = seed.get_key(address_or_nth, 500); + assert.strictEqual(keypair.to_hex_pub(), expected); } + for (var nth = 0; nth < test_data.length; nth++) { var seed_json = test_data[nth][0]; var address = test_data[nth][1]; @@ -47,7 +46,30 @@ describe('Seed', function() { // This isn't too bad as it only needs to generate one keypair `seq` assert_helper(seed_json, nth_for_seed, expected); }; + }); + + it('should return the key_pair for a valid account and secret pair', function() { + var address = 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE'; + var seed = Seed.from_json('shsWGZcmZz6YsWWmcnpfr6fLTdtFV'); + var keyPair = seed.get_key(address); + assert.strictEqual(keyPair.get_address().to_json(), address); + assert.strictEqual(keyPair.to_hex_pub(), '02F89EAEC7667B30F33D0687BBA86C3FE2A08CCA40A9186C5BDE2DAA6FA97A37D8'); + }); + + it('should not find a KeyPair for a secret that does not belong to the given account', function() { + var address = 'r3GgMwvgvP8h4yVWvjH1dPZNvC37TjzBBE'; + var secret = 'snoPBrXtMeMyMHUVTgbuqAfg1SUTb'; + var seed = Seed.from_json('snoPBrXtMeMyMHUVTgbuqAfg1SUTb'); + try { + seed.get_key(address); + assert(false, 'should throw an error'); + } catch(e) { + assert.strictEqual(e.message, 'Too many loops looking for KeyPair yielding '+address+' from '+secret); + } + + }); + }); // vim:sw=2:sts=2:ts=8:et