mirror of
				https://github.com/therootcompany/keypairs.js.git
				synced 2024-11-16 17:29:03 +00:00 
			
		
		
		
	
		
			
	
	
		
			166 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			166 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var Keypairs = require('../'); | ||
|  | 
 | ||
|  | /* global Promise*/ | ||
|  | Keypairs.parseOrGenerate({ key: null }) | ||
|  | 	.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')" | ||
|  | 						); | ||
|  | 					} | ||
|  | 					if (!pair.parseError) { | ||
|  | 						throw new Error( | ||
|  | 							'should pass parseError for malformed string' | ||
|  | 						); | ||
|  | 					} | ||
|  | 					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, | ||
|  | 				// Note: using ES512 won't actually increase the length
 | ||
|  | 				// (it would be truncated to fit into the key size)
 | ||
|  | 				alg: 'ES256', | ||
|  | 				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.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); | ||
|  | 	}); |