UNPKG

meteor-node-stubs

Version:

Stub implementations of Node built-in modules, a la Browserify

154 lines (135 loc) 4.09 kB
var assert = require('assert'); var benchmark = require('benchmark'); var crypto = require('crypto'); var hash = require('hash.js'); var elliptic = require('../'); var eccjs = require('eccjs'); var jodid = require('./deps/jodid'); var ecdsa = require('ecdsa'); var ECKey = require('eckey'); var secp256k1 = require('secp256k1'); var benchmarks = []; var maxTime = 10; function add(op, obj) { benchmarks.push({ name: op, start: function start() { var suite = new benchmark.Suite; console.log('Benchmarking: ' + op); Object.keys(obj).forEach(function(key) { suite.add(key + '#' + op, obj[key], { maxTime: maxTime }) }); suite .on('cycle', function(event) { console.log(String(event.target)); }) .on('complete', function() { console.log('------------------------'); console.log('Fastest is ' + this.filter('fastest').pluck('name')); }) .run(); console.log('========================'); } }); } function start() { var re = process.argv[2] ? new RegExp(process.argv[2], 'i') : /./; benchmarks.filter(function(b) { return re.test(b.name); }).forEach(function(b) { b.start(); }); } var str = 'big benchmark against elliptic'; var m1 = hash.sha256().update(str).digest(); var c1 = elliptic.ec(elliptic.curves.secp256k1); var k1 = c1.genKeyPair(); var s1 = c1.sign(m1, k1); var ok = '-----BEGIN EC PARAMETERS-----\n' + 'BgUrgQQACg==\n' + '-----END EC PARAMETERS-----\n' + '-----BEGIN EC PRIVATE KEY-----\n' + 'MHQCAQEEIEWQfsvf8TdY+F2ziHut3Fl+LVdCHAQBLxeKn3v79M1LoAcGBSuBBAAK\n' + 'oUQDQgAEM7DB6MG6T5nGSwougzGIXVypXb81EerftCyqTc7v/rjmLobz5ZJHGALh\n' + 'ne+0Gdz5ZytFHQCTkUlU85Mz8SPjWg==\n' + '-----END EC PRIVATE KEY-----'; assert(c1.verify(m1, s1, k1)); var m2 = eccjs.sjcl.hash.sha256.hash('big benchmark against elliptic'); var c2 = eccjs.sjcl.ecc.curves.k256; var k2 = eccjs.sjcl.ecc.ecdsa.generateKeys(c2, 0); var s2 = k2.sec.sign(m2, 0); assert(k2.pub.verify(m2, s2)); var m3 = crypto.createHash('sha256').update(str).digest(); var k3 = new ECKey(crypto.randomBytes(32)); var s3 = ecdsa.sign(m3, k3.privateKey); assert(ecdsa.verify(m3, s3, k3.publicKey)); var m4 = crypto.createHash('sha256').update(str).digest(); var k4priv = crypto.randomBytes(32); var k4pub = secp256k1.createPublicKey(k4priv); var s4 = secp256k1.sign(k4priv, m4); assert(secp256k1.verify(k4pub, m4, s4) > 0); add('sign', { elliptic: function() { c1.sign(m1, k1); }, sjcl: function() { k2.sec.sign(m2, 0); }, openssl: function() { crypto.createSign('RSA-SHA256').update(str).sign(ok); }, ecdsa: function() { ecdsa.sign(m3, k3.privateKey); }, secp256k1: function() { secp256k1.sign(k4priv, m4); } }); var os1 = crypto.createSign('RSA-SHA256').update(str).sign(ok); var opk = '-----BEGIN PUBLIC KEY-----\n' + 'MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEM7DB6MG6T5nGSwougzGIXVypXb81Eerf\n' + 'tCyqTc7v/rjmLobz5ZJHGALhne+0Gdz5ZytFHQCTkUlU85Mz8SPjWg==\n' + '-----END PUBLIC KEY-----'; add('verify', { elliptic: function() { c1.verify(m1, s1, k1); }, sjcl: function() { k2.pub.verify(m2, s2); }, openssl: function() { crypto.createVerify('RSA-SHA256').update(str).verify(opk, os1); }, ecdsa: function() { ecdsa.verify(m3, s3, k3.publicKey); }, secp256k1: function() { secp256k1.verify(k4pub, m4, s4); } }); add('gen', { elliptic: function() { c1.genKeyPair().getPublic(); }, sjcl: function() { eccjs.sjcl.ecc.ecdsa.generateKeys(c2, 0); } }); add('ecdh', { elliptic: function() { c1.genKeyPair().derive(k1.getPublic()); } }); var cu1 = elliptic.ec('curve25519'); var ku1 = cu1.genKeyPair(); var kp2 = jodid.eddsa.genKeySeed(); add('curve25519', { elliptic: function() { var s = ku1.derive(cu1.genKeyPair().getPublic()); }, jodid: function() { var s = jodid.dh.computeKey(kp2, jodid.dh.publicKey(jodid.eddsa.genKeySeed())); } }); start();