Kyle Drake
11 years ago
4 changed files with 82 additions and 80 deletions
@ -1,22 +1,44 @@ |
|||||
var assert = require('assert') |
var assert = require('assert') |
||||
var sec = require('../src/jsbn/sec') |
|
||||
var ecdsa = require('../').ecdsa |
var ecdsa = require('../').ecdsa |
||||
|
|
||||
|
var sec = require('../src/jsbn/sec') |
||||
var ecparams = sec('secp256k1') |
var ecparams = sec('secp256k1') |
||||
|
|
||||
describe('EC', function() { |
var ECPointFp = require('../').ECPointFp |
||||
it('handles point multiplication', function() { |
var ECKey = require('../').ECKey |
||||
var G = ecparams.getG() |
|
||||
var n = ecparams.getN() |
describe('ec', function() { |
||||
|
describe('ECPointFp', function() { |
||||
|
it('behaviours correctly', function() { |
||||
|
var G = ecparams.getG() |
||||
|
var n = ecparams.getN() |
||||
|
|
||||
|
assert.ok(G.multiply(n).isInfinity(), "Gn is infinite") |
||||
|
|
||||
|
var k = ecdsa.getBigRandom(n) |
||||
|
var P = G.multiply(k) |
||||
|
assert.ok(!P.isInfinity(), "kG is not infinite") |
||||
|
assert.ok(P.isOnCurve(), "kG on curve") |
||||
|
assert.ok(P.multiply(n).isInfinity(), "kGn is infinite") |
||||
|
|
||||
|
assert.ok(P.validate(), "kG validates as a public key") |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
describe('decodeFrom', function() { |
||||
|
it('decodes valid ECPoints', function() { |
||||
|
var p1 = ECKey().getPub().toBytes() |
||||
|
assert.equal(p1.length, 65) |
||||
|
|
||||
assert.ok(G.multiply(n).isInfinity(), "Gn is infinite") |
var p1_q = ECPointFp.decodeFrom(ecparams.getCurve(), p1) |
||||
|
assert.ok(p1_q) |
||||
|
assert.ok(p1_q.validate()) |
||||
|
|
||||
var k = ecdsa.getBigRandom(n) |
var p2 = new Buffer('0486f356006a38b847bedec1bf47013776925d939d5a35a97a4d1263e550c7f1ab5aba44ab74d22892097a0e851addf07ba97e33416df5affaceeb35d5607cd23c', 'hex') |
||||
var P = G.multiply(k) |
|
||||
assert.ok(!P.isInfinity(), "kG is not infinite") |
|
||||
assert.ok(P.isOnCurve(), "kG on curve") |
|
||||
assert.ok(P.multiply(n).isInfinity(), "kGn is infinite") |
|
||||
|
|
||||
assert.ok(P.validate(), "kG validates as a public key") |
var p2_q = ECPointFp.decodeFrom(ecparams.getCurve(), p2) |
||||
|
assert.ok(p2_q) |
||||
|
assert.ok(p2_q.validate()) |
||||
|
}) |
||||
}) |
}) |
||||
}) |
}) |
||||
|
@ -1,18 +1,59 @@ |
|||||
var assert = require('assert') |
var assert = require('assert') |
||||
var convert = require('../').convert |
var crypto = require('../').crypto |
||||
var ecdsa = require('../').ecdsa |
var ecdsa = require('..').ecdsa |
||||
var ECPubKey = require('../').ECPubKey |
var rng = require('secure-random') |
||||
var Message = require('../').Message |
|
||||
|
var BigInteger = require('..').BigInteger |
||||
|
var ECKey = require('..').ECKey |
||||
|
var ECPubKey = require('..').ECPubKey |
||||
|
var Message = require('..').Message |
||||
|
|
||||
describe('ecdsa', function() { |
describe('ecdsa', function() { |
||||
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' |
||||
var signature = convert.base64ToBytes('H0PG6+PUo96UPTJ/DVj8aBU5it+Nuli4YdsLuTMvfJxoHH9Jb7jYTQXCCOX2jrTChD5S1ic3vCrUQHdmB5/sEQY=') |
var signature = new Buffer('H0PG6+PUo96UPTJ/DVj8aBU5it+Nuli4YdsLuTMvfJxoHH9Jb7jYTQXCCOX2jrTChD5S1ic3vCrUQHdmB5/sEQY=', 'base64') |
||||
var obj = ecdsa.parseSigCompact(signature) |
var obj = ecdsa.parseSigCompact(signature) |
||||
var pubKey = new ECPubKey(ecdsa.recoverPubKey(obj.r, obj.s, Message.magicHash('1111'), obj.i)) |
var pubKey = new ECPubKey(ecdsa.recoverPubKey(obj.r, obj.s, Message.magicHash('1111'), obj.i)) |
||||
|
|
||||
assert.equal(pubKey.toHex(true), '02e8fcf4d749b35879bc1f3b14b49e67ab7301da3558c5a9b74a54f1e6339c334c') |
assert.equal(pubKey.toHex(true), '02e8fcf4d749b35879bc1f3b14b49e67ab7301da3558c5a9b74a54f1e6339c334c') |
||||
}) |
}) |
||||
}) |
}) |
||||
|
|
||||
|
describe('sign/verify', function() { |
||||
|
it('Signing and Verifying', function () { |
||||
|
var s1 = new ECKey() |
||||
|
var sig_a = s1.sign(BigInteger.ZERO) |
||||
|
|
||||
|
assert.ok(sig_a, 'Sign null') |
||||
|
assert.ok(s1.verify(BigInteger.ZERO, sig_a)) |
||||
|
|
||||
|
var message = new BigInteger(1024, rng).toByteArrayUnsigned() |
||||
|
var hash = crypto.sha256(message) |
||||
|
var sig_b = s1.sign(hash) |
||||
|
assert.ok(sig_b, 'Sign random string') |
||||
|
assert.ok(s1.verify(hash, sig_b)) |
||||
|
|
||||
|
var message2 = new Buffer( |
||||
|
'12dce2c169986b3346827ffb2305cf393984627f5f9722a1b1368e933c8d' + |
||||
|
'd296653fbe5d7ac031c4962ad0eb1c4298c3b91d244e1116b4a76a130c13' + |
||||
|
'1e7aec7fa70184a71a2e66797052831511b93c6e8d72ae58a1980eaacb66' + |
||||
|
'8a33f50d7cefb96a5dab897b5efcb99cbafb0d777cb83fc9b2115b69c0fa' + |
||||
|
'3d82507b932b84e4', 'hex') |
||||
|
|
||||
|
var hash2 = crypto.sha256(message2) |
||||
|
|
||||
|
var sig_c = new Buffer( |
||||
|
'3044022038d9b8dd5c9fbf330565c1f51d72a59ba869aeb2c2001be959d3' + |
||||
|
'79e861ec71960220a73945f32cf90d03127d2c3410d16cee120fa1a4b4c3' + |
||||
|
'f273ab082801a95506c4', 'hex') |
||||
|
|
||||
|
var s2 = new Buffer( |
||||
|
'045a1594316e433fb91f35ef4874610d22177c3f1a1060f6c1e70a609d51' + |
||||
|
'b20be5795cd2a5eae0d6b872ba42db95e9afaeea3fbb89e98099575b6828' + |
||||
|
'609a978528', 'hex') |
||||
|
|
||||
|
assert.ok(ecdsa.verify(hash2, sig_c, s2), 'Verify constant signature') |
||||
|
}) |
||||
|
}) |
||||
}) |
}) |
||||
|
@ -1,61 +0,0 @@ |
|||||
var assert = require('assert') |
|
||||
var bitcoinjs = require('../') |
|
||||
var crypto = require('../').crypto |
|
||||
var sec = require('../src/jsbn/sec') |
|
||||
var BigInteger = require('../src/jsbn/jsbn.js') |
|
||||
var rng = require('secure-random') |
|
||||
var ecparams = sec('secp256k1') |
|
||||
var ECPointFp = bitcoinjs.ECPointFp |
|
||||
var convert = require('../src/convert') |
|
||||
|
|
||||
it('Keys & Key Management', function () { |
|
||||
var p1 = bitcoinjs.ECKey().getPub().toBytes() |
|
||||
assert.equal(p1.length, 65) |
|
||||
|
|
||||
var p1_q = ECPointFp.decodeFrom(ecparams.getCurve(), p1) |
|
||||
assert.ok(p1_q) |
|
||||
assert.ok(p1_q.validate()) |
|
||||
|
|
||||
var p2 = bitcoinjs.convert.hexToBytes( |
|
||||
'0486f356006a38b847bedec1bf47013776925d939d5a35a97a4d1263e550c7f1a' + |
|
||||
'b5aba44ab74d22892097a0e851addf07ba97e33416df5affaceeb35d5607cd23c') |
|
||||
|
|
||||
var p2_q = ECPointFp.decodeFrom(ecparams.getCurve(), p2) |
|
||||
assert.ok(p2_q) |
|
||||
assert.ok(p2_q.validate()) |
|
||||
}) |
|
||||
|
|
||||
it('Signing and Verifying', function () { |
|
||||
var s1 = bitcoinjs.ECKey() |
|
||||
var sig_a = s1.sign(BigInteger.ZERO) |
|
||||
assert.ok(sig_a, 'Sign null') |
|
||||
|
|
||||
assert.ok(s1.verify(BigInteger.ZERO, sig_a)) |
|
||||
|
|
||||
var message = new BigInteger(1024, rng).toByteArrayUnsigned() |
|
||||
var hash = crypto.sha256(message) |
|
||||
var sig_b = s1.sign(hash) |
|
||||
assert.ok(sig_b, 'Sign random string') |
|
||||
assert.ok(s1.verify(hash, sig_b)) |
|
||||
|
|
||||
var message2 = bitcoinjs.convert.hexToBytes( |
|
||||
'12dce2c169986b3346827ffb2305cf393984627f5f9722a1b1368e933c8d' + |
|
||||
'd296653fbe5d7ac031c4962ad0eb1c4298c3b91d244e1116b4a76a130c13' + |
|
||||
'1e7aec7fa70184a71a2e66797052831511b93c6e8d72ae58a1980eaacb66' + |
|
||||
'8a33f50d7cefb96a5dab897b5efcb99cbafb0d777cb83fc9b2115b69c0fa' + |
|
||||
'3d82507b932b84e4') |
|
||||
|
|
||||
var hash2 = crypto.sha256(message2) |
|
||||
|
|
||||
var sig_c = bitcoinjs.convert.hexToBytes( |
|
||||
'3044022038d9b8dd5c9fbf330565c1f51d72a59ba869aeb2c2001be959d3' + |
|
||||
'79e861ec71960220a73945f32cf90d03127d2c3410d16cee120fa1a4b4c3' + |
|
||||
'f273ab082801a95506c4') |
|
||||
|
|
||||
var s2 = bitcoinjs.convert.hexToBytes( |
|
||||
'045a1594316e433fb91f35ef4874610d22177c3f1a1060f6c1e70a609d51' + |
|
||||
'b20be5795cd2a5eae0d6b872ba42db95e9afaeea3fbb89e98099575b6828' + |
|
||||
'609a978528') |
|
||||
|
|
||||
assert.ok(bitcoinjs.ecdsa.verify(hash2, sig_c, s2), 'Verify constant signature') |
|
||||
}) |
|
Loading…
Reference in new issue