Enforces Array input for deterministicGenerateK
This commit is contained in:
parent
1b66976d92
commit
bc37e65014
3 changed files with 26 additions and 6 deletions
14
src/ecdsa.js
14
src/ecdsa.js
|
@ -1,3 +1,4 @@
|
||||||
|
var assert = require('assert')
|
||||||
var BigInteger = require('./bigi')
|
var BigInteger = require('./bigi')
|
||||||
var ECPointFp = require('./ec').ECPointFp
|
var ECPointFp = require('./ec').ECPointFp
|
||||||
|
|
||||||
|
@ -35,7 +36,10 @@ function implShamirsTrick(P, k, Q, l) {
|
||||||
return R
|
return R
|
||||||
}
|
}
|
||||||
|
|
||||||
function deterministicGenerateK(hash,key) {
|
function deterministicGenerateK(hash, secret) {
|
||||||
|
assert(Array.isArray(hash))
|
||||||
|
assert(Array.isArray(secret))
|
||||||
|
|
||||||
var vArr = []
|
var vArr = []
|
||||||
var kArr = []
|
var kArr = []
|
||||||
for (var i = 0;i < 32;i++) vArr.push(1)
|
for (var i = 0;i < 32;i++) vArr.push(1)
|
||||||
|
@ -43,10 +47,10 @@ function deterministicGenerateK(hash,key) {
|
||||||
var v = convert.bytesToWordArray(vArr)
|
var v = convert.bytesToWordArray(vArr)
|
||||||
var k = convert.bytesToWordArray(kArr)
|
var k = convert.bytesToWordArray(kArr)
|
||||||
|
|
||||||
k = HmacSHA256(convert.bytesToWordArray(vArr.concat([0]).concat(key).concat(hash)), k)
|
k = HmacSHA256(convert.bytesToWordArray(vArr.concat([0]).concat(secret).concat(hash)), k)
|
||||||
v = HmacSHA256(v, k)
|
v = HmacSHA256(v, k)
|
||||||
vArr = convert.wordArrayToBytes(v)
|
vArr = convert.wordArrayToBytes(v)
|
||||||
k = HmacSHA256(convert.bytesToWordArray(vArr.concat([1]).concat(key).concat(hash)), k)
|
k = HmacSHA256(convert.bytesToWordArray(vArr.concat([1]).concat(secret).concat(hash)), k)
|
||||||
v = HmacSHA256(v,k)
|
v = HmacSHA256(v,k)
|
||||||
v = HmacSHA256(v,k)
|
v = HmacSHA256(v,k)
|
||||||
vArr = convert.wordArrayToBytes(v)
|
vArr = convert.wordArrayToBytes(v)
|
||||||
|
@ -54,7 +58,11 @@ function deterministicGenerateK(hash,key) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var ecdsa = {
|
var ecdsa = {
|
||||||
|
deterministicGenerateK: deterministicGenerateK,
|
||||||
sign: function (hash, priv) {
|
sign: function (hash, priv) {
|
||||||
|
if (Buffer.isBuffer(hash)) hash = Array.prototype.slice.call(hash)
|
||||||
|
if (Buffer.isBuffer(priv)) priv = Array.prototype.slice.call(priv)
|
||||||
|
|
||||||
var d = priv
|
var d = priv
|
||||||
var n = ecparams.getN()
|
var n = ecparams.getN()
|
||||||
var e = BigInteger.fromBuffer(hash)
|
var e = BigInteger.fromBuffer(hash)
|
||||||
|
|
|
@ -10,6 +10,18 @@ var ECPubKey = require('..').ECPubKey
|
||||||
var Message = require('..').Message
|
var Message = require('..').Message
|
||||||
|
|
||||||
describe('ecdsa', function() {
|
describe('ecdsa', function() {
|
||||||
|
// FIXME: needs much better tests than this
|
||||||
|
describe('deterministicGenerateK', function() {
|
||||||
|
it('produces deterministic K values', function() {
|
||||||
|
var secret = [4]
|
||||||
|
|
||||||
|
var k1 = ecdsa.deterministicGenerateK([1], secret)
|
||||||
|
var k2 = ecdsa.deterministicGenerateK([2], secret)
|
||||||
|
|
||||||
|
assert.notDeepEqual(k1, k2)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('recoverPubKey', function() {
|
describe('recoverPubKey', function() {
|
||||||
it('succesfully recovers a public key', function() {
|
it('succesfully recovers a public key', function() {
|
||||||
var addr = 'mgQK8S6CfSXKjPmnujArSmVxafeJfrZsa3'
|
var addr = 'mgQK8S6CfSXKjPmnujArSmVxafeJfrZsa3'
|
||||||
|
@ -24,7 +36,7 @@ describe('ecdsa', function() {
|
||||||
describe('sign/verify', function() {
|
describe('sign/verify', function() {
|
||||||
it('Signing and Verifying', function () {
|
it('Signing and Verifying', function () {
|
||||||
var s1 = ECKey.makeRandom()
|
var s1 = ECKey.makeRandom()
|
||||||
var sig_a = s1.sign(BigInteger.ZERO)
|
var sig_a = s1.sign([0])
|
||||||
|
|
||||||
assert.ok(sig_a, 'Sign null')
|
assert.ok(sig_a, 'Sign null')
|
||||||
assert.ok(s1.pub.verify(BigInteger.ZERO, sig_a))
|
assert.ok(s1.pub.verify(BigInteger.ZERO, sig_a))
|
||||||
|
@ -59,7 +71,7 @@ describe('ecdsa', function() {
|
||||||
|
|
||||||
it('should sign with low S value', function() {
|
it('should sign with low S value', function() {
|
||||||
var priv = ECKey.fromHex('ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458')
|
var priv = ECKey.fromHex('ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458')
|
||||||
var message = 'Vires in numeris'
|
var message = new Buffer('Vires in numeris')
|
||||||
var signature = priv.sign(message)
|
var signature = priv.sign(message)
|
||||||
var parsed = ecdsa.parseSig(signature)
|
var parsed = ecdsa.parseSig(signature)
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,7 @@ describe('ECKey', function() {
|
||||||
describe('signing', function() {
|
describe('signing', function() {
|
||||||
var hpriv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458'
|
var hpriv = 'ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458'
|
||||||
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
var hcpub = '024b12d9d7c77db68388b6ff7c89046174c871546436806bcd80d07c28ea811992'
|
||||||
var message = 'Vires in numeris'
|
var message = new Buffer('Vires in numeris')
|
||||||
|
|
||||||
it('should verify against the private key', function() {
|
it('should verify against the private key', function() {
|
||||||
var priv = ECKey.fromHex(hpriv)
|
var priv = ECKey.fromHex(hpriv)
|
||||||
|
|
Loading…
Add table
Reference in a new issue