UNPKG

happyucjs-lightwallet

Version:
118 lines (90 loc) 4.39 kB
var expect = require('chai').expect var keyStore = require('../lib/keystore') var upgrade = require('../lib/upgrade') var signing = require('../lib/signing') var fixtures = require('./fixtures/keystore') var Transaction = require('happyucjs-tx') var util = require("happyucjs-util") var nacl = require('tweetnacl') describe("Signing", function () { describe("signTx", function() { it('signs a transaction deterministically', function(done) { var pw = Uint8Array.from(fixtures.valid[0].pwDerivedKey) var fixture = fixtures.valid[0] keyStore.createVault({ password: fixture.password, seedPhrase: fixture.mnSeed, salt: fixture.salt, hdPathString: fixture.hdPathString }, function (err, ks) { ks.generateNewAddress(pw) var addr = ks.getAddresses()[0] expect(addr).to.equal(fixtures.valid[0].hucjsTxParams.from) var tx = new Transaction(fixtures.valid[0].hucjsTxParams) var rawTx = tx.serialize().toString('hex') expect(rawTx).to.equal(fixtures.valid[0].rawUnsignedTx) var signedTx0 = signing.signTx(ks, pw, rawTx, addr); expect(signedTx0).to.equal(fixtures.valid[0].rawSignedTx) done(); }) }); it('Correctly handles a 31 byte key from bitcore', function(done) { var secretSeed = "erupt consider beyond twist bike enroll you salute weasel emerge divert hundred"; var hdPath = "m/44'/60'/0'" //as defined in SLIP44 var password = 'test' var fixture = fixtures.valid[0] keyStore.createVault({ password: password, seedPhrase: secretSeed, salt: 'someSalt', hdPathString: hdPath }, function (err, keystore) { keystore.keyFromPassword(password, function (err, pwDerivedKey) { keystore.generateNewAddress(pwDerivedKey, 1); //Generate a new address var address = keystore.getAddresses()[0]; var hexSeedHUC = keystore.exportPrivateKey(address, pwDerivedKey); var addr0 = keyStore._computeAddressFromPrivKey(hexSeedHUC); expect(address).to.equal('0x' + addr0) var tx = new Transaction({from: address, to: address, value: 100000000}) var rawTx = tx.serialize().toString('hex'); var signedTx = signing.signTx(keystore, pwDerivedKey, rawTx, address, hdPath) var expectedTx = 'f861808080945e2abe3de708923e8425348005ee7fdd77e203cb8405f5e100801ca00a9a2486f65cab6c7819c82ee741f72d1acaab005642eef32f303696909fa64ea04e5d5e0e8d5f38704ac04faa1f91a9ee15a3ffcf158de342324d242b6acba819'; expect(signedTx).to.equal(expectedTx); done(); }) }) }) describe("signMsg", function() { it('signs a message deterministically', function(done) { var pw = Uint8Array.from(fixtures.valid[0].pwDerivedKey); var fixture = fixtures.valid[0] keyStore.createVault({ password: fixture.password, seedPhrase: fixture.mnSeed, salt: fixture.salt, hdPathString: fixture.hdPathString }, function (err, ks) { ks.generateNewAddress(pw); var addr = ks.getAddresses()[0]; expect(addr).to.equal(fixtures.valid[0].hucjsTxParams.from); var msg = "this is a message"; var signedMsg = signing.signMsg(ks, pw, msg, addr); var msgHash = util.addHexPrefix(util.sha3(msg).toString('hex')); var signedMsgHash = signing.signMsgHash(ks, pw, msgHash, addr); // signedMsg and signedMsgHash have the same signature expect(signedMsg.v).to.equal(signedMsgHash.v); expect(signedMsg.r.toString()).to.equal(signedMsgHash.r.toString()); expect(signedMsg.s.toString()).to.equal(signedMsgHash.s.toString()); var recoveredAddress = signing.recoverAddress(msg, signedMsg.v, signedMsg.r, signedMsg.s); expect(addr).to.equal('0x' + recoveredAddress.toString('hex')); var concatSig = signing.concatSig(signedMsg); var expectedConcatSig = '0x7b518ee144b8facf3f21b1f97a6d1f8aea448934d89cf5570e92bcca4d375ab6080f17400eafad3c5808e064ee56cd45321382040fb299fa028ea3cddf3488151c'; expect(concatSig).to.equal(expectedConcatSig); done(); }) }); }); }); });