diff --git a/phpseclib/Crypt/Blowfish.php b/phpseclib/Crypt/Blowfish.php index 3949e812..27e34b75 100644 --- a/phpseclib/Crypt/Blowfish.php +++ b/phpseclib/Crypt/Blowfish.php @@ -317,7 +317,7 @@ class Blowfish extends Base function isValidEngine($engine) { if ($engine == self::ENGINE_OPENSSL) { - if ($this->key_length != 16) { + if ($this->key_length < 16) { return false; } $this->cipher_name_openssl_ecb = 'bf-ecb'; diff --git a/phpseclib/Crypt/RC4.php b/phpseclib/Crypt/RC4.php index 1e768d7d..51033320 100644 --- a/phpseclib/Crypt/RC4.php +++ b/phpseclib/Crypt/RC4.php @@ -144,21 +144,8 @@ class RC4 extends Base */ function isValidEngine($engine) { - switch ($engine) { - case Base::ENGINE_OPENSSL: - switch (strlen($this->key)) { - case 5: - $this->cipher_name_openssl = 'rc4-40'; - break; - case 8: - $this->cipher_name_openssl = 'rc4-64'; - break; - case 16: - $this->cipher_name_openssl = 'rc4'; - break; - default: - return false; - } + if ($engine == Base::ENGINE_OPENSSL) { + $this->cipher_name_openssl = 'rc4-40'; } return parent::isValidEngine($engine); diff --git a/tests/Unit/Crypt/BlowfishTest.php b/tests/Unit/Crypt/BlowfishTest.php index bf15feb8..c523425d 100644 --- a/tests/Unit/Crypt/BlowfishTest.php +++ b/tests/Unit/Crypt/BlowfishTest.php @@ -84,4 +84,47 @@ class Unit_Crypt_BlowfishTest extends PhpseclibTestCase $plaintext = bin2hex($plaintext); $this->assertEquals($result, $expected, "Failed asserting that $plaintext yielded expected output in $engineName engine"); } + + public function testKeySizes() + { + $objects = $engines = array(); + $temp = new Blowfish(Base::MODE_CTR); + $temp->setPreferredEngine(Base::ENGINE_INTERNAL); + $objects[] = $temp; + $engines[] = 'internal'; + + if ($temp->isValidEngine(Base::ENGINE_MCRYPT)) { + $temp = new Blowfish(Base::MODE_CTR); + $temp->setPreferredEngine(Base::ENGINE_MCRYPT); + $objects[] = $temp; + $engines[] = 'mcrypt'; + } + + if ($temp->isValidEngine(Base::ENGINE_OPENSSL)) { + $temp = new Blowfish(Base::MODE_CTR); + $temp->setPreferredEngine(Base::ENGINE_OPENSSL); + $objects[] = $temp; + $engines[] = 'OpenSSL'; + } + + if (count($objects) < 2) { + self::markTestSkipped('Unable to initialize two or more engines'); + } + + for ($i = 0; $i < count($objects); $i++) { + $objects[$i]->setIV(str_repeat('x', $objects[$i]->getBlockLength() >> 3)); + } + + $plaintext = str_repeat('.', 100); + + for ($keyLen = 4; $keyLen <= 56; $keyLen++) { + $key = crypt_random_string($keyLen); + $objects[0]->setKey($key); + $ref = $objects[0]->encrypt($plaintext); + for ($i = 1; $i < count($objects); $i++) { + $objects[$i]->setKey($key); + $this->assertEquals($ref, $objects[$i]->encrypt($plaintext), "Failed asserting that {$engines[$i]} yields the same output as the internal engine with a key size of $keyLen"); + } + } + } } diff --git a/tests/Unit/Crypt/RC4Test.php b/tests/Unit/Crypt/RC4Test.php index 1a020ff8..ce16b13f 100644 --- a/tests/Unit/Crypt/RC4Test.php +++ b/tests/Unit/Crypt/RC4Test.php @@ -209,4 +209,43 @@ class Unit_Crypt_RC4Test extends PhpseclibTestCase $result = $rc4->encrypt(str_repeat("\0", $offset + 16)); $this->assertEquals(bin2hex(substr($result, -16)), $expected, "Failed asserting that key $key yielded expected output at offset $offset in $engineName engine"); } + + public function testKeySizes() + { + $objects = $engines = array(); + $temp = new RC4(Base::MODE_CTR); + $temp->setPreferredEngine(Base::ENGINE_INTERNAL); + $objects[] = $temp; + $engines[] = 'internal'; + + if ($temp->isValidEngine(Base::ENGINE_MCRYPT)) { + $temp = new RC4(Base::MODE_CTR); + $temp->setPreferredEngine(Base::ENGINE_MCRYPT); + $objects[] = $temp; + $engines[] = 'mcrypt'; + } + + if ($temp->isValidEngine(Base::ENGINE_OPENSSL)) { + $temp = new RC4(Base::MODE_CTR); + $temp->setPreferredEngine(Base::ENGINE_OPENSSL); + $objects[] = $temp; + $engines[] = 'OpenSSL'; + } + + if (count($objects) < 2) { + self::markTestSkipped('Unable to initialize two or more engines'); + } + + $plaintext = str_repeat('.', 100); + + for ($keyLen = 5; $keyLen <= 256; $keyLen++) { + $key = crypt_random_string($keyLen); + $objects[0]->setKey($key); + $ref = $objects[0]->encrypt($plaintext); + for ($i = 1; $i < count($objects); $i++) { + $objects[$i]->setKey($key); + $this->assertEquals($ref, $objects[$i]->encrypt($plaintext), "Failed asserting that {$engines[$i]} yields the same output as the internal engine with a key size of $keyLen"); + } + } + } }