bitcoinjs-lib/test/integration/stealth.js

50 lines
1.5 KiB
JavaScript
Raw Normal View History

/* global describe, it */
var assert = require('assert')
var bigi = require('bigi')
var bitcoin = require('../../')
var ecurve = require('ecurve')
var secp256k1 = ecurve.getCurveByName('secp256k1')
describe('bitcoinjs-lib (crypto)', function () {
it('can generate a single-key stealth address', function () {
var G = secp256k1.G
var n = secp256k1.n
function stealthSend (Q) {
var noncePair = bitcoin.ECPair.makeRandom()
var e = noncePair.d
var eQ = Q.multiply(e) // shared secret
var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded()))
var cG = G.multiply(c)
var Qprime = Q.add(cG)
return {
shared: new bitcoin.ECPair(null, Qprime),
nonce: noncePair.Q
}
}
function stealthReceive (d, P) {
var dP = P.multiply(d) // shared secret
var c = bigi.fromBuffer(bitcoin.crypto.sha256(dP.getEncoded()))
return new bitcoin.ECPair(d.add(c).mod(n))
}
// receiver private key
var receiver = bitcoin.ECPair.fromWIF('5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss')
var stealthS = stealthSend(receiver.Q) // public, done by sender
// ... sender now reveals nonce to receiver
var stealthR = stealthReceive(receiver.d, stealthS.nonce) // private, done by receiver
// and check that we derived both sides correctly
assert.equal(stealthS.shared.getAddress(), stealthR.getAddress())
})
// TODO
it.skip('can generate a dual-key stealth address', function () {})
})