| 
									
										
										
										
											2019-03-04 17:16:25 -07: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 12:30:32 -07: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-04 17:16:25 -07: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); | 
					
						
							|  |  |  | }); |