If session decryption fails, return NULL

Otherwise it returns false, we try to unpack that, and generally bad
things happen.
This commit is contained in:
Stephen Paul Weber 2018-07-25 09:57:33 -05:00
parent 413741fa84
commit 498e60602b
2 changed files with 20 additions and 1 deletions

View File

@ -208,7 +208,8 @@ class OpenPGP_Crypt_RSA {
static function try_decrypt_session($key, $edata) { static function try_decrypt_session($key, $edata) {
$key->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $key->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$data = $key->decrypt($edata); $data = @$key->decrypt($edata);
if(!$data) return NULL;
$sk = substr($data, 1, strlen($data)-3); $sk = substr($data, 1, strlen($data)-3);
$chk = unpack('n', substr($data, -2)); $chk = unpack('n', substr($data, -2));
$chk = reset($chk); $chk = reset($chk);

View File

@ -109,6 +109,24 @@ class Decryption extends PHPUnit_Framework_TestCase {
} }
} }
public function testDecryptRoundtrip() {
$m = new OpenPGP_Message(array(new OpenPGP_LiteralDataPacket("hello\n")));
$key = OpenPGP_Message::parse(file_get_contents(dirname(__FILE__) . '/data/helloKey.gpg'));
$em = OpenPGP_Crypt_Symmetric::encrypt($key, $m);
foreach($key as $packet) {
if(!($packet instanceof OpenPGP_SecretKeyPacket)) continue;
$decryptor = new OpenPGP_Crypt_RSA($packet);
$m2 = $decryptor->decrypt($em);
foreach($m2 as $p) {
if($p instanceof OpenPGP_LiteralDataPacket) {
$this->assertEquals($p->data, "hello\n");
}
}
}
}
public function testDecryptSecretKey() { public function testDecryptSecretKey() {
$key = OpenPGP_Message::parse(file_get_contents(dirname(__FILE__) . '/data/encryptedSecretKey.gpg')); $key = OpenPGP_Message::parse(file_get_contents(dirname(__FILE__) . '/data/encryptedSecretKey.gpg'));
$skey = OpenPGP_Crypt_Symmetric::decryptSecretKey("hello", $key[0]); $skey = OpenPGP_Crypt_Symmetric::decryptSecretKey("hello", $key[0]);