use autovalue for CryptoInputParcel
This commit is contained in:
@@ -129,7 +129,7 @@ public class ImportKeysListCloudLoader
|
||||
mEntryList.clear();
|
||||
GetKeyResult pendingResult = new GetKeyResult(null,
|
||||
RequiredInputParcel.createOrbotRequiredOperation(),
|
||||
new CryptoInputParcel());
|
||||
CryptoInputParcel.createCryptoInputParcel());
|
||||
mEntryListWrapper = new AsyncTaskResultWrapper<>(mEntryList, pendingResult);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ public class BackupOperation extends BaseOperation<BackupKeyringParcel> {
|
||||
outStream = mContext.getContentResolver().openOutputStream(backupInput.mOutputUri);
|
||||
}
|
||||
|
||||
return signEncryptOperation.execute(inputParcel, new CryptoInputParcel(), inputData, outStream);
|
||||
return signEncryptOperation.execute(inputParcel, CryptoInputParcel.createCryptoInputParcel(), inputData, outStream);
|
||||
}
|
||||
|
||||
boolean exportKeysToStream(OperationLog log, long[] masterKeyIds, boolean exportSecret, OutputStream outStream) {
|
||||
|
||||
@@ -88,7 +88,7 @@ public class BenchmarkOperation extends BaseOperation<BenchmarkInputParcel> {
|
||||
data.setSymmetricEncryptionAlgorithm(OpenKeychainSymmetricKeyAlgorithmTags.AES_128);
|
||||
SignEncryptParcel input = new SignEncryptParcel(data.build());
|
||||
input.setBytes(buf);
|
||||
encryptResult = op.execute(input, new CryptoInputParcel());
|
||||
encryptResult = op.execute(input, CryptoInputParcel.createCryptoInputParcel());
|
||||
log.add(encryptResult, 1);
|
||||
log.add(LogType.MSG_BENCH_ENC_TIME, 2,
|
||||
String.format("%.2f", encryptResult.getResults().get(0).mOperationTime / 1000.0));
|
||||
@@ -107,7 +107,7 @@ public class BenchmarkOperation extends BaseOperation<BenchmarkInputParcel> {
|
||||
new ProgressScaler(mProgressable, 50 +i*(50/numRepeats), 50 +(i+1)*(50/numRepeats), 100));
|
||||
PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(encryptResult.getResultBytes());
|
||||
input.setAllowSymmetricDecryption(true);
|
||||
decryptResult = op.execute(input, new CryptoInputParcel(passphrase));
|
||||
decryptResult = op.execute(input, CryptoInputParcel.createCryptoInputParcel(passphrase));
|
||||
log.add(decryptResult, 1);
|
||||
log.add(LogType.MSG_BENCH_DEC_TIME, 2, String.format("%.2f", decryptResult.mOperationTime / 1000.0));
|
||||
totalTime += decryptResult.mOperationTime;
|
||||
|
||||
@@ -154,7 +154,7 @@ public class KeybaseVerificationOperation extends BaseOperation<KeybaseVerificat
|
||||
|
||||
PgpDecryptVerifyInputParcel input = new PgpDecryptVerifyInputParcel(messageBytes);
|
||||
|
||||
DecryptVerifyResult decryptVerifyResult = op.execute(input, new CryptoInputParcel());
|
||||
DecryptVerifyResult decryptVerifyResult = op.execute(input, CryptoInputParcel.createCryptoInputParcel());
|
||||
|
||||
if (!decryptVerifyResult.success()) {
|
||||
log.add(decryptVerifyResult, 1);
|
||||
|
||||
@@ -51,7 +51,7 @@ public class RevokeOperation extends BaseReadWriteOperation<RevokeKeyringParcel>
|
||||
CryptoInputParcel cryptoInputParcel) {
|
||||
|
||||
// we don't cache passphrases during revocation
|
||||
cryptoInputParcel.mCachePassphrase = false;
|
||||
cryptoInputParcel = cryptoInputParcel.withNoCachePassphrase();
|
||||
|
||||
long masterKeyId = revokeKeyringParcel.mMasterKeyId;
|
||||
|
||||
|
||||
@@ -69,10 +69,9 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult.LogTyp
|
||||
import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog;
|
||||
import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
|
||||
import org.sufficientlysecure.keychain.pgp.DecryptVerifySecurityProblem.DecryptVerifySecurityProblemBuilder;
|
||||
import org.sufficientlysecure.keychain.pgp.SecurityProblem.InsecureBitStrength;
|
||||
import org.sufficientlysecure.keychain.pgp.SecurityProblem.EncryptionAlgorithmProblem;
|
||||
import org.sufficientlysecure.keychain.pgp.SecurityProblem.KeySecurityProblem;
|
||||
import org.sufficientlysecure.keychain.pgp.SecurityProblem.MissingMdc;
|
||||
import org.sufficientlysecure.keychain.pgp.SecurityProblem.EncryptionAlgorithmProblem;
|
||||
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
|
||||
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
|
||||
import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
|
||||
@@ -321,6 +320,7 @@ public class PgpDecryptVerifyOperation extends BaseOperation<PgpDecryptVerifyInp
|
||||
decryptionResultBuilder.setEncrypted(true);
|
||||
if (esResult.sessionKey != null && esResult.decryptedSessionKey != null) {
|
||||
decryptionResultBuilder.setSessionKey(esResult.sessionKey, esResult.decryptedSessionKey);
|
||||
cryptoInput = cryptoInput.withCryptoData(esResult.sessionKey, esResult.decryptedSessionKey);
|
||||
}
|
||||
|
||||
if (esResult.encryptionKeySecurityProblem != null) {
|
||||
@@ -820,7 +820,6 @@ public class PgpDecryptVerifyOperation extends BaseOperation<PgpDecryptVerifyInp
|
||||
result.encryptedData = encryptedDataAsymmetric;
|
||||
|
||||
Map<ByteBuffer, byte[]> cachedSessionKeys = decryptorFactory.getCachedSessionKeys();
|
||||
cryptoInput.addCryptoData(cachedSessionKeys);
|
||||
if (cachedSessionKeys.size() >= 1) {
|
||||
Entry<ByteBuffer, byte[]> entry = cachedSessionKeys.entrySet().iterator().next();
|
||||
result.sessionKey = entry.getKey().array();
|
||||
|
||||
@@ -336,7 +336,7 @@ public class PgpKeyOperation {
|
||||
masterSecretKey.getEncoded(), new JcaKeyFingerprintCalculator());
|
||||
|
||||
subProgressPush(50, 100);
|
||||
CryptoInputParcel cryptoInput = new CryptoInputParcel(creationTime, new Passphrase(""));
|
||||
CryptoInputParcel cryptoInput = CryptoInputParcel.createCryptoInputParcel(creationTime, new Passphrase(""));
|
||||
return internal(sKR, masterSecretKey, add.mFlags, add.mExpiry, cryptoInput, saveParcel, log, indent);
|
||||
|
||||
} catch (PGPException e) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de>
|
||||
* Copyright (C) 2014 Vincent Breitmoser <v.breitmoser@mugenguild.com>
|
||||
* Copyright (C) 2017 Vincent Breitmoser <v.breitmoser@mugenguild.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -154,12 +154,12 @@ public class OpenPgpService extends Service {
|
||||
|
||||
CryptoInputParcel inputParcel = CryptoInputParcelCacheService.getCryptoInputParcel(this, data);
|
||||
if (inputParcel == null) {
|
||||
inputParcel = new CryptoInputParcel(new Date());
|
||||
inputParcel = CryptoInputParcel.createCryptoInputParcel(new Date());
|
||||
}
|
||||
// override passphrase in input parcel if given by API call
|
||||
if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
|
||||
inputParcel.mPassphrase =
|
||||
new Passphrase(data.getCharArrayExtra(OpenPgpApi.EXTRA_PASSPHRASE));
|
||||
inputParcel = inputParcel.withPassphrase(
|
||||
new Passphrase(data.getCharArrayExtra(OpenPgpApi.EXTRA_PASSPHRASE)));
|
||||
}
|
||||
|
||||
// execute PGP operation!
|
||||
@@ -265,11 +265,12 @@ public class OpenPgpService extends Service {
|
||||
|
||||
CryptoInputParcel inputParcel = CryptoInputParcelCacheService.getCryptoInputParcel(this, data);
|
||||
if (inputParcel == null) {
|
||||
inputParcel = new CryptoInputParcel(new Date());
|
||||
inputParcel = CryptoInputParcel.createCryptoInputParcel(new Date());
|
||||
}
|
||||
// override passphrase in input parcel if given by API call
|
||||
if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
|
||||
inputParcel.mPassphrase = new Passphrase(data.getCharArrayExtra(OpenPgpApi.EXTRA_PASSPHRASE));
|
||||
inputParcel = inputParcel.withPassphrase(
|
||||
new Passphrase(data.getCharArrayExtra(OpenPgpApi.EXTRA_PASSPHRASE)));
|
||||
}
|
||||
|
||||
// TODO this is not correct!
|
||||
@@ -352,17 +353,18 @@ public class OpenPgpService extends Service {
|
||||
|
||||
CryptoInputParcel cryptoInput = CryptoInputParcelCacheService.getCryptoInputParcel(this, data);
|
||||
if (cryptoInput == null) {
|
||||
cryptoInput = new CryptoInputParcel();
|
||||
cryptoInput = CryptoInputParcel.createCryptoInputParcel();
|
||||
}
|
||||
// override passphrase in input parcel if given by API call
|
||||
if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) {
|
||||
cryptoInput.mPassphrase =
|
||||
new Passphrase(data.getCharArrayExtra(OpenPgpApi.EXTRA_PASSPHRASE));
|
||||
cryptoInput = cryptoInput.withPassphrase(
|
||||
new Passphrase(data.getCharArrayExtra(OpenPgpApi.EXTRA_PASSPHRASE)));
|
||||
}
|
||||
if (data.hasExtra(OpenPgpApi.EXTRA_DECRYPTION_RESULT)) {
|
||||
OpenPgpDecryptionResult decryptionResult = data.getParcelableExtra(OpenPgpApi.EXTRA_DECRYPTION_RESULT);
|
||||
if (decryptionResult != null && decryptionResult.hasDecryptedSessionKey()) {
|
||||
cryptoInput.addCryptoData(decryptionResult.getSessionKey(), decryptionResult.getDecryptedSessionKey());
|
||||
cryptoInput = cryptoInput.withCryptoData(
|
||||
decryptionResult.getSessionKey(), decryptionResult.getDecryptedSessionKey());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ public class KeyserverSyncAdapterService extends Service {
|
||||
}
|
||||
case ACTION_UPDATE_ALL: {
|
||||
// does not check for screen on/off
|
||||
asyncKeyUpdate(this, new CryptoInputParcel(), startId);
|
||||
asyncKeyUpdate(this, CryptoInputParcel.createCryptoInputParcel(), startId);
|
||||
// we depend on handleUpdateResult to call stopSelf when it is no longer necessary
|
||||
// for the intent to be redelivered
|
||||
return START_REDELIVER_INTENT;
|
||||
@@ -118,7 +118,7 @@ public class KeyserverSyncAdapterService extends Service {
|
||||
case ACTION_IGNORE_TOR: {
|
||||
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||
manager.cancel(Constants.Notification.KEYSERVER_SYNC_FAIL_ORBOT);
|
||||
asyncKeyUpdate(this, new CryptoInputParcel(ParcelableProxy.getForNoProxy()),
|
||||
asyncKeyUpdate(this, CryptoInputParcel.createCryptoInputParcel(ParcelableProxy.getForNoProxy()),
|
||||
startId);
|
||||
// we depend on handleUpdateResult to call stopSelf when it is no longer necessary
|
||||
// for the intent to be redelivered
|
||||
|
||||
@@ -19,181 +19,128 @@ package org.sufficientlysecure.keychain.service.input;
|
||||
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.support.annotation.CheckResult;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.ryanharter.auto.value.parcel.ParcelAdapter;
|
||||
import org.sufficientlysecure.keychain.util.ByteMapParcelAdapter;
|
||||
import org.sufficientlysecure.keychain.util.ParcelableProxy;
|
||||
import org.sufficientlysecure.keychain.util.Passphrase;
|
||||
|
||||
/**
|
||||
* This is a base class for the input of crypto operations.
|
||||
*/
|
||||
public class CryptoInputParcel implements Parcelable {
|
||||
@AutoValue
|
||||
public abstract class CryptoInputParcel implements Parcelable {
|
||||
@Nullable
|
||||
public abstract Date getSignatureTime();
|
||||
@Nullable
|
||||
public abstract Passphrase getPassphrase();
|
||||
public abstract boolean isCachePassphrase();
|
||||
|
||||
private Date mSignatureTime;
|
||||
private boolean mHasSignature;
|
||||
public boolean hasPassphrase() {
|
||||
return getPassphrase() != null;
|
||||
}
|
||||
|
||||
public Passphrase mPassphrase;
|
||||
// used to supply an explicit proxy to operations that require it
|
||||
// this is not final so it can be added to an existing CryptoInputParcel
|
||||
// (e.g) CertifyOperation with upload might require both passphrase and orbot to be enabled
|
||||
private ParcelableProxy mParcelableProxy;
|
||||
|
||||
// specifies whether passphrases should be cached
|
||||
public boolean mCachePassphrase = true;
|
||||
@Nullable
|
||||
public abstract ParcelableProxy getParcelableProxy();
|
||||
|
||||
// this map contains both decrypted session keys and signed hashes to be
|
||||
// used in the crypto operation described by this parcel.
|
||||
private HashMap<ByteBuffer, byte[]> mCryptoData = new HashMap<>();
|
||||
@ParcelAdapter(ByteMapParcelAdapter.class)
|
||||
public abstract Map<ByteBuffer, byte[]> getCryptoData();
|
||||
|
||||
public CryptoInputParcel() {
|
||||
mSignatureTime = null;
|
||||
mPassphrase = null;
|
||||
mCachePassphrase = true;
|
||||
|
||||
public static CryptoInputParcel createCryptoInputParcel() {
|
||||
return new AutoValue_CryptoInputParcel(null, null, true, null, Collections.<ByteBuffer,byte[]>emptyMap());
|
||||
}
|
||||
|
||||
public CryptoInputParcel(Date signatureTime, Passphrase passphrase) {
|
||||
mHasSignature = true;
|
||||
mSignatureTime = signatureTime == null ? new Date() : signatureTime;
|
||||
mPassphrase = passphrase;
|
||||
mCachePassphrase = true;
|
||||
}
|
||||
|
||||
public CryptoInputParcel(Passphrase passphrase) {
|
||||
mPassphrase = passphrase;
|
||||
mCachePassphrase = true;
|
||||
}
|
||||
|
||||
public CryptoInputParcel(Date signatureTime) {
|
||||
mHasSignature = true;
|
||||
mSignatureTime = signatureTime == null ? new Date() : signatureTime;
|
||||
mPassphrase = null;
|
||||
mCachePassphrase = true;
|
||||
}
|
||||
|
||||
public CryptoInputParcel(ParcelableProxy parcelableProxy) {
|
||||
this();
|
||||
mParcelableProxy = parcelableProxy;
|
||||
}
|
||||
|
||||
public CryptoInputParcel(Date signatureTime, boolean cachePassphrase) {
|
||||
mHasSignature = true;
|
||||
mSignatureTime = signatureTime == null ? new Date() : signatureTime;
|
||||
mPassphrase = null;
|
||||
mCachePassphrase = cachePassphrase;
|
||||
}
|
||||
|
||||
public CryptoInputParcel(boolean cachePassphrase) {
|
||||
mCachePassphrase = cachePassphrase;
|
||||
}
|
||||
|
||||
protected CryptoInputParcel(Parcel source) {
|
||||
mHasSignature = source.readByte() != 0;
|
||||
if (mHasSignature) {
|
||||
mSignatureTime = new Date(source.readLong());
|
||||
public static CryptoInputParcel createCryptoInputParcel(Date signatureTime, Passphrase passphrase) {
|
||||
if (signatureTime == null) {
|
||||
signatureTime = new Date();
|
||||
}
|
||||
mPassphrase = source.readParcelable(getClass().getClassLoader());
|
||||
mParcelableProxy = source.readParcelable(getClass().getClassLoader());
|
||||
mCachePassphrase = source.readByte() != 0;
|
||||
return new AutoValue_CryptoInputParcel(signatureTime, passphrase, true, null,
|
||||
Collections.<ByteBuffer,byte[]>emptyMap());
|
||||
}
|
||||
|
||||
{
|
||||
int count = source.readInt();
|
||||
mCryptoData = new HashMap<>(count);
|
||||
for (int i = 0; i < count; i++) {
|
||||
byte[] key = source.createByteArray();
|
||||
byte[] value = source.createByteArray();
|
||||
mCryptoData.put(ByteBuffer.wrap(key), value);
|
||||
}
|
||||
public static CryptoInputParcel createCryptoInputParcel(Passphrase passphrase) {
|
||||
return new AutoValue_CryptoInputParcel(null, passphrase, true, null, Collections.<ByteBuffer,byte[]>emptyMap());
|
||||
}
|
||||
|
||||
public static CryptoInputParcel createCryptoInputParcel(Date signatureTime) {
|
||||
if (signatureTime == null) {
|
||||
signatureTime = new Date();
|
||||
}
|
||||
|
||||
return new AutoValue_CryptoInputParcel(signatureTime, null, true, null,
|
||||
Collections.<ByteBuffer,byte[]>emptyMap());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
public static CryptoInputParcel createCryptoInputParcel(ParcelableProxy parcelableProxy) {
|
||||
return new AutoValue_CryptoInputParcel(null, null, true, parcelableProxy, new HashMap<ByteBuffer,byte[]>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeByte((byte) (mHasSignature ? 1 : 0));
|
||||
if (mHasSignature) {
|
||||
dest.writeLong(mSignatureTime.getTime());
|
||||
}
|
||||
dest.writeParcelable(mPassphrase, 0);
|
||||
dest.writeParcelable(mParcelableProxy, 0);
|
||||
dest.writeByte((byte) (mCachePassphrase ? 1 : 0));
|
||||
|
||||
dest.writeInt(mCryptoData.size());
|
||||
for (HashMap.Entry<ByteBuffer, byte[]> entry : mCryptoData.entrySet()) {
|
||||
dest.writeByteArray(entry.getKey().array());
|
||||
dest.writeByteArray(entry.getValue());
|
||||
public static CryptoInputParcel createCryptoInputParcel(Date signatureTime, boolean cachePassphrase) {
|
||||
if (signatureTime == null) {
|
||||
signatureTime = new Date();
|
||||
}
|
||||
return new AutoValue_CryptoInputParcel(signatureTime, null, cachePassphrase, null,
|
||||
new HashMap<ByteBuffer,byte[]>());
|
||||
}
|
||||
|
||||
public void addParcelableProxy(ParcelableProxy parcelableProxy) {
|
||||
mParcelableProxy = parcelableProxy;
|
||||
public static CryptoInputParcel createCryptoInputParcel(boolean cachePassphrase) {
|
||||
return new AutoValue_CryptoInputParcel(null, null, cachePassphrase, null, new HashMap<ByteBuffer,byte[]>());
|
||||
}
|
||||
|
||||
public void addSignatureTime(Date signatureTime) {
|
||||
mSignatureTime = signatureTime;
|
||||
// TODO get rid of this!
|
||||
@CheckResult
|
||||
public CryptoInputParcel withCryptoData(byte[] hash, byte[] signedHash) {
|
||||
Map<ByteBuffer,byte[]> newCryptoData = new HashMap<>(getCryptoData());
|
||||
newCryptoData.put(ByteBuffer.wrap(hash), signedHash);
|
||||
newCryptoData = Collections.unmodifiableMap(newCryptoData);
|
||||
|
||||
return new AutoValue_CryptoInputParcel(getSignatureTime(), getPassphrase(), isCachePassphrase(),
|
||||
getParcelableProxy(), newCryptoData);
|
||||
}
|
||||
|
||||
public void addCryptoData(byte[] hash, byte[] signedHash) {
|
||||
mCryptoData.put(ByteBuffer.wrap(hash), signedHash);
|
||||
@CheckResult
|
||||
public CryptoInputParcel withCryptoData(Map<ByteBuffer, byte[]> cachedSessionKeys) {
|
||||
Map<ByteBuffer,byte[]> newCryptoData = new HashMap<>(getCryptoData());
|
||||
newCryptoData.putAll(cachedSessionKeys);
|
||||
newCryptoData = Collections.unmodifiableMap(newCryptoData);
|
||||
|
||||
return new AutoValue_CryptoInputParcel(getSignatureTime(), getPassphrase(), isCachePassphrase(),
|
||||
getParcelableProxy(), newCryptoData);
|
||||
}
|
||||
|
||||
public void addCryptoData(Map<ByteBuffer, byte[]> cachedSessionKeys) {
|
||||
mCryptoData.putAll(cachedSessionKeys);
|
||||
|
||||
@CheckResult
|
||||
public CryptoInputParcel withPassphrase(Passphrase passphrase) {
|
||||
return new AutoValue_CryptoInputParcel(getSignatureTime(), passphrase, isCachePassphrase(),
|
||||
getParcelableProxy(), getCryptoData());
|
||||
}
|
||||
|
||||
public ParcelableProxy getParcelableProxy() {
|
||||
return mParcelableProxy;
|
||||
@CheckResult
|
||||
public CryptoInputParcel withNoCachePassphrase() {
|
||||
return new AutoValue_CryptoInputParcel(getSignatureTime(), getPassphrase(), false, getParcelableProxy(),
|
||||
getCryptoData());
|
||||
}
|
||||
|
||||
public Map<ByteBuffer, byte[]> getCryptoData() {
|
||||
return mCryptoData;
|
||||
@CheckResult
|
||||
public CryptoInputParcel withSignatureTime(Date signatureTime) {
|
||||
return new AutoValue_CryptoInputParcel(signatureTime, getPassphrase(), isCachePassphrase(),
|
||||
getParcelableProxy(), getCryptoData());
|
||||
}
|
||||
|
||||
public Date getSignatureTime() {
|
||||
return mSignatureTime;
|
||||
@CheckResult
|
||||
public CryptoInputParcel withParcelableProxy(ParcelableProxy parcelableProxy) {
|
||||
return new AutoValue_CryptoInputParcel(getSignatureTime(), getPassphrase(), isCachePassphrase(),
|
||||
parcelableProxy, getCryptoData());
|
||||
}
|
||||
|
||||
public boolean hasPassphrase() {
|
||||
return mPassphrase != null;
|
||||
}
|
||||
|
||||
public Passphrase getPassphrase() {
|
||||
return mPassphrase;
|
||||
}
|
||||
|
||||
public static final Creator<CryptoInputParcel> CREATOR = new Creator<CryptoInputParcel>() {
|
||||
public CryptoInputParcel createFromParcel(final Parcel source) {
|
||||
return new CryptoInputParcel(source);
|
||||
}
|
||||
|
||||
public CryptoInputParcel[] newArray(final int size) {
|
||||
return new CryptoInputParcel[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder b = new StringBuilder();
|
||||
b.append("CryptoInput: { ");
|
||||
b.append(mSignatureTime).append(" ");
|
||||
if (mPassphrase != null) {
|
||||
b.append("passphrase");
|
||||
}
|
||||
if (mCryptoData != null) {
|
||||
b.append(mCryptoData.size());
|
||||
b.append(" hashes ");
|
||||
}
|
||||
b.append("}");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -523,7 +523,8 @@ public class BackupCodeFragment extends CryptoOperationFragment<BackupKeyringPar
|
||||
|
||||
// if we don't want to execute the actual operation outside of this activity, drop out here
|
||||
if (!mExecuteBackupOperation) {
|
||||
((BackupActivity) getActivity()).handleBackupOperation(new CryptoInputParcel(passphrase));
|
||||
((BackupActivity) getActivity()).handleBackupOperation(
|
||||
CryptoInputParcel.createCryptoInputParcel(passphrase));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -531,7 +532,7 @@ public class BackupCodeFragment extends CryptoOperationFragment<BackupKeyringPar
|
||||
mCachedBackupUri = TemporaryFileProvider.createFile(activity, filename,
|
||||
Constants.MIME_TYPE_ENCRYPTED_ALTERNATE);
|
||||
|
||||
cryptoOperation(new CryptoInputParcel(passphrase));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(passphrase));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ public class CertifyKeyFragment
|
||||
Notify.create(getActivity(), getString(R.string.select_key_to_certify),
|
||||
Notify.Style.ERROR).show();
|
||||
} else {
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -499,7 +499,7 @@ public class CreateKeyFinalFragment extends Fragment {
|
||||
|
||||
|
||||
mMoveToCardOpHelper = new CryptoOperationHelper<>(2, this, callback, R.string.progress_modify);
|
||||
mMoveToCardOpHelper.cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
mMoveToCardOpHelper.cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
}
|
||||
|
||||
private void uploadKey(final EditKeyResult saveKeyResult) {
|
||||
|
||||
@@ -235,7 +235,7 @@ public class CreateSecurityTokenImportResetFragment
|
||||
Intent intent = new Intent(getActivity(), SecurityTokenOperationActivity.class);
|
||||
RequiredInputParcel resetP = RequiredInputParcel.createSecurityTokenReset();
|
||||
intent.putExtra(SecurityTokenOperationActivity.EXTRA_REQUIRED_INPUT, resetP);
|
||||
intent.putExtra(SecurityTokenOperationActivity.EXTRA_CRYPTO_INPUT, new CryptoInputParcel());
|
||||
intent.putExtra(SecurityTokenOperationActivity.EXTRA_CRYPTO_INPUT, CryptoInputParcel.createCryptoInputParcel());
|
||||
startActivityForResult(intent, REQUEST_CODE_RESET);
|
||||
}
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ public class DeleteKeyDialogActivity extends FragmentActivity {
|
||||
}
|
||||
|
||||
private void startRevocationOperation() {
|
||||
mRevokeOpHelper.cryptoOperation(new CryptoInputParcel(new Date(), false));
|
||||
mRevokeOpHelper.cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date(), false));
|
||||
}
|
||||
|
||||
private void startDeletionOperation() {
|
||||
|
||||
@@ -156,7 +156,7 @@ public class EditKeyFragment extends QueueingCryptoOperationFragment<SaveKeyring
|
||||
if (mDataUri == null) {
|
||||
returnKeyringParcel();
|
||||
} else {
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
}
|
||||
}
|
||||
}, new OnClickListener() {
|
||||
|
||||
@@ -345,19 +345,19 @@ public class EncryptFilesFragment
|
||||
case R.id.encrypt_save: {
|
||||
hideKeyboard();
|
||||
mAfterEncryptAction = AfterEncryptAction.SAVE;
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
break;
|
||||
}
|
||||
case R.id.encrypt_share: {
|
||||
hideKeyboard();
|
||||
mAfterEncryptAction = AfterEncryptAction.SHARE;
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
break;
|
||||
}
|
||||
case R.id.encrypt_copy: {
|
||||
hideKeyboard();
|
||||
mAfterEncryptAction = AfterEncryptAction.COPY;
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
break;
|
||||
}
|
||||
case R.id.check_use_armor: {
|
||||
@@ -733,7 +733,7 @@ public class EncryptFilesFragment
|
||||
mOutputUris.add(data.getData());
|
||||
// make sure this is correct at this point
|
||||
mAfterEncryptAction = AfterEncryptAction.SAVE;
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
} else if (resultCode == Activity.RESULT_CANCELED) {
|
||||
onCryptoOperationCancelled();
|
||||
}
|
||||
|
||||
@@ -181,18 +181,18 @@ public class EncryptTextFragment
|
||||
case R.id.encrypt_copy: {
|
||||
hideKeyboard();
|
||||
mShareAfterEncrypt = false;
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
break;
|
||||
}
|
||||
case R.id.encrypt_share: {
|
||||
hideKeyboard();
|
||||
mShareAfterEncrypt = true;
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
break;
|
||||
}
|
||||
case R.id.encrypt_paste: {
|
||||
hideKeyboard();
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
|
||||
@@ -70,7 +70,7 @@ public class OrbotRequiredDialogActivity extends FragmentActivity
|
||||
mCryptoInputParcel = getIntent().getParcelableExtra(EXTRA_CRYPTO_INPUT);
|
||||
if (mCryptoInputParcel == null) {
|
||||
// compatibility with usages that don't use a CryptoInputParcel
|
||||
mCryptoInputParcel = new CryptoInputParcel();
|
||||
mCryptoInputParcel = CryptoInputParcel.createCryptoInputParcel();
|
||||
}
|
||||
|
||||
mMessenger = getIntent().getParcelableExtra(EXTRA_MESSENGER);
|
||||
@@ -147,7 +147,7 @@ public class OrbotRequiredDialogActivity extends FragmentActivity
|
||||
public void onNeutralButton() {
|
||||
sendMessage(MESSAGE_ORBOT_IGNORE);
|
||||
Intent intent = new Intent();
|
||||
mCryptoInputParcel.addParcelableProxy(ParcelableProxy.getForNoProxy());
|
||||
mCryptoInputParcel = mCryptoInputParcel.withParcelableProxy(ParcelableProxy.getForNoProxy());
|
||||
intent.putExtra(RESULT_CRYPTO_INPUT, mCryptoInputParcel);
|
||||
setResult(RESULT_OK, intent);
|
||||
finish();
|
||||
|
||||
@@ -99,7 +99,7 @@ public class PassphraseDialogActivity extends FragmentActivity {
|
||||
|
||||
CryptoInputParcel cryptoInputParcel = getIntent().getParcelableExtra(EXTRA_CRYPTO_INPUT);
|
||||
if (cryptoInputParcel == null) {
|
||||
cryptoInputParcel = new CryptoInputParcel();
|
||||
cryptoInputParcel = CryptoInputParcel.createCryptoInputParcel();
|
||||
getIntent().putExtra(EXTRA_CRYPTO_INPUT, cryptoInputParcel);
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ public class PassphraseDialogActivity extends FragmentActivity {
|
||||
if (pubRing.getSecretKeyType(requiredInput.getSubKeyId()) == SecretKeyType.PASSPHRASE_EMPTY) {
|
||||
// also return passphrase back to activity
|
||||
Intent returnIntent = new Intent();
|
||||
cryptoInputParcel.mPassphrase = new Passphrase("");
|
||||
cryptoInputParcel = cryptoInputParcel.withPassphrase(new Passphrase(""));
|
||||
returnIntent.putExtra(RESULT_CRYPTO_INPUT, cryptoInputParcel);
|
||||
setResult(RESULT_OK, returnIntent);
|
||||
finish();
|
||||
@@ -539,7 +539,7 @@ public class PassphraseDialogActivity extends FragmentActivity {
|
||||
|
||||
CryptoInputParcel inputParcel = getArguments().getParcelable(EXTRA_CRYPTO_INPUT);
|
||||
// noinspection ConstantConditions, we handle the non-null case in PassphraseDialogActivity.onCreate()
|
||||
inputParcel.mPassphrase = passphrase;
|
||||
inputParcel = inputParcel.withPassphrase(passphrase);
|
||||
|
||||
((PassphraseDialogActivity) getActivity()).handleResult(inputParcel);
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenActivity {
|
||||
for (int i = 0; i < mRequiredInput.mInputData.length; i++) {
|
||||
byte[] encryptedSessionKey = mRequiredInput.mInputData[i];
|
||||
byte[] decryptedSessionKey = mSecurityTokenHelper.decryptSessionKey(encryptedSessionKey, publicKeyRing.getPublicKey(tokenKeyId));
|
||||
mInputParcel.addCryptoData(encryptedSessionKey, decryptedSessionKey);
|
||||
mInputParcel = mInputParcel.withCryptoData(encryptedSessionKey, decryptedSessionKey);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -218,13 +218,13 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenActivity {
|
||||
throw new IOException(getString(R.string.error_wrong_security_token));
|
||||
}
|
||||
|
||||
mInputParcel.addSignatureTime(mRequiredInput.mSignatureTime);
|
||||
mInputParcel = mInputParcel.withSignatureTime(mRequiredInput.mSignatureTime);
|
||||
|
||||
for (int i = 0; i < mRequiredInput.mInputData.length; i++) {
|
||||
byte[] hash = mRequiredInput.mInputData[i];
|
||||
int algo = mRequiredInput.mSignAlgos[i];
|
||||
byte[] signedHash = mSecurityTokenHelper.calculateSignature(hash, algo);
|
||||
mInputParcel.addCryptoData(hash, signedHash);
|
||||
mInputParcel = mInputParcel.withCryptoData(hash, signedHash);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -266,7 +266,7 @@ public class SecurityTokenOperationActivity extends BaseSecurityTokenActivity {
|
||||
mSecurityTokenHelper.changeKey(key, passphrase);
|
||||
|
||||
// TODO: Is this really used anywhere?
|
||||
mInputParcel.addCryptoData(subkeyBytes, tokenSerialNumber);
|
||||
mInputParcel = mInputParcel.withCryptoData(subkeyBytes, tokenSerialNumber);
|
||||
}
|
||||
|
||||
// change PINs afterwards
|
||||
|
||||
@@ -323,7 +323,7 @@ public class CryptoOperationHelper<T extends Parcelable, S extends OperationResu
|
||||
}
|
||||
|
||||
public void cryptoOperation() {
|
||||
cryptoOperation(new CryptoInputParcel(new Date()));
|
||||
cryptoOperation(CryptoInputParcel.createCryptoInputParcel(new Date()));
|
||||
}
|
||||
|
||||
public void onHandleResult(OperationResult result) {
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package org.sufficientlysecure.keychain.util;
|
||||
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import android.os.Parcel;
|
||||
|
||||
import com.ryanharter.auto.value.parcel.TypeAdapter;
|
||||
|
||||
|
||||
public class ByteMapParcelAdapter implements TypeAdapter<Map<ByteBuffer,byte[]>> {
|
||||
@Override
|
||||
public Map<ByteBuffer, byte[]> fromParcel(Parcel source) {
|
||||
int count = source.readInt();
|
||||
Map<ByteBuffer,byte[]> result = new HashMap<>(count);
|
||||
for (int i = 0; i < count; i++) {
|
||||
byte[] key = source.createByteArray();
|
||||
byte[] value = source.createByteArray();
|
||||
result.put(ByteBuffer.wrap(key), value);
|
||||
}
|
||||
return Collections.unmodifiableMap(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toParcel(Map<ByteBuffer, byte[]> value, Parcel dest) {
|
||||
dest.writeInt(value.size());
|
||||
for (Map.Entry<ByteBuffer, byte[]> entry : value.entrySet()) {
|
||||
dest.writeByteArray(entry.getKey().array());
|
||||
dest.writeByteArray(entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user