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