use byte[] for expected fingerprint
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user