You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							112 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							112 lines
						
					
					
						
							2.8 KiB
						
					
					
				
								// Copyright 2012 Joyent, Inc.  All rights reserved.
							 | 
						|
								
							 | 
						|
								var assert = require('assert-plus');
							 | 
						|
								var sshpk = require('sshpk');
							 | 
						|
								var util = require('util');
							 | 
						|
								
							 | 
						|
								var HASH_ALGOS = {
							 | 
						|
								  'sha1': true,
							 | 
						|
								  'sha256': true,
							 | 
						|
								  'sha512': true
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								var PK_ALGOS = {
							 | 
						|
								  'rsa': true,
							 | 
						|
								  'dsa': true,
							 | 
						|
								  'ecdsa': true
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								function HttpSignatureError(message, caller) {
							 | 
						|
								  if (Error.captureStackTrace)
							 | 
						|
								    Error.captureStackTrace(this, caller || HttpSignatureError);
							 | 
						|
								
							 | 
						|
								  this.message = message;
							 | 
						|
								  this.name = caller.name;
							 | 
						|
								}
							 | 
						|
								util.inherits(HttpSignatureError, Error);
							 | 
						|
								
							 | 
						|
								function InvalidAlgorithmError(message) {
							 | 
						|
								  HttpSignatureError.call(this, message, InvalidAlgorithmError);
							 | 
						|
								}
							 | 
						|
								util.inherits(InvalidAlgorithmError, HttpSignatureError);
							 | 
						|
								
							 | 
						|
								function validateAlgorithm(algorithm) {
							 | 
						|
								  var alg = algorithm.toLowerCase().split('-');
							 | 
						|
								
							 | 
						|
								  if (alg.length !== 2) {
							 | 
						|
								    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' is not a ' +
							 | 
						|
								      'valid algorithm'));
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  if (alg[0] !== 'hmac' && !PK_ALGOS[alg[0]]) {
							 | 
						|
								    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' type keys ' +
							 | 
						|
								      'are not supported'));
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  if (!HASH_ALGOS[alg[1]]) {
							 | 
						|
								    throw (new InvalidAlgorithmError(alg[1].toUpperCase() + ' is not a ' +
							 | 
						|
								      'supported hash algorithm'));
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  return (alg);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								///--- API
							 | 
						|
								
							 | 
						|
								module.exports = {
							 | 
						|
								
							 | 
						|
								  HASH_ALGOS: HASH_ALGOS,
							 | 
						|
								  PK_ALGOS: PK_ALGOS,
							 | 
						|
								
							 | 
						|
								  HttpSignatureError: HttpSignatureError,
							 | 
						|
								  InvalidAlgorithmError: InvalidAlgorithmError,
							 | 
						|
								
							 | 
						|
								  validateAlgorithm: validateAlgorithm,
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Converts an OpenSSH public key (rsa only) to a PKCS#8 PEM file.
							 | 
						|
								   *
							 | 
						|
								   * The intent of this module is to interoperate with OpenSSL only,
							 | 
						|
								   * specifically the node crypto module's `verify` method.
							 | 
						|
								   *
							 | 
						|
								   * @param {String} key an OpenSSH public key.
							 | 
						|
								   * @return {String} PEM encoded form of the RSA public key.
							 | 
						|
								   * @throws {TypeError} on bad input.
							 | 
						|
								   * @throws {Error} on invalid ssh key formatted data.
							 | 
						|
								   */
							 | 
						|
								  sshKeyToPEM: function sshKeyToPEM(key) {
							 | 
						|
								    assert.string(key, 'ssh_key');
							 | 
						|
								
							 | 
						|
								    var k = sshpk.parseKey(key, 'ssh');
							 | 
						|
								    return (k.toString('pem'));
							 | 
						|
								  },
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Generates an OpenSSH fingerprint from an ssh public key.
							 | 
						|
								   *
							 | 
						|
								   * @param {String} key an OpenSSH public key.
							 | 
						|
								   * @return {String} key fingerprint.
							 | 
						|
								   * @throws {TypeError} on bad input.
							 | 
						|
								   * @throws {Error} if what you passed doesn't look like an ssh public key.
							 | 
						|
								   */
							 | 
						|
								  fingerprint: function fingerprint(key) {
							 | 
						|
								    assert.string(key, 'ssh_key');
							 | 
						|
								
							 | 
						|
								    var k = sshpk.parseKey(key, 'ssh');
							 | 
						|
								    return (k.fingerprint('md5').toString('hex'));
							 | 
						|
								  },
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa)
							 | 
						|
								   *
							 | 
						|
								   * The reverse of the above function.
							 | 
						|
								   */
							 | 
						|
								  pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) {
							 | 
						|
								    assert.equal('string', typeof (pem), 'typeof pem');
							 | 
						|
								
							 | 
						|
								    var k = sshpk.parseKey(pem, 'pem');
							 | 
						|
								    k.comment = comment;
							 | 
						|
								    return (k.toString('ssh'));
							 | 
						|
								  }
							 | 
						|
								};
							 | 
						|
								
							 |