From 4499caef1e64d2e1afec37d360958f516da4dd40 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Wed, 18 Mar 2015 13:45:16 +0100 Subject: introduce CryptoOperationParcel for nfc data --- .../keychain/service/CertifyActionsParcel.java | 11 ++++- .../service/input/CryptoOperationParcel.java | 52 ++++++++++++++++++++++ .../keychain/ui/CertifyKeyFragment.java | 4 +- 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoOperationParcel.java (limited to 'OpenKeychain/src/main/java/org') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java index f4b941109..d6da18e6e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/CertifyActionsParcel.java @@ -23,15 +23,17 @@ import android.os.Parcelable; import java.io.Serializable; import java.util.ArrayList; +import java.util.Date; import org.sufficientlysecure.keychain.pgp.WrappedUserAttribute; +import org.sufficientlysecure.keychain.service.input.CryptoOperationParcel; /** * This class is a a transferable representation for a number of keyrings to * be certified. */ -public class CertifyActionsParcel implements Parcelable { +public class CertifyActionsParcel extends CryptoOperationParcel { // the master key id to certify with final public long mMasterKeyId; @@ -39,12 +41,15 @@ public class CertifyActionsParcel implements Parcelable { public ArrayList mCertifyActions = new ArrayList<>(); - public CertifyActionsParcel(long masterKeyId) { + public CertifyActionsParcel(Date operationTime, long masterKeyId) { + super(operationTime); mMasterKeyId = masterKeyId; mLevel = CertifyLevel.DEFAULT; } public CertifyActionsParcel(Parcel source) { + super(source); + mMasterKeyId = source.readLong(); // just like parcelables, this is meant for ad-hoc IPC only and is NOT portable! mLevel = CertifyLevel.values()[source.readInt()]; @@ -58,6 +63,8 @@ public class CertifyActionsParcel implements Parcelable { @Override public void writeToParcel(Parcel destination, int flags) { + super.writeToParcel(destination, flags); + destination.writeLong(mMasterKeyId); destination.writeInt(mLevel.ordinal()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoOperationParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoOperationParcel.java new file mode 100644 index 000000000..2101755ad --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/input/CryptoOperationParcel.java @@ -0,0 +1,52 @@ +package org.sufficientlysecure.keychain.service.input; + +import java.nio.ByteBuffer; +import java.util.Date; +import java.util.HashMap; + +import android.os.Parcel; +import android.os.Parcelable; + + +/** This is a base class for the input of crypto operations. + * + */ +public abstract class CryptoOperationParcel implements Parcelable { + + Date mOperationTime; + + // this map contains both decrypted session keys and signed hashes to be + // used in the crypto operation described by this parcel. + HashMap mCryptoData; + + protected CryptoOperationParcel(Date operationTime) { + mOperationTime = operationTime; + } + + protected CryptoOperationParcel(Parcel source) { + mOperationTime = new Date(source.readLong()); + + { + 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); + } + } + + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(mOperationTime.getTime()); + + dest.writeInt(mCryptoData.size()); + for (HashMap.Entry entry : mCryptoData.entrySet()) { + dest.writeByteArray(entry.getKey().array()); + dest.writeByteArray(entry.getValue()); + } + } + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java index 9cb4e5f65..049c6976d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java @@ -66,6 +66,8 @@ import org.sufficientlysecure.keychain.util.Preferences; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Date; + public class CertifyKeyFragment extends LoaderFragment implements LoaderManager.LoaderCallbacks { @@ -368,7 +370,7 @@ public class CertifyKeyFragment extends LoaderFragment Bundle data = new Bundle(); { // fill values for this action - CertifyActionsParcel parcel = new CertifyActionsParcel(mSignMasterKeyId); + CertifyActionsParcel parcel = new CertifyActionsParcel(new Date(), mSignMasterKeyId); parcel.mCertifyActions.addAll(certifyActions); data.putParcelable(KeychainIntentService.CERTIFY_PARCEL, parcel); -- cgit v1.2.3