Fix #32: Decryption of message encrypted with multiple keys

When the message is encrypted with multiple keys and the decryption
key(s) added is not the first encrypted key, then it was failing due to
invalid early failure when uid was not found in decrypted keys. This
changes such behavior and just returns empty key instead in such case.
This commit is contained in:
Jakub Zelenka 2025-04-22 18:49:52 +02:00
parent 91e92a2690
commit 34e4c9542b
No known key found for this signature in database
GPG key ID: 1C0779DC5C0A9DE4
4 changed files with 137 additions and 4 deletions

View file

@ -742,8 +742,10 @@ gpgme_error_t passphrase_decrypt_cb (
uid[idx] = '\0';
if (!PHPC_HASH_CSTR_FIND_PTR_IN_COND(
PHPC_THIS->decryptkeys, (char *)uid, passphrase)) {
GNUPG_ERR("no passphrase set");
return 1;
/* If the requested key is not in decryptkeys, ignore it and return success. It then tries
* to call callback for the next key if the message was encrypted with more than one key. */
write(fd, "\n", 1);
return 0;
}
if (!passphrase) {
GNUPG_ERR("no passphrase set");

View file

@ -0,0 +1,29 @@
--TEST--
encrypt and decrypt a text with multiple keys
--SKIPIF--
<?php if(!class_exists("gnupg")) die("skip"); ?>
--FILE--
<?php
require_once "gnupgt.inc";
gnupgt::import_keys();
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_WARNING);
$gpg->addencryptkey($fingerprint);
$gpg->addencryptkey($fingerprint2);
$gpg->addencryptkey($fingerprint3);
$enc = $gpg->encrypt($plaintext);
$gpg = new gnupg();
$gpg->adddecryptkey($fingerprint2, $passphrase2);
$ret = $gpg->decrypt($enc);
var_dump($ret);
?>
--EXPECTF--
string(7) "foo bar"
--CLEAN--
<?php
require_once "gnupgt.inc";
gnupgt::delete_key();
?>

View file

@ -66,7 +66,7 @@ class gnupgt {
}
/**
* Import all keys
* Import a single key
*/
static public function import_key($privkey = null)
{
@ -78,6 +78,21 @@ class gnupgt {
$gpg->import(is_null($privkey) ? $testkey : $privkey);
}
/**
* Import all keys
*/
static public function import_keys()
{
global $testkey, $testkey2, $testkey3;
self::reset_key();
$gpg = self::create_instance();
$gpg->import($testkey);
$gpg->import($testkey2);
$gpg->import($testkey3);
}
/**
* Delete all keys.
* @param null|string $homeDir

View file

@ -66,4 +66,91 @@ ngBZTudrwBbKC8xx224aOk0TiDbiWftGtx4=
=py/2
-----END PGP PRIVATE KEY BLOCK-----
EOF;
?>
// RSA 2048 key with different passprhrase than testkey
$passphrase2 = "blabla2";
$fingerprint2 = "FB7E60AA1FE2564B10DF07FEA4C19633A227485F";
$testkey2 = <<<EOF
-----BEGIN PGP PRIVATE KEY BLOCK-----
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
=RBbv
-----END PGP PRIVATE KEY BLOCK-----
EOF;
// EC Curve 25519 Key with the same passphrase as testkey
$passphrase3 = "blabla";
$fingerprint3 = "2D5CCE418C7212931917A35E8A1C9B7E78F3F200";
$testkey3 = <<<EOF
-----BEGIN PGP PRIVATE KEY BLOCK-----
lIYEaAfDfBYJKwYBBAHaRw8BAQdA4jPoB0hx6VQELdNec5yMmGdk1y0w+FBd4795
Nzawq1v+BwMCQ0Stv6AJZoX/N+canKS8Reb1WI6rd2AFYJ1a635SuzJuiAXpZjNr
1dqQWzqfyiPkvSuEBX3xUoipnncyT4oS1v3Xxz2LyaJsVD/M84murbQkUEhQIFRo
aXJkIFRlc3QgPHRlc3QzQGdudXBnLnBocC5uZXQ+iJMEExYKADsWIQQtXM5BjHIS
kxkXo16KHJt+ePPyAAUCaAfDfAIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIX
gAAKCRCKHJt+ePPyAItFAQC5zOjM4m5R4LC9z2+Qc9+o/NsazZm4pRg/0GdDNKSq
RwD/fZkEQ3NVqAGyZAf05xySuCohjq6NyXB7FoHEKNM8DQaciwRoB8N8EgorBgEE
AZdVAQUBAQdALxHB/DCBuPT2N0D0blqPfCkzAoUoT8ryzCt0m38x2RQDAQgH/gcD
Ahl6v0cdX5YA/+8mmWL/3bFdT/TUkct232XUNosZJWAp/SirUEcIghisKoUslI0W
/yMskyfYQao9Xp2ZgAh5tDjY+zPrFeW/qBiRqGuLEvyIeAQYFgoAIBYhBC1czkGM
chKTGRejXoocm3548/IABQJoB8N8AhsMAAoJEIocm3548/IAhyMA/1Rj6kqCdqHl
cMH5geSnHg1pXfI9duFcNv/s8d3EqGx8AQCNHc+JFez4DQi22I8p/Lp5t1Wxugig
Fm5SdMmMXCHwAg==
=Bbro
-----END PGP PRIVATE KEY BLOCK-----
EOF;