mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-23 13:45:48 +00:00
Merge branch account-ids
This commit is contained in:
@@ -11,6 +11,7 @@ var BigInteger = utils.jsbn.BigInteger;
|
|||||||
var Base = require('./base').Base;
|
var Base = require('./base').Base;
|
||||||
var UInt = require('./uint').UInt;
|
var UInt = require('./uint').UInt;
|
||||||
var UInt256 = require('./uint256').UInt256;
|
var UInt256 = require('./uint256').UInt256;
|
||||||
|
var UInt160 = require('./uint160').UInt160;
|
||||||
var KeyPair = require('./keypair').KeyPair;
|
var KeyPair = require('./keypair').KeyPair;
|
||||||
|
|
||||||
var Seed = extend(function () {
|
var Seed = extend(function () {
|
||||||
@@ -83,16 +84,33 @@ function SHA256_RIPEMD160(bits) {
|
|||||||
return sjcl.hash.ripemd160.hash(sjcl.hash.sha256.hash(bits));
|
return sjcl.hash.ripemd160.hash(sjcl.hash.sha256.hash(bits));
|
||||||
};
|
};
|
||||||
|
|
||||||
Seed.prototype.get_key = function (account_id) {
|
/**
|
||||||
|
* @param account
|
||||||
|
* {undefined} take first, default, KeyPair
|
||||||
|
*
|
||||||
|
* {Number} specifies the account number of the KeyPair
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* {Uint160} (from_json able), specifies the address matching the KeyPair
|
||||||
|
* that is desired.
|
||||||
|
*/
|
||||||
|
Seed.prototype.get_key = function (account) {
|
||||||
|
var account_number = 0, address;
|
||||||
|
|
||||||
if (!this.is_valid()) {
|
if (!this.is_valid()) {
|
||||||
throw new Error('Cannot generate keys from invalid seed!');
|
throw new Error('Cannot generate keys from invalid seed!');
|
||||||
}
|
}
|
||||||
|
if (account) {
|
||||||
// XXX Should loop over keys until we find the right one
|
if (typeof account === 'number') {
|
||||||
|
account_number = account;
|
||||||
|
} else {
|
||||||
|
address = UInt160.from_json(account);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var private_gen, public_gen;
|
var private_gen, public_gen;
|
||||||
var curve = this._curve;
|
var curve = this._curve;
|
||||||
var seq = 0, i = 0;
|
var i = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
private_gen = sjcl.bn.fromBits(firstHalfOfSHA512(append_int(this.to_bytes(), i)));
|
private_gen = sjcl.bn.fromBits(firstHalfOfSHA512(append_int(this.to_bytes(), i)));
|
||||||
@@ -102,16 +120,30 @@ Seed.prototype.get_key = function (account_id) {
|
|||||||
public_gen = curve.G.mult(private_gen);
|
public_gen = curve.G.mult(private_gen);
|
||||||
|
|
||||||
var sec;
|
var sec;
|
||||||
|
var key_pair;
|
||||||
|
var max_loops = 1000; // TODO
|
||||||
|
|
||||||
|
do {
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
sec = sjcl.bn.fromBits(firstHalfOfSHA512(append_int(append_int(public_gen.toBytesCompressed(), seq), i)));
|
sec = sjcl.bn.fromBits(firstHalfOfSHA512(append_int(append_int(public_gen.toBytesCompressed(), account_number), i)));
|
||||||
i++;
|
i++;
|
||||||
} while (!curve.r.greaterEquals(sec));
|
} while (!curve.r.greaterEquals(sec));
|
||||||
|
|
||||||
|
account_number++;
|
||||||
sec = sec.add(private_gen).mod(curve.r);
|
sec = sec.add(private_gen).mod(curve.r);
|
||||||
|
key_pair = KeyPair.from_bn_secret(sec);
|
||||||
|
|
||||||
return KeyPair.from_bn_secret(sec);
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.Seed = Seed;
|
exports.Seed = Seed;
|
||||||
|
|||||||
63
test/seed-test.js
Normal file
63
test/seed-test.js
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
var assert = require('assert');
|
||||||
|
var utils = require('./testutils');
|
||||||
|
var Seed = utils.load_module('seed').Seed;
|
||||||
|
var config = require('./testutils').get_config();
|
||||||
|
|
||||||
|
describe('Seed', function() {
|
||||||
|
it('can generate many addresses', function () {
|
||||||
|
var seed = Seed.from_json("masterpassphrase");
|
||||||
|
|
||||||
|
// Note: Created with jRippleAPI code
|
||||||
|
// Link: https://github.com/pmarches/jRippleAPI/blob/master/src/jrippleapi/keys/RippleDeterministicKeyGenerator.java
|
||||||
|
|
||||||
|
// To reviewer/merger: Even generating keypairs for thi this small amount of
|
||||||
|
// addresses makes the test suite run SO SLOW. Consider cutting at the tail.
|
||||||
|
var first_nth_addresses = [
|
||||||
|
// 0th implied
|
||||||
|
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||||
|
// 1th implied
|
||||||
|
"r4bYF7SLUMD7QgSLLpgJx38WJSY12ViRjP",
|
||||||
|
// 2th implied
|
||||||
|
"rLpAd4peHUMBPbVJASMYK5GTBUSwXRD9nx",
|
||||||
|
// ...
|
||||||
|
"rN9HWHPAftXC6xNxJRqgVr1HexpUi6FBUa",
|
||||||
|
"rhwPfeEkeQh2vqoKGPBpPyS9nKmKZdpypu",
|
||||||
|
"rKdNfPfrzfisDCPCqK67YhDLezuVKGKXNm",
|
||||||
|
"rsn4NeGzMRvMn5ABQxmt9VNEkSknVneBK4",
|
||||||
|
"rUSJGFH1kQnaKpoAhkArfyw6HZVe8GT5w3",
|
||||||
|
"r3EYp6isx2Row5pu19C4Ujvp68oEEabhuA",
|
||||||
|
"rGiYpnAn9DTXiM78CCJcYAuL6QHEDdazHA",
|
||||||
|
"rVrRVeqqEJHAove5B9TqBAHEXBTzMi5eu",
|
||||||
|
"rJbarThDXYXxtCgDxRoTCDf2NoYdgSjuVk",
|
||||||
|
"rfuWNJ1TkQzoZZcc4K8wmtsUiGwURFbed1",
|
||||||
|
"rpuTqebfbZZdKEUV3bjecoViNL4W4gepWZ",
|
||||||
|
"r42ywHUco4C2AjgaSmYM7uX13Kbz6GdDKp",
|
||||||
|
"rnWb45MLd5hQiB6Arr94DdY2z95quL7XNf",
|
||||||
|
"rMukaQ87bfAeddcT16RtgS3RbFmaQWrSGu",
|
||||||
|
"rN6dMHU51K9y8eVMhjQMsQVp5gPwt3eYYx",
|
||||||
|
"rfRFyeJDNqpfZVFmjNj9tNzFVsCNAWKtNc",
|
||||||
|
"rMoGSX48KrT31HKx9KfMSnYhjvRw3YYzQW",
|
||||||
|
"rfTiEfbeVsYU7QEe1Zfogiz7h43x6ChKGC"
|
||||||
|
]
|
||||||
|
|
||||||
|
function assert_helper(account_id, expected) {
|
||||||
|
var keypair = seed.get_key(account_id);
|
||||||
|
assert.strictEqual(keypair.get_address().to_json(),
|
||||||
|
expected);
|
||||||
|
}
|
||||||
|
for (var nth = 0; nth < first_nth_addresses.length; nth++) {
|
||||||
|
var expected = first_nth_addresses[nth], looking_for;
|
||||||
|
|
||||||
|
//`seed.get_key($ripple_address)` is arguably an ill concieved feature
|
||||||
|
// as it needs to generate `nth` many keypairs and generate hashed public
|
||||||
|
// keys (addresses) for equality tests ??
|
||||||
|
// Would need remote.set_secret(address, private_key_not_seed) ??
|
||||||
|
assert_helper((looking_for = expected), expected)
|
||||||
|
|
||||||
|
// This isn't too bad as it only needs to generate one keypair `seq`
|
||||||
|
assert_helper((looking_for = nth), expected)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// vim:sw=2:sts=2:ts=8:et
|
||||||
Reference in New Issue
Block a user