meteor-node-stubs
Version:
Stub implementations of Node built-in modules, a la Browserify
139 lines (113 loc) • 4.2 kB
JavaScript
/* eslint-env node, mocha */
;
var assert = require('assert');
var elliptic = require('../');
var utils = elliptic.utils;
var toArray = elliptic.utils.toArray;
var eddsa = elliptic.eddsa;
function toHex(arr) {
return elliptic.utils.toHex(arr).toUpperCase();
}
var MAX_PROGRAMMATIC = process.env.CI ? Infinity : 50;
describe('ed25519 derivations', function() {
var expectedTests = 256;
var ed25519;
var derivations;
before(function() {
ed25519 = new eddsa('ed25519');
derivations = require('./fixtures/derivation-fixtures');
assert.equal(derivations.length, expectedTests);
});
function testFactory(i) {
it('can compute correct a and A for secret: ' + i, function() {
var test = derivations[i];
var secret = utils.toArray(test.secret_hex, 'hex');
var key = ed25519.keyFromSecret(secret);
assert.equal(toHex(key.privBytes()), test.a_hex);
var xRecovered = toHex(ed25519.encodeInt(
ed25519.decodePoint(key.pubBytes()).getX()));
assert.equal(xRecovered, test.A_P.x);
assert.equal(toHex(key.pubBytes()), test.A_hex);
});
}
for (var i = 0; i < Math.min(expectedTests, MAX_PROGRAMMATIC); i++)
testFactory(i);
});
describe('sign.input ed25519 test vectors', function() {
var expectedTests = 1024;
var ed25519;
var lines;
before(function(done) {
ed25519 = new eddsa('ed25519');
require('fs').readFile(__dirname + '/fixtures/sign.input', function(err, f) {
lines = f.toString().split('\n');
assert.equal(lines.length, expectedTests + 1 /*blank line*/);
done();
});
});
function testFactory(i) {
it('vector ' + i, function() {
var split = lines[i].toUpperCase().split(':');
var key = ed25519.keyFromSecret(split[0].slice(0, 64));
var expectedPk = split[0].slice(64);
assert.equal(toHex(key.pubBytes()), expectedPk);
var msg = toArray(split[2], 'hex');
var sig = key.sign(msg).toHex();
var sigR = sig.slice(0, 64);
var sigS = sig.slice(64);
assert.equal(sigR, split[3].slice(0, 64));
assert.equal(sigS, split[3].slice(64, 128));
assert(key.verify(msg, sig));
var forged = msg.length === 0 ? [ 0x78 ] /*ord('x')*/:
msg.slice(0, msg.length - 1).concat(
(msg[(msg.length - 1)] + 1) % 256);
assert.equal(msg.length || 1, forged.length);
assert(!key.verify(forged, sig));
});
}
for (var i = 0; i < Math.min(expectedTests, MAX_PROGRAMMATIC); i++)
testFactory(i);
});
describe('EDDSA(\'ed25519\')', function() {
var ed25519;
before(function() {
ed25519 = new eddsa('ed25519');
});
it('has encodingLength of 32', function() {
assert.equal(32, ed25519.encodingLength);
});
it('can sign/verify messages', function() {
var secret = toArray(new Array(65).join('0'), 'hex');
assert(secret.length === 32);
var msg = [ 0xB, 0xE, 0xE, 0xF ];
var key = ed25519.keyFromSecret(secret);
var sig = key.sign(msg).toHex();
var R = '8F1B9A7FDB22BCD2C15D4695B1CE2B063CBFAEC9B00BE360427BAC9533943F6C';
var S = '5F0B380FD7F2E43B70AB2FA29F6C6E3FFC1012710E174786814012324BF19B0C';
assert.equal(sig.slice(0, 64), R);
assert.equal(sig.slice(64), S);
assert(key.verify(msg, sig));
});
describe('KeyPair', function() {
var pair;
var secret = '00000000000000000000000000000000' +
'00000000000000000000000000000000';
before(function() {
pair = ed25519.keyFromSecret(secret);
});
it('can be created with keyFromSecret/keyFromPublic', function() {
var pubKey = ed25519.keyFromPublic(toHex(pair.pubBytes()));
assert(pubKey.pub() instanceof ed25519.pointClass);
assert(pubKey.pub().eq(pair.pub()));
});
it('#getSecret returns bytes with optional encoding', function() {
assert(Array.isArray(pair.getSecret()));
assert(pair.getSecret('hex') === secret);
});
it('#getPub returns bytes with optional encoding', function() {
assert(Array.isArray(pair.getPublic()));
assert.equal(pair.getPublic('hex'),
'3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29');
});
});
});