fixes for extractPublicKeyRing, update SpongyCastle

This commit is contained in:
Vincent Breitmoser 2014-07-26 03:56:28 +02:00
parent a1c163e993
commit 7fe1b00080
3 changed files with 19 additions and 16 deletions

View File

@ -14,6 +14,7 @@ import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.spongycastle.openpgp.PGPSignature; import org.spongycastle.openpgp.PGPSignature;
import org.spongycastle.openpgp.PGPSignatureList; import org.spongycastle.openpgp.PGPSignatureList;
import org.spongycastle.openpgp.PGPUtil; import org.spongycastle.openpgp.PGPUtil;
import org.spongycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog; import org.sufficientlysecure.keychain.service.OperationResultParcel.OperationLog;
@ -24,6 +25,7 @@ import org.sufficientlysecure.keychain.util.Log;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -193,7 +195,7 @@ public class UncachedKeyRing {
* - Remove all certificates flagged as "local" * - Remove all certificates flagged as "local"
* - Remove all certificates which are superseded by a newer one on the same target, * - Remove all certificates which are superseded by a newer one on the same target,
* including revocations with later re-certifications. * including revocations with later re-certifications.
* - Remove all certificates of unknown type: * - Remove all certificates in other positions if not of known type:
* - key revocation signatures on the master key * - key revocation signatures on the master key
* - subkey binding signatures for subkeys * - subkey binding signatures for subkeys
* - certifications and certification revocations for user ids * - certifications and certification revocations for user ids
@ -658,7 +660,7 @@ public class UncachedKeyRing {
return left.length - right.length; return left.length - right.length;
} }
// compare byte-by-byte // compare byte-by-byte
for (int i = 0; i < left.length && i < right.length; i++) { for (int i = 0; i < left.length; i++) {
if (left[i] != right[i]) { if (left[i] != right[i]) {
return (left[i] & 0xff) - (right[i] & 0xff); return (left[i] & 0xff) - (right[i] & 0xff);
} }
@ -768,19 +770,20 @@ public class UncachedKeyRing {
} }
public UncachedKeyRing extractPublicKeyRing() { public UncachedKeyRing extractPublicKeyRing() throws IOException {
if(!isSecret()) { if(!isSecret()) {
throw new RuntimeException("Tried to extract public keyring from non-secret keyring. " + throw new RuntimeException("Tried to extract public keyring from non-secret keyring. " +
"This is a programming error and should never happen!"); "This is a programming error and should never happen!");
} }
ArrayList<PGPPublicKey> keys = new ArrayList();
Iterator<PGPPublicKey> it = mRing.getPublicKeys(); Iterator<PGPPublicKey> it = mRing.getPublicKeys();
ByteArrayOutputStream stream = new ByteArrayOutputStream(2048);
while (it.hasNext()) { while (it.hasNext()) {
keys.add(it.next()); stream.write(it.next().getEncoded());
} }
return new UncachedKeyRing(new PGPPublicKeyRing(keys)); return new UncachedKeyRing(
new PGPPublicKeyRing(stream.toByteArray(), new JcaKeyFingerprintCalculator()));
} }
/** This method replaces a public key in a keyring. /** This method replaces a public key in a keyring.

View File

@ -1,14 +1,11 @@
package org.sufficientlysecure.keychain.pgp; package org.sufficientlysecure.keychain.pgp;
import org.spongycastle.bcpg.ArmoredOutputStream; import org.spongycastle.bcpg.ArmoredOutputStream;
import org.spongycastle.openpgp.PGPKeyRing;
import org.spongycastle.openpgp.PGPObjectFactory; import org.spongycastle.openpgp.PGPObjectFactory;
import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.util.IterableIterator; import org.sufficientlysecure.keychain.util.IterableIterator;
import org.sufficientlysecure.keychain.util.Log;
import java.io.IOException; import java.io.IOException;
import java.util.Iterator; import java.util.Iterator;
@ -25,17 +22,20 @@ public class WrappedPublicKeyRing extends WrappedKeyRing {
PGPPublicKeyRing getRing() { PGPPublicKeyRing getRing() {
if(mRing == null) { if(mRing == null) {
// get first object in block
PGPObjectFactory factory = new PGPObjectFactory(mPubKey); PGPObjectFactory factory = new PGPObjectFactory(mPubKey);
PGPKeyRing keyRing = null;
try { try {
if ((keyRing = (PGPKeyRing) factory.nextObject()) == null) { Object obj = factory.nextObject();
Log.e(Constants.TAG, "No keys given!"); if (! (obj instanceof PGPPublicKeyRing)) {
throw new RuntimeException("Error constructing WrappedPublicKeyRing, should never happen!");
}
mRing = (PGPPublicKeyRing) obj;
if (factory.nextObject() != null) {
throw new RuntimeException("Encountered trailing data after keyring, should never happen!");
} }
} catch (IOException e) { } catch (IOException e) {
Log.e(Constants.TAG, "Error while converting to PGPKeyRing!", e); throw new RuntimeException("IO Error constructing WrappedPublicKeyRing, should never happen!");
} }
mRing = (PGPPublicKeyRing) keyRing;
} }
return mRing; return mRing;
} }

2
extern/spongycastle vendored

@ -1 +1 @@
Subproject commit c142a844b680652adb751a193a4e4a926a4c080b Subproject commit 41ef8b1f539dd3d8748865d68a34ed307f699eec