| 
									
										
										
										
											2015-12-13 17:50:04 +01:00
										 |  |  | // Copyright 2014 ISRG.  All rights reserved
 | 
					
						
							|  |  |  | // This Source Code Form is subject to the terms of the Mozilla Public
 | 
					
						
							|  |  |  | // License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
					
						
							|  |  |  | // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
					
						
							| 
									
										
										
										
											2015-12-16 03:23:02 +00:00
										 |  |  | 'use strict'; | 
					
						
							| 
									
										
										
										
											2015-12-13 17:50:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   fromStandardB64: function(x) { | 
					
						
							|  |  |  |     return x.replace(/[+]/g, "-").replace(/\//g, "_").replace(/=/g,""); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   toStandardB64: function(x) { | 
					
						
							|  |  |  |     var b64 = x.replace(/-/g, "+").replace(/_/g, "/").replace(/=/g, ""); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (b64.length % 4) { | 
					
						
							|  |  |  |       case 2: b64 += "=="; break; | 
					
						
							|  |  |  |       case 3: b64 += "="; break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return b64; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   b64enc: function(buffer) { | 
					
						
							|  |  |  |     return this.fromStandardB64(buffer.toString("base64")); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   b64dec: function(str) { | 
					
						
							|  |  |  |     return new Buffer(this.toStandardB64(str), "base64"); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   isB64String: function(x) { | 
					
						
							| 
									
										
										
										
											2015-12-16 03:23:02 +00:00
										 |  |  |     return ("string" === typeof x) && !x.match(/[^a-zA-Z0-9_-]/); | 
					
						
							| 
									
										
										
										
											2015-12-13 17:50:04 +01:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   fieldsPresent: function(fields, object) { | 
					
						
							|  |  |  |     for (var i in fields) { | 
					
						
							|  |  |  |       if (!(fields[i] in object)) { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   validSignature: function(sig) { | 
					
						
							| 
									
										
										
										
											2015-12-16 03:23:02 +00:00
										 |  |  |     return (("object" === typeof sig) && | 
					
						
							|  |  |  |       ("alg" in sig) && ("string" === typeof sig.alg) && | 
					
						
							| 
									
										
										
										
											2015-12-13 17:50:04 +01:00
										 |  |  |       ("nonce" in sig) && this.isB64String(sig.nonce) && | 
					
						
							|  |  |  |       ("sig" in sig) && this.isB64String(sig.sig) && | 
					
						
							|  |  |  |       ("jwk" in sig) && this.validJWK(sig.jwk)); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   validJWK: function(jwk) { | 
					
						
							| 
									
										
										
										
											2015-12-16 03:23:02 +00:00
										 |  |  |     return (("object" === typeof jwk) && ("kty" in jwk) && ( | 
					
						
							|  |  |  |       ((jwk.kty === "RSA") | 
					
						
							| 
									
										
										
										
											2015-12-13 17:50:04 +01:00
										 |  |  |         && ("n" in jwk) && this.isB64String(jwk.n) | 
					
						
							|  |  |  |         && ("e" in jwk) && this.isB64String(jwk.e)) || | 
					
						
							| 
									
										
										
										
											2015-12-16 03:23:02 +00:00
										 |  |  |       ((jwk.kty === "EC") | 
					
						
							| 
									
										
										
										
											2015-12-13 17:50:04 +01:00
										 |  |  |         && ("crv" in jwk) | 
					
						
							|  |  |  |         && ("x" in jwk) && this.isB64String(jwk.x) | 
					
						
							|  |  |  |         && ("y" in jwk) && this.isB64String(jwk.y)) | 
					
						
							|  |  |  |     ) && !("d" in jwk)); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // A simple, non-standard fingerprint for a JWK,
 | 
					
						
							|  |  |  |   // just so that we don't have to store objects
 | 
					
						
							|  |  |  |   keyFingerprint: function(jwk) { | 
					
						
							|  |  |  |     switch (jwk.kty) { | 
					
						
							|  |  |  |       case "RSA": return jwk.n; | 
					
						
							|  |  |  |       case "EC": return jwk.crv + jwk.x + jwk.y; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     throw "Unrecognized key type"; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; |