diff --git a/phpseclib/Crypt/RSA.php b/phpseclib/Crypt/RSA.php index 33e86c6d..300dd7f9 100644 --- a/phpseclib/Crypt/RSA.php +++ b/phpseclib/Crypt/RSA.php @@ -1031,22 +1031,22 @@ class RSA /** - * __toString() magic method + * __toString() magic method * * @access public */ function __toString() { $key = $this->getPrivateKey($this->privateKeyFormat); - if ($key !== false) { + if (is_string($key)) { return $key; } $key = $this->_getPrivatePublicKey($this->publicKeyFormat); - return $key !== false ? $key : ''; + return is_string($key) ? $key : ''; } /** - * __clone() magic method + * __clone() magic method * * @access public */ diff --git a/phpseclib/Crypt/RSA/Raw.php b/phpseclib/Crypt/RSA/Raw.php index 47ebc3a0..d3992521 100644 --- a/phpseclib/Crypt/RSA/Raw.php +++ b/phpseclib/Crypt/RSA/Raw.php @@ -48,32 +48,42 @@ class Raw if (!is_array($key)) { return false; } + if (isset($key['isPublicKey']) && isset($key['modulus'])) { + if (isset($key['privateExponent']) || isset($key['publicExponent'])) { + if (!isset($key['primes'])) { + return $key; + } + if (isset($key['exponents']) && isset($key['coefficients']) && isset($key['publicExponent']) && isset($key['privateExponent'])) { + return $key; + } + } + } $components = array('isPublicKey' => true); switch (true) { case isset($key['e']): - $components['publicExponent'] = $key['e']->copy(); + $components['publicExponent'] = $key['e']; break; case isset($key['exponent']): - $components['publicExponent'] = $key['exponent']->copy(); + $components['publicExponent'] = $key['exponent']; break; case isset($key['publicExponent']): - $components['publicExponent'] = $key['publicExponent']->copy(); + $components['publicExponent'] = $key['publicExponent']; break; case isset($key[0]): - $components['publicExponent'] = $key[0]->copy(); + $components['publicExponent'] = $key[0]; } switch (true) { case isset($key['n']): - $components['modulus'] = $key['n']->copy(); + $components['modulus'] = $key['n']; break; case isset($key['modulo']): - $components['modulus'] = $key['modulo']->copy(); + $components['modulus'] = $key['modulo']; break; case isset($key['modulus']): - $components['modulus'] = $key['modulus']->copy(); + $components['modulus'] = $key['modulus']; break; case isset($key[1]): - $components['modulus'] = $key[1]->copy(); + $components['modulus'] = $key[1]; } return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false; } diff --git a/tests/Unit/Crypt/RSA/LoadKeyTest.php b/tests/Unit/Crypt/RSA/LoadKeyTest.php index ee28863d..ec858630 100644 --- a/tests/Unit/Crypt/RSA/LoadKeyTest.php +++ b/tests/Unit/Crypt/RSA/LoadKeyTest.php @@ -7,6 +7,7 @@ use phpseclib\Crypt\RSA; use phpseclib\Crypt\RSA\PKCS1; +use phpseclib\Math\BigInteger; class Unit_Crypt_RSA_LoadKeyTest extends PhpseclibTestCase { @@ -361,4 +362,49 @@ Private-MAC: 03e2cb74e1d67652fbad063d2ed0478f31bdf256 $this->assertSame($key, $key2); } + + public function testRawKey() + { + $rsa = new RSA(); + + $key = array( + 'e' => BigInteger('10001', 16), + 'n' => BigInteger('aa18aba43b50deef38598faf87d2ab634e4571c130a9bca7b878267414faab8b471bd8965f5c9fc3' . + '818485eaf529c26246f3055064a8de19c8c338be5496cbaeb059dc0b358143b44a35449eb2641131' . + '21a455bd7fde3fac919e94b56fb9bb4f651cdb23ead439d6cd523eb08191e75b35fd13a7419b3090' . + 'f24787bd4f4e1967', 16) + ); + $this->assertTrue($rsa->load($key)); + $rsa->setPublicKeyFormat('raw'); + $this->assertEmpty("$rsa"); + } + + public function testRawComment() + { + $key = 'PuTTY-User-Key-File-2: ssh-rsa +Encryption: aes256-cbc +Comment: phpseclib-generated-key +Public-Lines: 4 +AAAAB3NzaC1yc2EAAAADAQABAAAAgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4 +eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RK +NUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDy +R4e9T04ZZw== +Private-Lines: 8 +llx04QMegql0/nE5RvcJSrGrodxt6ytuv/JX2caeZBUyQwQc2WBNYagLHyHPM9jI +9OUWz59FLhjFXZMDNMoUXxVmjwQpOAaVPYNxxFM9AF6/NXFji64K7huD9n4A+kLn +sHwMLWPR5a/tZA0r05DZNz9ULA3mQu7Hz4EQ8ifu3uTPJuTmL51x6RmudYKysb20 +fM8VzC3ukvzzRh0pujUVTr/yQdmciASVFnZlt4xQy+ZEOVUAOfwjd//AFfXTvk6x +7A45rNlU/uicHwLgoY1APvRHCFxw7F+uVW5L4mSX7NNzqBKkZ+1qpQTAfQvIfEIb +444+CXsgIyOpqt6VxJH2u6elAtE1wau3YaFR8Alm8m97rFYzRi3oDP5NZYkTCWSV +EOpSeghXSs7IilJu8I6/sB1w5dakdeBSFkIynrlFXkO0uUw+QJJWjxY8SypzgIuP +DzduF6XsQrCyo6dnIpGQCQ== +Private-MAC: 35134b7434bf828b21404099861d455e660e8740'; + $raw = PuTTY::load($key, 'password'); + $this->assertArrayHasKey('comment', $raw); + $this->assertEquals($raw['comment'], 'phpseclib-generated-key'); + + $rsa = new RSA(); + $rsa->load($raw); + $this->assertGreaterThanOrEqual(1, strlen("$rsa")); + } }