diff --git a/phpseclib/Crypt/RSA.php b/phpseclib/Crypt/RSA.php index b72b30c2..77414ee0 100644 --- a/phpseclib/Crypt/RSA.php +++ b/phpseclib/Crypt/RSA.php @@ -2085,8 +2085,14 @@ class RSA */ function _exponentiate($x) { - if (empty($this->primes) || empty($this->coefficients) || empty($this->exponents)) { - return $x->modPow($this->exponent, $this->modulus); + switch (true) { + case empty($this->primes): + case $this->primes[1]->equals($this->zero): + case empty($this->coefficients): + case $this->coefficients[2]->equals($this->zero): + case empty($this->exponents): + case $this->exponents[1]->equals($this->zero): + return $x->modPow($this->exponent, $this->modulus); } $num_primes = count($this->primes); diff --git a/tests/Unit/Crypt/RSA/LoadKeyTest.php b/tests/Unit/Crypt/RSA/LoadKeyTest.php index a535fd44..c4c72cc1 100644 --- a/tests/Unit/Crypt/RSA/LoadKeyTest.php +++ b/tests/Unit/Crypt/RSA/LoadKeyTest.php @@ -380,4 +380,25 @@ Private-MAC: 35134b7434bf828b21404099861d455e660e8740'; $rsa->setPrivateKey(); $rsa->loadKey($rsa); } + + /** + * @group github980 + */ + public function testZeroComponents() + { + $key = '-----BEGIN RSA PRIVATE KEY----- +MIGaAgEAAkEAt5yrcHAAjhglnCEn6yecMWPeUXcMyo0+itXrLlkpcKIIyqPw546b +GThhlb1ppX1ySX/OUA4jSakHekNP5eWPawIBAAJAW6/aVD05qbsZHMvZuS2Aa5Fp +NNj0BDlf38hOtkhDzz/hkYb+EBYLLvldhgsD0OvRNy8yhz7EjaUqLCB0juIN4QIB +AAIBAAIBAAIBAAIBAA== +-----END RSA PRIVATE KEY-----'; + + $rsa = new Crypt_RSA(); + $rsa->loadKey($key); + $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + $rsa->setHash('md5'); + $rsa->setMGFHash('md5'); + + $rsa->sign('zzzz'); + } }