142 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			142 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | /** | ||
|  |  * OpenSSH Formatted RSA Key Handler | ||
|  |  * | ||
|  |  * PHP version 5 | ||
|  |  * | ||
|  |  * Place in $HOME/.ssh/authorized_keys | ||
|  |  * | ||
|  |  * @category  Crypt | ||
|  |  * @package   RSA | ||
|  |  * @author    Jim Wigginton <terrafrost@php.net> | ||
|  |  * @copyright 2015 Jim Wigginton | ||
|  |  * @license   http://www.opensource.org/licenses/mit-license.html  MIT License | ||
|  |  * @link      http://phpseclib.sourceforge.net | ||
|  |  */ | ||
|  | 
 | ||
|  | namespace phpseclib\Crypt\RSA; | ||
|  | 
 | ||
|  | use ParagonIE\ConstantTime\Base64; | ||
|  | use phpseclib\Math\BigInteger; | ||
|  | 
 | ||
|  | /** | ||
|  |  * OpenSSH Formatted RSA Key Handler | ||
|  |  * | ||
|  |  * @package RSA | ||
|  |  * @author  Jim Wigginton <terrafrost@php.net> | ||
|  |  * @access  public | ||
|  |  */ | ||
|  | class OpenSSH | ||
|  | { | ||
|  |     /** | ||
|  |      * Default comment | ||
|  |      * | ||
|  |      * @var string | ||
|  |      * @access private | ||
|  |      */ | ||
|  |     static $comment = 'phpseclib-generated-key'; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Sets the default comment | ||
|  |      * | ||
|  |      * @access public | ||
|  |      * @param string $comment | ||
|  |      */ | ||
|  |     static function setComment($comment) | ||
|  |     { | ||
|  |         self::$comment = str_replace(array("\r", "\n"), '', $comment); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Break a public or private key down into its constituent components | ||
|  |      * | ||
|  |      * @access public | ||
|  |      * @param string $key | ||
|  |      * @param string $password optional | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     static function load($key, $password = '') | ||
|  |     { | ||
|  |         if (!is_string($key)) { | ||
|  |             return false; | ||
|  |         } | ||
|  | 
 | ||
|  |         $parts = explode(' ', $key, 3); | ||
|  | 
 | ||
|  |         $key = isset($parts[1]) ? Base64::decode($parts[1]) : Base64::decode($parts[0]); | ||
|  |         if ($key === false) { | ||
|  |             return false; | ||
|  |         } | ||
|  | 
 | ||
|  |         $comment = isset($parts[2]) ? $parts[2] : false; | ||
|  | 
 | ||
|  |         if (substr($key, 0, 11) != "\0\0\0\7ssh-rsa") { | ||
|  |             return false; | ||
|  |         } | ||
|  |         self::_string_shift($key, 11); | ||
|  |         if (strlen($key) <= 4) { | ||
|  |             return false; | ||
|  |         } | ||
|  |         extract(unpack('Nlength', self::_string_shift($key, 4))); | ||
|  |         if (strlen($key) <= $length) { | ||
|  |             return false; | ||
|  |         } | ||
|  |         $publicExponent = new BigInteger(self::_string_shift($key, $length), -256); | ||
|  |         if (strlen($key) <= 4) { | ||
|  |             return false; | ||
|  |         } | ||
|  |         extract(unpack('Nlength', self::_string_shift($key, 4))); | ||
|  |         if (strlen($key) != $length) { | ||
|  |             return false; | ||
|  |         } | ||
|  |         $modulus = new BigInteger(self::_string_shift($key, $length), -256); | ||
|  | 
 | ||
|  |         return array( | ||
|  |             'isPublicKey' => true, | ||
|  |             'modulus' => $modulus, | ||
|  |             'publicExponent' => $publicExponent, | ||
|  |             'comment' => $comment | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Convert a public key to the appropriate format | ||
|  |      * | ||
|  |      * @access public | ||
|  |      * @param \phpseclib\Math\BigInteger $n | ||
|  |      * @param \phpseclib\Math\BigInteger $e | ||
|  |      * @return string | ||
|  |      */ | ||
|  |     static function savePublicKey(BigInteger $n, BigInteger $e) | ||
|  |     { | ||
|  |         $publicExponent = $e->toBytes(true); | ||
|  |         $modulus = $n->toBytes(true); | ||
|  | 
 | ||
|  |         // from <http://tools.ietf.org/html/rfc4253#page-15>:
 | ||
|  |         // string    "ssh-rsa"
 | ||
|  |         // mpint     e
 | ||
|  |         // mpint     n
 | ||
|  |         $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); | ||
|  |         $RSAPublicKey = 'ssh-rsa ' . Base64::encode($RSAPublicKey) . ' ' . self::$comment; | ||
|  | 
 | ||
|  |         return $RSAPublicKey; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * String Shift | ||
|  |      * | ||
|  |      * Inspired by array_shift | ||
|  |      * | ||
|  |      * @param string $string | ||
|  |      * @param int $index | ||
|  |      * @return string | ||
|  |      * @access private | ||
|  |      */ | ||
|  |     static function _string_shift(&$string, $index = 1) | ||
|  |     { | ||
|  |         $substr = substr($string, 0, $index); | ||
|  |         $string = substr($string, $index); | ||
|  |         return $substr; | ||
|  |     } | ||
|  | } |