diff options
author | Dominik Schürmann <dominik@dominikschuermann.de> | 2014-04-11 14:39:35 +0200 |
---|---|---|
committer | Dominik Schürmann <dominik@dominikschuermann.de> | 2014-04-11 14:39:35 +0200 |
commit | 85bb3d9480ccc52908e7a43379c5e2eda9dbd7f1 (patch) | |
tree | 4a20a9065d9411d35b720a0fd446ab4e2ff89b9f /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java | |
parent | 0687f7f40e1aecf4fbc109c3ab3fa2c3613546b3 (diff) | |
parent | baa3c86e1246d486d80c963ddc6c64b58f2a5093 (diff) | |
download | open-keychain-85bb3d9480ccc52908e7a43379c5e2eda9dbd7f1.tar.gz open-keychain-85bb3d9480ccc52908e7a43379c5e2eda9dbd7f1.tar.bz2 open-keychain-85bb3d9480ccc52908e7a43379c5e2eda9dbd7f1.zip |
Merge pull request #553 from Valodim/split-masterKeyId
Split master key & partial fix for uid order
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java')
-rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index cbc71ce6a..91d9b5584 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -200,6 +200,31 @@ public class PassphraseCacheService extends Service { return cachedPassphrase; } + public static boolean hasPassphrase(PGPSecretKeyRing secretKeyRing) { + PGPSecretKey secretKey = null; + boolean foundValidKey = false; + for (Iterator keys = secretKeyRing.getSecretKeys(); keys.hasNext(); ) { + secretKey = (PGPSecretKey) keys.next(); + if (!secretKey.isPrivateKeyEmpty()) { + foundValidKey = true; + break; + } + } + if(!foundValidKey) { + return false; + } + + try { + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder() + .setProvider("SC").build("".toCharArray()); + PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); + return testKey == null; + } catch(PGPException e) { + // this means the crc check failed -> passphrase required + return true; + } + } + /** * Checks if key has a passphrase. * @@ -210,27 +235,7 @@ public class PassphraseCacheService extends Service { // check if the key has no passphrase try { PGPSecretKeyRing secRing = ProviderHelper.getPGPSecretKeyRing(context, secretKeyId); - PGPSecretKey secretKey = null; - boolean foundValidKey = false; - for (Iterator keys = secRing.getSecretKeys(); keys.hasNext(); ) { - secretKey = (PGPSecretKey) keys.next(); - if (!secretKey.isPrivateKeyEmpty()) { - foundValidKey = true; - break; - } - } - - if (!foundValidKey) { - return false; - } - PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( - "SC").build("".toCharArray()); - PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); - if (testKey != null) { - return false; - } - } catch (PGPException e) { - // silently catch + return hasPassphrase(secRing); } catch (ProviderHelper.NotFoundException e) { Log.e(Constants.TAG, "key not found!", e); } |