From 3668c8897d88989780da800ecd648c7b33a0e8f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 15 Apr 2015 10:02:41 +0200 Subject: Fix YubiKey naming, cleanup --- .../keychain/remote/OpenPgpService.java | 2 +- .../keychain/service/PassphraseCacheService.java | 8 +- .../keychain/ui/DecryptFragment.java | 19 -- .../keychain/ui/NfcOperationActivity.java | 8 +- .../keychain/ui/PassphraseDialogActivity.java | 2 +- .../keychain/ui/SettingsActivity.java | 28 +-- .../keychain/ui/ViewKeyActivity.java | 8 +- .../keychain/ui/ViewKeyYubiKeyFragment.java | 218 ++++++++++++++++++++ .../keychain/ui/ViewKeyYubikeyFragment.java | 220 --------------------- .../keychain/ui/base/BaseNfcActivity.java | 25 ++- .../keychain/util/Preferences.java | 8 +- OpenKeychain/src/main/res/raw/help_changelog.md | 10 +- 12 files changed, 274 insertions(+), 282 deletions(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java delete mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java (limited to 'OpenKeychain/src/main') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index 71843cd7f..c51edf59c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -167,7 +167,7 @@ public class OpenPgpService extends RemoteService { switch (requiredInput.mType) { case NFC_DECRYPT: case NFC_SIGN: { - // build PendingIntent for Yubikey NFC operations + // build PendingIntent for YubiKey NFC operations Intent intent = new Intent(context, NfcOperationActivity.class); // pass params through to activity that it can be returned again later to repeat pgp operation intent.putExtra(NfcOperationActivity.EXTRA_SERVICE_INTENT, data); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java index 03c250035..78137170d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -245,11 +245,11 @@ public class PassphraseCacheService extends Service { switch (keyType) { case DIVERT_TO_CARD: - if (Preferences.getPreferences(this).useDefaultYubikeyPin()) { - Log.d(Constants.TAG, "PassphraseCacheService: Using default Yubikey PIN: 123456"); - return new Passphrase("123456"); // default Yubikey PIN, see http://www.yubico.com/2012/12/yubikey-neo-openpgp/ + if (Preferences.getPreferences(this).useDefaultYubiKeyPin()) { + Log.d(Constants.TAG, "PassphraseCacheService: Using default YubiKey PIN: 123456"); + return new Passphrase("123456"); // default YubiKey PIN, see http://www.yubico.com/2012/12/yubikey-neo-openpgp/ } else { - Log.d(Constants.TAG, "PassphraseCacheService: NOT using default Yubikey PIN"); + Log.d(Constants.TAG, "PassphraseCacheService: NOT using default YubiKey PIN"); break; } case PASSPHRASE_EMPTY: diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index f320a6d84..68b758bab 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -85,25 +85,6 @@ public abstract class DecryptFragment extends CryptoOperationFragment { startActivity(viewKeyIntent); } -// protected void startPassphraseDialog(long subkeyId) { -// Intent intent = new Intent(getActivity(), PassphraseDialogActivity.class); -// intent.putExtra(PassphraseDialogActivity.EXTRA_SUBKEY_ID, subkeyId); -// startActivityForResult(intent, REQUEST_CODE_PASSPHRASE); -// } -// -// protected void startNfcDecrypt(long subKeyId, Passphrase pin, byte[] encryptedSessionKey) { -// // build PendingIntent for Yubikey NFC operations -// Intent intent = new Intent(getActivity(), NfcActivity.class); -// intent.setAction(NfcActivity.ACTION_DECRYPT_SESSION_KEY); -// intent.putExtra(NfcActivity.EXTRA_SERVICE_INTENT, new Intent()); // not used, only relevant to OpenPgpService -// intent.putExtra(NfcActivity.EXTRA_KEY_ID, subKeyId); -// intent.putExtra(NfcActivity.EXTRA_PIN, pin); -// -// intent.putExtra(NfcActivity.EXTRA_NFC_ENC_SESSION_KEY, encryptedSessionKey); -// -// startActivityForResult(intent, REQUEST_CODE_NFC_DECRYPT); -// } - /** * * @return returns false if signature is invalid, key is revoked or expired. diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java index 25cc13fcb..aa66053fa 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java @@ -6,9 +6,7 @@ package org.sufficientlysecure.keychain.ui; -import android.annotation.TargetApi; import android.content.Intent; -import android.os.Build; import android.os.Bundle; import android.view.WindowManager; @@ -56,7 +54,7 @@ public class NfcOperationActivity extends BaseNfcActivity { mServiceIntent = data.getParcelable(EXTRA_SERVICE_INTENT); // obtain passphrase for this subkey - obtainYubikeyPin(RequiredInputParcel.createRequiredPassphrase(mRequiredInput)); + obtainYubiKeyPin(RequiredInputParcel.createRequiredPassphrase(mRequiredInput)); } @Override @@ -106,7 +104,7 @@ public class NfcOperationActivity extends BaseNfcActivity { // avoid a loop Preferences prefs = Preferences.getPreferences(this); - if (prefs.useDefaultYubikeyPin()) { + if (prefs.useDefaultYubiKeyPin()) { toast(getString(R.string.error_pin_nodefault)); setResult(RESULT_CANCELED); finish(); @@ -117,7 +115,7 @@ public class NfcOperationActivity extends BaseNfcActivity { PassphraseCacheService.clearCachedPassphrase( this, mRequiredInput.getMasterKeyId(), mRequiredInput.getSubKeyId()); - obtainYubikeyPin(RequiredInputParcel.createRequiredPassphrase(mRequiredInput)); + obtainYubiKeyPin(RequiredInputParcel.createRequiredPassphrase(mRequiredInput)); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java index 84612002f..4e926c0fe 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java @@ -314,7 +314,7 @@ public class PassphraseDialogActivity extends FragmentActivity { mPassphraseEditText.setImeActionLabel(getString(android.R.string.ok), EditorInfo.IME_ACTION_DONE); mPassphraseEditText.setOnEditorActionListener(this); - if (keyType == CanonicalizedSecretKey.SecretKeyType.DIVERT_TO_CARD && Preferences.getPreferences(activity).useNumKeypadForYubikeyPin()) { + if (keyType == CanonicalizedSecretKey.SecretKeyType.DIVERT_TO_CARD && Preferences.getPreferences(activity).useNumKeypadForYubiKeyPin()) { mPassphraseEditText.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_PASSWORD); } else if (keyType == CanonicalizedSecretKey.SecretKeyType.PIN) { mPassphraseEditText.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_PASSWORD); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java index 210960b65..442bdf8f7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java @@ -107,10 +107,10 @@ public class SettingsActivity extends PreferenceActivity { values[i] = "" + valueIds[i]; } - initializeUseDefaultYubikeyPin( + initializeUseDefaultYubiKeyPin( (CheckBoxPreference) findPreference(Constants.Pref.USE_DEFAULT_YUBIKEY_PIN)); - initializeUseNumKeypadForYubikeyPin( + initializeUseNumKeypadForYubiKeyPin( (CheckBoxPreference) findPreference(Constants.Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN)); } @@ -262,10 +262,10 @@ public class SettingsActivity extends PreferenceActivity { values[i] = "" + valueIds[i]; } - initializeUseDefaultYubikeyPin( + initializeUseDefaultYubiKeyPin( (CheckBoxPreference) findPreference(Constants.Pref.USE_DEFAULT_YUBIKEY_PIN)); - initializeUseNumKeypadForYubikeyPin( + initializeUseNumKeypadForYubiKeyPin( (CheckBoxPreference) findPreference(Constants.Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN)); } } @@ -335,23 +335,23 @@ public class SettingsActivity extends PreferenceActivity { return serverSummary + "; " + context.getString(R.string.label_preferred) + ": " + sPreferences.getPreferredKeyserver(); } - private static void initializeUseDefaultYubikeyPin(final CheckBoxPreference mUseDefaultYubikeyPin) { - mUseDefaultYubikeyPin.setChecked(sPreferences.useDefaultYubikeyPin()); - mUseDefaultYubikeyPin.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + private static void initializeUseDefaultYubiKeyPin(final CheckBoxPreference mUseDefaultYubiKeyPin) { + mUseDefaultYubiKeyPin.setChecked(sPreferences.useDefaultYubiKeyPin()); + mUseDefaultYubiKeyPin.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { - mUseDefaultYubikeyPin.setChecked((Boolean) newValue); - sPreferences.setUseDefaultYubikeyPin((Boolean) newValue); + mUseDefaultYubiKeyPin.setChecked((Boolean) newValue); + sPreferences.setUseDefaultYubiKeyPin((Boolean) newValue); return false; } }); } - private static void initializeUseNumKeypadForYubikeyPin(final CheckBoxPreference mUseNumKeypadForYubikeyPin) { - mUseNumKeypadForYubikeyPin.setChecked(sPreferences.useNumKeypadForYubikeyPin()); - mUseNumKeypadForYubikeyPin.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + private static void initializeUseNumKeypadForYubiKeyPin(final CheckBoxPreference mUseNumKeypadForYubiKeyPin) { + mUseNumKeypadForYubiKeyPin.setChecked(sPreferences.useNumKeypadForYubiKeyPin()); + mUseNumKeypadForYubiKeyPin.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { - mUseNumKeypadForYubikeyPin.setChecked((Boolean) newValue); - sPreferences.setUseNumKeypadForYubikeyPin((Boolean) newValue); + mUseNumKeypadForYubiKeyPin.setChecked((Boolean) newValue); + sPreferences.setUseNumKeypadForYubiKeyPin((Boolean) newValue); return false; } }); 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 b063df2fb..5466c0b9a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -281,7 +281,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements 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); + showYubiKeyFragment(nfcFingerprints, nfcUserId, nfcAid); } } @@ -593,12 +593,12 @@ public class ViewKeyActivity extends BaseNfcActivity implements } } - showYubikeyFragment(nfcFingerprints, nfcUserId, nfcAid); + showYubiKeyFragment(nfcFingerprints, nfcUserId, nfcAid); } - public void showYubikeyFragment(byte[] nfcFingerprints, String nfcUserId, byte[] nfcAid) { - ViewKeyYubikeyFragment frag = ViewKeyYubikeyFragment.newInstance( + public void showYubiKeyFragment(byte[] nfcFingerprints, String nfcUserId, byte[] nfcAid) { + ViewKeyYubiKeyFragment frag = ViewKeyYubiKeyFragment.newInstance( nfcFingerprints, nfcUserId, nfcAid); FragmentManager manager = getSupportFragmentManager(); 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..a2c158e7d --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java @@ -0,0 +1,218 @@ +package org.sufficientlysecure.keychain.ui; + + +import java.nio.ByteBuffer; +import java.util.Arrays; + +import android.content.Intent; +import android.database.Cursor; +import android.os.Bundle; +import android.os.Message; +import android.os.Messenger; +import android.support.v4.app.Fragment; +import android.support.v4.app.LoaderManager.LoaderCallbacks; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.Button; +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.pgp.CanonicalizedSecretKey.SecretKeyType; +import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; +import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.ServiceProgressHandler; +import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; + + +public class ViewKeyYubiKeyFragment extends Fragment + implements LoaderCallbacks { + + public static final String ARG_FINGERPRINT = "fingerprint"; + public static final String ARG_USER_ID = "user_id"; + public static final String ARG_CARD_AID = "aid"; + private byte[][] mFingerprints; + private String mUserId; + private byte[] mCardAid; + private long mMasterKeyId; + private Button vButton; + private TextView vStatus; + + 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_CARD_AID, aid); + frag.setArguments(args); + + return frag; + + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Bundle args = getArguments(); + ByteBuffer buf = ByteBuffer.wrap(args.getByteArray(ARG_FINGERPRINT)); + mFingerprints = new byte[buf.remaining()/40][]; + for (int i = 0; i < mFingerprints.length; i++) { + mFingerprints[i] = new byte[20]; + buf.get(mFingerprints[i]); + } + mUserId = args.getString(ARG_USER_ID); + mCardAid = args.getByteArray(ARG_CARD_AID); + + mMasterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints[0]); + + getLoaderManager().initLoader(0, null, this); + + } + + @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(mCardAid, 10, 4); + vSerNo.setText(getString(R.string.yubikey_serno, serno)); + + if (!mUserId.isEmpty()) { + vUserId.setText(getString(R.string.yubikey_key_holder, mUserId)); + } else { + vUserId.setText(getString(R.string.yubikey_key_holder_unset)); + } + + vButton = (Button) view.findViewById(R.id.button_bind); + vButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + promoteToSecretKey(); + } + }); + + vStatus = (TextView) view.findViewById(R.id.yubikey_status); + + return view; + } + + public void promoteToSecretKey() { + + ServiceProgressHandler saveHandler = new ServiceProgressHandler(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, mMasterKeyId); + data.putByteArray(KeychainIntentService.PROMOTE_CARD_AID, mCardAid); + 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); + + } + + public static final String[] PROJECTION = new String[]{ + Keys._ID, + Keys.KEY_ID, + Keys.RANK, + Keys.HAS_SECRET, + Keys.FINGERPRINT + }; + private static final int INDEX_KEY_ID = 1; + private static final int INDEX_RANK = 2; + private static final int INDEX_HAS_SECRET = 3; + private static final int INDEX_FINGERPRINT = 4; + + @Override + public Loader onCreateLoader(int id, Bundle args) { + return new CursorLoader(getActivity(), Keys.buildKeysUri(mMasterKeyId), + PROJECTION, null, null, null); + } + + @Override + public void onLoadFinished(Loader loader, Cursor data) { + if (!data.moveToFirst()) { + // wut? + return; + } + + boolean allBound = true; + boolean noneBound = true; + + do { + SecretKeyType keyType = SecretKeyType.fromNum(data.getInt(INDEX_HAS_SECRET)); + byte[] fingerprint = data.getBlob(INDEX_FINGERPRINT); + Integer index = naiveIndexOf(mFingerprints, fingerprint); + if (index == null) { + continue; + } + if (keyType == SecretKeyType.DIVERT_TO_CARD) { + noneBound = false; + } else { + allBound = false; + } + } while (data.moveToNext()); + + if (allBound) { + vButton.setVisibility(View.GONE); + vStatus.setText(R.string.yubikey_status_bound); + } else { + vButton.setVisibility(View.VISIBLE); + vStatus.setText(noneBound + ? R.string.yubikey_status_unbound + : R.string.yubikey_status_partly); + } + + } + + public Integer naiveIndexOf(byte[][] haystack, byte[] needle) { + for (int i = 0; i < haystack.length; i++) { + if (Arrays.equals(needle, haystack[i])) { + return i; + } + } + return null; + } + + @Override + public void onLoaderReset(Loader loader) { + + } +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java deleted file mode 100644 index 1482b70a7..000000000 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubikeyFragment.java +++ /dev/null @@ -1,220 +0,0 @@ -package org.sufficientlysecure.keychain.ui; - - -import java.nio.ByteBuffer; -import java.util.Arrays; - -import android.app.ProgressDialog; -import android.content.Intent; -import android.database.Cursor; -import android.os.Bundle; -import android.os.Message; -import android.os.Messenger; -import android.support.v4.app.Fragment; -import android.support.v4.app.LoaderManager.LoaderCallbacks; -import android.support.v4.content.CursorLoader; -import android.support.v4.content.Loader; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.Button; -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.pgp.CanonicalizedSecretKey.SecretKeyType; -import org.sufficientlysecure.keychain.provider.KeychainContract.Keys; -import org.sufficientlysecure.keychain.service.KeychainIntentService; -import org.sufficientlysecure.keychain.service.ServiceProgressHandler; -import org.sufficientlysecure.keychain.ui.dialog.ProgressDialogFragment; -import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; - - -public class ViewKeyYubikeyFragment extends Fragment - implements LoaderCallbacks { - - public static final String ARG_FINGERPRINT = "fingerprint"; - public static final String ARG_USER_ID = "user_id"; - public static final String ARG_CARD_AID = "aid"; - private byte[][] mFingerprints; - private String mUserId; - private byte[] mCardAid; - private long mMasterKeyId; - private Button vButton; - private TextView vStatus; - - 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_CARD_AID, aid); - frag.setArguments(args); - - return frag; - - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Bundle args = getArguments(); - ByteBuffer buf = ByteBuffer.wrap(args.getByteArray(ARG_FINGERPRINT)); - mFingerprints = new byte[buf.remaining()/40][]; - for (int i = 0; i < mFingerprints.length; i++) { - mFingerprints[i] = new byte[20]; - buf.get(mFingerprints[i]); - } - mUserId = args.getString(ARG_USER_ID); - mCardAid = args.getByteArray(ARG_CARD_AID); - - mMasterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mFingerprints[0]); - - getLoaderManager().initLoader(0, null, this); - - } - - @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(mCardAid, 10, 4); - vSerNo.setText(getString(R.string.yubikey_serno, serno)); - - if (!mUserId.isEmpty()) { - vUserId.setText(getString(R.string.yubikey_key_holder, mUserId)); - } else { - vUserId.setText(getString(R.string.yubikey_key_holder_unset)); - } - - vButton = (Button) view.findViewById(R.id.button_bind); - vButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - promoteToSecretKey(); - } - }); - - vStatus = (TextView) view.findViewById(R.id.yubikey_status); - - return view; - } - - public void promoteToSecretKey() { - - ServiceProgressHandler saveHandler = new ServiceProgressHandler(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, mMasterKeyId); - data.putByteArray(KeychainIntentService.PROMOTE_CARD_AID, mCardAid); - 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); - - } - - public static final String[] PROJECTION = new String[]{ - Keys._ID, - Keys.KEY_ID, - Keys.RANK, - Keys.HAS_SECRET, - Keys.FINGERPRINT - }; - private static final int INDEX_KEY_ID = 1; - private static final int INDEX_RANK = 2; - private static final int INDEX_HAS_SECRET = 3; - private static final int INDEX_FINGERPRINT = 4; - - @Override - public Loader onCreateLoader(int id, Bundle args) { - return new CursorLoader(getActivity(), Keys.buildKeysUri(mMasterKeyId), - PROJECTION, null, null, null); - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - if (!data.moveToFirst()) { - // wut? - return; - } - - boolean allBound = true; - boolean noneBound = true; - - do { - SecretKeyType keyType = SecretKeyType.fromNum(data.getInt(INDEX_HAS_SECRET)); - byte[] fingerprint = data.getBlob(INDEX_FINGERPRINT); - Integer index = naiveIndexOf(mFingerprints, fingerprint); - if (index == null) { - continue; - } - if (keyType == SecretKeyType.DIVERT_TO_CARD) { - noneBound = false; - } else { - allBound = false; - } - } while (data.moveToNext()); - - if (allBound) { - vButton.setVisibility(View.GONE); - vStatus.setText(R.string.yubikey_status_bound); - } else { - vButton.setVisibility(View.VISIBLE); - vStatus.setText(noneBound - ? R.string.yubikey_status_unbound - : R.string.yubikey_status_partly); - } - - } - - public Integer naiveIndexOf(byte[][] haystack, byte[] needle) { - for (int i = 0; i < haystack.length; i++) { - if (Arrays.equals(needle, haystack[i])) { - return i; - } - } - return null; - } - - @Override - public void onLoaderReset(Loader loader) { - - } -} 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 ff5268c7c..f55c8b17a 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 @@ -1,5 +1,21 @@ -package org.sufficientlysecure.keychain.ui.base; +/* + * Copyright (C) 2014-2015 Dominik Schürmann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.sufficientlysecure.keychain.ui.base; import java.io.IOException; import java.nio.ByteBuffer; @@ -35,7 +51,6 @@ import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Preferences; - public abstract class BaseNfcActivity extends BaseActivity { public static final int REQUEST_CODE_PASSPHRASE = 1; @@ -108,10 +123,10 @@ public abstract class BaseNfcActivity extends BaseActivity { enableNfcForegroundDispatch(); } - protected void obtainYubikeyPin(RequiredInputParcel requiredInput) { + protected void obtainYubiKeyPin(RequiredInputParcel requiredInput) { Preferences prefs = Preferences.getPreferences(this); - if (prefs.useDefaultYubikeyPin()) { + if (prefs.useDefaultYubiKeyPin()) { mPin = new Passphrase("123456"); return; } @@ -123,7 +138,7 @@ public abstract class BaseNfcActivity extends BaseActivity { } - protected void setYubikeyPin(Passphrase pin) { + protected void setYubiKeyPin(Passphrase pin) { mPin = pin; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java index 44c1e6b6c..8a7638054 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -109,21 +109,21 @@ public class Preferences { return mSharedPreferences.getBoolean(Constants.Pref.FIRST_TIME, true); } - public boolean useDefaultYubikeyPin() { + public boolean useDefaultYubiKeyPin() { return mSharedPreferences.getBoolean(Pref.USE_DEFAULT_YUBIKEY_PIN, false); } - public void setUseDefaultYubikeyPin(boolean useDefaultYubikeyPin) { + public void setUseDefaultYubiKeyPin(boolean useDefaultYubikeyPin) { SharedPreferences.Editor editor = mSharedPreferences.edit(); editor.putBoolean(Pref.USE_DEFAULT_YUBIKEY_PIN, useDefaultYubikeyPin); editor.commit(); } - public boolean useNumKeypadForYubikeyPin() { + public boolean useNumKeypadForYubiKeyPin() { return mSharedPreferences.getBoolean(Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN, true); } - public void setUseNumKeypadForYubikeyPin(boolean useNumKeypadForYubikeyPin) { + public void setUseNumKeypadForYubiKeyPin(boolean useNumKeypadForYubikeyPin) { SharedPreferences.Editor editor = mSharedPreferences.edit(); editor.putBoolean(Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN, useNumKeypadForYubikeyPin); editor.commit(); diff --git a/OpenKeychain/src/main/res/raw/help_changelog.md b/OpenKeychain/src/main/res/raw/help_changelog.md index 18203b1c5..104454f39 100644 --- a/OpenKeychain/src/main/res/raw/help_changelog.md +++ b/OpenKeychain/src/main/res/raw/help_changelog.md @@ -35,7 +35,7 @@ * Redesigned decrypt screen * New icon usage and colors * Fix import of secret keys from Symantec Encryption Desktop - * Subkey IDs on Yubikeys are now checked correctly + * Subkey IDs on YubiKeys are now checked correctly ## 3.0.1 @@ -46,7 +46,7 @@ ## 3.0 - * Full support for Yubikey signature generation and decryption! + * Full support for YubiKey signature generation and decryption! * Propose installable compatible apps in apps list * New design for decryption screens * Many fixes for key import, also fixes stripped keys @@ -60,7 +60,7 @@ ## 2.9.2 * Fix keys broken in 2.9.1 - * Yubikey decryption now working via API + * YubiKey decryption now working via API ## 2.9.1 @@ -69,7 +69,7 @@ * Fix key flags handling (now supporting Mailvelope 0.7 keys) * Improved passphrase handling * Key sharing via SafeSlinger - * Yubikey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain + * YubiKey: preference to allow other PINs, currently only signing via the OpenPGP API works, not inside of OpenKeychain * Fix usage of stripped keys * SHA256 as default for compatibility * Intent API has changed, see https://github.com/open-keychain/open-keychain/wiki/Intent-API @@ -80,7 +80,7 @@ * Fixing crashes introduced in v2.8 * Experimental ECC support - * Experimental Yubikey support (signing-only with imported keys) + * Experimental YubiKey support (signing-only with imported keys) ## 2.8 -- cgit v1.2.3