summaryrefslogtreecommitdiffstats
path: root/tool/src
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2019-04-09 14:17:48 +0200
committerJustus Winter <justus@sequoia-pgp.org>2019-04-09 14:17:48 +0200
commite7408ca748260d1ca19cf3046e1a5f33e79112e2 (patch)
tree50d37e9990d3ac0098d443990a955d8169e53b84 /tool/src
parent712dd46883c058f5afa21a1183eca1cba388b042 (diff)
tool: Fix error handling when decrypting using encrypted keys.
- Fixes #241.
Diffstat (limited to 'tool/src')
-rw-r--r--tool/src/commands/decrypt.rs26
1 files changed, 17 insertions, 9 deletions
diff --git a/tool/src/commands/decrypt.rs b/tool/src/commands/decrypt.rs
index 8bdb6c95..01bb0eef 100644
--- a/tool/src/commands/decrypt.rs
+++ b/tool/src/commands/decrypt.rs
@@ -134,7 +134,7 @@ impl<'a> DecryptionHelper for Helper<'a> {
}
// Second, we try those keys that are encrypted.
- for pkesk in pkesks {
+ 'pkesk_loop: for pkesk in pkesks {
let keyid = pkesk.recipient();
if let Some(key) = self.secret_keys.get(&keyid) {
if key.secret().map(|s| ! s.is_encrypted())
@@ -153,19 +153,27 @@ impl<'a> DecryptionHelper for Helper<'a> {
if let Ok(mpis) =
key.secret().unwrap().decrypt(key.pk_algo(), &p)
{
- if let Ok(sk) = pkesk.decrypt(key, &mpis)
+ match pkesk.decrypt(key, &mpis)
.and_then(|(algo, sk)| {
decrypt(algo, &sk)?; Ok(sk)
})
{
- if self.dump_session_key {
- eprintln!("Session key: {}",
- hex::encode(&sk));
- }
- return Ok(self.key_identities.get(keyid)
- .map(|fp| fp.clone()));
+ Ok(sk) => {
+ if self.dump_session_key {
+ eprintln!("Session key: {}",
+ hex::encode(&sk));
+ }
+ return Ok(self.key_identities.get(keyid)
+ .map(|fp| fp.clone()));
+ },
+ Err(e) => {
+ eprintln!("Decryption using {} failed:\n {}",
+ self.key_hints.get(&keyid).unwrap(),
+ e);
+ continue 'pkesk_loop;
+ },
}
-
+ } else {
eprintln!("Bad password.");
}
}