diff --git a/src/org/thialfihar/android/apg/Apg.java b/src/org/thialfihar/android/apg/Apg.java index 31720c5af..af4cbf1ed 100644 --- a/src/org/thialfihar/android/apg/Apg.java +++ b/src/org/thialfihar/android/apg/Apg.java @@ -166,6 +166,14 @@ public class Apg { } } + public static class NoAsymmetricEncryptionException extends Exception { + static final long serialVersionUID = 0xf812773343L; + + public NoAsymmetricEncryptionException() { + super(); + } + } + static { mPublicKeyRings = new Vector(); mSecretKeyRings = new Vector(); @@ -1366,7 +1374,7 @@ public class Apg { } public static long getDecryptionKeyId(InputStream inStream) - throws GeneralException, IOException { + throws GeneralException, NoAsymmetricEncryptionException, IOException { InputStream in = PGPUtil.getDecoderStream(inStream); PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPEncryptedDataList enc; @@ -1387,9 +1395,11 @@ public class Apg { // find the secret key PGPSecretKey secretKey = null; Iterator it = enc.getEncryptedDataObjects(); + boolean gotAsymmetricEncryption = false; while (it.hasNext()) { Object obj = it.next(); if (obj instanceof PGPPublicKeyEncryptedData) { + gotAsymmetricEncryption = true; PGPPublicKeyEncryptedData pbe = (PGPPublicKeyEncryptedData) obj; secretKey = findSecretKey(pbe.getKeyID()); if (secretKey != null) { @@ -1398,6 +1408,10 @@ public class Apg { } } + if (!gotAsymmetricEncryption) { + throw new NoAsymmetricEncryptionException(); + } + if (secretKey == null) { return 0; } diff --git a/src/org/thialfihar/android/apg/DecryptFileActivity.java b/src/org/thialfihar/android/apg/DecryptFileActivity.java index 8e21eae11..49f039423 100644 --- a/src/org/thialfihar/android/apg/DecryptFileActivity.java +++ b/src/org/thialfihar/android/apg/DecryptFileActivity.java @@ -129,18 +129,23 @@ public class DecryptFileActivity extends BaseActivity { try { InputStream in = new FileInputStream(mInputFilename); - setSecretKeyId(Apg.getDecryptionKeyId(in)); - if (getSecretKeyId() == 0) { + try { + setSecretKeyId(Apg.getDecryptionKeyId(in)); + if (getSecretKeyId() == 0) { + throw new Apg.GeneralException("no suitable keys found"); + } + mAssumeSymmetricEncryption = false; + } catch (Apg.NoAsymmetricEncryptionException e) { + setSecretKeyId(0); // reopen the file to check whether there's symmetric encryption data in there in = new FileInputStream(mInputFilename); if (!Apg.hasSymmetricEncryption(in)) { - throw new Apg.GeneralException("no suitable keys found"); + throw new Apg.GeneralException("no known kind of encryption found"); } mAssumeSymmetricEncryption = true; - } else { - mAssumeSymmetricEncryption = false; - } - showDialog(Id.dialog.pass_phrase); + } + + showDialog(Id.dialog.pass_phrase); } catch (FileNotFoundException e) { error = "file not found: " + e.getLocalizedMessage(); } catch (IOException e) { diff --git a/src/org/thialfihar/android/apg/DecryptMessageActivity.java b/src/org/thialfihar/android/apg/DecryptMessageActivity.java index d3a84eff5..76589016f 100644 --- a/src/org/thialfihar/android/apg/DecryptMessageActivity.java +++ b/src/org/thialfihar/android/apg/DecryptMessageActivity.java @@ -155,6 +155,8 @@ public class DecryptMessageActivity extends BaseActivity { error = e.getLocalizedMessage(); } catch (Apg.GeneralException e) { error = e.getLocalizedMessage(); + } catch (Apg.NoAsymmetricEncryptionException e) { + error = "no asymmetric encryption found"; } if (error != null) { Toast.makeText(this, "Error: " + error, Toast.LENGTH_SHORT).show();