aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-03-22 02:36:10 +0100
committerVincent Breitmoser <valodim@mugenguild.com>2015-03-22 02:36:10 +0100
commita7c52a1c9f8bca83b2981347a0eceeec68a92790 (patch)
tree3e6275123d12251749f8975a241cb6e64799dd49 /OpenKeychain/src/main/java/org/sufficientlysecure/keychain
parent04c7639a5a9b4f85122b7d5f299ba09131ce3036 (diff)
downloadopen-keychain-a7c52a1c9f8bca83b2981347a0eceeec68a92790.tar.gz
open-keychain-a7c52a1c9f8bca83b2981347a0eceeec68a92790.tar.bz2
open-keychain-a7c52a1c9f8bca83b2981347a0eceeec68a92790.zip
move yubikey import into viewkeyfragment
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java34
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java149
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java83
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java129
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java11
6 files changed, 259 insertions, 158 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
index 5c2fcde82..b73d6f545 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
@@ -17,12 +17,21 @@
package org.sufficientlysecure.keychain.ui;
+import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
+import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.util.Passphrase;
import java.io.IOException;
@@ -87,9 +96,28 @@ public class CreateKeyActivity extends BaseNfcActivity {
return;
}
- byte[] scannedFingerprint = nfcGetFingerprint(0);
- Fragment frag = CreateKeyYubiFragment.createInstance(scannedFingerprint);
- loadFragment(frag, FragAction.TO_RIGHT);
+ byte[] scannedFingerprints = nfcGetFingerprints();
+
+ try {
+ long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(scannedFingerprints);
+ CachedPublicKeyRing ring = new ProviderHelper(this).getCachedPublicKeyRing(masterKeyId);
+ ring.getMasterKeyId();
+
+ String userId = nfcGetUserId();
+ byte[] nfcAid = nfcGetAid();
+
+ Intent intent = new Intent(this, ViewKeyActivity.class);
+ intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId));
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, nfcAid);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, userId);
+ intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, scannedFingerprints);
+ startActivity(intent);
+ finish();
+
+ } catch (PgpKeyNotFoundException e) {
+ Fragment frag = CreateKeyYubiFragment.createInstance(scannedFingerprints);
+ loadFragment(frag, FragAction.TO_RIGHT);
+ }
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
index 63549c3d6..a1668d22e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
@@ -17,48 +17,33 @@
package org.sufficientlysecure.keychain.ui;
-import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.Arrays;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
-import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import android.widget.ViewAnimator;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
-import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
-import org.sufficientlysecure.keychain.ui.CreateKeyActivity.NfcListenerFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
-import org.sufficientlysecure.keychain.ui.util.Notify;
-import org.sufficientlysecure.keychain.ui.util.Notify.Style;
-import org.sufficientlysecure.keychain.ui.widget.NameEditText;
import org.sufficientlysecure.keychain.util.Preferences;
-
-public class CreateKeyYubiFragment extends Fragment
- implements LoaderManager.LoaderCallbacks<Cursor> {
+public class CreateKeyYubiFragment extends Fragment {
private static final String ARG_FINGERPRINT = "fingerprint";
@@ -67,12 +52,7 @@ public class CreateKeyYubiFragment extends Fragment
private byte[] mScannedFingerprint;
private long mScannedMasterKeyId;
- private ViewAnimator mAnimator;
private TextView mUnknownFingerprint;
- private TextView mFingerprint;
- private TextView mUserId;
-
- private YubiImportState mState;
public static Fragment createInstance(byte[] scannedFingerprint) {
Bundle args = new Bundle();
@@ -91,26 +71,14 @@ public class CreateKeyYubiFragment extends Fragment
mScannedFingerprint = getArguments().getByteArray(ARG_FINGERPRINT);
mScannedMasterKeyId = getKeyIdFromFingerprint(mScannedFingerprint);
- getLoaderManager().initLoader(0, null, this);
- }
-
- enum YubiImportState {
- UNKNOWN, // scanned unknown key (ready to import)
- BAD_FINGERPRINT, // scanned key, bad fingerprint
- IMPORTED, // imported key (ready to promote)
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.create_yubikey_fragment, container, false);
- mAnimator = (ViewAnimator) view.findViewById(R.id.create_yubikey_animator);
-
mUnknownFingerprint = (TextView) view.findViewById(R.id.create_yubikey_unknown_fp);
- mFingerprint = (TextView) view.findViewById(R.id.create_yubikey_fingerprint);
- mUserId = (TextView) view.findViewById(R.id.create_yubikey_user_id);
-
View mBackButton = view.findViewById(R.id.create_key_back_button);
View mNextButton = view.findViewById(R.id.create_key_next_button);
@@ -136,115 +104,8 @@ public class CreateKeyYubiFragment extends Fragment
mCreateKeyActivity = (CreateKeyActivity) getActivity();
}
- // These are the rows that we will retrieve.
- static final String[] UNIFIED_PROJECTION = new String[]{
- KeychainContract.KeyRings._ID,
- KeychainContract.KeyRings.MASTER_KEY_ID,
- KeychainContract.KeyRings.USER_ID,
- KeychainContract.KeyRings.IS_REVOKED,
- KeychainContract.KeyRings.IS_EXPIRED,
- KeychainContract.KeyRings.HAS_ANY_SECRET,
- KeychainContract.KeyRings.FINGERPRINT,
- };
-
- static final int INDEX_MASTER_KEY_ID = 1;
- static final int INDEX_USER_ID = 2;
- static final int INDEX_IS_REVOKED = 3;
- static final int INDEX_IS_EXPIRED = 4;
- static final int INDEX_HAS_ANY_SECRET = 5;
- static final int INDEX_FINGERPRINT = 6;
-
- @Override
- public Loader<Cursor> onCreateLoader(int id, Bundle args) {
- Uri baseUri = KeychainContract.KeyRings.buildUnifiedKeyRingUri(
- KeyRings.buildUnifiedKeyRingUri(mScannedMasterKeyId)
- );
- return new CursorLoader(getActivity(), baseUri, UNIFIED_PROJECTION, null, null, null);
- }
-
- @Override
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- if (data.moveToFirst()) {
-
- byte[] fingerprint = data.getBlob(INDEX_FINGERPRINT);
- if (!Arrays.equals(fingerprint, mScannedFingerprint)) {
- mState = YubiImportState.BAD_FINGERPRINT;
- Notify.create(getActivity(), "Fingerprint mismatch!", Style.ERROR);
- return;
- }
-
- String userId = data.getString(INDEX_USER_ID);
- boolean hasSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
-
- String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint);
- mFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp));
-
- mUserId.setText(userId);
-
- mAnimator.setDisplayedChild(2);
- mState = YubiImportState.IMPORTED;
-
- } else {
- String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint);
- mUnknownFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp));
-
- mAnimator.setDisplayedChild(1);
- mState = YubiImportState.UNKNOWN;
- }
- }
-
private void nextClicked() {
-
- switch (mState) {
- case UNKNOWN:
- importKey();
- break;
- case IMPORTED:
- promoteKey();
- break;
- }
-
- }
-
- public void promoteKey() {
-
- // Message is received after decrypting is done in KeychainIntentService
- KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity()) {
- public void handleMessage(Message message) {
- // handle messages by standard KeychainIntentServiceHandler first
- super.handleMessage(message);
-
- if (message.arg1 == MessageStatus.OKAY.ordinal()) {
- // get returned data bundle
- Bundle returnData = message.getData();
-
- PromoteKeyResult result =
- returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
-
- result.createNotify(getActivity()).show();
- }
-
- }
- };
-
- // Send all information needed to service to decrypt in other thread
- Intent intent = new Intent(getActivity(), KeychainIntentService.class);
-
- // fill values for this action
-
- intent.setAction(KeychainIntentService.ACTION_PROMOTE_KEYRING);
-
- Bundle data = new Bundle();
- data.putLong(KeychainIntentService.PROMOTE_MASTER_KEY_ID, mScannedMasterKeyId);
- intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-
- // Create a new Messenger for the communication back
- Messenger messenger = new Messenger(saveHandler);
- intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
-
- // start service with intent
- getActivity().startService(intent);
-
+ importKey();
}
public void importKey() {
@@ -299,12 +160,6 @@ public class CreateKeyYubiFragment extends Fragment
}
-
- @Override
- public void onLoaderReset(Loader<Cursor> loader) {
-
- }
-
static long getKeyIdFromFingerprint(byte[] fingerprint) {
ByteBuffer buf = ByteBuffer.wrap(fingerprint);
// skip first 12 bytes of the fingerprint
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 fc30eafcc..159b98e0e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -35,6 +35,7 @@ import android.os.Message;
import android.os.Messenger;
import android.provider.ContactsContract;
import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.FragmentManager;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -60,18 +61,22 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
import org.sufficientlysecure.keychain.operations.results.OperationResult;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
+import org.sufficientlysecure.keychain.provider.CachedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler.MessageStatus;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
-import org.sufficientlysecure.keychain.ui.base.BaseActivity;
+import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity;
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.ui.util.QrCodeUtils;
import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.ExportHelper;
@@ -79,12 +84,17 @@ import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.NfcHelper;
import org.sufficientlysecure.keychain.util.Preferences;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
-public class ViewKeyActivity extends BaseActivity implements
+public class ViewKeyActivity extends BaseNfcActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
+ public static final String EXTRA_NFC_USER_ID = "nfc_user_id";
+ public static final String EXTRA_NFC_AID = "nfc_aid";
+ public static final String EXTRA_NFC_FINGERPRINTS = "nfc_fingerprints";
+
static final int REQUEST_QR_FINGERPRINT = 1;
static final int REQUEST_DELETE = 2;
static final int REQUEST_EXPORT = 3;
@@ -107,6 +117,8 @@ public class ViewKeyActivity extends BaseActivity implements
private ImageView mQrCode;
private CardView mQrCodeLayout;
+ private String mQrCodeLoaded;
+
// NFC
private NfcHelper mNfcHelper;
@@ -257,6 +269,15 @@ public class ViewKeyActivity extends BaseActivity implements
mNfcHelper.initNfc(mDataUri);
startFragment(savedInstanceState, mDataUri);
+
+ if (savedInstanceState == null && getIntent().hasExtra(EXTRA_NFC_AID)) {
+ Intent intent = getIntent();
+ byte[] nfcFingerprints = intent.getByteArrayExtra(EXTRA_NFC_FINGERPRINTS);
+ String nfcUserId = intent.getStringExtra(EXTRA_NFC_USER_ID);
+ byte[] nfcAid = intent.getByteArrayExtra(EXTRA_NFC_AID);
+ showYubikeyFragment(nfcFingerprints, nfcUserId, nfcAid);
+ }
+
}
@Override
@@ -517,6 +538,60 @@ public class ViewKeyActivity extends BaseActivity implements
}
}
+ @Override
+ protected void onNfcPerform() throws IOException {
+
+ final byte[] nfcFingerprints = nfcGetFingerprints();
+ 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, "Different key stored on Yubikey!", 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;
+
+ } catch (PgpKeyNotFoundException e) {
+ Notify.create(this, "Different key stored on Yubikey!", Style.ERROR).show();
+ return;
+ }
+ }
+
+ showYubikeyFragment(nfcFingerprints, nfcUserId, nfcAid);
+
+ }
+
+ public void showYubikeyFragment(byte[] nfcFingerprints, String nfcUserId, byte[] nfcAid) {
+ ViewKeyYubikeyFragment frag = ViewKeyYubikeyFragment.newInstance(
+ nfcFingerprints, nfcUserId, nfcAid);
+
+ FragmentManager manager = getSupportFragmentManager();
+
+ manager.popBackStack("yubikey", FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ manager.beginTransaction()
+ .addToBackStack("yubikey")
+ .replace(R.id.view_key_fragment, frag)
+ .commit();
+ }
+
private void encrypt(Uri dataUri, boolean text) {
// If there is no encryption key, don't bother.
if (!mHasEncrypt) {
@@ -648,6 +723,7 @@ public class ViewKeyActivity extends BaseActivity implements
}
protected void onPostExecute(Bitmap qrCode) {
+ mQrCodeLoaded = fingerprint;
// scale the image up to our actual size. we do this in code rather
// than let the ImageView do this because we don't require filtering.
Bitmap scaled = Bitmap.createScaledBitmap(qrCode,
@@ -725,7 +801,6 @@ public class ViewKeyActivity extends BaseActivity implements
mName.setText(R.string.user_id_no_name);
}
- String oldFingerprint = mFingerprint;
mMasterKeyId = data.getLong(INDEX_MASTER_KEY_ID);
mFingerprint = KeyFormattingUtils.convertFingerprintToHex(data.getBlob(INDEX_FINGERPRINT));
@@ -789,7 +864,7 @@ public class ViewKeyActivity extends BaseActivity implements
mStatusImage.setVisibility(View.GONE);
color = getResources().getColor(R.color.primary);
// reload qr code only if the fingerprint changed
- if (!mFingerprint.equals(oldFingerprint)) {
+ if (!mFingerprint.equals(mQrCodeLoaded)) {
loadQrCode(mFingerprint);
}
photoTask.execute(mMasterKeyId);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java
new file mode 100644
index 000000000..7df791fbf
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java
@@ -0,0 +1,129 @@
+package org.sufficientlysecure.keychain.ui;
+
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.spongycastle.util.encoders.Hex;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
+import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
+import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+
+
+public class ViewKeyYubikeyFragment extends Fragment {
+
+
+ public static final String ARG_FINGERPRINT = "fingerprint";
+ public static final String ARG_USER_ID = "user_id";
+ public static final String ARG_AID = "aid";
+ private byte[] mFingerprints;
+ private String mUserId;
+ private byte[] mAid;
+
+ public static ViewKeyYubikeyFragment newInstance(byte[] fingerprints, String userId, byte[] aid) {
+
+ ViewKeyYubikeyFragment frag = new ViewKeyYubikeyFragment();
+
+ Bundle args = new Bundle();
+ args.putByteArray(ARG_FINGERPRINT, fingerprints);
+ args.putString(ARG_USER_ID, userId);
+ args.putByteArray(ARG_AID, aid);
+ frag.setArguments(args);
+
+ return frag;
+
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Bundle args = getArguments();
+ mFingerprints = args.getByteArray(ARG_FINGERPRINT);
+ mUserId = args.getString(ARG_USER_ID);
+ mAid = args.getByteArray(ARG_AID);
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.view_key_yubikey, null);
+
+ TextView vSerNo = (TextView) view.findViewById(R.id.yubikey_serno);
+ TextView vUserId = (TextView) view.findViewById(R.id.yubikey_userid);
+
+ String serno = Hex.toHexString(mAid, 10, 4);
+ vSerNo.setText("Serial N° " + serno);
+
+ if (!mUserId.isEmpty()) {
+ vUserId.setText("Key holder: " + mUserId);
+ } else {
+ vUserId.setText("Key holder: " + "<unset>");
+ }
+
+ view.findViewById(R.id.button_import).setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ promoteToSecretKey();
+ }
+ });
+
+
+ return view;
+ }
+
+ public void promoteToSecretKey() {
+
+ // Message is received after decrypting is done in KeychainIntentService
+ KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(getActivity()) {
+ public void handleMessage(Message message) {
+ // handle messages by standard KeychainIntentServiceHandler first
+ super.handleMessage(message);
+
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
+ // get returned data bundle
+ Bundle returnData = message.getData();
+
+ PromoteKeyResult result =
+ returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
+
+ result.createNotify(getActivity()).show();
+ }
+
+ }
+ };
+
+ // Send all information needed to service to decrypt in other thread
+ Intent intent = new Intent(getActivity(), KeychainIntentService.class);
+
+ // fill values for this action
+
+ intent.setAction(KeychainIntentService.ACTION_PROMOTE_KEYRING);
+
+ long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints);
+
+ Bundle data = new Bundle();
+ data.putLong(KeychainIntentService.PROMOTE_MASTER_KEY_ID, masterKeyId);
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(saveHandler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+
+ // start service with intent
+ getActivity().startService(intent);
+
+ }
+
+}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java
index ca1d79155..2fd88fd66 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java
@@ -248,12 +248,17 @@ public abstract class BaseNfcActivity extends BaseActivity {
return fp;
}
+ public byte[] nfcGetAid() throws IOException {
+
+ String info = "00CA004F00";
+ return mIsoDep.transceive(Hex.decode(info));
+
+ }
public String nfcGetUserId() throws IOException {
+
String info = "00CA006500";
- String data = "00CA005E00";
- return nfcGetHolderName(nfcCommunicate(info)) + " <" + (new String(Hex.decode(nfcGetDataField(
- nfcCommunicate(data))))) + ">";
+ return nfcGetHolderName(nfcCommunicate(info));
}
/**
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
index c5403e054..ae66b59d4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/KeyFormattingUtils.java
@@ -38,6 +38,7 @@ import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm;
import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Curve;
import org.sufficientlysecure.keychain.util.Log;
+import java.nio.ByteBuffer;
import java.security.DigestException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -215,7 +216,15 @@ public class KeyFormattingUtils {
* @return
*/
public static String convertFingerprintToHex(byte[] fingerprint) {
- return Hex.toHexString(fingerprint).toLowerCase(Locale.ENGLISH);
+ return Hex.toHexString(fingerprint, 0, 20).toLowerCase(Locale.ENGLISH);
+ }
+
+ public static long getKeyIdFromFingerprint(byte[] fingerprint) {
+ ByteBuffer buf = ByteBuffer.wrap(fingerprint);
+ // skip first 12 bytes of the fingerprint
+ buf.position(12);
+ // the last eight bytes are the key id (big endian, which is default order in ByteBuffer)
+ return buf.getLong();
}
/**