| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-13 04:33:17 -06:00
										 |  |  | var ursa; | 
					
						
							|  |  |  | try { | 
					
						
							|  |  |  |   ursa = require('ursa'); | 
					
						
							|  |  |  | } catch(e) { | 
					
						
							|  |  |  |   try { | 
					
						
							|  |  |  |     ursa = require('ursa-optional'); | 
					
						
							|  |  |  |   } catch(e2) { | 
					
						
							|  |  |  |     throw e; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function notToJson() { | 
					
						
							|  |  |  |   return undefined; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 19:09:37 -04:00
										 |  |  | var ursac = module.exports = { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // to components
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   _privateJwkToComponents: function (jwk) { | 
					
						
							|  |  |  |     var components = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [ 'n', 'e', 'p', 'q', 'dp', 'dq', 'qi', 'd' ].forEach(function (key) { | 
					
						
							|  |  |  |       components.push(new Buffer(jwk[key], 'base64')); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return components; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | , _publicJwkToComponents: function (jwk) { | 
					
						
							|  |  |  |     var components = []; | 
					
						
							|  |  |  |     [ 'n', 'e' ].forEach(function (key) { | 
					
						
							|  |  |  |       components.push(new Buffer(jwk[key], 'base64')); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return components; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Generate New Keypair
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  | , generateKeypair: function (bitlen, exp, options, cb) { | 
					
						
							| 
									
										
										
										
											2016-07-30 19:09:37 -04:00
										 |  |  |     var keypair = ursa.generatePrivateKey(bitlen || 2048, exp || 65537); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     keypair.toJSON = notToJson; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cb(null, { | 
					
						
							|  |  |  |       _ursa: keypair | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |   // Import
 | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |   //
 | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  | , _ursaImportPem: function (keypair) { | 
					
						
							|  |  |  |     if (keypair._ursa) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     if (keypair.privateKeyPem) { | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |       keypair._ursa = ursa.createPrivateKey(keypair.privateKeyPem); | 
					
						
							|  |  |  |       keypair._ursa.toJSON = notToJson; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (keypair.publicKeyPem) { | 
					
						
							|  |  |  |       ursac._ursaImportPublicPem(keypair); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | , _ursaImportPublicPem: function (keypair) { | 
					
						
							|  |  |  |     if (keypair._ursa || keypair._ursaPublic) { | 
					
						
							|  |  |  |       return; | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |     if (keypair.publicKeyPem) { | 
					
						
							|  |  |  |       keypair._ursaPublic = ursa.createPublicKey(keypair.publicKeyPem); | 
					
						
							|  |  |  |       keypair._ursaPublic.toJSON = notToJson; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | , _ursaImportJwk: function (keypair) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     if (keypair._ursa) { | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |       return; | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (keypair.privateKeyJwk) { | 
					
						
							|  |  |  |       keypair._ursa = ursa.createPrivateKeyFromComponents.apply( | 
					
						
							|  |  |  |         ursa | 
					
						
							|  |  |  |       , ursac._privateJwkToComponents(keypair.privateKeyJwk) | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       keypair._ursa.toJSON = notToJson; | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |     } | 
					
						
							|  |  |  |     else if (keypair.publicKeyJwk) { | 
					
						
							|  |  |  |       ursac._ursaImportPublicJwk(keypair); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | , _ursaImportPublicJwk: function (keypair) { | 
					
						
							|  |  |  |     if (keypair._ursa || keypair._ursaPublic) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 12:35:23 -04:00
										 |  |  |     if (keypair.publicKeyJwk) { | 
					
						
							|  |  |  |       keypair._ursaPublic = ursa.createPublicKeyFromComponents.apply( | 
					
						
							|  |  |  |         ursa | 
					
						
							|  |  |  |       , ursac._publicJwkToComponents(keypair.publicKeyJwk) | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       keypair._ursaPublic.toJSON = notToJson; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |   } | 
					
						
							|  |  |  | , import: function (keypair) { | 
					
						
							|  |  |  |     ursac._ursaImportJwk(keypair); | 
					
						
							|  |  |  |     ursac._ursaImportPem(keypair); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return keypair; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Export Public / Private PEMs
 | 
					
						
							|  |  |  |   //
 | 
					
						
							| 
									
										
										
										
											2016-08-02 16:42:44 -04:00
										 |  |  | , _pemBinToPem: function (pem) { | 
					
						
							|  |  |  |     return pem.toString('ascii').replace(/[\n\r]+/g, '\r\n'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  | , exportPrivatePem: function (keypair) { | 
					
						
							|  |  |  |     if (keypair.privateKeyPem) { | 
					
						
							|  |  |  |       return keypair.privateKeyPem; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (keypair._ursa) { | 
					
						
							| 
									
										
										
										
											2016-08-02 16:42:44 -04:00
										 |  |  |       return ursac._pemBinToPem(keypair._ursa.toPrivatePem()); | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (keypair.privateKeyJwk) { | 
					
						
							|  |  |  |       ursac._ursaImportJwk(keypair); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 16:42:44 -04:00
										 |  |  |       return ursac._pemBinToPem(keypair._ursa.toPrivatePem()); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     throw new Error("None of privateKeyPem, _ursa, or privateKeyJwk found. No way to export private key PEM"); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-07-30 23:47:52 -04:00
										 |  |  | , exportPublicPem: function (keypair) { | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     if (keypair.publicKeyPem) { | 
					
						
							|  |  |  |       return keypair.publicKeyPem; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (keypair._ursa || keypair._ursaPublic) { | 
					
						
							| 
									
										
										
										
											2016-08-02 16:42:44 -04:00
										 |  |  |       return ursac._pemBinToPem((keypair._ursa || keypair._ursaPublic).toPublicPem()); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (keypair.publicKeyJwk) { | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |       ursac._ursaImportPublicJwk(keypair); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 16:42:44 -04:00
										 |  |  |       return ursac._pemBinToPem(keypair._ursaPublic.toPublicPem()); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (keypair.privateKeyJwk) { | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |       ursac._ursaImportJwk(keypair); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 16:42:44 -04:00
										 |  |  |       return ursac._pemBinToPem(keypair._ursa.toPublicPem()); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (keypair.privateKeyPem) { | 
					
						
							| 
									
										
										
										
											2016-08-01 04:03:50 -04:00
										 |  |  |       ursac._ursaImportPem(keypair); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 16:42:44 -04:00
										 |  |  |       return ursac._pemBinToPem(keypair._ursa.toPublicPem()); | 
					
						
							| 
									
										
										
										
											2016-07-30 16:00:08 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     throw new Error("None of publicKeyPem, _ursa, publicKeyJwk, privateKeyPem, or privateKeyJwk found. No way to export public key PEM"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | //, exportPrivateKeyJwk: NOT IMPLEMENTED HERE
 | 
					
						
							|  |  |  | //, exportPublicKeyJwk: NOT IMPLEMENTED HERE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; |