diff --git a/fuzz/happy.js b/fuzz/happy.js new file mode 100644 index 0000000..4b4ad9a --- /dev/null +++ b/fuzz/happy.js @@ -0,0 +1,29 @@ +'use strict'; + +var assert = require('assert'), + crypto = require('crypto'); + +var keygen = require('./keygen'); + +var conv = require('../'); + +var sslalgs = { + 'ES256': 'RSA-SHA256', + 'ES384': 'RSA-SHA384', + 'ES512': 'RSA-SHA512' +}; + +['ES256', 'ES384', 'ES512'].forEach(function (alg) { + for (var i = 0; i < 10; ++i) { + var pem = keygen(alg); + + for (var j = 0; j < 10000; ++j) { + var der = crypto + .createSign(sslalgs[alg]) + .update(crypto.randomBytes((Math.random() * (256 - 1) | 0) + 1)) + .sign(pem); + + assert(conv.joseToDer(conv.derToJose(der, alg), alg).equals(der)); + } + } +}); diff --git a/fuzz/keygen.js b/fuzz/keygen.js new file mode 100644 index 0000000..19547fe --- /dev/null +++ b/fuzz/keygen.js @@ -0,0 +1,46 @@ +'use strict'; + +var base64url = require('base64-url').escape, + EC = require('elliptic').ec, + jwkToPem = require('jwk-to-pem'); + +var curves = { + ES256: 'p256', + ES384: 'p384', + ES512: 'p521' + }, + jwkCurves = { + ES256: 'P-256', + ES384: 'P-384', + ES512: 'P-521' + }; + +function b64(val) { + val = val.toString('hex', 2); + val = new Buffer(val, 'hex'); + val = val.toString('base64'); + val = base64url(val); + return val; +} + +function keygen(alg) { + var curve = new EC(curves[alg]); + + var keypair = curve.genKeyPair(); + var priv = keypair.getPrivate(); + var pub = keypair.getPublic(); + + var jwk = { + kty: 'EC', + crv: jwkCurves[alg], + x: b64(pub.getX()), + y: b64(pub.getY()), + d: b64(priv) + }; + + var pem = jwkToPem(jwk, { private: true }); + + return pem; +} + +module.exports = keygen; diff --git a/package.json b/package.json index 07f2740..273415a 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,9 @@ "bench": "^0.3.5", "chai": "^3.0.0", "coveralls": "^2.11.2", + "elliptic": "^6.0.1", "istanbul": "^0.3.15", + "jwk-to-pem": "^1.2.2", "mocha": "^2.2.5" } }