[pkg-gnupg-maint] Bug#638619: Bug#638619: Bug#638619: Misleading "gpg: Ohhhh jeeee: no decrypt() for 17" message from gpg when trying to decrypt a file without the public key being imported
NIIBE Yutaka
gniibe at fsij.org
Mon May 18 02:15:20 UTC 2015
On 05/08/2015 04:51 PM, NIIBE Yutaka wrote:
> Finally, I managed to reproduce this bug. Here is my scenario.
>
> (1) With --gen-key, generate DSA+Elgamal key
> (2) make a encrypted file using (1)
> (3) make a copy of .gnupg/secring.gpg
> (4) With --edit-key, delkey Elgamal subkey
> (5) With --export, make public key file
> (6) With --delete-secret-key, delete the key generated by (1)
> (7) Restore .gnupg/secring.gpg by the copy of (3)
> (8) Import DSA only public key of (5)
>
> Now, it has secret subkey, but no corresponding public key.
>
> (8) Try to decrypt encrypted file of (2)
> It asks the passphrase, then input it, then, it stops with:
>
> gpg: Ohhhh jeeee: no decrypt() for 17
>
> GnuPG is 1.4.18-7 in stable. I think that it is better to
> check availability of public key for the subkey.
With a fix below, now, it fails with emitting error like this:
-------------------------------------
gpg: key 9541DC07: secret key without public key - skipped
gpg: encrypted with ELG-E key, ID 9541DC07
gpg: public key decryption failed: public key not found
gpg: decryption failed: secret key not available
-------------------------------------
I think that the message would be confusing for a user a bit (as it
is explained from the view point of the implementation), but
it's much better.
diff --git a/g10/getkey.c b/g10/getkey.c
index d5d1135..fc3c179 100644
--- a/g10/getkey.c
+++ b/g10/getkey.c
@@ -498,7 +498,19 @@ get_seckey( PKT_secret_key *sk, u32 *keyid )
ctx.req_usage = sk->req_usage;
rc = lookup( &ctx, &kb, 1 );
if ( !rc ) {
+ u32 skid[2];
+
sk_from_block ( &ctx, sk, kb );
+ keyid_from_sk ( sk, skid );
+ /*
+ * Make sure it's exact match of keyid.
+ * If not, it's secret subkey with no public key.
+ */
+ if (!(keyid[0] == skid[0] && keyid[1] == skid[1])) {
+ log_error (_("key %s: secret key without public key"
+ " - skipped\n"), keystr(keyid));
+ rc = G10ERR_NO_PUBKEY;
+ }
}
get_seckey_end( &ctx );
release_kbnode ( kb );
--
More information about the pkg-gnupg-maint
mailing list