aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2014-06-22 16:03:13 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2014-06-22 16:03:13 +0200
commit4db0194e6acd6f89216f08d6a97fa223539f5969 (patch)
tree0fe699f561bbba3e8ab0823cd66b4a16e154d6b9 /OpenKeychain
parent106e1fcf0344ddf98f65b7c7adc706da19faef7d (diff)
parent9f947aefe63055045b4dfa7087b858f8f3d2987e (diff)
downloadopen-keychain-4db0194e6acd6f89216f08d6a97fa223539f5969.tar.gz
open-keychain-4db0194e6acd6f89216f08d6a97fa223539f5969.tar.bz2
open-keychain-4db0194e6acd6f89216f08d6a97fa223539f5969.zip
Merge branch 'master' of github.com:open-keychain/open-keychain
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java54
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java124
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java28
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java2
7 files changed, 93 insertions, 131 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
index 47265c3aa..0a49cb629 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
@@ -46,6 +46,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
private String mExtraData;
private String mQuery;
private String mOrigin;
+ private Integer mHashCode = null;
private boolean mSelected;
@@ -98,6 +99,13 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
}
};
+ public int hashCode() {
+ if (mHashCode != null) {
+ return mHashCode;
+ }
+ return super.hashCode();
+ }
+
public String getKeyIdHex() {
return mKeyIdHex;
}
@@ -240,6 +248,8 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
mSecretKey = ring.isSecret();
UncachedPublicKey key = ring.getPublicKey();
+ mHashCode = key.hashCode();
+
mPrimaryUserId = key.getPrimaryUserId();
mUserIds = key.getUnorderedUserIds();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java
index fdf561aaf..066c51a13 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java
@@ -27,7 +27,9 @@ public class ParcelableKeyRing implements Parcelable {
public static final Creator<ParcelableKeyRing> CREATOR = new Creator<ParcelableKeyRing>() {
public ParcelableKeyRing createFromParcel(final Parcel source) {
- return new ParcelableKeyRing(source.createByteArray());
+ byte[] bytes = source.createByteArray();
+ String expectedFingerprint = source.readString();
+ return new ParcelableKeyRing(bytes, expectedFingerprint);
}
public ParcelableKeyRing[] newArray(final int size) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
index c590200ee..9b3e5bc54 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java
@@ -481,58 +481,4 @@ public class PgpKeyOperation {
}
-
- /**
- * Certify the given pubkeyid with the given masterkeyid.
- *
- * @param certificationKey Certifying key
- * @param publicKey public key to certify
- * @param userIds User IDs to certify, must not be null or empty
- * @param passphrase Passphrase of the secret key
- * @return A keyring with added certifications
- */
- public PGPPublicKey certifyKey(PGPSecretKey certificationKey, PGPPublicKey publicKey,
- List<String> userIds, String passphrase)
- throws PgpGeneralMsgIdException, NoSuchAlgorithmException, NoSuchProviderException,
- PGPException, SignatureException {
-
- // create a signatureGenerator from the supplied masterKeyId and passphrase
- PGPSignatureGenerator signatureGenerator;
- {
-
- if (certificationKey == null) {
- throw new PgpGeneralMsgIdException(R.string.error_no_signature_key);
- }
-
- PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider(
- Constants.BOUNCY_CASTLE_PROVIDER_NAME).build(passphrase.toCharArray());
- PGPPrivateKey signaturePrivateKey = certificationKey.extractPrivateKey(keyDecryptor);
- if (signaturePrivateKey == null) {
- throw new PgpGeneralMsgIdException(R.string.error_could_not_extract_private_key);
- }
-
- // TODO: SHA256 fixed?
- JcaPGPContentSignerBuilder contentSignerBuilder = new JcaPGPContentSignerBuilder(
- certificationKey.getPublicKey().getAlgorithm(), PGPUtil.SHA256)
- .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
-
- signatureGenerator = new PGPSignatureGenerator(contentSignerBuilder);
- signatureGenerator.init(PGPSignature.DEFAULT_CERTIFICATION, signaturePrivateKey);
- }
-
- { // supply signatureGenerator with a SubpacketVector
- PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();
- PGPSignatureSubpacketVector packetVector = spGen.generate();
- signatureGenerator.setHashedSubpackets(packetVector);
- }
-
- // fetch public key ring, add the certification and return it
- for (String userId : new IterableIterator<String>(userIds.iterator())) {
- PGPSignature sig = signatureGenerator.generateCertification(userId, publicKey);
- publicKey = PGPPublicKey.addCertification(publicKey, userId, sig);
- }
-
- return publicKey;
- }
-
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
index 0db570be9..f4e19d21a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java
@@ -498,13 +498,12 @@ public class ProviderHelper {
}
}
- mIndent -= 1;
-
} catch (IOException e) {
log(LogLevel.ERROR, LogType.MSG_IP_FAIL_IO_EXC);
Log.e(Constants.TAG, "IOException during import", e);
- mIndent -= 1;
return SaveKeyringResult.RESULT_ERROR;
+ } finally {
+ mIndent -= 1;
}
try {
@@ -523,19 +522,16 @@ public class ProviderHelper {
mContentResolver.applyBatch(KeychainContract.CONTENT_AUTHORITY, operations);
log(LogLevel.OK, LogType.MSG_IP_SUCCESS);
- mIndent -= 1;
progress.setProgress(LogType.MSG_IP_SUCCESS.getMsgId(), 90, 100);
return result;
} catch (RemoteException e) {
log(LogLevel.ERROR, LogType.MSG_IP_FAIL_REMOTE_EX);
Log.e(Constants.TAG, "RemoteException during import", e);
- mIndent -= 1;
return SaveKeyringResult.RESULT_ERROR;
} catch (OperationApplicationException e) {
log(LogLevel.ERROR, LogType.MSG_IP_FAIL_OP_EXC);
Log.e(Constants.TAG, "OperationApplicationException during import", e);
- mIndent -= 1;
return SaveKeyringResult.RESULT_ERROR;
}
@@ -581,75 +577,80 @@ public class ProviderHelper {
log(LogLevel.START, LogType.MSG_IS,
new String[]{ PgpKeyHelper.convertKeyIdToHex(masterKeyId) });
mIndent += 1;
+ try {
- // Canonicalize this key, to assert a number of assumptions made about it.
- keyRing = keyRing.canonicalize(mLog, mIndent);
- if (keyRing == null) {
- return SaveKeyringResult.RESULT_ERROR;
- }
+ // Canonicalize this key, to assert a number of assumptions made about it.
+ keyRing = keyRing.canonicalize(mLog, mIndent);
+ if (keyRing == null) {
+ return SaveKeyringResult.RESULT_ERROR;
+ }
- // IF this is successful, it's a secret key
- int result = SaveKeyringResult.SAVED_SECRET;
+ // IF this is successful, it's a secret key
+ int result = SaveKeyringResult.SAVED_SECRET;
- // save secret keyring
- try {
- ContentValues values = new ContentValues();
- values.put(KeyRingData.MASTER_KEY_ID, masterKeyId);
- values.put(KeyRingData.KEY_RING_DATA, keyRing.getEncoded());
- // insert new version of this keyRing
- Uri uri = KeyRingData.buildSecretKeyRingUri(Long.toString(masterKeyId));
- if (mContentResolver.insert(uri, values) == null) {
- log(LogLevel.ERROR, LogType.MSG_IS_DB_EXCEPTION);
+ // save secret keyring
+ try {
+ ContentValues values = new ContentValues();
+ values.put(KeyRingData.MASTER_KEY_ID, masterKeyId);
+ values.put(KeyRingData.KEY_RING_DATA, keyRing.getEncoded());
+ // insert new version of this keyRing
+ Uri uri = KeyRingData.buildSecretKeyRingUri(Long.toString(masterKeyId));
+ if (mContentResolver.insert(uri, values) == null) {
+ log(LogLevel.ERROR, LogType.MSG_IS_DB_EXCEPTION);
+ return SaveKeyringResult.RESULT_ERROR;
+ }
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "Failed to encode key!", e);
+ log(LogLevel.ERROR, LogType.MSG_IS_FAIL_IO_EXC);
return SaveKeyringResult.RESULT_ERROR;
}
- } catch (IOException e) {
- Log.e(Constants.TAG, "Failed to encode key!", e);
- log(LogLevel.ERROR, LogType.MSG_IS_FAIL_IO_EXC);
- return SaveKeyringResult.RESULT_ERROR;
- }
- {
- Uri uri = Keys.buildKeysUri(Long.toString(masterKeyId));
+ {
+ Uri uri = Keys.buildKeysUri(Long.toString(masterKeyId));
- // first, mark all keys as not available
- ContentValues values = new ContentValues();
- values.put(Keys.HAS_SECRET, 0);
- mContentResolver.update(uri, values, null, null);
+ // first, mark all keys as not available
+ ContentValues values = new ContentValues();
+ values.put(Keys.HAS_SECRET, 0);
+ mContentResolver.update(uri, values, null, null);
- values.put(Keys.HAS_SECRET, 1);
- // then, mark exactly the keys we have available
- log(LogLevel.INFO, LogType.MSG_IS_IMPORTING_SUBKEYS);
- mIndent += 1;
- Set<Long> available = keyRing.getAvailableSubkeys();
- for (UncachedPublicKey sub :
- new IterableIterator<UncachedPublicKey>(keyRing.getPublicKeys())) {
- long id = sub.getKeyId();
- if(available.contains(id)) {
- int upd = mContentResolver.update(uri, values, Keys.KEY_ID + " = ?",
- new String[] { Long.toString(id) });
- if (upd == 1) {
- log(LogLevel.DEBUG, LogType.MSG_IS_SUBKEY_OK, new String[]{
- PgpKeyHelper.convertKeyIdToHex(id)
- });
+ values.put(Keys.HAS_SECRET, 1);
+ // then, mark exactly the keys we have available
+ log(LogLevel.INFO, LogType.MSG_IS_IMPORTING_SUBKEYS);
+ mIndent += 1;
+ Set<Long> available = keyRing.getAvailableSubkeys();
+ for (UncachedPublicKey sub :
+ new IterableIterator<UncachedPublicKey>(keyRing.getPublicKeys())) {
+ long id = sub.getKeyId();
+ if (available.contains(id)) {
+ int upd = mContentResolver.update(uri, values, Keys.KEY_ID + " = ?",
+ new String[]{Long.toString(id)});
+ if (upd == 1) {
+ log(LogLevel.DEBUG, LogType.MSG_IS_SUBKEY_OK, new String[]{
+ PgpKeyHelper.convertKeyIdToHex(id)
+ });
+ } else {
+ log(LogLevel.WARN, LogType.MSG_IS_SUBKEY_NONEXISTENT, new String[]{
+ PgpKeyHelper.convertKeyIdToHex(id)
+ });
+ }
} else {
- log(LogLevel.WARN, LogType.MSG_IS_SUBKEY_NONEXISTENT, new String[]{
+ log(LogLevel.INFO, LogType.MSG_IS_SUBKEY_STRIPPED, new String[]{
PgpKeyHelper.convertKeyIdToHex(id)
});
}
- } else {
- log(LogLevel.INFO, LogType.MSG_IS_SUBKEY_STRIPPED, new String[]{
- PgpKeyHelper.convertKeyIdToHex(id)
- });
}
+ mIndent -= 1;
+
+ // this implicitly leaves all keys which were not in the secret key ring
+ // with has_secret = 0
}
- mIndent -= 1;
- // this implicitly leaves all keys which were not in the secret key ring
- // with has_secret = 0
- }
+ log(LogLevel.OK, LogType.MSG_IS_SUCCESS);
+ return result;
- log(LogLevel.OK, LogType.MSG_IS_SUCCESS);
- return result;
+ } finally {
+ mIndent -= 1;
+ }
}
@@ -738,12 +739,13 @@ public class ProviderHelper {
}
}
- mIndent -= 1;
return new SaveKeyringResult(result, mLog);
} catch (IOException e) {
log(LogLevel.ERROR, LogType.MSG_IP_FAIL_IO_EXC);
return new SaveKeyringResult(SaveKeyringResult.RESULT_ERROR, mLog);
+ } finally {
+ mIndent -= 1;
}
}
@@ -833,6 +835,8 @@ public class ProviderHelper {
} catch (IOException e) {
log(LogLevel.ERROR, LogType.MSG_IS_FAIL_IO_EXC, null);
return new SaveKeyringResult(SaveKeyringResult.RESULT_ERROR, mLog);
+ } finally {
+ mIndent -= 1;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
index c68b7c189..47a6cab1d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java
@@ -4,7 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
-import java.util.HashMap;
+import java.util.ArrayList;
/** This class is a a transferable representation for a collection of changes
* to be done on a keyring.
@@ -29,14 +29,14 @@ public class SaveKeyringParcel implements Parcelable {
public String newPassphrase;
- public String[] addUserIds;
- public SubkeyAdd[] addSubKeys;
+ public ArrayList<String> addUserIds;
+ public ArrayList<SubkeyAdd> addSubKeys;
- public SubkeyChange[] changeSubKeys;
+ public ArrayList<SubkeyChange> changeSubKeys;
public String changePrimaryUserId;
- public String[] revokeUserIds;
- public long[] revokeSubKeys;
+ public ArrayList<String> revokeUserIds;
+ public ArrayList<Long> revokeSubKeys;
public SaveKeyringParcel(long masterKeyId, byte[] fingerprint) {
mMasterKeyId = masterKeyId;
@@ -73,14 +73,14 @@ public class SaveKeyringParcel implements Parcelable {
mMasterKeyId = source.readLong();
mFingerprint = source.createByteArray();
- addUserIds = source.createStringArray();
- addSubKeys = (SubkeyAdd[]) source.readSerializable();
+ addUserIds = source.createStringArrayList();
+ addSubKeys = (ArrayList<SubkeyAdd>) source.readSerializable();
- changeSubKeys = (SubkeyChange[]) source.readSerializable();
+ changeSubKeys = (ArrayList<SubkeyChange>) source.readSerializable();
changePrimaryUserId = source.readString();
- revokeUserIds = source.createStringArray();
- revokeSubKeys = source.createLongArray();
+ revokeUserIds = source.createStringArrayList();
+ revokeSubKeys = (ArrayList<Long>) source.readSerializable();
}
@Override
@@ -88,14 +88,14 @@ public class SaveKeyringParcel implements Parcelable {
destination.writeLong(mMasterKeyId);
destination.writeByteArray(mFingerprint);
- destination.writeStringArray(addUserIds);
+ destination.writeStringList(addUserIds);
destination.writeSerializable(addSubKeys);
destination.writeSerializable(changeSubKeys);
destination.writeString(changePrimaryUserId);
- destination.writeStringArray(revokeUserIds);
- destination.writeLongArray(revokeSubKeys);
+ destination.writeStringList(revokeUserIds);
+ destination.writeSerializable(revokeSubKeys);
}
public static final Creator<SaveKeyringParcel> CREATOR = new Creator<SaveKeyringParcel>() {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
index d77e3a452..84fd513a0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -79,7 +79,7 @@ public class ImportKeysListFragment extends ListFragment implements
public ArrayList<ParcelableKeyRing> getSelectedData() {
ArrayList<ParcelableKeyRing> result = new ArrayList<ParcelableKeyRing>();
for (ImportKeysListEntry entry : getSelectedEntries()) {
- result.add(mCachedKeyData.get(entry.getKeyId()));
+ result.add(mCachedKeyData.get(entry.hashCode()));
}
return result;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
index c2712e89e..99f959035 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
@@ -138,7 +138,7 @@ public class ImportKeysListLoader
for(UncachedKeyRing key : rings) {
ImportKeysListEntry item = new ImportKeysListEntry(getContext(), key);
mData.add(item);
- mParcelableRings.put(key.getMasterKeyId(), new ParcelableKeyRing(key.getEncoded()));
+ mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(key.getEncoded()));
isEmpty = false;
}
}