var Keypairs = require('./'); /* global Promise*/ Keypairs.parseOrGenerate({ key: '' }).then(function (pair) { // should NOT have any warning output if (!pair.private || !pair.public) { throw new Error("missing key pairs"); } return Promise.all([ // Testing Public Part of key Keypairs.export({ jwk: pair.public }).then(function (pem) { if (!/--BEGIN PUBLIC/.test(pem)) { throw new Error("did not export public pem"); } return Promise.all([ Keypairs.parse({ key: pem }).then(function (pair) { if (pair.private) { throw new Error("shouldn't have private part"); } return true; }) , Keypairs.parse({ key: pem, private: true }).then(function () { var err = new Error("should have thrown an error when private key was required and public pem was given"); err.code = 'NOERR'; throw err; }).catch(function (e) { if ('NOERR' === e.code) { throw e; } return true; }) ]).then(function () { return true; }); }) // Testing Private Part of Key , Keypairs.export({ jwk: pair.private }).then(function (pem) { if (!/--BEGIN .*PRIVATE KEY--/.test(pem)) { throw new Error("did not export private pem: " + pem); } return Promise.all([ Keypairs.parse({ key: pem }).then(function (pair) { if (!pair.private) { throw new Error("should have private part"); } if (!pair.public) { throw new Error("should have public part also"); } return true; }) , Keypairs.parse({ key: pem, public: true }).then(function (pair) { if (pair.private) { throw new Error("should NOT have private part"); } if (!pair.public) { throw new Error("should have the public part though"); } return true; }) ]).then(function () { return true; }); }) , Keypairs.parseOrGenerate({ key: 'not a key', public: true }).then(function (pair) { // SHOULD have warning output if (!pair.private || !pair.public) { throw new Error("missing key pairs (should ignore 'public')"); } return true; }) , Keypairs.parse({ key: JSON.stringify(pair.private) }).then(function (pair) { if (!pair.private || !pair.public) { throw new Error("missing key pairs (stringified jwt)"); } return true; }) , Keypairs.parse({ key: JSON.stringify(pair.private), public: true }).then(function (pair) { if (pair.private) { throw new Error("has private key when it shouldn't"); } if (!pair.public) { throw new Error("doesn't have public key when it should"); } return true; }) , Keypairs.parse({ key: JSON.stringify(pair.public), private: true }).then(function () { var err = new Error("should have thrown an error when private key was required and public jwk was given"); err.code = 'NOERR'; throw err; }).catch(function (e) { if ('NOERR' === e.code) { throw e; } return true; }) , Keypairs.signJwt({ jwk: pair.private, alg: 'ES512', iss: 'https://example.com/', exp: '1h' }).then(function (jwt) { var parts = jwt.split('.'); var now = Math.round(Date.now()/1000); var token = { header: JSON.parse(Buffer.from(parts[0], 'base64')) , payload: JSON.parse(Buffer.from(parts[1], 'base64')) , signature: parts[2] //Buffer.from(parts[2], 'base64') }; // allow some leeway just in case we happen to hit a 1ms boundary if (token.payload.exp - now > 60 * 59.99) { return true; } throw new Error("token was not properly generated"); }) ]).then(function (results) { if (results.length && results.every(function (v) { return true === v; })) { console.info("If a warning prints right above this, it's a pass"); console.log("PASS"); process.exit(0); } else { throw new Error("didn't get all passes (but no errors either)"); } }); }).catch(function (e) { console.error("Caught an unexpected (failing) error:"); console.error(e); process.exit(1); });