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