From ee4d911baf39fe242a90e12163d9853728479a35 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Mon, 13 Oct 2014 15:02:42 +0200 Subject: [PATCH] make PgpEncryptSign and PgpDecryptVerify subclasses of BaseOperation --- .../keychain/pgp/PgpEncryptDecryptTest.java | 1 + .../keychain/pgp/PgpDecryptVerify.java | 39 ++++++----------- .../keychain/pgp/PgpSignEncrypt.java | 42 ++++++------------- .../keychain/remote/OpenPgpService.java | 32 ++------------ .../service/KeychainIntentService.java | 42 ++++--------------- 5 files changed, 36 insertions(+), 120 deletions(-) diff --git a/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java index 7b12aae17..c5136b5cb 100644 --- a/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java +++ b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java @@ -105,6 +105,7 @@ public class PgpEncryptDecryptTest { providerHelper.saveSecretKeyRing(mStaticRing1, new ProgressScaler()); } + /* @Test public void testSymmetricEncryptDecrypt() { 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 383592356..7af7becb6 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java @@ -18,6 +18,7 @@ package org.sufficientlysecure.keychain.pgp; +import android.content.Context; import android.webkit.MimeTypeMap; import org.openintents.openpgp.OpenPgpMetadata; @@ -45,6 +46,7 @@ import org.spongycastle.openpgp.operator.jcajce.JcePBEDataDecryptorFactoryBuilde import org.spongycastle.openpgp.operator.jcajce.NfcSyncPublicKeyDataDecryptorFactoryBuilder; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.operations.BaseOperation; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; import org.sufficientlysecure.keychain.provider.ProviderHelper; @@ -71,13 +73,11 @@ import java.util.Set; /** * This class uses a Builder pattern! */ -public class PgpDecryptVerify { - private ProviderHelper mProviderHelper; - private PassphraseCacheInterface mPassphraseCache; +public class PgpDecryptVerify extends BaseOperation { + private InputData mData; private OutputStream mOutStream; - private Progressable mProgressable; private boolean mAllowSymmetricDecryption; private String mPassphrase; private Set mAllowedKeyIds; @@ -85,13 +85,12 @@ public class PgpDecryptVerify { private byte[] mDecryptedSessionKey; private PgpDecryptVerify(Builder builder) { + super(builder.mContext, builder.mProviderHelper, builder.mProgressable); + // private Constructor can only be called from Builder - this.mProviderHelper = builder.mProviderHelper; - this.mPassphraseCache = builder.mPassphraseCache; this.mData = builder.mData; this.mOutStream = builder.mOutStream; - this.mProgressable = builder.mProgressable; this.mAllowSymmetricDecryption = builder.mAllowSymmetricDecryption; this.mPassphrase = builder.mPassphrase; this.mAllowedKeyIds = builder.mAllowedKeyIds; @@ -101,6 +100,7 @@ public class PgpDecryptVerify { public static class Builder { // mandatory parameter + private Context mContext; private ProviderHelper mProviderHelper; private PassphraseCacheInterface mPassphraseCache; private InputData mData; @@ -114,19 +114,16 @@ public class PgpDecryptVerify { private boolean mDecryptMetadataOnly = false; private byte[] mDecryptedSessionKey = null; - public Builder(ProviderHelper providerHelper, PassphraseCacheInterface passphraseCache, + public Builder(Context context, ProviderHelper providerHelper, + Progressable progressable, InputData data, OutputStream outStream) { + mContext = context; mProviderHelper = providerHelper; - mPassphraseCache = passphraseCache; + mProgressable = progressable; mData = data; mOutStream = outStream; } - public Builder setProgressable(Progressable progressable) { - mProgressable = progressable; - return this; - } - public Builder setAllowSymmetricDecryption(boolean allowSymmetricDecryption) { mAllowSymmetricDecryption = allowSymmetricDecryption; return this; @@ -165,18 +162,6 @@ public class PgpDecryptVerify { } } - public void updateProgress(int message, int current, int total) { - if (mProgressable != null) { - mProgressable.setProgress(message, current, total); - } - } - - public void updateProgress(int current, int total) { - if (mProgressable != null) { - mProgressable.setProgress(current, total); - } - } - /** * Decrypts and/or verifies data based on parameters of class */ @@ -313,7 +298,7 @@ public class PgpDecryptVerify { if (mPassphrase == null) { try { // returns "" if key has no passphrase - mPassphrase = mPassphraseCache.getCachedPassphrase(subKeyId); + mPassphrase = getCachedPassphrase(subKeyId); log.add(LogType.MSG_DC_PASS_CACHED, indent +1); } catch (PassphraseCacheInterface.NoSecretKeyException e) { log.add(LogType.MSG_DC_ERROR_NO_KEY, indent +1); 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 670f3bb3c..8aeae3e9b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncrypt.java @@ -19,6 +19,8 @@ package org.sufficientlysecure.keychain.pgp; +import android.content.Context; + import org.spongycastle.bcpg.ArmoredOutputStream; import org.spongycastle.bcpg.BCPGOutputStream; import org.spongycastle.bcpg.CompressionAlgorithmTags; @@ -34,6 +36,7 @@ import org.spongycastle.openpgp.operator.jcajce.NfcSyncPGPContentSignerBuilder; import org.spongycastle.util.encoders.Hex; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.operations.BaseOperation; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; @@ -60,14 +63,11 @@ import java.util.LinkedList; /** * This class uses a Builder pattern! */ -public class PgpSignEncrypt { - private ProviderHelper mProviderHelper; - private PassphraseCacheInterface mPassphraseCache; +public class PgpSignEncrypt extends BaseOperation { private String mVersionHeader; private InputData mData; private OutputStream mOutStream; - private Progressable mProgressable; private boolean mEnableAsciiArmorOutput; private int mCompressionId; private long[] mEncryptionMasterKeyIds; @@ -95,14 +95,13 @@ public class PgpSignEncrypt { } private PgpSignEncrypt(Builder builder) { + super(builder.mContext, builder.mProviderHelper, builder.mProgressable); + // 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; - this.mProgressable = builder.mProgressable; this.mEnableAsciiArmorOutput = builder.mEnableAsciiArmorOutput; this.mCompressionId = builder.mCompressionId; this.mEncryptionMasterKeyIds = builder.mEncryptionMasterKeyIds; @@ -121,14 +120,14 @@ public class PgpSignEncrypt { public static class Builder { // mandatory parameter + private Context mContext; private ProviderHelper mProviderHelper; - private PassphraseCacheInterface mPassphraseCache; + private Progressable mProgressable; private InputData mData; private OutputStream mOutStream; // optional private String mVersionHeader = null; - private Progressable mProgressable = null; private boolean mEnableAsciiArmorOutput = false; private int mCompressionId = CompressionAlgorithmTags.UNCOMPRESSED; private long[] mEncryptionMasterKeyIds = null; @@ -144,10 +143,12 @@ public class PgpSignEncrypt { private byte[] mNfcSignedHash = null; private Date mNfcCreationTimestamp = null; - public Builder(ProviderHelper providerHelper, PassphraseCacheInterface passphraseCache, + public Builder(Context context, ProviderHelper providerHelper, Progressable progressable, InputData data, OutputStream outStream) { + mContext = context; mProviderHelper = providerHelper; - mPassphraseCache = passphraseCache; + mProgressable = progressable; + mData = data; mOutStream = outStream; } @@ -157,11 +158,6 @@ public class PgpSignEncrypt { return this; } - public Builder setProgressable(Progressable progressable) { - mProgressable = progressable; - return this; - } - public Builder setEnableAsciiArmorOutput(boolean enableAsciiArmorOutput) { mEnableAsciiArmorOutput = enableAsciiArmorOutput; return this; @@ -245,18 +241,6 @@ public class PgpSignEncrypt { } } - public void updateProgress(int message, int current, int total) { - if (mProgressable != null) { - mProgressable.setProgress(message, current, total); - } - } - - public void updateProgress(int current, int total) { - if (mProgressable != null) { - mProgressable.setProgress(current, total); - } - } - /** * Signs and/or encrypts data based on parameters of class */ @@ -324,7 +308,7 @@ public class PgpSignEncrypt { if (mSignaturePassphrase == null) { try { // returns "" if key has no passphrase - mSignaturePassphrase = mPassphraseCache.getCachedPassphrase(signKeyId); + mSignaturePassphrase = getCachedPassphrase(signKeyId); // TODO // log.add(LogType.MSG_DC_PASS_CACHED, indent + 1); } catch (PassphraseCacheInterface.NoSecretKeyException e) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index 1ed1a7104..f77328d34 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -34,11 +34,9 @@ import org.spongycastle.util.encoders.Hex; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.ui.NfcActivity; import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.pgp.PassphraseCacheInterface; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; import org.sufficientlysecure.keychain.provider.KeychainDatabase.Tables; -import org.sufficientlysecure.keychain.provider.ProviderHelper.NotFoundException; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt; @@ -76,28 +74,6 @@ public class OpenPgpService extends RemoteService { static final String EMAIL_SEARCH_WHERE = Tables.KEYS + "." + KeychainContract.KeyRings.IS_REVOKED + " = 0 AND " + KeychainContract.KeyRings.IS_EXPIRED + " = 0"; - private PassphraseCacheInterface passphraseCacheInterface = new PassphraseCacheInterface() { - @Override - public String getCachedPassphrase(long subKeyId) throws NoSecretKeyException { - try { - long masterKeyId = new ProviderHelper(getContext()).getMasterKeyId(subKeyId); - return getCachedPassphrase(masterKeyId, subKeyId); - } catch (NotFoundException e) { - throw new PassphraseCacheInterface.NoSecretKeyException(); - } - } - - @Override - public String getCachedPassphrase(long masterKeyId, long subKeyId) throws NoSecretKeyException { - try { - return PassphraseCacheService.getCachedPassphrase( - getContext(), masterKeyId, subKeyId); - } catch (PassphraseCacheService.KeyNotFoundException e) { - throw new PassphraseCacheInterface.NoSecretKeyException(); - } - } - }; - /** * Search database for key ids based on emails. * @@ -304,7 +280,7 @@ public class OpenPgpService extends RemoteService { // sign-only PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder( - new ProviderHelper(getContext()), passphraseCacheInterface, + this, new ProviderHelper(getContext()), null, inputData, os ); builder.setEnableAsciiArmorOutput(asciiArmor) @@ -396,8 +372,7 @@ public class OpenPgpService extends RemoteService { InputData inputData = new InputData(is, inputLength); PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder( - new ProviderHelper(getContext()), passphraseCacheInterface, - inputData, os + this, new ProviderHelper(getContext()), null, inputData, os ); builder.setEnableAsciiArmorOutput(asciiArmor) .setVersionHeader(PgpHelper.getVersionForHeader(this)) @@ -513,8 +488,7 @@ public class OpenPgpService extends RemoteService { InputData inputData = new InputData(is, inputLength); PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder( - new ProviderHelper(getContext()), passphraseCacheInterface, - inputData, os + this, new ProviderHelper(getContext()), null, inputData, os ); byte[] nfcDecryptedSessionKey = data.getByteArrayExtra(OpenPgpApi.EXTRA_NFC_DECRYPTED_SESSION_KEY); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index f69a0c5a4..eb5ab93f7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -20,7 +20,6 @@ package org.sufficientlysecure.keychain.service; import android.app.IntentService; import android.content.Intent; -import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Message; @@ -58,8 +57,6 @@ import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralMsgIdException; import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing; -import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; -import org.sufficientlysecure.keychain.provider.KeychainDatabase; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; @@ -78,7 +75,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; @@ -91,7 +87,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * data from the activities or other apps, queues these intents, executes them, and stops itself * after doing them. */ -public class KeychainIntentService extends IntentService implements Progressable, PassphraseCacheInterface { +public class KeychainIntentService extends IntentService implements Progressable { /* extras that can be given by intent */ public static final String EXTRA_MESSENGER = "messenger"; @@ -297,11 +293,9 @@ public class KeychainIntentService extends IntentService implements Progressable // verifyText and decrypt returning additional resultData values for the // verification of signatures PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder( - new ProviderHelper(this), - this, inputData, null + this, new ProviderHelper(this), this, inputData, null ); - builder.setProgressable(this) - .setAllowSymmetricDecryption(true) + builder.setAllowSymmetricDecryption(true) .setPassphrase(passphrase) .setDecryptMetadataOnly(true) .setNfcState(nfcDecryptedSessionKey); @@ -330,11 +324,10 @@ public class KeychainIntentService extends IntentService implements Progressable // verifyText and decrypt returning additional resultData values for the // verification of signatures PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder( - new ProviderHelper(this), this, + this, new ProviderHelper(this), this, inputData, outStream ); - builder.setProgressable(this) - .setAllowSymmetricDecryption(true) + builder.setAllowSymmetricDecryption(true) .setPassphrase(passphrase) .setNfcState(nfcDecryptedSessionKey); @@ -591,10 +584,9 @@ public class KeychainIntentService extends IntentService implements Progressable /* Operation */ PgpSignEncrypt.Builder builder = new PgpSignEncrypt.Builder( - new ProviderHelper(this), this, inputData, outStream + this, new ProviderHelper(this), this, inputData, outStream ); - builder.setProgressable(this) - .setEnableAsciiArmorOutput(useAsciiArmor) + builder.setEnableAsciiArmorOutput(useAsciiArmor) .setVersionHeader(PgpHelper.getVersionForHeader(this)) .setCompressionId(compressionId) .setSymmetricEncryptionAlgorithm( @@ -787,26 +779,6 @@ public class KeychainIntentService extends IntentService implements Progressable } } - @Override - public String getCachedPassphrase(long subKeyId) throws NoSecretKeyException { - try { - long masterKeyId = new ProviderHelper(this).getMasterKeyId(subKeyId); - return getCachedPassphrase(masterKeyId, subKeyId); - } catch (NotFoundException e) { - throw new PassphraseCacheInterface.NoSecretKeyException(); - } - } - - @Override - public String getCachedPassphrase(long masterKeyId, long subKeyId) throws NoSecretKeyException { - try { - return PassphraseCacheService.getCachedPassphrase( - KeychainIntentService.this, masterKeyId, subKeyId); - } catch (PassphraseCacheService.KeyNotFoundException e) { - throw new PassphraseCacheInterface.NoSecretKeyException(); - } - } - @Override public int onStartCommand(Intent intent, int flags, int startId) { if (ACTION_CANCEL.equals(intent.getAction())) {