diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java index 56c688b8f..2e28af1ab 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/BackupOperation.java @@ -170,18 +170,19 @@ public class BackupOperation extends BaseOperation { throws FileNotFoundException { PgpSignEncryptOperation signEncryptOperation = new PgpSignEncryptOperation(mContext, mKeyRepository, mProgressable, mCancelled); - PgpSignEncryptData.Builder data = PgpSignEncryptData.builder(); - data.setSymmetricPassphrase(cryptoInput.getPassphrase()); - data.setEnableAsciiArmorOutput(backupInput.getEnableAsciiArmorOutput()); - data.setAddBackupHeader(true); - PgpSignEncryptInputParcel inputParcel = new PgpSignEncryptInputParcel(data.build()); + PgpSignEncryptData.Builder builder = PgpSignEncryptData.builder(); + builder.setSymmetricPassphrase(cryptoInput.getPassphrase()); + builder.setEnableAsciiArmorOutput(backupInput.getEnableAsciiArmorOutput()); + builder.setAddBackupHeader(true); + PgpSignEncryptData pgpSignEncryptData = builder.build(); InputStream inStream = mContext.getContentResolver().openInputStream(plainUri); String filename; long[] masterKeyIds = backupInput.getMasterKeyIds(); if (masterKeyIds != null && masterKeyIds.length == 1) { - filename = Constants.FILE_BACKUP_PREFIX + KeyFormattingUtils.convertKeyIdToHex(masterKeyIds[0]); + filename = Constants.FILE_BACKUP_PREFIX + KeyFormattingUtils.convertKeyIdToHex( + masterKeyIds[0]); } else { filename = Constants.FILE_BACKUP_PREFIX + new SimpleDateFormat("yyyy-MM-dd", Locale .getDefault()).format(new Date()); @@ -203,7 +204,8 @@ public class BackupOperation extends BaseOperation { outStream = mContext.getContentResolver().openOutputStream(backupInput.getOutputUri()); } - return signEncryptOperation.execute(inputParcel, CryptoInputParcel.createCryptoInputParcel(), inputData, outStream); + return signEncryptOperation.execute( + pgpSignEncryptData, CryptoInputParcel.createCryptoInputParcel(), inputData, outStream); } boolean exportKeysToStream(OperationLog log, long[] masterKeyIds, boolean exportSecret, OutputStream outStream) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java index 07e491a0c..88cfbb649 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/SignEncryptOperation.java @@ -81,13 +81,14 @@ public class SignEncryptOperation extends BaseOperation { PgpSignEncryptOperation op = new PgpSignEncryptOperation(mContext, mKeyRepository, new ProgressScaler(mProgressable, 100 * count / total, 100 * ++count / total, 100), mCancelled); - PgpSignEncryptInputParcel inputParcel = new PgpSignEncryptInputParcel(input.getSignEncryptData()); + PgpSignEncryptInputParcel inputParcel; if (inputBytes != null) { - inputParcel.setInputBytes(inputBytes); + inputParcel = PgpSignEncryptInputParcel.createForBytes( + input.getSignEncryptData(), outputUris.pollFirst(), inputBytes); } else { - inputParcel.setInputUri(inputUris.removeFirst()); + inputParcel = PgpSignEncryptInputParcel.createForInputUri( + input.getSignEncryptData(), outputUris.pollFirst(), inputUris.removeFirst()); } - inputParcel.setOutputUri(outputUris.pollFirst()); PgpSignEncryptResult result = op.execute(inputParcel, cryptoInput); results.add(result); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java index 59e50aefa..4de8c4090 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptData.java @@ -19,6 +19,11 @@ package org.sufficientlysecure.keychain.pgp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + import android.os.Parcelable; import android.support.annotation.Nullable; @@ -42,6 +47,8 @@ public abstract class PgpSignEncryptData implements Parcelable { @Nullable @SuppressWarnings("mutable") public abstract long[] getEncryptionMasterKeyIds(); + @Nullable + public abstract List getAllowedSigningKeyIds(); public abstract int getCompressionAlgorithm(); @Nullable public abstract String getVersionHeader(); @@ -86,6 +93,12 @@ public abstract class PgpSignEncryptData implements Parcelable { public abstract Builder setCleartextSignature(boolean isCleartextSignature); public abstract Builder setDetachedSignature(boolean isDetachedSignature); public abstract Builder setHiddenRecipients(boolean isHiddenRecipients); + + abstract Builder setAllowedSigningKeyIds(List allowedSigningKeyIds); + public Builder setAllowedSigningKeyIds(Collection allowedSigningKeyIds) { + setAllowedSigningKeyIds(Collections.unmodifiableList(new ArrayList<>(allowedSigningKeyIds))); + return this; + } } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java index f5f998d25..aef423729 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptInputParcel.java @@ -18,104 +18,33 @@ package org.sufficientlysecure.keychain.pgp; + import android.net.Uri; -import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.Nullable; -import java.util.HashSet; +import com.google.auto.value.AutoValue; -public class PgpSignEncryptInputParcel implements Parcelable { +@AutoValue +public abstract class PgpSignEncryptInputParcel implements Parcelable { + public abstract PgpSignEncryptData getData(); + @Nullable + public abstract Uri getOutputUri(); + @Nullable + public abstract Uri getInputUri(); + @Nullable + @SuppressWarnings("mutable") + public abstract byte[] getInputBytes(); - private PgpSignEncryptData data; - - private Uri mInputUri; - private Uri mOutputUri; - private byte[] mInputBytes; - - private HashSet mAllowedKeyIds; - - public PgpSignEncryptInputParcel(PgpSignEncryptData data) { - this.data = data; + public static PgpSignEncryptInputParcel createForBytes( + PgpSignEncryptData signEncryptData, Uri outputUri, byte[] inputBytes) { + return new AutoValue_PgpSignEncryptInputParcel(signEncryptData, outputUri, null, inputBytes); } - PgpSignEncryptInputParcel(Parcel source) { - mInputUri = source.readParcelable(getClass().getClassLoader()); - mOutputUri = source.readParcelable(getClass().getClassLoader()); - mInputBytes = source.createByteArray(); - - data = source.readParcelable(getClass().getClassLoader()); - - mAllowedKeyIds = (HashSet) source.readSerializable(); + public static PgpSignEncryptInputParcel createForInputUri( + PgpSignEncryptData signEncryptData, Uri outputUri, Uri inputUri) { + return new AutoValue_PgpSignEncryptInputParcel(signEncryptData, outputUri, inputUri, null); } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeParcelable(mInputUri, 0); - dest.writeParcelable(mOutputUri, 0); - dest.writeByteArray(mInputBytes); - - data.writeToParcel(dest, 0); - - dest.writeSerializable(mAllowedKeyIds); - } - - public void setInputBytes(byte[] inputBytes) { - this.mInputBytes = inputBytes; - } - - byte[] getInputBytes() { - return mInputBytes; - } - - public PgpSignEncryptInputParcel setInputUri(Uri uri) { - mInputUri = uri; - return this; - } - - Uri getInputUri() { - return mInputUri; - } - - public PgpSignEncryptInputParcel setOutputUri(Uri uri) { - mOutputUri = uri; - return this; - } - - Uri getOutputUri() { - return mOutputUri; - } - - public void setData(PgpSignEncryptData data) { - this.data = data; - } - - public PgpSignEncryptData getData() { - return data; - } - - HashSet getAllowedKeyIds() { - return mAllowedKeyIds; - } - - public void setAllowedKeyIds(HashSet allowedKeyIds) { - mAllowedKeyIds = allowedKeyIds; - } - - public static final Creator CREATOR = new Creator() { - public PgpSignEncryptInputParcel createFromParcel(final Parcel source) { - return new PgpSignEncryptInputParcel(source); - } - - public PgpSignEncryptInputParcel[] newArray(final int size) { - return new PgpSignEncryptInputParcel[size]; - } - }; - } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java index bb022699e..9a7071388 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpSignEncryptOperation.java @@ -32,6 +32,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.security.SignatureException; +import java.util.Collection; import java.util.Date; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -148,7 +149,7 @@ public class PgpSignEncryptOperation extends BaseOperation 0) || data.getSymmetricPassphrase() != null); @@ -221,15 +220,13 @@ public class PgpSignEncryptOperation extends BaseOperation allowedSigningKeyIds = data.getAllowedSigningKeyIds(); + if (allowedSigningKeyIds != null && !allowedSigningKeyIds.contains(signingMasterKeyId)) { + // this key is in our db, but NOT allowed! + log.add(LogType.MSG_PSE_ERROR_KEY_NOT_ALLOWED, indent + 1); + return new PgpSignEncryptResult(PgpSignEncryptResult.RESULT_KEY_DISALLOWED, log); } - // Make sure key is not expired or revoked if (signingKeyRing.isExpired() || signingKeyRing.isRevoked() || signingKey.isExpired() || signingKey.isRevoked()) { @@ -572,8 +569,7 @@ public class PgpSignEncryptOperation extends BaseOperation