2019-03-05 00:16:25 +00:00
|
|
|
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;
|
|
|
|
})
|
2019-03-08 19:30:32 +00:00
|
|
|
, Keypairs.signJwt({ jwk: pair.private, 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");
|
|
|
|
})
|
2019-03-05 00:16:25 +00:00
|
|
|
]).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);
|
|
|
|
});
|