From 8743c68ce67a9e5f21e0f3f6ed2e023c697d633d Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Wed, 13 Aug 2014 17:31:28 -0400 Subject: [PATCH] kdf --- index.js | 35 +++++++++++++++++++++-------------- lib/kdf.js | 33 +++++++++++++++++++++++++++++++++ test/test.kdf.js | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 14 deletions(-) create mode 100644 lib/kdf.js create mode 100644 test/test.kdf.js diff --git a/index.js b/index.js index a8f495e..e7bf374 100644 --- a/index.js +++ b/index.js @@ -1,20 +1,27 @@ var privsec = module.exports; -privsec.address = require('./lib/address'); -privsec.base58 = require('./lib/base58'); -privsec.base58check = require('./lib/base58check'); -privsec.bip32 = require('./lib/bip32'); -privsec.bn = require('./lib/bn'); -privsec.constants = require('./lib/constants'); -privsec.ecdsa = require('./lib/ecdsa'); -privsec.hash = require('./lib/hash'); -privsec.key = require('./lib/key'); -privsec.point = require('./lib/point'); -privsec.privkey = require('./lib/privkey'); -privsec.pubkey = require('./lib/pubkey'); -privsec.random = require('./lib/random'); -privsec.signature = require('./lib/signature'); +//main bitcoin library +privsec.Address = require('./lib/address'); +privsec.Base58 = require('./lib/base58'); +privsec.Base58Check = require('./lib/base58check'); +privsec.BIP32 = require('./lib/bip32'); +privsec.BN = require('./lib/bn'); +privsec.Constants = require('./lib/constants'); +privsec.ECDSA = require('./lib/ecdsa'); +privsec.Hash = require('./lib/hash'); +privsec.KDF = require('./lib/kdf'); +privsec.Key = require('./lib/key'); +privsec.Point = require('./lib/point'); +privsec.Privkey = require('./lib/privkey'); +privsec.Pubkey = require('./lib/pubkey'); +privsec.Random = require('./lib/random'); +privsec.Signature = require('./lib/signature'); +//experimental +//privsec.expmt = {}; +//privsec.expmt.Stealth = require('./lib/expmt/stealth'); + +//dependencies privsec.deps = {}; privsec.deps.bnjs = require('bn.js'); privsec.deps.bs58 = require('bs58'); diff --git a/lib/kdf.js b/lib/kdf.js new file mode 100644 index 0000000..91d0752 --- /dev/null +++ b/lib/kdf.js @@ -0,0 +1,33 @@ +var Bn = require('./bn'); +var Privkey = require('./privkey'); +var Point = require('./point'); +var Pubkey = require('./pubkey'); +var Key = require('./key'); +var Hash = require('./hash'); + +function KDF() { +}; + +KDF.buf2key = function(buf) { + return KDF.sha256hmac2key(buf); +}; + +KDF.sha256hmac2key = function(buf) { + var privkey = KDF.sha256hmac2privkey(buf); + var key = new Key(privkey); + key.privkey2pubkey(); + return key; +}; + +KDF.sha256hmac2privkey = function(buf) { + var bn; + var concat = new Buffer([]); + do { + var hash = Hash.sha256hmac(buf, concat); + var bn = Bn.fromBuffer(hash); + concat = Buffer.concat([concat, new Buffer(0)]); + } while(!bn.lt(Point.getN())); + return new Privkey(bn); +}; + +module.exports = KDF; diff --git a/test/test.kdf.js b/test/test.kdf.js new file mode 100644 index 0000000..4571b4c --- /dev/null +++ b/test/test.kdf.js @@ -0,0 +1,39 @@ +var should = require('chai').should(); +var KDF = require('../lib/kdf'); +var Hash = require('../lib/hash'); + +describe('kdf', function() { + + describe('#buf2key', function() { + + it('should compute these known values', function() { + var buf = Hash.sha256(new Buffer('test')); + var key = KDF.buf2key(buf); + key.privkey.toString().should.equal('KxxVszVMFLGzmxpxR7sMSaWDmqMKLVhKebX5vZbGHyuR8spreQ7V'); + key.pubkey.toString().should.equal('03774f761ae89a0d2fda0d532bad62286ae8fcda9bc38c060036296085592a97c1'); + }); + + }); + + describe('#sha256hmac2key', function() { + + it('should compute these known values', function() { + var buf = Hash.sha256(new Buffer('test')); + var key = KDF.sha256hmac2key(buf); + key.privkey.toString().should.equal('KxxVszVMFLGzmxpxR7sMSaWDmqMKLVhKebX5vZbGHyuR8spreQ7V'); + key.pubkey.toString().should.equal('03774f761ae89a0d2fda0d532bad62286ae8fcda9bc38c060036296085592a97c1'); + }); + + }); + + describe('#sha256hmac2privkey', function() { + + it('should compute this known privkey', function() { + var buf = Hash.sha256(new Buffer('test')); + var privkey = KDF.sha256hmac2privkey(buf); + privkey.toString().should.equal('KxxVszVMFLGzmxpxR7sMSaWDmqMKLVhKebX5vZbGHyuR8spreQ7V'); + }); + + }); + +});