aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2014-09-17 13:45:16 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2014-09-17 13:45:16 +0200
commitd686c55a0a86ef845795fc03a8a5de44b5fe73cc (patch)
treed5bb8dfe1d451b392c8c88a3fa8b14b1dd43db1e /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp
parent3defd194aaa79309c0a0921a63c5ab157081325c (diff)
downloadopen-keychain-d686c55a0a86ef845795fc03a8a5de44b5fe73cc.tar.gz
open-keychain-d686c55a0a86ef845795fc03a8a5de44b5fe73cc.tar.bz2
open-keychain-d686c55a0a86ef845795fc03a8a5de44b5fe73cc.zip
Work on new result handling (WIP)
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PassphraseCacheInterface.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java26
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java49
3 files changed, 55 insertions, 31 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PassphraseCacheInterface.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PassphraseCacheInterface.java
new file mode 100644
index 000000000..433c4db00
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PassphraseCacheInterface.java
@@ -0,0 +1,11 @@
+package org.sufficientlysecure.keychain.pgp;
+
+public interface PassphraseCacheInterface {
+ public static class NoSecretKeyException extends Exception {
+ public NoSecretKeyException() {
+ }
+ }
+
+ public String getCachedPassphrase(long masterKeyId) throws NoSecretKeyException;
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
index 89e25b2e0..1d8ca1b54 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java
@@ -72,7 +72,7 @@ import java.util.Set;
*/
public class PgpDecryptVerify {
private ProviderHelper mProviderHelper;
- private PassphraseCache mPassphraseCache;
+ private PassphraseCacheInterface mPassphraseCache;
private InputData mData;
private OutputStream mOutStream;
@@ -101,7 +101,7 @@ public class PgpDecryptVerify {
public static class Builder {
// mandatory parameter
private ProviderHelper mProviderHelper;
- private PassphraseCache mPassphraseCache;
+ private PassphraseCacheInterface mPassphraseCache;
private InputData mData;
private OutputStream mOutStream;
@@ -113,12 +113,12 @@ public class PgpDecryptVerify {
private boolean mDecryptMetadataOnly = false;
private byte[] mDecryptedSessionKey = null;
- public Builder(ProviderHelper providerHelper, PassphraseCache passphraseCache,
+ public Builder(ProviderHelper providerHelper, PassphraseCacheInterface passphraseCache,
InputData data, OutputStream outStream) {
- this.mProviderHelper = providerHelper;
- this.mPassphraseCache = passphraseCache;
- this.mData = data;
- this.mOutStream = outStream;
+ mProviderHelper = providerHelper;
+ mPassphraseCache = passphraseCache;
+ mData = data;
+ mOutStream = outStream;
}
public Builder setProgressable(Progressable progressable) {
@@ -176,16 +176,6 @@ public class PgpDecryptVerify {
}
}
- public interface PassphraseCache {
- public String getCachedPassphrase(long masterKeyId)
- throws NoSecretKeyException;
- }
-
- public static class NoSecretKeyException extends Exception {
- public NoSecretKeyException() {
- }
- }
-
/**
* Decrypts and/or verifies data based on parameters of class
*/
@@ -322,7 +312,7 @@ public class PgpDecryptVerify {
// returns "" if key has no passphrase
mPassphrase = mPassphraseCache.getCachedPassphrase(subKeyId);
log.add(LogType.MSG_DC_PASS_CACHED, indent +1);
- } catch (NoSecretKeyException e) {
+ } catch (PassphraseCacheInterface.NoSecretKeyException e) {
log.add(LogType.MSG_DC_ERROR_NO_KEY, indent +1);
return new DecryptVerifyResult(DecryptVerifyResult.RESULT_ERROR, log);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
index e06335104..25840495e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java
@@ -59,6 +59,7 @@ import java.util.LinkedList;
*/
public class PgpSignEncrypt {
private ProviderHelper mProviderHelper;
+ private PassphraseCacheInterface mPassphraseCache;
private String mVersionHeader;
private InputData mData;
private OutputStream mOutStream;
@@ -93,6 +94,7 @@ public class PgpSignEncrypt {
private PgpSignEncrypt(Builder builder) {
// private Constructor can only be called from Builder
this.mProviderHelper = builder.mProviderHelper;
+ this.mPassphraseCache = builder.mPassphraseCache;
this.mVersionHeader = builder.mVersionHeader;
this.mData = builder.mData;
this.mOutStream = builder.mOutStream;
@@ -117,6 +119,7 @@ public class PgpSignEncrypt {
public static class Builder {
// mandatory parameter
private ProviderHelper mProviderHelper;
+ private PassphraseCacheInterface mPassphraseCache;
private InputData mData;
private OutputStream mOutStream;
@@ -138,8 +141,10 @@ public class PgpSignEncrypt {
private byte[] mNfcSignedHash = null;
private Date mNfcCreationTimestamp = null;
- public Builder(ProviderHelper providerHelper, InputData data, OutputStream outStream) {
+ public Builder(ProviderHelper providerHelper, PassphraseCacheInterface passphraseCache,
+ InputData data, OutputStream outStream) {
mProviderHelper = providerHelper;
+ mPassphraseCache = passphraseCache;
mData = data;
mOutStream = outStream;
}
@@ -290,20 +295,15 @@ public class PgpSignEncrypt {
/* Get keys for signature generation for later usage */
CanonicalizedSecretKey signingKey = null;
+ long signKeyId;
if (enableSignature) {
- // If we weren't handed a passphrase, throw early
- if (mSignaturePassphrase == null) {
- log.add(LogType.MSG_SE_ERROR_NO_PASSPHRASE, indent);
- return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
- }
-
try {
// fetch the indicated master key id (the one whose name we sign in)
CanonicalizedSecretKeyRing signingKeyRing =
mProviderHelper.getCanonicalizedSecretKeyRing(mSignatureMasterKeyId);
// fetch the specific subkey to sign with, or just use the master key if none specified
- long signKeyId = mSignatureSubKeyId != null ? mSignatureSubKeyId : mSignatureMasterKeyId;
+ signKeyId = mSignatureSubKeyId != null ? mSignatureSubKeyId : mSignatureMasterKeyId;
signingKey = signingKeyRing.getSecretKey(signKeyId);
// make sure it's a signing key alright!
} catch (ProviderHelper.NotFoundException e) {
@@ -317,6 +317,28 @@ public class PgpSignEncrypt {
return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
}
+ // if no passphrase was explicitly set try to get it from the cache service
+ if (mSignaturePassphrase == null) {
+ try {
+ // returns "" if key has no passphrase
+ mSignaturePassphrase = mPassphraseCache.getCachedPassphrase(signKeyId);
+ // TODO
+// log.add(LogType.MSG_DC_PASS_CACHED, indent + 1);
+ } catch (PassphraseCacheInterface.NoSecretKeyException e) {
+ // TODO
+// log.add(LogType.MSG_DC_ERROR_NO_KEY, indent + 1);
+ return new SignEncryptResult(SignEncryptResult.RESULT_ERROR, log);
+ }
+
+ // if passphrase was not cached, return here indicating that a passphrase is missing!
+ if (mSignaturePassphrase == null) {
+ log.add(LogType.MSG_SE_PENDING_PASSPHRASE, indent + 1);
+ SignEncryptResult result = new SignEncryptResult(SignEncryptResult.RESULT_PENDING_PASSPHRASE, log);
+ result.setKeyIdPassphraseNeeded(signKeyId);
+ return result;
+ }
+ }
+
updateProgress(R.string.progress_extracting_signature_key, 0, 100);
try {
@@ -369,10 +391,10 @@ public class PgpSignEncrypt {
log.add(LogType.MSG_SE_KEY_OK, indent + 1,
PgpKeyHelper.convertKeyIdToHex(id));
} catch (PgpGeneralException e) {
- log.add(LogType.MSG_SE_KEY_WARN, indent +1,
+ log.add(LogType.MSG_SE_KEY_WARN, indent + 1,
PgpKeyHelper.convertKeyIdToHex(id));
} catch (ProviderHelper.NotFoundException e) {
- log.add(LogType.MSG_SE_KEY_UNKNOWN, indent +1,
+ log.add(LogType.MSG_SE_KEY_UNKNOWN, indent + 1,
PgpKeyHelper.convertKeyIdToHex(id));
}
}
@@ -407,9 +429,10 @@ public class PgpSignEncrypt {
/* actual encryption */
updateProgress(R.string.progress_encrypting, 8, 100);
log.add(enableSignature
- ? LogType.MSG_SE_SIGCRYPTING
- : LogType.MSG_SE_ENCRYPTING,
- indent);
+ ? LogType.MSG_SE_SIGCRYPTING
+ : LogType.MSG_SE_ENCRYPTING,
+ indent
+ );
indent += 1;
encryptionOut = cPk.open(out, new byte[1 << 16]);