schnorr: fix issues mentioned in #89.
This commit is contained in:
parent
60a4c0a34d
commit
3bc4fa5822
@ -11,6 +11,7 @@ var elliptic = require('elliptic');
|
|||||||
var Signature = require('elliptic/lib/elliptic/ec/signature');
|
var Signature = require('elliptic/lib/elliptic/ec/signature');
|
||||||
var hmacDRBG = require('elliptic/lib/elliptic/hmac-drbg');
|
var hmacDRBG = require('elliptic/lib/elliptic/hmac-drbg');
|
||||||
var crypto = require('./crypto');
|
var crypto = require('./crypto');
|
||||||
|
var curves = elliptic.curves;
|
||||||
var curve = elliptic.ec('secp256k1').curve;
|
var curve = elliptic.ec('secp256k1').curve;
|
||||||
var sha256 = require('./crypto').sha256;
|
var sha256 = require('./crypto').sha256;
|
||||||
|
|
||||||
@ -76,6 +77,9 @@ schnorr._sign = function _sign(msg, prv, k, hash, pubnonce) {
|
|||||||
|
|
||||||
h = schnorr.hash(msg, r.getX(), hash);
|
h = schnorr.hash(msg, r.getX(), hash);
|
||||||
|
|
||||||
|
if (h.cmpn(0) === 0)
|
||||||
|
return;
|
||||||
|
|
||||||
if (h.cmp(curve.n) >= 0)
|
if (h.cmp(curve.n) >= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -100,7 +104,7 @@ schnorr._sign = function _sign(msg, prv, k, hash, pubnonce) {
|
|||||||
|
|
||||||
schnorr.sign = function sign(msg, key, hash, pubnonce) {
|
schnorr.sign = function sign(msg, key, hash, pubnonce) {
|
||||||
var prv = new BN(key);
|
var prv = new BN(key);
|
||||||
var k, sig;
|
var k, sig, drbg;
|
||||||
|
|
||||||
if (prv.cmpn(0) === 0)
|
if (prv.cmpn(0) === 0)
|
||||||
throw new Error('Bad private key.');
|
throw new Error('Bad private key.');
|
||||||
@ -108,8 +112,10 @@ schnorr.sign = function sign(msg, key, hash, pubnonce) {
|
|||||||
if (prv.cmp(curve.n) >= 0)
|
if (prv.cmp(curve.n) >= 0)
|
||||||
throw new Error('Bad private key.');
|
throw new Error('Bad private key.');
|
||||||
|
|
||||||
|
drbg = schnorr.drbg(msg, key, pubnonce);
|
||||||
|
|
||||||
while (!sig) {
|
while (!sig) {
|
||||||
k = new BN(crypto.randomBytes(32));
|
k = new BN(drbg.generate(curve.n.byteLength()));
|
||||||
sig = schnorr._sign(msg, prv, k, hash, pubnonce);
|
sig = schnorr._sign(msg, prv, k, hash, pubnonce);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,16 +310,16 @@ schnorr.partialSign = function partialSign(msg, priv, privnonce, pubs, hash) {
|
|||||||
schnorr.alg = new Buffer('Schnorr+SHA256 ', 'ascii');
|
schnorr.alg = new Buffer('Schnorr+SHA256 ', 'ascii');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform hmac drbg according to rfc6979.
|
* Instantiate an HMAC-DRBG.
|
||||||
* @param {Buffer} msg
|
* @param {Buffer} msg
|
||||||
* @param {Buffer} priv
|
* @param {Buffer} priv
|
||||||
* @param {Buffer} data
|
* @param {Buffer} data
|
||||||
* @returns {Buffer}
|
* @returns {HmacDRBG}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
schnorr.rfc6979 = function rfc6979(msg, priv, data) {
|
schnorr.drbg = function drbg(msg, priv, data) {
|
||||||
var kdata = new Buffer(112);
|
var kdata = new Buffer(112);
|
||||||
var drbg, prv, pers;
|
var prv, pers;
|
||||||
|
|
||||||
kdata.fill(0);
|
kdata.fill(0);
|
||||||
|
|
||||||
@ -329,16 +335,26 @@ schnorr.rfc6979 = function rfc6979(msg, priv, data) {
|
|||||||
msg = toArray(kdata.slice(32, 64));
|
msg = toArray(kdata.slice(32, 64));
|
||||||
pers = toArray(kdata.slice(64));
|
pers = toArray(kdata.slice(64));
|
||||||
|
|
||||||
drbg = new hmacDRBG({
|
return new hmacDRBG({
|
||||||
hash: require('hash.js').sha256,
|
hash: curves.secp256k1.hash,
|
||||||
entropy: prv,
|
entropy: prv,
|
||||||
nonce: msg,
|
nonce: msg,
|
||||||
pers: pers
|
pers: pers
|
||||||
});
|
});
|
||||||
|
};
|
||||||
|
|
||||||
drbg = drbg.generate(curve.n.byteLength());
|
/**
|
||||||
|
* Perform hmac drbg according to rfc6979.
|
||||||
|
* @param {Buffer} msg
|
||||||
|
* @param {Buffer} priv
|
||||||
|
* @param {Buffer} data
|
||||||
|
* @returns {Buffer}
|
||||||
|
*/
|
||||||
|
|
||||||
return new Buffer(drbg);
|
schnorr.rfc6979 = function rfc6979(msg, priv, data) {
|
||||||
|
var drbg = schnorr.drbg(msg, priv, data);
|
||||||
|
var bytes = drbg.generate(curve.n.byteLength());
|
||||||
|
return new Buffer(bytes);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user