use byte[] for expected fingerprint

This commit is contained in:
Vincent Breitmoser
2017-05-20 21:21:45 +02:00
parent 0699d3cdb5
commit add9bf8973
15 changed files with 63 additions and 55 deletions

View File

@@ -30,6 +30,7 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
@@ -56,7 +57,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
private boolean mUpdated;
private Date mDate;
private String mFingerprintHex;
private byte[] mFingerprint;
private Integer mBitStrength;
private String mCurveOid;
private String mAlgorithm;
@@ -78,10 +79,10 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
}
public boolean hasSameKeyAs(ImportKeysListEntry other) {
if (mFingerprintHex == null || other == null) {
if (mFingerprint == null || other == null || other.mFingerprint == null) {
return false;
}
return mFingerprintHex.equals(other.mFingerprintHex);
return Arrays.equals(mFingerprint, other.mFingerprint);
}
public String getKeyIdHex() {
@@ -140,16 +141,12 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
mDate = date;
}
public String getFingerprintHex() {
return mFingerprintHex;
}
public void setFingerprintHex(String fingerprintHex) {
mFingerprintHex = fingerprintHex;
}
public void setFingerprint(byte[] fingerprint) {
mFingerprintHex = KeyFormattingUtils.convertFingerprintToHex(fingerprint);
mFingerprint = fingerprint;
}
public byte[] getFingerprint() {
return mFingerprint;
}
public Integer getBitStrength() {
@@ -371,7 +368,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
if (mDate != null) {
dest.writeLong(mDate.getTime());
}
dest.writeString(mFingerprintHex);
dest.writeByteArray(mFingerprint);
dest.writeString(mKeyIdHex);
dest.writeInt(mBitStrength == null ? 0 : 1);
if (mBitStrength != null) {
@@ -397,7 +394,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
vr.mExpired = source.readByte() == 1;
vr.mUpdated = source.readByte() == 1;
vr.mDate = source.readInt() != 0 ? new Date(source.readLong()) : null;
vr.mFingerprintHex = source.readString();
vr.mFingerprint = source.createByteArray();
vr.mKeyIdHex = source.readString();
vr.mBitStrength = source.readInt() != 0 ? source.readInt() : null;
vr.mAlgorithm = source.readString();

View File

@@ -76,7 +76,7 @@ public class KeybaseKeyserver extends Keyserver {
String username = match.getUsername();
String fullName = match.getFullName();
String fingerprint = match.getFingerprint();
entry.setFingerprintHex(fingerprint);
entry.setFingerprint(KeyFormattingUtils.convertFingerprintHexFingerprint(fingerprint));
entry.setKeyIdHex("0x" + match.getKeyID());
// so we can query for the keybase id directly, and to identify the location from which the

View File

@@ -301,7 +301,8 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
// see https://bitbucket.org/skskeyserver/sks-keyserver/pull-request/12/fixes-for-machine-readable-indexes/diff
String fingerprintOrKeyId = matcher.group(1).toLowerCase(Locale.ENGLISH);
if (fingerprintOrKeyId.length() == 40) {
entry.setFingerprintHex(fingerprintOrKeyId);
byte[] fingerprint = KeyFormattingUtils.convertFingerprintHexFingerprint(fingerprintOrKeyId);
entry.setFingerprint(fingerprint);
entry.setKeyIdHex("0x" + fingerprintOrKeyId.substring(fingerprintOrKeyId.length()
- 16, fingerprintOrKeyId.length()));
} else if (fingerprintOrKeyId.length() == 16) {

View File

@@ -30,7 +30,7 @@ public class ParcelableKeyRing implements Parcelable {
public final byte[] mBytes;
// dual role!
public final String mExpectedFingerprint;
public final byte[] mExpectedFingerprint;
public final String mKeyIdHex;
public final String mKeybaseName;
public final String mFbUsername;
@@ -39,13 +39,13 @@ public class ParcelableKeyRing implements Parcelable {
this(bytes, null, null, null, null);
}
public ParcelableKeyRing(String expectedFingerprint, String keyIdHex, String keybaseName,
String fbUsername) {
public ParcelableKeyRing(byte[] expectedFingerprint, String keyIdHex, String keybaseName,
String fbUsername) {
this(null, expectedFingerprint, keyIdHex, keybaseName, fbUsername);
}
public ParcelableKeyRing(byte[] bytes, String expectedFingerprint, String keyIdHex,
public ParcelableKeyRing(byte[] bytes, byte[] expectedFingerprint, String keyIdHex,
String keybaseName, String fbUsername) {
this.mBytes = bytes;
@@ -58,7 +58,7 @@ public class ParcelableKeyRing implements Parcelable {
private ParcelableKeyRing(Parcel source) {
mBytes = source.createByteArray();
mExpectedFingerprint = source.readString();
mExpectedFingerprint = source.createByteArray();
mKeyIdHex = source.readString();
mKeybaseName = source.readString();
mFbUsername = source.readString();
@@ -67,7 +67,7 @@ public class ParcelableKeyRing implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeByteArray(mBytes);
dest.writeString(mExpectedFingerprint);
dest.writeByteArray(mExpectedFingerprint);
dest.writeString(mKeyIdHex);
dest.writeString(mKeybaseName);
dest.writeString(mFbUsername);

View File

@@ -30,6 +30,7 @@ import org.sufficientlysecure.keychain.operations.results.GetKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ParcelableProxy;
import org.sufficientlysecure.keychain.util.Preferences;
@@ -83,7 +84,7 @@ public class ImportKeysListCloudLoader
// Now we have all the data needed to build the parcelable key ring for this key
for (ImportKeysListEntry e : mEntryList) {
e.setParcelableKeyRing(new ParcelableKeyRing(e.getFingerprintHex(), e.getKeyIdHex(),
e.setParcelableKeyRing(new ParcelableKeyRing(e.getFingerprint(), e.getKeyIdHex(),
e.getKeybaseName(), e.getFbUsername()));
}
@@ -146,16 +147,19 @@ public class ImportKeysListCloudLoader
mEntryList.clear();
// add result to data
if (enforceFingerprint) {
String fingerprint = mState.mServerQuery.substring(2);
Log.d(Constants.TAG, "fingerprint: " + fingerprint);
String fingerprintHex = mState.mServerQuery.substring(2);
Log.d(Constants.TAG, "fingerprint: " + fingerprintHex);
// query must return only one result!
if (searchResult.size() == 1) {
if (fingerprintHex.length() != 40) {
throw new IllegalArgumentException("Bad format!");
}
ImportKeysListEntry uniqueEntry = searchResult.get(0);
/*
* set fingerprint explicitly after query
* to enforce a check when the key is imported by KeychainService
*/
uniqueEntry.setFingerprintHex(fingerprint);
uniqueEntry.setFingerprint(KeyFormattingUtils.convertFingerprintHexFingerprint(fingerprintHex));
mEntryList.add(uniqueEntry);
}
} else {

View File

@@ -58,6 +58,7 @@ import org.sufficientlysecure.keychain.service.ContactSyncAdapterService;
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.service.input.CryptoInputParcel;
import org.sufficientlysecure.keychain.service.input.RequiredInputParcel;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.IteratorWithSize;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ParcelableFileCache;
@@ -340,9 +341,10 @@ public class ImportOperation extends BaseReadWriteOperation<ImportKeyringParcel>
// Download by fingerprint, or keyId - whichever is available
if (entry.mExpectedFingerprint != null) {
String fingerprintHex = KeyFormattingUtils.convertFingerprintToHex(entry.mExpectedFingerprint);
log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, "0x" +
entry.mExpectedFingerprint.substring(24));
data = hkpKeyserver.get("0x" + entry.mExpectedFingerprint, proxy).getBytes();
fingerprintHex.substring(24));
data = hkpKeyserver.get("0x" + fingerprintHex, proxy).getBytes();
} else {
log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, entry.mKeyIdHex);
data = hkpKeyserver.get(entry.mKeyIdHex, proxy).getBytes();

View File

@@ -18,19 +18,20 @@
package org.sufficientlysecure.keychain.pgp;
import org.bouncycastle.openpgp.PGPKeyRing;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.IterableIterator;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.bouncycastle.openpgp.PGPKeyRing;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.util.IterableIterator;
/**
* A generic wrapped PGPKeyRing object.
@@ -168,14 +169,13 @@ public abstract class CanonicalizedKeyRing extends KeyRing {
}
/// Returns true iff the keyring contains a primary key or mutually bound subkey with the expected fingerprint
public boolean containsBoundSubkey(String expectedFingerprint) {
public boolean containsBoundSubkey(byte[] expectedFingerprint) {
for (CanonicalizedPublicKey key : publicKeyIterator()) {
boolean isMasterOrMutuallyBound = key.isMasterKey() || key.canSign();
if (!isMasterOrMutuallyBound) {
continue;
}
if (KeyFormattingUtils.convertFingerprintToHex(
key.getFingerprint()).equalsIgnoreCase(expectedFingerprint)) {
if (Arrays.equals(key.getFingerprint(), expectedFingerprint)) {
return true;
}
}

View File

@@ -747,7 +747,7 @@ public class KeyWritableRepository extends KeyRepository {
* If you want to merge keys in-memory only and not save in database set skipSave=true.
*/
public SaveKeyringResult savePublicKeyRing(UncachedKeyRing publicRing,
String expectedFingerprint,
byte[] expectedFingerprint,
ArrayList<CanonicalizedKeyRing> canKeyRings,
boolean skipSave) {
@@ -869,7 +869,7 @@ public class KeyWritableRepository extends KeyRepository {
}
}
public SaveKeyringResult savePublicKeyRing(UncachedKeyRing publicRing, String expectedFingerprint) {
public SaveKeyringResult savePublicKeyRing(UncachedKeyRing publicRing, byte[] expectedFingerprint) {
return savePublicKeyRing(publicRing, expectedFingerprint, null, false);
}

View File

@@ -462,10 +462,8 @@ public class KeyserverSyncAdapterService extends Service {
continue;
}
Log.d(Constants.TAG, "Keyserver sync: Updating {" + keyId + "}");
String fingerprint = KeyFormattingUtils
.convertFingerprintToHex(keyCursor.getBlob(INDEX_FINGERPRINT));
String hexKeyId = KeyFormattingUtils
.convertKeyIdToHex(keyId);
byte[] fingerprint = keyCursor.getBlob(INDEX_FINGERPRINT);
String hexKeyId = KeyFormattingUtils.convertKeyIdToHex(keyId);
// we aren't updating from keybase as of now
keyList.add(new ParcelableKeyRing(fingerprint, hexKeyId, null, null));
}

View File

@@ -69,7 +69,7 @@ public class CreateSecurityTokenImportResetFragment
private byte[] mTokenAid;
private double mTokenVersion;
private String mTokenUserId;
private String mTokenFingerprint;
private byte[] mTokenFingerprint;
private TextView vSerNo;
private TextView vUserId;
private TextView mNextButton;
@@ -107,7 +107,7 @@ public class CreateSecurityTokenImportResetFragment
byte[] fp = new byte[20];
ByteBuffer.wrap(fp).put(mTokenFingerprints, 0, 20);
mTokenFingerprint = KeyFormattingUtils.convertFingerprintToHex(fp);
mTokenFingerprint = fp;
}
@@ -261,7 +261,7 @@ public class CreateSecurityTokenImportResetFragment
byte[] fp = new byte[20];
ByteBuffer.wrap(fp).put(mTokenFingerprints, 0, 20);
mTokenFingerprint = KeyFormattingUtils.convertFingerprintToHex(fp);
mTokenFingerprint = fp;
}
@Override

View File

@@ -40,6 +40,7 @@ import org.sufficientlysecure.keychain.operations.results.OperationResult.LogTyp
import org.sufficientlysecure.keychain.operations.results.SingletonResult;
import org.sufficientlysecure.keychain.service.ImportKeyringParcel;
import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.IntentIntegratorSupportV4;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.keyimport.ParcelableHkpKeyserver;
@@ -152,8 +153,8 @@ public class ImportKeysProxyActivity extends FragmentActivity
returnResult(intent);
return;
}
final String fingerprint = uri.getEncodedSchemeSpecificPart().toLowerCase(Locale.ENGLISH);
if (!fingerprint.matches("[a-fA-F0-9]{40}")) {
final String fingerprintHex = uri.getEncodedSchemeSpecificPart().toLowerCase(Locale.ENGLISH);
if (!fingerprintHex.matches("[a-fA-F0-9]{40}")) {
SingletonResult result = new SingletonResult(
SingletonResult.RESULT_ERROR, LogType.MSG_WRONG_QR_CODE_FP);
Intent intent = new Intent();
@@ -161,6 +162,7 @@ public class ImportKeysProxyActivity extends FragmentActivity
returnResult(intent);
return;
}
byte[] fingerprint = KeyFormattingUtils.convertFingerprintHexFingerprint(fingerprintHex);
if (ACTION_SCAN_WITH_RESULT.equals(action)) {
Intent result = new Intent();
@@ -168,7 +170,7 @@ public class ImportKeysProxyActivity extends FragmentActivity
setResult(RESULT_OK, result);
finish();
} else {
importKeys(fingerprint);
importKeysFromFingerprint(fingerprint);
}
}
@@ -196,7 +198,7 @@ public class ImportKeysProxyActivity extends FragmentActivity
startImportService(selectedEntries);
}
public void importKeys(String fingerprint) {
public void importKeysFromFingerprint(byte[] fingerprint) {
ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null, null);
ArrayList<ParcelableKeyRing> selectedEntries = new ArrayList<>();
selectedEntries.add(keyEntry);

View File

@@ -502,8 +502,7 @@ public class KeyListFragment extends RecyclerFragment<KeySectionedListAdapter>
ArrayList<ParcelableKeyRing> keyList = new ArrayList<>();
try {
while (cursor.moveToNext()) {
byte[] blob = cursor.getBlob(0); //fingerprint column is 0
String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob);
byte[] fingerprint = cursor.getBlob(0); //fingerprint column is 0
ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null, null);
keyList.add(keyEntry);
}

View File

@@ -1148,9 +1148,8 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements
mRefresh.startAnimation(mRotate);
byte[] blob = keyRepository.getCachedPublicKeyRing(dataUri).getFingerprint();
String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob);
ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null, null);
ParcelableKeyRing keyEntry = new ParcelableKeyRing(blob, null, null, null);
ArrayList<ParcelableKeyRing> entries = new ArrayList<>();
entries.add(keyEntry);
mKeyList = entries;

View File

@@ -330,6 +330,13 @@ public class KeyFormattingUtils {
return hexString;
}
public static byte[] convertFingerprintHexFingerprint(String fingerprintHex) {
if (fingerprintHex.length() != 40) {
throw new IllegalArgumentException("fingerprint must be 40 chars long!");
}
return Hex.decode(fingerprintHex);
}
public static long convertKeyIdHexToKeyId(String hex) {
return new BigInteger(hex.substring(2), 16).longValue();
}

View File

@@ -57,8 +57,7 @@ public class EmailKeyHelper {
// Put them in a list and import
ArrayList<ParcelableKeyRing> keys = new ArrayList<>(entries.size());
for (ImportKeysListEntry entry : entries) {
keys.add(new ParcelableKeyRing(entry.getFingerprintHex(), entry.getKeyIdHex(), null,
null));
keys.add(new ParcelableKeyRing(entry.getFingerprint(), entry.getKeyIdHex(), null, null));
}
mKeyList = keys;
mKeyserver = keyserver;