aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java10
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java86
2 files changed, 54 insertions, 42 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java
index 4c7d1dfbd..f8d79d33b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiKeyImportFragment.java
@@ -193,13 +193,19 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe
ImportKeyResult result =
returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
- if (!result.success()) {
+ long[] masterKeyIds = result.getImportedMasterKeyIds();
+
+ // TODO handle masterKeyIds.length != 1...? sorta outlandish scenario
+
+ if (!result.success() || masterKeyIds.length == 0) {
result.createNotify(getActivity()).show();
return;
}
Intent intent = new Intent(getActivity(), ViewKeyActivity.class);
- intent.setData(KeyRings.buildGenericKeyRingUri(mNfcMasterKeyId));
+ // use the imported masterKeyId, not the one from the yubikey, because
+ // that one might* just have been a subkey of the imported key
+ intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyIds[0]));
intent.putExtra(ViewKeyActivity.EXTRA_DISPLAY_RESULT, result);
intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid);
intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index 302236570..7ae4f1be3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -546,49 +546,54 @@ public class ViewKeyActivity extends BaseNfcActivity implements
final String nfcUserId = nfcGetUserId();
final byte[] nfcAid = nfcGetAid();
- String fp = KeyFormattingUtils.convertFingerprintToHex(nfcFingerprints);
- final long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(nfcFingerprints);
-
- if (!mFingerprint.equals(fp)) {
- try {
- CachedPublicKeyRing ring = mProviderHelper.getCachedPublicKeyRing(masterKeyId);
- ring.getMasterKeyId();
-
- Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG,
- Style.WARN, new ActionListener() {
- @Override
- public void onAction() {
- Intent intent = new Intent(
- ViewKeyActivity.this, ViewKeyActivity.class);
- intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId));
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, nfcAid);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, nfcUserId);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, nfcFingerprints);
- startActivity(intent);
- finish();
- }
- }, R.string.snack_yubikey_view).show();
- return;
+ long yubiKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(nfcFingerprints);
- } catch (PgpKeyNotFoundException e) {
- Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG,
- Style.WARN, new ActionListener() {
- @Override
- public void onAction() {
- Intent intent = new Intent(
- ViewKeyActivity.this, CreateKeyActivity.class);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, nfcAid);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, nfcUserId);
- intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, nfcFingerprints);
- startActivity(intent);
- finish();
- }
- }, R.string.snack_yubikey_import).show();
+ try {
+
+ // if the yubikey matches a subkey in any key
+ CachedPublicKeyRing ring = mProviderHelper.getCachedPublicKeyRing(
+ KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(yubiKeyId));
+ byte[] candidateFp = ring.getFingerprint();
+
+ // if the master key of that key matches this one, just show the yubikey dialog
+ if (KeyFormattingUtils.convertFingerprintToHex(candidateFp).equals(mFingerprint)) {
+ showYubiKeyFragment(nfcFingerprints, nfcUserId, nfcAid);
return;
}
- }
- showYubiKeyFragment(nfcFingerprints, nfcUserId, nfcAid);
+ // otherwise, offer to go to that key
+ final long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(candidateFp);
+ Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG,
+ Style.WARN, new ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intent = new Intent(
+ ViewKeyActivity.this, ViewKeyActivity.class);
+ intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId));
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, nfcAid);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, nfcUserId);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, nfcFingerprints);
+ startActivity(intent);
+ finish();
+ }
+ }, R.string.snack_yubikey_view).show();
+
+ // and if it's not found, offer import
+ } catch (PgpKeyNotFoundException e) {
+ Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG,
+ Style.WARN, new ActionListener() {
+ @Override
+ public void onAction() {
+ Intent intent = new Intent(
+ ViewKeyActivity.this, CreateKeyActivity.class);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, nfcAid);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, nfcUserId);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, nfcFingerprints);
+ startActivity(intent);
+ finish();
+ }
+ }, R.string.snack_yubikey_import).show();
+ }
}
@@ -820,7 +825,8 @@ public class ViewKeyActivity extends BaseNfcActivity implements
}
mMasterKeyId = data.getLong(INDEX_MASTER_KEY_ID);
- mFingerprint = KeyFormattingUtils.convertFingerprintToHex(data.getBlob(INDEX_FINGERPRINT));
+ mFingerprint = KeyFormattingUtils.convertFingerprintToHex(
+ data.getBlob(INDEX_FINGERPRINT));
mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
mHasEncrypt = data.getInt(INDEX_HAS_ENCRYPT) != 0;