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);
 | |
| 	});
 |