diff options
Diffstat (limited to 'OpenKeychain/src/main/java/org')
29 files changed, 478 insertions, 356 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index 7bac8aa97..3e48abccb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -105,7 +105,7 @@ public final class Constants { public static final String CACHED_CONSOLIDATE = "cachedConsolidate"; public static final String SEARCH_KEYSERVER = "search_keyserver_pref"; public static final String SEARCH_KEYBASE = "search_keybase_pref"; - public static final String USE_NUMKEYPAD_FOR_YUBIKEY_PIN = "useNumKeypadForYubikeyPin"; + public static final String USE_NUMKEYPAD_FOR_SECURITY_TOKEN_PIN = "useNumKeypadForYubikeyPin"; public static final String ENCRYPT_FILENAMES = "encryptFilenames"; public static final String FILE_USE_COMPRESSION = "useFileCompression"; public static final String TEXT_USE_COMPRESSION = "useTextCompression"; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index ed2123987..1e90c2cc3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -562,9 +562,9 @@ public abstract class OperationResult implements Parcelable { MSG_MF_ERROR_CONFLICTING_NFC_COMMANDS(LogLevel.ERROR, R.string.msg_mf_error_conflicting_nfc_commands), MSG_MF_ERROR_DUPLICATE_KEYTOCARD_FOR_SLOT(LogLevel.ERROR, R.string.msg_mf_error_duplicate_keytocard_for_slot), MSG_MF_ERROR_INVALID_FLAGS_FOR_KEYTOCARD(LogLevel.ERROR, R.string.msg_mf_error_invalid_flags_for_keytocard), - MSG_MF_ERROR_BAD_NFC_ALGO(LogLevel.ERROR, R.string.edit_key_error_bad_nfc_algo), - MSG_MF_ERROR_BAD_NFC_SIZE(LogLevel.ERROR, R.string.edit_key_error_bad_nfc_size), - MSG_MF_ERROR_BAD_NFC_STRIPPED(LogLevel.ERROR, R.string.edit_key_error_bad_nfc_stripped), + MSG_MF_ERROR_BAD_SECURITY_TOKEN_ALGO(LogLevel.ERROR, R.string.edit_key_error_bad_security_token_algo), + MSG_MF_ERROR_BAD_SECURITY_TOKEN_SIZE(LogLevel.ERROR, R.string.edit_key_error_bad_security_token_size), + MSG_MF_ERROR_BAD_SECURITY_TOKEN_STRIPPED(LogLevel.ERROR, R.string.edit_key_error_bad_security_token_stripped), MSG_MF_MASTER (LogLevel.DEBUG, R.string.msg_mf_master), MSG_MF_NOTATION_PIN (LogLevel.DEBUG, R.string.msg_mf_notation_pin), MSG_MF_NOTATION_EMPTY (LogLevel.DEBUG, R.string.msg_mf_notation_empty), diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java index 59b840054..c42608a6b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperation.java @@ -413,8 +413,8 @@ public class PgpKeyOperation { boolean hasEncrypt = false; boolean hasAuth = false; for(SaveKeyringParcel.SubkeyChange change : saveParcel.mChangeSubKeys) { - if (change.mMoveKeyToCard) { - // If this is a keytocard operation, see if it was completed: look for a hash + if (change.mMoveKeyToSecurityToken) { + // If this is a moveKeyToSecurityToken operation, see if it was completed: look for a hash // matching the given subkey ID in cryptoData. byte[] subKeyId = new byte[8]; ByteBuffer buf = ByteBuffer.wrap(subKeyId); @@ -422,13 +422,13 @@ public class PgpKeyOperation { byte[] serialNumber = cryptoInput.getCryptoData().get(buf); if (serialNumber != null) { - change.mMoveKeyToCard = false; - change.mDummyDivert = serialNumber; + change.mMoveKeyToSecurityToken = false; + change.mSecurityTokenSerialNo = serialNumber; } } - if (change.mMoveKeyToCard) { - // Pending keytocard operation. Need to make sure that we don't have multiple + if (change.mMoveKeyToSecurityToken) { + // Pending moveKeyToSecurityToken operation. Need to make sure that we don't have multiple // subkeys pending for the same slot. CanonicalizedSecretKey wsK = wsKR.getSecretKey(change.mKeyId); @@ -460,6 +460,11 @@ public class PgpKeyOperation { } } + if (isDummy(masterSecretKey) && ! saveParcel.isRestrictedOnly()) { + log.add(LogType.MSG_EK_ERROR_DUMMY, indent); + return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null); + } + if (isDummy(masterSecretKey) || saveParcel.isRestrictedOnly()) { log.add(LogType.MSG_MF_RESTRICTED_MODE, indent); return internalRestricted(sKR, saveParcel, log, indent + 1); @@ -810,26 +815,26 @@ public class PgpKeyOperation { // no really, it is. this operation irrevocably removes the private key data from the key sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey()); sKR = PGPSecretKeyRing.insertSecretKey(sKR, sKey); - } else if (change.mMoveKeyToCard) { - if (checkSmartCardCompatibility(sKey, log, indent + 1)) { + } else if (change.mMoveKeyToSecurityToken) { + if (checkSecurityTokenCompatibility(sKey, log, indent + 1)) { log.add(LogType.MSG_MF_KEYTOCARD_START, indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId)); nfcKeyToCardOps.addSubkey(change.mKeyId); } else { - // Appropriate log message already set by checkSmartCardCompatibility + // Appropriate log message already set by checkSecurityTokenCompatibility return new PgpEditKeyResult(EditKeyResult.RESULT_ERROR, log, null); } - } else if (change.mDummyDivert != null) { + } else if (change.mSecurityTokenSerialNo != null) { // NOTE: Does this code get executed? Or always handled in internalRestricted? - if (change.mDummyDivert.length != 16) { + if (change.mSecurityTokenSerialNo.length != 16) { log.add(LogType.MSG_MF_ERROR_DIVERT_SERIAL, indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId)); return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null); } log.add(LogType.MSG_MF_KEYTOCARD_FINISH, indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId), - Hex.toHexString(change.mDummyDivert, 8, 6)); - sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey(), change.mDummyDivert); + Hex.toHexString(change.mSecurityTokenSerialNo, 8, 6)); + sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey(), change.mSecurityTokenSerialNo); sKR = PGPSecretKeyRing.insertSecretKey(sKR, sKey); } @@ -1063,22 +1068,22 @@ public class PgpKeyOperation { indent -= 1; } - // 7. if requested, change PIN and/or Admin PIN on card - if (saveParcel.mCardPin != null) { + // 7. if requested, change PIN and/or Admin PIN on security token + if (saveParcel.mSecurityTokenPin != null) { progress(R.string.progress_modify_pin, 90); log.add(LogType.MSG_MF_PIN, indent); indent += 1; - nfcKeyToCardOps.setPin(saveParcel.mCardPin); + nfcKeyToCardOps.setPin(saveParcel.mSecurityTokenPin); indent -= 1; } - if (saveParcel.mCardAdminPin != null) { + if (saveParcel.mSecurityTokenAdminPin != null) { progress(R.string.progress_modify_admin_pin, 90); log.add(LogType.MSG_MF_ADMIN_PIN, indent); indent += 1; - nfcKeyToCardOps.setAdminPin(saveParcel.mCardAdminPin); + nfcKeyToCardOps.setAdminPin(saveParcel.mSecurityTokenAdminPin); indent -= 1; } @@ -1128,7 +1133,7 @@ public class PgpKeyOperation { progress(R.string.progress_modify, 0); - // Make sure the saveParcel includes only operations available without passphrae! + // Make sure the saveParcel includes only operations available without passphrase! if (!saveParcel.isRestrictedOnly()) { log.add(LogType.MSG_MF_ERROR_RESTRICTED, indent); return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null); @@ -1157,22 +1162,22 @@ public class PgpKeyOperation { return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null); } - if (change.mDummyStrip || change.mDummyDivert != null) { + if (change.mDummyStrip || change.mSecurityTokenSerialNo != null) { // IT'S DANGEROUS~ // no really, it is. this operation irrevocably removes the private key data from the key if (change.mDummyStrip) { sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey()); } else { // the serial number must be 16 bytes in length - if (change.mDummyDivert.length != 16) { + if (change.mSecurityTokenSerialNo.length != 16) { log.add(LogType.MSG_MF_ERROR_DIVERT_SERIAL, indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId)); return new PgpEditKeyResult(PgpEditKeyResult.RESULT_ERROR, log, null); } log.add(LogType.MSG_MF_KEYTOCARD_FINISH, indent + 1, KeyFormattingUtils.convertKeyIdToHex(change.mKeyId), - Hex.toHexString(change.mDummyDivert, 8, 6)); - sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey(), change.mDummyDivert); + Hex.toHexString(change.mSecurityTokenSerialNo, 8, 6)); + sKey = PGPSecretKey.constructGnuDummyKey(sKey.getPublicKey(), change.mSecurityTokenSerialNo); } sKR = PGPSecretKeyRing.insertSecretKey(sKR, sKey); } @@ -1625,26 +1630,26 @@ public class PgpKeyOperation { && s2k.getProtectionMode() == S2K.GNU_PROTECTION_MODE_DIVERT_TO_CARD; } - private static boolean checkSmartCardCompatibility(PGPSecretKey key, OperationLog log, int indent) { + private static boolean checkSecurityTokenCompatibility(PGPSecretKey key, OperationLog log, int indent) { PGPPublicKey publicKey = key.getPublicKey(); int algorithm = publicKey.getAlgorithm(); if (algorithm != PublicKeyAlgorithmTags.RSA_ENCRYPT && algorithm != PublicKeyAlgorithmTags.RSA_SIGN && algorithm != PublicKeyAlgorithmTags.RSA_GENERAL) { - log.add(LogType.MSG_MF_ERROR_BAD_NFC_ALGO, indent + 1); + log.add(LogType.MSG_MF_ERROR_BAD_SECURITY_TOKEN_ALGO, indent + 1); return false; } // Key size must be 2048 int keySize = publicKey.getBitStrength(); if (keySize != 2048) { - log.add(LogType.MSG_MF_ERROR_BAD_NFC_SIZE, indent + 1); + log.add(LogType.MSG_MF_ERROR_BAD_SECURITY_TOKEN_SIZE, indent + 1); return false; } // Secret key parts must be available if (isDivertToCard(key) || isDummy(key)) { - log.add(LogType.MSG_MF_ERROR_BAD_NFC_STRIPPED, indent + 1); + log.add(LogType.MSG_MF_ERROR_BAD_SECURITY_TOKEN_STRIPPED, indent + 1); return false; } 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 a6d505763..15c83d4dc 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -59,7 +59,7 @@ import org.sufficientlysecure.keychain.remote.ui.SelectSignKeyIdActivity; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; import org.sufficientlysecure.keychain.ui.ImportKeysActivity; -import org.sufficientlysecure.keychain.ui.NfcOperationActivity; +import org.sufficientlysecure.keychain.ui.SecurityTokenOperationActivity; import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity; import org.sufficientlysecure.keychain.ui.ViewKeyActivity; import org.sufficientlysecure.keychain.util.InputData; @@ -191,12 +191,12 @@ public class OpenPgpService extends Service { case NFC_MOVE_KEY_TO_CARD: case NFC_DECRYPT: case NFC_SIGN: { - // build PendingIntent for YubiKey NFC operations - Intent intent = new Intent(context, NfcOperationActivity.class); + // build PendingIntent for Security Token NFC operations + Intent intent = new Intent(context, SecurityTokenOperationActivity.class); // pass params through to activity that it can be returned again later to repeat pgp operation - intent.putExtra(NfcOperationActivity.EXTRA_SERVICE_INTENT, data); - intent.putExtra(NfcOperationActivity.EXTRA_REQUIRED_INPUT, requiredInput); - intent.putExtra(NfcOperationActivity.EXTRA_CRYPTO_INPUT, cryptoInput); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_SERVICE_INTENT, data); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_REQUIRED_INPUT, requiredInput); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_CRYPTO_INPUT, cryptoInput); return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); } 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 606daabed..f9ab58f5b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/PassphraseCacheService.java @@ -365,6 +365,8 @@ public class PassphraseCacheService extends Service { CachedPassphrase cachedPassphrase; if (timeoutTtl == 0L) { cachedPassphrase = CachedPassphrase.getPassphraseLock(passphrase, primaryUserID); + } else if (timeoutTtl >= Integer.MAX_VALUE) { + cachedPassphrase = CachedPassphrase.getPassphraseNoTimeout(passphrase, primaryUserID); } else { cachedPassphrase = CachedPassphrase.getPassphraseTtlTimeout(passphrase, primaryUserID, timeoutTtl); @@ -427,7 +429,10 @@ public class PassphraseCacheService extends Service { // Stop all ttl alarms for (int i = 0; i < mPassphraseCache.size(); i++) { - am.cancel(buildIntent(this, mPassphraseCache.keyAt(i))); + CachedPassphrase cachedPassphrase = mPassphraseCache.valueAt(i); + if (cachedPassphrase.mTimeoutMode == TimeoutMode.TTL) { + am.cancel(buildIntent(this, mPassphraseCache.keyAt(i))); + } } mPassphraseCache.clear(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java index 6959fca56..472eb3b18 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java @@ -61,9 +61,9 @@ public class SaveKeyringParcel implements Parcelable { public ArrayList<String> mRevokeUserIds; public ArrayList<Long> mRevokeSubKeys; - // if these are non-null, PINs will be changed on the card - public Passphrase mCardPin; - public Passphrase mCardAdminPin; + // if these are non-null, PINs will be changed on the token + public Passphrase mSecurityTokenPin; + public Passphrase mSecurityTokenAdminPin; // private because they have to be set together with setUpdateOptions private boolean mUpload; @@ -89,8 +89,8 @@ public class SaveKeyringParcel implements Parcelable { mChangeSubKeys = new ArrayList<>(); mRevokeUserIds = new ArrayList<>(); mRevokeSubKeys = new ArrayList<>(); - mCardPin = null; - mCardAdminPin = null; + mSecurityTokenPin = null; + mSecurityTokenAdminPin = null; mUpload = false; mUploadAtomic = false; mKeyserver = null; @@ -128,7 +128,7 @@ public class SaveKeyringParcel implements Parcelable { for (SubkeyChange change : mChangeSubKeys) { if (change.mRecertify || change.mFlags != null || change.mExpiry != null - || change.mMoveKeyToCard) { + || change.mMoveKeyToSecurityToken) { return false; } } @@ -175,11 +175,11 @@ public class SaveKeyringParcel implements Parcelable { public boolean mRecertify; // if this flag is true, the subkey should be changed to a stripped key public boolean mDummyStrip; - // if this flag is true, the subkey should be moved to a card - public boolean mMoveKeyToCard; + // if this flag is true, the subkey should be moved to a security token + public boolean mMoveKeyToSecurityToken; // if this is non-null, the subkey will be changed to a divert-to-card - // key for the given serial number - public byte[] mDummyDivert; + // (security token) key for the given serial number + public byte[] mSecurityTokenSerialNo; public SubkeyChange(long keyId) { mKeyId = keyId; @@ -196,16 +196,17 @@ public class SaveKeyringParcel implements Parcelable { mExpiry = expiry; } - public SubkeyChange(long keyId, boolean dummyStrip, boolean moveKeyToCard) { + public SubkeyChange(long keyId, boolean dummyStrip, boolean moveKeyToSecurityToken) { this(keyId, null, null); // these flags are mutually exclusive! - if (dummyStrip && moveKeyToCard) { + if (dummyStrip && moveKeyToSecurityToken) { throw new AssertionError( - "cannot set strip and keytocard flags at the same time - this is a bug!"); + "cannot set strip and moveKeyToSecurityToken" + + " flags at the same time - this is a bug!"); } mDummyStrip = dummyStrip; - mMoveKeyToCard = moveKeyToCard; + mMoveKeyToSecurityToken = moveKeyToSecurityToken; } @Override @@ -214,8 +215,8 @@ public class SaveKeyringParcel implements Parcelable { out += "mFlags: " + mFlags + ", "; out += "mExpiry: " + mExpiry + ", "; out += "mDummyStrip: " + mDummyStrip + ", "; - out += "mMoveKeyToCard: " + mMoveKeyToCard + ", "; - out += "mDummyDivert: [" + (mDummyDivert == null ? 0 : mDummyDivert.length) + " bytes]"; + out += "mMoveKeyToSecurityToken: " + mMoveKeyToSecurityToken + ", "; + out += "mSecurityTokenSerialNo: [" + (mSecurityTokenSerialNo == null ? 0 : mSecurityTokenSerialNo.length) + " bytes]"; return out; } @@ -259,8 +260,8 @@ public class SaveKeyringParcel implements Parcelable { mRevokeUserIds = source.createStringArrayList(); mRevokeSubKeys = (ArrayList<Long>) source.readSerializable(); - mCardPin = source.readParcelable(Passphrase.class.getClassLoader()); - mCardAdminPin = source.readParcelable(Passphrase.class.getClassLoader()); + mSecurityTokenPin = source.readParcelable(Passphrase.class.getClassLoader()); + mSecurityTokenAdminPin = source.readParcelable(Passphrase.class.getClassLoader()); mUpload = source.readByte() != 0; mUploadAtomic = source.readByte() != 0; @@ -288,8 +289,8 @@ public class SaveKeyringParcel implements Parcelable { destination.writeStringList(mRevokeUserIds); destination.writeSerializable(mRevokeSubKeys); - destination.writeParcelable(mCardPin, flags); - destination.writeParcelable(mCardAdminPin, flags); + destination.writeParcelable(mSecurityTokenPin, flags); + destination.writeParcelable(mSecurityTokenAdminPin, flags); destination.writeByte((byte) (mUpload ? 1 : 0)); destination.writeByte((byte) (mUploadAtomic ? 1 : 0)); @@ -322,8 +323,8 @@ public class SaveKeyringParcel implements Parcelable { out += "mChangePrimaryUserId: " + mChangePrimaryUserId + "\n"; out += "mRevokeUserIds: " + mRevokeUserIds + "\n"; out += "mRevokeSubKeys: " + mRevokeSubKeys + "\n"; - out += "mCardPin: " + mCardPin + "\n"; - out += "mCardAdminPin: " + mCardAdminPin; + out += "mSecurityTokenPin: " + mSecurityTokenPin + "\n"; + out += "mSecurityTokenAdminPin: " + mSecurityTokenAdminPin; return out; } 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 a4163d7f9..925888813 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java @@ -28,7 +28,7 @@ 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.base.BaseSecurityTokenNfcActivity; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Preferences; @@ -36,16 +36,16 @@ import org.sufficientlysecure.keychain.util.Preferences; import java.io.IOException; import java.util.ArrayList; -public class CreateKeyActivity extends BaseNfcActivity { +public class CreateKeyActivity extends BaseSecurityTokenNfcActivity { public static final String EXTRA_NAME = "name"; public static final String EXTRA_EMAIL = "email"; public static final String EXTRA_FIRST_TIME = "first_time"; public static final String EXTRA_ADDITIONAL_EMAILS = "additional_emails"; public static final String EXTRA_PASSPHRASE = "passphrase"; - public static final String EXTRA_CREATE_YUBI_KEY = "create_yubi_key"; - public static final String EXTRA_YUBI_KEY_PIN = "yubi_key_pin"; - public static final String EXTRA_YUBI_KEY_ADMIN_PIN = "yubi_key_admin_pin"; + public static final String EXTRA_CREATE_SECURITY_TOKEN = "create_yubi_key"; + public static final String EXTRA_SECURITY_TOKEN_PIN = "yubi_key_pin"; + public static final String EXTRA_SECURITY_TOKEN_ADMIN_PIN = "yubi_key_admin_pin"; public static final String EXTRA_NFC_USER_ID = "nfc_user_id"; public static final String EXTRA_NFC_AID = "nfc_aid"; @@ -58,9 +58,9 @@ public class CreateKeyActivity extends BaseNfcActivity { ArrayList<String> mAdditionalEmails; Passphrase mPassphrase; boolean mFirstTime; - boolean mCreateYubiKey; - Passphrase mYubiKeyPin; - Passphrase mYubiKeyAdminPin; + boolean mCreateSecurityToken; + Passphrase mSecurityTokenPin; + Passphrase mSecurityTokenAdminPin; Fragment mCurrentFragment; @@ -93,9 +93,9 @@ public class CreateKeyActivity extends BaseNfcActivity { mAdditionalEmails = savedInstanceState.getStringArrayList(EXTRA_ADDITIONAL_EMAILS); mPassphrase = savedInstanceState.getParcelable(EXTRA_PASSPHRASE); mFirstTime = savedInstanceState.getBoolean(EXTRA_FIRST_TIME); - mCreateYubiKey = savedInstanceState.getBoolean(EXTRA_CREATE_YUBI_KEY); - mYubiKeyPin = savedInstanceState.getParcelable(EXTRA_YUBI_KEY_PIN); - mYubiKeyAdminPin = savedInstanceState.getParcelable(EXTRA_YUBI_KEY_ADMIN_PIN); + mCreateSecurityToken = savedInstanceState.getBoolean(EXTRA_CREATE_SECURITY_TOKEN); + mSecurityTokenPin = savedInstanceState.getParcelable(EXTRA_SECURITY_TOKEN_PIN); + mSecurityTokenAdminPin = savedInstanceState.getParcelable(EXTRA_SECURITY_TOKEN_ADMIN_PIN); mCurrentFragment = getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG); } else { @@ -105,7 +105,7 @@ public class CreateKeyActivity extends BaseNfcActivity { mName = intent.getStringExtra(EXTRA_NAME); mEmail = intent.getStringExtra(EXTRA_EMAIL); mFirstTime = intent.getBooleanExtra(EXTRA_FIRST_TIME, false); - mCreateYubiKey = intent.getBooleanExtra(EXTRA_CREATE_YUBI_KEY, false); + mCreateSecurityToken = intent.getBooleanExtra(EXTRA_CREATE_SECURITY_TOKEN, false); if (intent.hasExtra(EXTRA_NFC_FINGERPRINTS)) { byte[] nfcFingerprints = intent.getByteArrayExtra(EXTRA_NFC_FINGERPRINTS); @@ -113,13 +113,13 @@ public class CreateKeyActivity extends BaseNfcActivity { byte[] nfcAid = intent.getByteArrayExtra(EXTRA_NFC_AID); if (containsKeys(nfcFingerprints)) { - Fragment frag = CreateYubiKeyImportResetFragment.newInstance( + Fragment frag = CreateSecurityTokenImportResetFragment.newInstance( nfcFingerprints, nfcAid, nfcUserId); loadFragment(frag, FragAction.START); setTitle(R.string.title_import_keys); } else { - Fragment frag = CreateYubiKeyBlankFragment.newInstance(); + Fragment frag = CreateSecurityTokenBlankFragment.newInstance(); loadFragment(frag, FragAction.START); setTitle(R.string.title_manage_my_keys); } @@ -169,19 +169,19 @@ public class CreateKeyActivity extends BaseNfcActivity { Intent intent = new Intent(this, ViewKeyActivity.class); intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId)); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mScannedFingerprints); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_AID, mNfcAid); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_USER_ID, mNfcUserId); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_FINGERPRINTS, mScannedFingerprints); startActivity(intent); finish(); } catch (PgpKeyNotFoundException e) { - Fragment frag = CreateYubiKeyImportResetFragment.newInstance( + Fragment frag = CreateSecurityTokenImportResetFragment.newInstance( mScannedFingerprints, mNfcAid, mNfcUserId); loadFragment(frag, FragAction.TO_RIGHT); } } else { - Fragment frag = CreateYubiKeyBlankFragment.newInstance(); + Fragment frag = CreateSecurityTokenBlankFragment.newInstance(); loadFragment(frag, FragAction.TO_RIGHT); } } @@ -209,9 +209,9 @@ public class CreateKeyActivity extends BaseNfcActivity { outState.putStringArrayList(EXTRA_ADDITIONAL_EMAILS, mAdditionalEmails); outState.putParcelable(EXTRA_PASSPHRASE, mPassphrase); outState.putBoolean(EXTRA_FIRST_TIME, mFirstTime); - outState.putBoolean(EXTRA_CREATE_YUBI_KEY, mCreateYubiKey); - outState.putParcelable(EXTRA_YUBI_KEY_PIN, mYubiKeyPin); - outState.putParcelable(EXTRA_YUBI_KEY_ADMIN_PIN, mYubiKeyAdminPin); + outState.putBoolean(EXTRA_CREATE_SECURITY_TOKEN, mCreateSecurityToken); + outState.putParcelable(EXTRA_SECURITY_TOKEN_PIN, mSecurityTokenPin); + outState.putParcelable(EXTRA_SECURITY_TOKEN_ADMIN_PIN, mSecurityTokenAdminPin); } @Override diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java index acb768f55..b020a0dba 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyEmailFragment.java @@ -235,10 +235,10 @@ public class CreateKeyEmailFragment extends Fragment { CreateKeyActivity createKeyActivity = ((CreateKeyActivity) getActivity()); - if (createKeyActivity.mCreateYubiKey) { + if (createKeyActivity.mCreateSecurityToken) { hideKeyboard(); - CreateYubiKeyPinFragment frag = CreateYubiKeyPinFragment.newInstance(); + CreateSecurityTokenPinFragment frag = CreateSecurityTokenPinFragment.newInstance(); mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); } else { CreateKeyPassphraseFragment frag = CreateKeyPassphraseFragment.newInstance(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java index b79e4454d..b92645777 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java @@ -17,19 +17,19 @@ package org.sufficientlysecure.keychain.ui; - -import java.util.Date; -import java.util.Iterator; - import android.app.Activity; import android.content.Intent; import android.database.Cursor; -import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; @@ -55,6 +55,9 @@ import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Preferences; +import java.util.Date; +import java.util.Iterator; + public class CreateKeyFinalFragment extends Fragment { public static final int REQUEST_EDIT_KEY = 0x00008007; @@ -64,8 +67,8 @@ public class CreateKeyFinalFragment extends Fragment { CheckBox mUploadCheckbox; View mBackButton; View mCreateButton; - TextView mEditText; - View mEditButton; + View mCustomKeyLayout; + Button mCustomKeyRevertButton; SaveKeyringParcel mSaveKeyringParcel; @@ -97,8 +100,8 @@ public class CreateKeyFinalFragment extends Fragment { mUploadCheckbox = (CheckBox) view.findViewById(R.id.create_key_upload); mBackButton = view.findViewById(R.id.create_key_back_button); mCreateButton = view.findViewById(R.id.create_key_next_button); - mEditText = (TextView) view.findViewById(R.id.create_key_edit_text); - mEditButton = view.findViewById(R.id.create_key_edit_button); + mCustomKeyLayout = view.findViewById(R.id.custom_key_layout); + mCustomKeyRevertButton = (Button) view.findViewById(R.id.revert_key_configuration); CreateKeyActivity createKeyActivity = (CreateKeyActivity) getActivity(); @@ -126,22 +129,20 @@ public class CreateKeyFinalFragment extends Fragment { } }); - mBackButton.setOnClickListener(new View.OnClickListener() { + mCustomKeyRevertButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - CreateKeyActivity createKeyActivity = (CreateKeyActivity) getActivity(); - if (createKeyActivity != null) { - createKeyActivity.loadFragment(null, FragAction.TO_LEFT); - } + keyConfigRevertToDefault(); } }); - mEditButton.setOnClickListener(new View.OnClickListener() { + mBackButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent edit = new Intent(getActivity(), EditKeyActivity.class); - edit.putExtra(EditKeyActivity.EXTRA_SAVE_KEYRING_PARCEL, mSaveKeyringParcel); - startActivityForResult(edit, REQUEST_EDIT_KEY); + CreateKeyActivity createKeyActivity = (CreateKeyActivity) getActivity(); + if (createKeyActivity != null) { + createKeyActivity.loadFragment(null, FragAction.TO_LEFT); + } } }); @@ -154,6 +155,38 @@ public class CreateKeyFinalFragment extends Fragment { } @Override + public void onPrepareOptionsMenu(Menu menu) { + CreateKeyActivity createKeyActivity = (CreateKeyActivity) getActivity(); + + MenuItem editItem = menu.findItem(R.id.menu_create_key_edit); + editItem.setEnabled(!createKeyActivity.mCreateSecurityToken); + + super.onPrepareOptionsMenu(menu); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.create_key_final, menu); + + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + + case R.id.menu_create_key_edit: + Intent edit = new Intent(getActivity(), EditKeyActivity.class); + edit.putExtra(EditKeyActivity.EXTRA_SAVE_KEYRING_PARCEL, mSaveKeyringParcel); + startActivityForResult(edit, REQUEST_EDIT_KEY); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (mCreateOpHelper != null) { mCreateOpHelper.handleActivityResult(requestCode, resultCode, data); @@ -168,8 +201,9 @@ public class CreateKeyFinalFragment extends Fragment { switch (requestCode) { case REQUEST_EDIT_KEY: { if (resultCode == Activity.RESULT_OK) { - mSaveKeyringParcel = data.getParcelableExtra(EditKeyActivity.EXTRA_SAVE_KEYRING_PARCEL); - mEditText.setText(R.string.create_key_custom); + SaveKeyringParcel customKeyConfiguration = + data.getParcelableExtra(EditKeyActivity.EXTRA_SAVE_KEYRING_PARCEL); + keyConfigUseCustom(customKeyConfiguration); } break; } @@ -179,53 +213,29 @@ public class CreateKeyFinalFragment extends Fragment { } } + public void keyConfigUseCustom(SaveKeyringParcel customKeyConfiguration) { + mSaveKeyringParcel = customKeyConfiguration; + mCustomKeyLayout.setVisibility(View.VISIBLE); + } + + public void keyConfigRevertToDefault() { + Activity activity = getActivity(); + if (activity == null) { + return; + } + mSaveKeyringParcel = createDefaultSaveKeyringParcel((CreateKeyActivity) activity); + mCustomKeyLayout.setVisibility(View.GONE); + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - CreateKeyActivity createKeyActivity = (CreateKeyActivity) getActivity(); + // We have a menu item to show in action bar. + setHasOptionsMenu(true); if (mSaveKeyringParcel == null) { - mSaveKeyringParcel = new SaveKeyringParcel(); - - if (createKeyActivity.mCreateYubiKey) { - mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, - 2048, null, KeyFlags.SIGN_DATA | KeyFlags.CERTIFY_OTHER, 0L)); - mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, - 2048, null, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, 0L)); - mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, - 2048, null, KeyFlags.AUTHENTICATION, 0L)); - mEditText.setText(R.string.create_key_custom); - mEditButton.setEnabled(false); - - // use empty passphrase - mSaveKeyringParcel.mNewUnlock = new ChangeUnlockParcel(new Passphrase(), null); - } else { - mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, - 4096, null, KeyFlags.CERTIFY_OTHER, 0L)); - mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, - 4096, null, KeyFlags.SIGN_DATA, 0L)); - mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, - 4096, null, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, 0L)); - - mSaveKeyringParcel.mNewUnlock = createKeyActivity.mPassphrase != null - ? new ChangeUnlockParcel(createKeyActivity.mPassphrase, null) - : null; - } - String userId = KeyRing.createUserId( - new KeyRing.UserId(createKeyActivity.mName, createKeyActivity.mEmail, null) - ); - mSaveKeyringParcel.mAddUserIds.add(userId); - mSaveKeyringParcel.mChangePrimaryUserId = userId; - if (createKeyActivity.mAdditionalEmails != null - && createKeyActivity.mAdditionalEmails.size() > 0) { - for (String email : createKeyActivity.mAdditionalEmails) { - String thisUserId = KeyRing.createUserId( - new KeyRing.UserId(createKeyActivity.mName, email, null) - ); - mSaveKeyringParcel.mAddUserIds.add(thisUserId); - } - } + keyConfigRevertToDefault(); } // handle queued actions @@ -256,6 +266,49 @@ public class CreateKeyFinalFragment extends Fragment { } + private static SaveKeyringParcel createDefaultSaveKeyringParcel(CreateKeyActivity createKeyActivity) { + SaveKeyringParcel saveKeyringParcel = new SaveKeyringParcel(); + + if (createKeyActivity.mCreateSecurityToken) { + saveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, + 2048, null, KeyFlags.SIGN_DATA | KeyFlags.CERTIFY_OTHER, 0L)); + saveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, + 2048, null, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, 0L)); + saveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, + 2048, null, KeyFlags.AUTHENTICATION, 0L)); + + // use empty passphrase + saveKeyringParcel.mNewUnlock = new ChangeUnlockParcel(new Passphrase(), null); + } else { + saveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, + 4096, null, KeyFlags.CERTIFY_OTHER, 0L)); + saveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, + 4096, null, KeyFlags.SIGN_DATA, 0L)); + saveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Algorithm.RSA, + 4096, null, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, 0L)); + + saveKeyringParcel.mNewUnlock = createKeyActivity.mPassphrase != null + ? new ChangeUnlockParcel(createKeyActivity.mPassphrase, null) + : null; + } + String userId = KeyRing.createUserId( + new KeyRing.UserId(createKeyActivity.mName, createKeyActivity.mEmail, null) + ); + saveKeyringParcel.mAddUserIds.add(userId); + saveKeyringParcel.mChangePrimaryUserId = userId; + if (createKeyActivity.mAdditionalEmails != null + && createKeyActivity.mAdditionalEmails.size() > 0) { + for (String email : createKeyActivity.mAdditionalEmails) { + String thisUserId = KeyRing.createUserId( + new KeyRing.UserId(createKeyActivity.mName, email, null) + ); + saveKeyringParcel.mAddUserIds.add(thisUserId); + } + } + + return saveKeyringParcel; + } + private void createKey() { CreateKeyActivity activity = (CreateKeyActivity) getActivity(); if (activity == null) { @@ -263,7 +316,7 @@ public class CreateKeyFinalFragment extends Fragment { return; } - final boolean createYubiKey = activity.mCreateYubiKey; + final boolean createSecurityToken = activity.mCreateSecurityToken; CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult> createKeyCallback = new CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult>() { @@ -275,7 +328,7 @@ public class CreateKeyFinalFragment extends Fragment { @Override public void onCryptoOperationSuccess(EditKeyResult result) { - if (createYubiKey) { + if (createSecurityToken) { moveToCard(result); return; } @@ -327,19 +380,19 @@ public class CreateKeyFinalFragment extends Fragment { try { changeKeyringParcel = new SaveKeyringParcel(key.getMasterKeyId(), key.getFingerprint()); } catch (PgpKeyNotFoundException e) { - Log.e(Constants.TAG, "Key that should be moved to YubiKey not found in database!"); + Log.e(Constants.TAG, "Key that should be moved to Security Token not found in database!"); return; } // define subkeys that should be moved to the card Cursor cursor = activity.getContentResolver().query( KeychainContract.Keys.buildKeysUri(changeKeyringParcel.mMasterKeyId), - new String[] { KeychainContract.Keys.KEY_ID, }, null, null, null + new String[]{KeychainContract.Keys.KEY_ID,}, null, null, null ); try { while (cursor != null && cursor.moveToNext()) { long subkeyId = cursor.getLong(0); - changeKeyringParcel.getOrCreateSubkeyChange(subkeyId).mMoveKeyToCard = true; + changeKeyringParcel.getOrCreateSubkeyChange(subkeyId).mMoveKeyToSecurityToken = true; } } finally { if (cursor != null) { @@ -348,8 +401,8 @@ public class CreateKeyFinalFragment extends Fragment { } // define new PIN and Admin PIN for the card - changeKeyringParcel.mCardPin = activity.mYubiKeyPin; - changeKeyringParcel.mCardAdminPin = activity.mYubiKeyAdminPin; + changeKeyringParcel.mSecurityTokenPin = activity.mSecurityTokenPin; + changeKeyringParcel.mSecurityTokenAdminPin = activity.mSecurityTokenAdminPin; CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult> callback = new CryptoOperationHelper.Callback<SaveKeyringParcel, EditKeyResult>() { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java index 68ec0e8c8..c62ec97e7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java @@ -38,7 +38,7 @@ public class CreateKeyStartFragment extends Fragment { View mCreateKey; View mImportKey; - View mYubiKey; + View mSecurityToken; TextView mSkipOrCancel; public static final int REQUEST_CODE_IMPORT_KEY = 0x00007012; @@ -61,7 +61,7 @@ public class CreateKeyStartFragment extends Fragment { mCreateKey = view.findViewById(R.id.create_key_create_key_button); mImportKey = view.findViewById(R.id.create_key_import_button); - mYubiKey = view.findViewById(R.id.create_key_yubikey_button); + mSecurityToken = view.findViewById(R.id.create_key_security_token_button); mSkipOrCancel = (TextView) view.findViewById(R.id.create_key_cancel); if (mCreateKeyActivity.mFirstTime) { @@ -78,10 +78,10 @@ public class CreateKeyStartFragment extends Fragment { } }); - mYubiKey.setOnClickListener(new View.OnClickListener() { + mSecurityToken.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - CreateYubiKeyWaitFragment frag = new CreateYubiKeyWaitFragment(); + CreateSecurityTokenWaitFragment frag = new CreateSecurityTokenWaitFragment(); mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); } }); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyBlankFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenBlankFragment.java index 5b13dc88e..08441c199 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyBlankFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenBlankFragment.java @@ -27,7 +27,7 @@ import android.view.ViewGroup; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; -public class CreateYubiKeyBlankFragment extends Fragment { +public class CreateSecurityTokenBlankFragment extends Fragment { CreateKeyActivity mCreateKeyActivity; View mBackButton; @@ -36,8 +36,8 @@ public class CreateYubiKeyBlankFragment extends Fragment { /** * Creates new instance of this fragment */ - public static CreateYubiKeyBlankFragment newInstance() { - CreateYubiKeyBlankFragment frag = new CreateYubiKeyBlankFragment(); + public static CreateSecurityTokenBlankFragment newInstance() { + CreateSecurityTokenBlankFragment frag = new CreateSecurityTokenBlankFragment(); Bundle args = new Bundle(); @@ -81,7 +81,7 @@ public class CreateYubiKeyBlankFragment extends Fragment { } private void nextClicked() { - mCreateKeyActivity.mCreateYubiKey = true; + mCreateKeyActivity.mCreateSecurityToken = true; CreateKeyNameFragment frag = CreateKeyNameFragment.newInstance(); mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportResetFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenImportResetFragment.java index 5712f4452..81f782149 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportResetFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenImportResetFragment.java @@ -49,7 +49,7 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Preferences; -public class CreateYubiKeyImportResetFragment +public class CreateSecurityTokenImportResetFragment extends QueueingCryptoOperationFragment<ImportKeyringParcel, ImportKeyResult> implements NfcListenerFragment { @@ -61,10 +61,10 @@ public class CreateYubiKeyImportResetFragment CreateKeyActivity mCreateKeyActivity; - private byte[] mNfcFingerprints; - private byte[] mNfcAid; - private String mNfcUserId; - private String mNfcFingerprint; + private byte[] mTokenFingerprints; + private byte[] mTokenAid; + private String mTokenUserId; + private String mTokenFingerprint; private ImportKeysListFragment mListFragment; private TextView vSerNo; private TextView vUserId; @@ -79,7 +79,7 @@ public class CreateYubiKeyImportResetFragment public static Fragment newInstance(byte[] scannedFingerprints, byte[] nfcAid, String userId) { - CreateYubiKeyImportResetFragment frag = new CreateYubiKeyImportResetFragment(); + CreateSecurityTokenImportResetFragment frag = new CreateSecurityTokenImportResetFragment(); Bundle args = new Bundle(); args.putByteArray(ARG_FINGERPRINTS, scannedFingerprints); @@ -96,26 +96,26 @@ public class CreateYubiKeyImportResetFragment Bundle args = savedInstanceState != null ? savedInstanceState : getArguments(); - mNfcFingerprints = args.getByteArray(ARG_FINGERPRINTS); - mNfcAid = args.getByteArray(ARG_AID); - mNfcUserId = args.getString(ARG_USER_ID); + mTokenFingerprints = args.getByteArray(ARG_FINGERPRINTS); + mTokenAid = args.getByteArray(ARG_AID); + mTokenUserId = args.getString(ARG_USER_ID); byte[] fp = new byte[20]; - ByteBuffer.wrap(fp).put(mNfcFingerprints, 0, 20); - mNfcFingerprint = KeyFormattingUtils.convertFingerprintToHex(fp); + ByteBuffer.wrap(fp).put(mTokenFingerprints, 0, 20); + mTokenFingerprint = KeyFormattingUtils.convertFingerprintToHex(fp); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.create_yubi_key_import_reset_fragment, container, false); + View view = inflater.inflate(R.layout.create_security_token_import_reset_fragment, container, false); - vSerNo = (TextView) view.findViewById(R.id.yubikey_serno); - vUserId = (TextView) view.findViewById(R.id.yubikey_userid); + vSerNo = (TextView) view.findViewById(R.id.token_serno); + vUserId = (TextView) view.findViewById(R.id.token_userid); mNextButton = (TextView) view.findViewById(R.id.create_key_next_button); - mRadioImport = (RadioButton) view.findViewById(R.id.yubikey_decision_import); - mRadioReset = (RadioButton) view.findViewById(R.id.yubikey_decision_reset); - mResetWarning = view.findViewById(R.id.yubikey_import_reset_warning); + mRadioImport = (RadioButton) view.findViewById(R.id.token_decision_import); + mRadioReset = (RadioButton) view.findViewById(R.id.token_decision_reset); + mResetWarning = view.findViewById(R.id.token_import_reset_warning); View mBackButton = view.findViewById(R.id.create_key_back_button); mBackButton.setOnClickListener(new View.OnClickListener() { @@ -142,7 +142,7 @@ public class CreateYubiKeyImportResetFragment }); mListFragment = ImportKeysListFragment.newInstance(null, null, - "0x" + mNfcFingerprint, true, null); + "0x" + mTokenFingerprint, true, null); mRadioImport.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -154,7 +154,7 @@ public class CreateYubiKeyImportResetFragment mResetWarning.setVisibility(View.GONE); getFragmentManager().beginTransaction() - .replace(R.id.yubikey_import_fragment, mListFragment, "yubikey_import") + .replace(R.id.security_token_import_fragment, mListFragment, "token_import") .commit(); getFragmentManager().executePendingTransactions(); @@ -188,9 +188,9 @@ public class CreateYubiKeyImportResetFragment public void onSaveInstanceState(Bundle args) { super.onSaveInstanceState(args); - args.putByteArray(ARG_FINGERPRINTS, mNfcFingerprints); - args.putByteArray(ARG_AID, mNfcAid); - args.putString(ARG_USER_ID, mNfcUserId); + args.putByteArray(ARG_FINGERPRINTS, mTokenFingerprints); + args.putByteArray(ARG_AID, mTokenAid); + args.putString(ARG_USER_ID, mTokenUserId); } @Override @@ -200,25 +200,25 @@ public class CreateYubiKeyImportResetFragment } public void setData() { - String serno = Hex.toHexString(mNfcAid, 10, 4); - vSerNo.setText(getString(R.string.yubikey_serno, serno)); + String serno = Hex.toHexString(mTokenAid, 10, 4); + vSerNo.setText(getString(R.string.security_token_serial_no, serno)); - if (!mNfcUserId.isEmpty()) { - vUserId.setText(getString(R.string.yubikey_key_holder, mNfcUserId)); + if (!mTokenUserId.isEmpty()) { + vUserId.setText(getString(R.string.security_token_key_holder, mTokenUserId)); } else { - vUserId.setText(getString(R.string.yubikey_key_holder_not_set)); + vUserId.setText(getString(R.string.security_token_key_holder_not_set)); } } public void refreshSearch() { - mListFragment.loadNew(new ImportKeysListFragment.CloudLoaderState("0x" + mNfcFingerprint, + mListFragment.loadNew(new ImportKeysListFragment.CloudLoaderState("0x" + mTokenFingerprint, Preferences.getPreferences(getActivity()).getCloudSearchPrefs())); } public void importKey() { ArrayList<ParcelableKeyRing> keyList = new ArrayList<>(); - keyList.add(new ParcelableKeyRing(mNfcFingerprint, null)); + keyList.add(new ParcelableKeyRing(mTokenFingerprint, null)); mKeyList = keyList; mKeyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver(); @@ -230,11 +230,11 @@ public class CreateYubiKeyImportResetFragment } public void resetCard() { - Intent intent = new Intent(getActivity(), NfcOperationActivity.class); - intent.putExtra(NfcOperationActivity.EXTRA_SERVICE_INTENT, (Parcelable[]) null); + Intent intent = new Intent(getActivity(), SecurityTokenOperationActivity.class); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_SERVICE_INTENT, (Parcelable[]) null); RequiredInputParcel resetP = RequiredInputParcel.createNfcReset(); - intent.putExtra(NfcOperationActivity.EXTRA_REQUIRED_INPUT, resetP); - intent.putExtra(NfcOperationActivity.EXTRA_CRYPTO_INPUT, new CryptoInputParcel()); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_REQUIRED_INPUT, resetP); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_CRYPTO_INPUT, new CryptoInputParcel()); startActivityForResult(intent, REQUEST_CODE_RESET); } @@ -251,13 +251,13 @@ public class CreateYubiKeyImportResetFragment @Override public void doNfcInBackground() throws IOException { - mNfcFingerprints = mCreateKeyActivity.nfcGetFingerprints(); - mNfcAid = mCreateKeyActivity.nfcGetAid(); - mNfcUserId = mCreateKeyActivity.nfcGetUserId(); + mTokenFingerprints = mCreateKeyActivity.nfcGetFingerprints(); + mTokenAid = mCreateKeyActivity.nfcGetAid(); + mTokenUserId = mCreateKeyActivity.nfcGetUserId(); byte[] fp = new byte[20]; - ByteBuffer.wrap(fp).put(mNfcFingerprints, 0, 20); - mNfcFingerprint = KeyFormattingUtils.convertFingerprintToHex(fp); + ByteBuffer.wrap(fp).put(mTokenFingerprints, 0, 20); + mTokenFingerprint = KeyFormattingUtils.convertFingerprintToHex(fp); } @Override @@ -284,13 +284,13 @@ public class CreateYubiKeyImportResetFragment Activity activity = getActivity(); Intent intent = new Intent(activity, ViewKeyActivity.class); - // use the imported masterKeyId, not the one from the yubikey, because + // use the imported masterKeyId, not the one from the token, 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); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mNfcFingerprints); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_AID, mTokenAid); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_USER_ID, mTokenUserId); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_FINGERPRINTS, mTokenFingerprints); startActivity(intent); activity.finish(); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenPinFragment.java index 128383d6d..45cf7a665 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyPinFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenPinFragment.java @@ -37,7 +37,7 @@ import java.security.SecureRandom; import java.util.Arrays; import java.util.HashSet; -public class CreateYubiKeyPinFragment extends Fragment { +public class CreateSecurityTokenPinFragment extends Fragment { // view CreateKeyActivity mCreateKeyActivity; @@ -65,8 +65,8 @@ public class CreateYubiKeyPinFragment extends Fragment { /** * Creates new instance of this fragment */ - public static CreateYubiKeyPinFragment newInstance() { - CreateYubiKeyPinFragment frag = new CreateYubiKeyPinFragment(); + public static CreateSecurityTokenPinFragment newInstance() { + CreateSecurityTokenPinFragment frag = new CreateSecurityTokenPinFragment(); Bundle args = new Bundle(); frag.setArguments(args); @@ -109,7 +109,7 @@ public class CreateYubiKeyPinFragment extends Fragment { mBackButton = view.findViewById(R.id.create_key_back_button); mNextButton = view.findViewById(R.id.create_key_next_button); - if (mCreateKeyActivity.mYubiKeyPin == null) { + if (mCreateKeyActivity.mSecurityTokenPin == null) { new AsyncTask<Void, Void, Passphrase>() { @Override protected Passphrase doInBackground(Void... unused) { @@ -129,13 +129,13 @@ public class CreateYubiKeyPinFragment extends Fragment { @Override protected void onPostExecute(Passphrase adminPin) { - mCreateKeyActivity.mYubiKeyAdminPin = adminPin; + mCreateKeyActivity.mSecurityTokenAdminPin = adminPin; - mAdminPin.setText(mCreateKeyActivity.mYubiKeyAdminPin.toStringUnsafe()); + mAdminPin.setText(mCreateKeyActivity.mSecurityTokenAdminPin.toStringUnsafe()); } }.execute(); } else { - mAdminPin.setText(mCreateKeyActivity.mYubiKeyAdminPin.toStringUnsafe()); + mAdminPin.setText(mCreateKeyActivity.mSecurityTokenAdminPin.toStringUnsafe()); } mPin.requestFocus(); @@ -187,7 +187,7 @@ public class CreateYubiKeyPinFragment extends Fragment { return; } - mCreateKeyActivity.mYubiKeyPin = new Passphrase(mPin.getText().toString()); + mCreateKeyActivity.mSecurityTokenPin = new Passphrase(mPin.getText().toString()); CreateKeyFinalFragment frag = CreateKeyFinalFragment.newInstance(); hideKeyboard(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyWaitFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenWaitFragment.java index d45195512..a3ea38e40 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyWaitFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenWaitFragment.java @@ -28,14 +28,14 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction; -public class CreateYubiKeyWaitFragment extends Fragment { +public class CreateSecurityTokenWaitFragment extends Fragment { CreateKeyActivity mCreateKeyActivity; View mBackButton; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.create_yubi_key_wait_fragment, container, false); + View view = inflater.inflate(R.layout.create_security_token_wait_fragment, container, false); mBackButton = view.findViewById(R.id.create_key_back_button); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java index 1c72cdf41..2d94d0d93 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java @@ -435,9 +435,9 @@ public class EditKeyFragment extends QueueingCryptoOperationFragment<SaveKeyring } // toggle change.mDummyStrip = !change.mDummyStrip; - if (change.mDummyStrip && change.mMoveKeyToCard) { + if (change.mDummyStrip && change.mMoveKeyToSecurityToken) { // User had chosen to divert key, but now wants to strip it instead. - change.mMoveKeyToCard = false; + change.mMoveKeyToSecurityToken = false; } break; } @@ -479,8 +479,8 @@ public class EditKeyFragment extends QueueingCryptoOperationFragment<SaveKeyring // break; // } // // toggle -// change.mMoveKeyToCard = !change.mMoveKeyToCard; -// if (change.mMoveKeyToCard && change.mDummyStrip) { +// change.mMoveKeyToSecurityToken = !change.mMoveKeyToSecurityToken; +// if (change.mMoveKeyToSecurityToken && change.mDummyStrip) { // // User had chosen to strip key, but now wants to divert it. // change.mDummyStrip = false; // } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java index 1fe3df869..dce0d3aaf 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java @@ -36,7 +36,7 @@ import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.service.ImportKeyringParcel; -import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity; +import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenNfcActivity; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.Notify; @@ -48,7 +48,7 @@ import org.sufficientlysecure.keychain.util.Preferences; import java.io.IOException; import java.util.ArrayList; -public class ImportKeysActivity extends BaseNfcActivity +public class ImportKeysActivity extends BaseSecurityTokenNfcActivity implements CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> { public static final String ACTION_IMPORT_KEY = OpenKeychainIntents.IMPORT_KEY; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java index 7bd7bafcc..af60a1d9b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MainActivity.java @@ -40,11 +40,11 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.remote.ui.AppsListFragment; -import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity; +import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenNfcActivity; import org.sufficientlysecure.keychain.util.FabContainer; import org.sufficientlysecure.keychain.util.Preferences; -public class MainActivity extends BaseNfcActivity implements FabContainer, OnBackStackChangedListener { +public class MainActivity extends BaseSecurityTokenNfcActivity implements FabContainer, OnBackStackChangedListener { static final int ID_KEYS = 1; static final int ID_ENCRYPT_DECRYPT = 2; 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 2fcbbf6c2..b934f3d5f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java @@ -261,7 +261,7 @@ public class PassphraseDialogActivity extends FragmentActivity { hint = getString(R.string.label_pin); break; case DIVERT_TO_CARD: - message = getString(R.string.yubikey_pin_for, userId); + message = getString(R.string.security_token_pin_for, userId); hint = getString(R.string.label_pin); break; // special case: empty passphrase just returns the empty passphrase @@ -313,7 +313,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).useNumKeypadForSecurityTokenPin()) || keyType == CanonicalizedSecretKey.SecretKeyType.PIN) { mPassphraseEditText.setInputType(InputType.TYPE_CLASS_NUMBER); mPassphraseEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityTokenOperationActivity.java index 86b0a36d0..130dd6a79 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/NfcOperationActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SecurityTokenOperationActivity.java @@ -27,7 +27,6 @@ import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; -import android.widget.Toast; import android.widget.ViewAnimator; import org.sufficientlysecure.keychain.Constants; @@ -40,12 +39,11 @@ import org.sufficientlysecure.keychain.remote.CryptoInputParcelCacheService; import org.sufficientlysecure.keychain.service.PassphraseCacheService; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; -import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity; +import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenNfcActivity; import org.sufficientlysecure.keychain.ui.util.ThemeChanger; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.OrientationUtils; import org.sufficientlysecure.keychain.util.Passphrase; -import org.sufficientlysecure.keychain.util.Preferences; import java.io.IOException; import java.nio.ByteBuffer; @@ -56,7 +54,7 @@ import java.util.Arrays; * NFC devices. * For the full specs, see http://g10code.com/docs/openpgp-card-2.0.pdf */ -public class NfcOperationActivity extends BaseNfcActivity { +public class SecurityTokenOperationActivity extends BaseSecurityTokenNfcActivity { public static final String EXTRA_REQUIRED_INPUT = "required_input"; public static final String EXTRA_CRYPTO_INPUT = "crypto_input"; @@ -99,12 +97,12 @@ public class NfcOperationActivity extends BaseNfcActivity { mInputParcel = getIntent().getParcelableExtra(EXTRA_CRYPTO_INPUT); - setTitle(R.string.nfc_text); + setTitle(R.string.security_token_nfc_text); vAnimator = (ViewAnimator) findViewById(R.id.view_animator); vAnimator.setDisplayedChild(0); - vErrorText = (TextView) findViewById(R.id.nfc_activity_3_error_text); - vErrorTryAgainButton = (Button) findViewById(R.id.nfc_activity_3_error_try_again); + vErrorText = (TextView) findViewById(R.id.security_token_activity_3_error_text); + vErrorTryAgainButton = (Button) findViewById(R.id.security_token_activity_3_error_try_again); vErrorTryAgainButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -114,7 +112,7 @@ public class NfcOperationActivity extends BaseNfcActivity { vAnimator.setDisplayedChild(0); } }); - Button vCancel = (Button) findViewById(R.id.nfc_activity_0_cancel); + Button vCancel = (Button) findViewById(R.id.security_token_activity_0_cancel); vCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -136,13 +134,13 @@ public class NfcOperationActivity extends BaseNfcActivity { // obtain passphrase for this subkey if (mRequiredInput.mType != RequiredInputParcel.RequiredInputType.NFC_MOVE_KEY_TO_CARD && mRequiredInput.mType != RequiredInputParcel.RequiredInputType.NFC_RESET_CARD) { - obtainYubiKeyPin(mRequiredInput); + obtainSecurityTokenPin(mRequiredInput); } } @Override protected void initLayout() { - setContentView(R.layout.nfc_operation_activity); + setContentView(R.layout.security_token_operation_activity); } @Override @@ -186,7 +184,7 @@ public class NfcOperationActivity extends BaseNfcActivity { KeychainContract.KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(mRequiredInput.getMasterKeyId()) ); } catch (ProviderHelper.NotFoundException e) { - throw new IOException("Couldn't find subkey for key to card operation."); + throw new IOException("Couldn't find subkey for key to token operation."); } byte[] newPin = mRequiredInput.mInputData[0]; @@ -202,7 +200,7 @@ public class NfcOperationActivity extends BaseNfcActivity { long keyGenerationTimestampMillis = key.getCreationTime().getTime(); long keyGenerationTimestamp = keyGenerationTimestampMillis / 1000; byte[] timestampBytes = ByteBuffer.allocate(4).putInt((int) keyGenerationTimestamp).array(); - byte[] cardSerialNumber = Arrays.copyOf(nfcGetAid(), 16); + byte[] tokenSerialNumber = Arrays.copyOf(nfcGetAid(), 16); Passphrase passphrase; try { @@ -218,7 +216,7 @@ public class NfcOperationActivity extends BaseNfcActivity { nfcPutData(0xCE, timestampBytes); nfcPutData(0xC7, key.getFingerprint()); } else { - throw new IOException("Key slot occupied; card must be reset to put new signature key."); + throw new IOException("Key slot occupied; token must be reset to put new signature key."); } } else if (key.canEncrypt()) { if (shouldPutKey(key.getFingerprint(), 1)) { @@ -226,7 +224,7 @@ public class NfcOperationActivity extends BaseNfcActivity { nfcPutData(0xCF, timestampBytes); nfcPutData(0xC8, key.getFingerprint()); } else { - throw new IOException("Key slot occupied; card must be reset to put new decryption key."); + throw new IOException("Key slot occupied; token must be reset to put new decryption key."); } } else if (key.canAuthenticate()) { if (shouldPutKey(key.getFingerprint(), 2)) { @@ -234,14 +232,14 @@ public class NfcOperationActivity extends BaseNfcActivity { nfcPutData(0xD0, timestampBytes); nfcPutData(0xC9, key.getFingerprint()); } else { - throw new IOException("Key slot occupied; card must be reset to put new authentication key."); + throw new IOException("Key slot occupied; token must be reset to put new authentication key."); } } else { - throw new IOException("Inappropriate key flags for smart card key."); + throw new IOException("Inappropriate key flags for Security Token key."); } // TODO: Is this really used anywhere? - mInputParcel.addCryptoData(subkeyBytes, cardSerialNumber); + mInputParcel.addCryptoData(subkeyBytes, tokenSerialNumber); } // change PINs afterwards @@ -282,7 +280,7 @@ public class NfcOperationActivity extends BaseNfcActivity { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { - // check all 200ms if YubiKey has been taken away + // check all 200ms if Security Token has been taken away while (true) { if (isNfcConnected()) { try { @@ -307,7 +305,7 @@ public class NfcOperationActivity extends BaseNfcActivity { protected void onNfcError(String error) { pauseTagHandling(); - vErrorText.setText(error + "\n\n" + getString(R.string.nfc_try_again_text)); + vErrorText.setText(error + "\n\n" + getString(R.string.security_token_nfc_try_again_text)); vAnimator.setDisplayedChild(3); } @@ -321,17 +319,17 @@ public class NfcOperationActivity extends BaseNfcActivity { } private boolean shouldPutKey(byte[] fingerprint, int idx) throws IOException { - byte[] cardFingerprint = nfcGetMasterKeyFingerprint(idx); + byte[] tokenFingerprint = nfcGetMasterKeyFingerprint(idx); // Note: special case: This should not happen, but happens with // https://github.com/FluffyKaon/OpenPGP-Card, thus for now assume true - if (cardFingerprint == null) { + if (tokenFingerprint == null) { return true; } // Slot is empty, or contains this key already. PUT KEY operation is safe - if (Arrays.equals(cardFingerprint, BLANK_FINGERPRINT) || - Arrays.equals(cardFingerprint, fingerprint)) { + if (Arrays.equals(tokenFingerprint, BLANK_FINGERPRINT) || + Arrays.equals(tokenFingerprint, fingerprint)) { return true; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsCacheTTLFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsCacheTTLFragment.java index 1c769e7a2..b811d51b5 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsCacheTTLFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsCacheTTLFragment.java @@ -77,7 +77,6 @@ public class SettingsCacheTTLFragment extends Fragment { recyclerView.setAdapter(mAdapter); recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); - } private void savePreference() { 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 67487f2ca..03fc07936 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -84,7 +84,7 @@ import org.sufficientlysecure.keychain.service.ImportKeyringParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; import org.sufficientlysecure.keychain.ui.ViewKeyFragment.PostponeType; -import org.sufficientlysecure.keychain.ui.base.BaseNfcActivity; +import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenNfcActivity; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; @@ -102,13 +102,13 @@ import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Preferences; -public class ViewKeyActivity extends BaseNfcActivity implements +public class ViewKeyActivity extends BaseSecurityTokenNfcActivity implements LoaderManager.LoaderCallbacks<Cursor>, CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> { - 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"; + public static final String EXTRA_SECURITY_TOKEN_USER_ID = "security_token_user_id"; + public static final String EXTRA_SECURITY_TOKEN_AID = "security_token_aid"; + public static final String EXTRA_SECURITY_TOKEN_FINGERPRINTS = "security_token_fingerprints"; @Retention(RetentionPolicy.SOURCE) @IntDef({REQUEST_QR_FINGERPRINT, REQUEST_BACKUP, REQUEST_CERTIFY, REQUEST_DELETE}) @@ -159,7 +159,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements private boolean mIsRevoked = false; private boolean mIsExpired = false; - private boolean mShowYubikeyAfterCreation = false; + private boolean mShowSecurityTokenAfterCreation = false; private MenuItem mRefreshItem; private boolean mIsRefreshing; @@ -345,9 +345,9 @@ public class ViewKeyActivity extends BaseNfcActivity implements .commit(); } - // need to postpone loading of the yubikey fragment until after mMasterKeyId + // need to postpone loading of the security token fragment until after mMasterKeyId // is available, but we mark here that this should be done - mShowYubikeyAfterCreation = true; + mShowSecurityTokenAfterCreation = true; } @@ -656,69 +656,69 @@ public class ViewKeyActivity extends BaseNfcActivity implements @Override protected void onNfcPostExecute() { - long yubiKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(mNfcFingerprints); + long tokenId = KeyFormattingUtils.getKeyIdFromFingerprint(mNfcFingerprints); try { - // if the yubikey matches a subkey in any key + // if the security token matches a subkey in any key CachedPublicKeyRing ring = mProviderHelper.getCachedPublicKeyRing( - KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(yubiKeyId)); + KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(tokenId)); byte[] candidateFp = ring.getFingerprint(); - // if the master key of that key matches this one, just show the yubikey dialog + // if the master key of that key matches this one, just show the token dialog if (KeyFormattingUtils.convertFingerprintToHex(candidateFp).equals(mFingerprintString)) { - showYubiKeyFragment(mNfcFingerprints, mNfcUserId, mNfcAid); + showSecurityTokenFragment(mNfcFingerprints, mNfcUserId, mNfcAid); return; } // otherwise, offer to go to that key final long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(candidateFp); - Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG, + Notify.create(this, R.string.snack_security_token_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, mNfcAid); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mNfcFingerprints); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_AID, mNfcAid); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_USER_ID, mNfcUserId); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_FINGERPRINTS, mNfcFingerprints); startActivity(intent); finish(); } - }, R.string.snack_yubikey_view).show(); + }, R.string.snack_security_token_view).show(); // and if it's not found, offer import } catch (PgpKeyNotFoundException e) { - Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG, + Notify.create(this, R.string.snack_security_token_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, mNfcAid); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mNfcFingerprints); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_AID, mNfcAid); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_USER_ID, mNfcUserId); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_FINGERPRINTS, mNfcFingerprints); startActivity(intent); finish(); } - }, R.string.snack_yubikey_import).show(); + }, R.string.snack_security_token_import).show(); } } - public void showYubiKeyFragment( - final byte[] nfcFingerprints, final String nfcUserId, final byte[] nfcAid) { + public void showSecurityTokenFragment( + final byte[] tokenFingerprints, final String tokenUserId, final byte[] tokenAid) { new Handler().post(new Runnable() { @Override public void run() { - ViewKeyYubiKeyFragment frag = ViewKeyYubiKeyFragment.newInstance( - mMasterKeyId, nfcFingerprints, nfcUserId, nfcAid); + ViewKeySecurityTokenFragment frag = ViewKeySecurityTokenFragment.newInstance( + mMasterKeyId, tokenFingerprints, tokenUserId, tokenAid); FragmentManager manager = getSupportFragmentManager(); - manager.popBackStack("yubikey", FragmentManager.POP_BACK_STACK_INCLUSIVE); + manager.popBackStack("security_token", FragmentManager.POP_BACK_STACK_INCLUSIVE); manager.beginTransaction() - .addToBackStack("yubikey") + .addToBackStack("security_token") .replace(R.id.view_key_fragment, frag) // if this is called while the activity wasn't resumed, just forget it happened .commitAllowingStateLoss(); @@ -888,14 +888,14 @@ public class ViewKeyActivity extends BaseNfcActivity implements mFingerprint = data.getBlob(INDEX_FINGERPRINT); mFingerprintString = KeyFormattingUtils.convertFingerprintToHex(mFingerprint); - // if it wasn't shown yet, display yubikey fragment - if (mShowYubikeyAfterCreation && getIntent().hasExtra(EXTRA_NFC_AID)) { - mShowYubikeyAfterCreation = false; + // if it wasn't shown yet, display token fragment + if (mShowSecurityTokenAfterCreation && getIntent().hasExtra(EXTRA_SECURITY_TOKEN_AID)) { + mShowSecurityTokenAfterCreation = false; 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); + byte[] tokenFingerprints = intent.getByteArrayExtra(EXTRA_SECURITY_TOKEN_FINGERPRINTS); + String tokenUserId = intent.getStringExtra(EXTRA_SECURITY_TOKEN_USER_ID); + byte[] tokenAid = intent.getByteArrayExtra(EXTRA_SECURITY_TOKEN_AID); + showSecurityTokenFragment(tokenFingerprints, tokenUserId, tokenAid); } mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java index b10e5f8d4..b9a8259c1 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java @@ -61,10 +61,11 @@ public class ViewKeyAdvActivity extends BaseActivity implements protected Uri mDataUri; public static final String EXTRA_SELECTED_TAB = "selected_tab"; - public static final int TAB_SHARE = 0; - public static final int TAB_IDENTITIES = 1; - public static final int TAB_SUBKEYS = 2; - public static final int TAB_CERTS = 3; + public static final int TAB_START = 0; + public static final int TAB_SHARE = 1; + public static final int TAB_IDENTITIES = 2; + public static final int TAB_SUBKEYS = 3; + public static final int TAB_CERTS = 4; // view private ViewPager mViewPager; @@ -126,31 +127,35 @@ public class ViewKeyAdvActivity extends BaseActivity implements mViewPager.setAdapter(mTabAdapter); // keep track which of these are action mode enabled! - mTabsWithActionMode = new boolean[4]; + mTabsWithActionMode = new boolean[5]; + + mTabAdapter.addTab(ViewKeyAdvStartFragment.class, + null, getString(R.string.key_view_tab_start)); + mTabsWithActionMode[0] = false; Bundle shareBundle = new Bundle(); shareBundle.putParcelable(ViewKeyAdvShareFragment.ARG_DATA_URI, dataUri); mTabAdapter.addTab(ViewKeyAdvShareFragment.class, shareBundle, getString(R.string.key_view_tab_share)); - mTabsWithActionMode[0] = false; + mTabsWithActionMode[1] = false; Bundle userIdsBundle = new Bundle(); userIdsBundle.putParcelable(ViewKeyAdvUserIdsFragment.ARG_DATA_URI, dataUri); mTabAdapter.addTab(ViewKeyAdvUserIdsFragment.class, userIdsBundle, getString(R.string.section_user_ids)); - mTabsWithActionMode[1] = true; + mTabsWithActionMode[2] = true; Bundle keysBundle = new Bundle(); keysBundle.putParcelable(ViewKeyAdvSubkeysFragment.ARG_DATA_URI, dataUri); mTabAdapter.addTab(ViewKeyAdvSubkeysFragment.class, keysBundle, getString(R.string.key_view_tab_keys)); - mTabsWithActionMode[2] = true; + mTabsWithActionMode[3] = true; Bundle certsBundle = new Bundle(); certsBundle.putParcelable(ViewKeyAdvCertsFragment.ARG_DATA_URI, dataUri); mTabAdapter.addTab(ViewKeyAdvCertsFragment.class, certsBundle, getString(R.string.key_view_tab_certs)); - mTabsWithActionMode[3] = false; + mTabsWithActionMode[4] = false; // update layout after operations mSlidingTabLayout.setViewPager(mViewPager); @@ -158,7 +163,7 @@ public class ViewKeyAdvActivity extends BaseActivity implements // switch to tab selected by extra Intent intent = getIntent(); - int switchToTab = intent.getIntExtra(EXTRA_SELECTED_TAB, TAB_SHARE); + int switchToTab = intent.getIntExtra(EXTRA_SELECTED_TAB, TAB_START); mViewPager.setCurrentItem(switchToTab); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvStartFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvStartFragment.java new file mode 100644 index 000000000..f7e6f2b9c --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvStartFragment.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2015 Dominik Schürmann <dominik@dominikschuermann.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +package org.sufficientlysecure.keychain.ui; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.markdown4j.Markdown4jProcessor; +import org.sufficientlysecure.htmltextview.HtmlTextView; +import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.R; +import org.sufficientlysecure.keychain.util.Log; + +import java.io.IOException; + +public class ViewKeyAdvStartFragment extends Fragment { + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.view_key_adv_start_fragment, container, false); + + HtmlTextView textView = (HtmlTextView) + view.findViewById(R.id.view_key_adv_start_text); + + // load markdown from raw resource + try { + String html = new Markdown4jProcessor().process( + getActivity().getResources().openRawResource(R.raw.advanced)); + textView.setHtmlFromString(html, new HtmlTextView.LocalImageGetter()); + } catch (IOException e) { + Log.e(Constants.TAG, "IOException", e); + } + + return view; + } + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java index 14477723e..fc6db1b92 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java @@ -340,9 +340,9 @@ public class ViewKeyAdvSubkeysFragment extends LoaderFragment implements } // toggle change.mDummyStrip = !change.mDummyStrip; - if (change.mDummyStrip && change.mMoveKeyToCard) { + if (change.mDummyStrip && change.mMoveKeyToSecurityToken) { // User had chosen to divert key, but now wants to strip it instead. - change.mMoveKeyToCard = false; + change.mMoveKeyToSecurityToken = false; } break; } @@ -384,8 +384,8 @@ public class ViewKeyAdvSubkeysFragment extends LoaderFragment implements // break; // } // // toggle -// change.mMoveKeyToCard = !change.mMoveKeyToCard; -// if (change.mMoveKeyToCard && change.mDummyStrip) { +// change.mMoveKeyToSecurityToken = !change.mMoveKeyToSecurityToken; +// if (change.mMoveKeyToSecurityToken && change.mDummyStrip) { // // User had chosen to strip key, but now wants to divert it. // change.mDummyStrip = false; // } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeySecurityTokenFragment.java index f980f297b..48e41c7bb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyYubiKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeySecurityTokenFragment.java @@ -44,7 +44,7 @@ import org.sufficientlysecure.keychain.ui.base.QueueingCryptoOperationFragment; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -public class ViewKeyYubiKeyFragment +public class ViewKeySecurityTokenFragment extends QueueingCryptoOperationFragment<PromoteKeyringParcel, PromoteKeyResult> implements LoaderCallbacks<Cursor> { @@ -62,9 +62,9 @@ public class ViewKeyYubiKeyFragment private Button vButton; private TextView vStatus; - public static ViewKeyYubiKeyFragment newInstance(long masterKeyId, + public static ViewKeySecurityTokenFragment newInstance(long masterKeyId, byte[] fingerprints, String userId, byte[] aid) { - ViewKeyYubiKeyFragment frag = new ViewKeyYubiKeyFragment(); + ViewKeySecurityTokenFragment frag = new ViewKeySecurityTokenFragment(); Bundle args = new Bundle(); args.putLong(ARG_MASTER_KEY_ID, masterKeyId); @@ -76,7 +76,7 @@ public class ViewKeyYubiKeyFragment return frag; } - public ViewKeyYubiKeyFragment() { + public ViewKeySecurityTokenFragment() { super(null); } @@ -102,18 +102,18 @@ public class ViewKeyYubiKeyFragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup superContainer, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.view_key_yubikey, null); + View view = inflater.inflate(R.layout.view_key_security_token, null); - TextView vSerNo = (TextView) view.findViewById(R.id.yubikey_serno); - TextView vUserId = (TextView) view.findViewById(R.id.yubikey_userid); + TextView vSerNo = (TextView) view.findViewById(R.id.token_serno); + TextView vUserId = (TextView) view.findViewById(R.id.token_userid); String serno = Hex.toHexString(mCardAid, 10, 4); - vSerNo.setText(getString(R.string.yubikey_serno, serno)); + vSerNo.setText(getString(R.string.security_token_serial_no, serno)); if (!mUserId.isEmpty()) { - vUserId.setText(getString(R.string.yubikey_key_holder, mUserId)); + vUserId.setText(getString(R.string.security_token_key_holder, mUserId)); } else { - vUserId.setText(getString(R.string.yubikey_key_holder_not_set)); + vUserId.setText(getString(R.string.security_token_key_holder_not_set)); } vButton = (Button) view.findViewById(R.id.button_bind); @@ -124,7 +124,7 @@ public class ViewKeyYubiKeyFragment } }); - vStatus = (TextView) view.findViewById(R.id.yubikey_status); + vStatus = (TextView) view.findViewById(R.id.token_status); return view; } @@ -185,12 +185,12 @@ public class ViewKeyYubiKeyFragment if (allBound) { vButton.setVisibility(View.GONE); - vStatus.setText(R.string.yubikey_status_bound); + vStatus.setText(R.string.security_token_status_bound); } else { vButton.setVisibility(View.VISIBLE); vStatus.setText(noneBound - ? R.string.yubikey_status_unbound - : R.string.yubikey_status_partly); + ? R.string.security_token_status_unbound + : R.string.security_token_status_partly); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java index 84608f2dc..b5ef1d5e4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java @@ -174,7 +174,7 @@ public class SubkeysAdapter extends CursorAdapter { ? mSaveKeyringParcel.getSubkeyChange(keyId) : null; - if (change != null && (change.mDummyStrip || change.mMoveKeyToCard)) { + if (change != null && (change.mDummyStrip || change.mMoveKeyToSecurityToken)) { if (change.mDummyStrip) { algorithmStr.append(", "); final SpannableString boldStripped = new SpannableString( @@ -183,7 +183,7 @@ public class SubkeysAdapter extends CursorAdapter { boldStripped.setSpan(new StyleSpan(Typeface.BOLD), 0, boldStripped.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); algorithmStr.append(boldStripped); } - if (change.mMoveKeyToCard) { + if (change.mMoveKeyToSecurityToken) { algorithmStr.append(", "); final SpannableString boldDivert = new SpannableString( context.getString(R.string.key_divert) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenNfcActivity.java index 3e0bc7890..0f00fcd92 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseNfcActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenNfcActivity.java @@ -60,9 +60,8 @@ import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.Iso7816TLV; 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 abstract class BaseSecurityTokenNfcActivity extends BaseActivity { public static final int REQUEST_CODE_PIN = 1; @@ -113,9 +112,9 @@ public abstract class BaseNfcActivity extends BaseActivity { Intent intent = new Intent(this, ViewKeyActivity.class); intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyId)); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId); - intent.putExtra(ViewKeyActivity.EXTRA_NFC_FINGERPRINTS, mNfcFingerprints); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_AID, mNfcAid); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_USER_ID, mNfcUserId); + intent.putExtra(ViewKeyActivity.EXTRA_SECURITY_TOKEN_FINGERPRINTS, mNfcFingerprints); startActivity(intent); } catch (PgpKeyNotFoundException e) { Intent intent = new Intent(this, CreateKeyActivity.class); @@ -224,12 +223,12 @@ public abstract class BaseNfcActivity extends BaseActivity { private void handleNfcError(IOException e) { if (e instanceof TagLostException) { - onNfcError(getString(R.string.error_nfc_tag_lost)); + onNfcError(getString(R.string.security_token_error_tag_lost)); return; } if (e instanceof IsoDepNotSupportedException) { - onNfcError(getString(R.string.error_nfc_iso_dep_not_supported)); + onNfcError(getString(R.string.security_token_error_iso_dep_not_supported)); return; } @@ -244,69 +243,69 @@ public abstract class BaseNfcActivity extends BaseActivity { if ((status & (short) 0xFFF0) == 0x63C0) { int tries = status & 0x000F; // hook to do something different when PIN is wrong - onNfcPinError(getResources().getQuantityString(R.plurals.error_pin, tries, tries)); + onNfcPinError(getResources().getQuantityString(R.plurals.security_token_error_pin, tries, tries)); return; } // Otherwise, all status codes are fixed values. switch (status) { // These errors should not occur in everyday use; if they are returned, it means we - // made a mistake sending data to the card, or the card is misbehaving. + // made a mistake sending data to the token, or the token is misbehaving. case 0x6A80: { - onNfcError(getString(R.string.error_nfc_bad_data)); + onNfcError(getString(R.string.security_token_error_bad_data)); break; } case 0x6883: { - onNfcError(getString(R.string.error_nfc_chaining_error)); + onNfcError(getString(R.string.security_token_error_chaining_error)); break; } case 0x6B00: { - onNfcError(getString(R.string.error_nfc_header, "P1/P2")); + onNfcError(getString(R.string.security_token_error_header, "P1/P2")); break; } case 0x6D00: { - onNfcError(getString(R.string.error_nfc_header, "INS")); + onNfcError(getString(R.string.security_token_error_header, "INS")); break; } case 0x6E00: { - onNfcError(getString(R.string.error_nfc_header, "CLA")); + onNfcError(getString(R.string.security_token_error_header, "CLA")); break; } // These error conditions are more likely to be experienced by an end user. case 0x6285: { - onNfcError(getString(R.string.error_nfc_terminated)); + onNfcError(getString(R.string.security_token_error_terminated)); break; } case 0x6700: { - onNfcPinError(getString(R.string.error_nfc_wrong_length)); + onNfcPinError(getString(R.string.security_token_error_wrong_length)); break; } case 0x6982: { - onNfcError(getString(R.string.error_nfc_security_not_satisfied)); + onNfcError(getString(R.string.security_token_error_security_not_satisfied)); break; } case 0x6983: { - onNfcError(getString(R.string.error_nfc_authentication_blocked)); + onNfcError(getString(R.string.security_token_error_authentication_blocked)); break; } case 0x6985: { - onNfcError(getString(R.string.error_nfc_conditions_not_satisfied)); + onNfcError(getString(R.string.security_token_error_conditions_not_satisfied)); break; } // 6A88 is "Not Found" in the spec, but Yubikey also returns 6A83 for this in some cases. case 0x6A88: case 0x6A83: { - onNfcError(getString(R.string.error_nfc_data_not_found)); + onNfcError(getString(R.string.security_token_error_data_not_found)); break; } // 6F00 is a JavaCard proprietary status code, SW_UNKNOWN, and usually represents an - // unhandled exception on the smart card. + // unhandled exception on the security token. case 0x6F00: { - onNfcError(getString(R.string.error_nfc_unknown)); + onNfcError(getString(R.string.security_token_error_unknown)); break; } default: { - onNfcError(getString(R.string.error_nfc, e.getMessage())); + onNfcError(getString(R.string.security_token_error, e.getMessage())); break; } } @@ -335,7 +334,7 @@ public abstract class BaseNfcActivity extends BaseActivity { enableNfcForegroundDispatch(); } - protected void obtainYubiKeyPin(RequiredInputParcel requiredInput) { + protected void obtainSecurityTokenPin(RequiredInputParcel requiredInput) { try { Passphrase passphrase = PassphraseCacheService.getCachedPassphrase(this, @@ -471,7 +470,7 @@ public abstract class BaseNfcActivity extends BaseActivity { return fptlv.mV; } - /** Return the PW Status Bytes from the card. This is a simple DO; no TLV decoding needed. + /** Return the PW Status Bytes from the token. This is a simple DO; no TLV decoding needed. * * @return Seven bytes in fixed format, plus 0x9000 status word at the end. */ @@ -697,7 +696,7 @@ public abstract class BaseNfcActivity extends BaseActivity { } } - // reactivate card! + // reactivate token! String reactivate1 = "00" + "e6" + "00" + "00"; String reactivate2 = "00" + "44" + "00" + "00"; String response1 = nfcCommunicate(reactivate1); @@ -722,7 +721,7 @@ public abstract class BaseNfcActivity extends BaseActivity { } /** Modifies the user's PW1 or PW3. Before sending, the new PIN will be validated for - * conformance to the card's requirements for key length. + * conformance to the token's requirements for key length. * * @param pw For PW1, this is 0x81. For PW3 (Admin PIN), mode is 0x83. * @param newPin The new PW1 or PW3. @@ -767,7 +766,7 @@ public abstract class BaseNfcActivity extends BaseActivity { } /** - * Stores a data object on the card. Automatically validates the proper PIN for the operation. + * Stores a data object on the token. Automatically validates the proper PIN for the operation. * Supported for all data objects < 255 bytes in length. Only the cardholder certificate * (0x7F21) can exceed this length. * @@ -800,9 +799,9 @@ public abstract class BaseNfcActivity extends BaseActivity { } /** - * Puts a key on the card in the given slot. + * Puts a key on the token in the given slot. * - * @param slot The slot on the card where the key should be stored: + * @param slot The slot on the token where the key should be stored: * 0xB6: Signature Key * 0xB8: Decipherment Key * 0xA4: Authentication Key @@ -823,12 +822,12 @@ public abstract class BaseNfcActivity extends BaseActivity { // Shouldn't happen; the UI should block the user from getting an incompatible key this far. if (crtSecretKey.getModulus().bitLength() > 2048) { - throw new IOException("Key too large to export to smart card."); + throw new IOException("Key too large to export to Security Token."); } // Should happen only rarely; all GnuPG keys since 2006 use public exponent 65537. if (!crtSecretKey.getPublicExponent().equals(new BigInteger("65537"))) { - throw new IOException("Invalid public exponent for smart card key."); + throw new IOException("Invalid public exponent for smart Security Token."); } if (!mPw3Validated) { @@ -884,7 +883,7 @@ public abstract class BaseNfcActivity extends BaseActivity { String putKeyCommand = "10DB3FFF"; String lastPutKeyCommand = "00DB3FFF"; - // Now we're ready to communicate with the card. + // Now we're ready to communicate with the token. offset = 0; String response; while(offset < dataToSend.length) { @@ -903,7 +902,7 @@ public abstract class BaseNfcActivity extends BaseActivity { } if (!response.endsWith("9000")) { - throw new CardException("Key export to card failed", parseCardStatus(response)); + throw new CardException("Key export to Security Token failed", parseCardStatus(response)); } } @@ -914,7 +913,7 @@ public abstract class BaseNfcActivity extends BaseActivity { /** * Parses out the status word from a JavaCard response string. * - * @param response A hex string with the response from the card + * @param response A hex string with the response from the token * @return A short indicating the SW1/SW2, or 0 if a status could not be determined. */ short parseCardStatus(String response) { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java index 7ab9c7237..451065d6b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/CryptoOperationHelper.java @@ -39,7 +39,7 @@ import org.sufficientlysecure.keychain.service.KeychainService; import org.sufficientlysecure.keychain.service.ServiceProgressHandler; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; -import org.sufficientlysecure.keychain.ui.NfcOperationActivity; +import org.sufficientlysecure.keychain.ui.SecurityTokenOperationActivity; import org.sufficientlysecure.keychain.ui.OrbotRequiredDialogActivity; import org.sufficientlysecure.keychain.ui.PassphraseDialogActivity; import org.sufficientlysecure.keychain.ui.RetryUploadDialogActivity; @@ -133,9 +133,9 @@ public class CryptoOperationHelper<T extends Parcelable, S extends OperationResu case NFC_MOVE_KEY_TO_CARD: case NFC_DECRYPT: case NFC_SIGN: { - Intent intent = new Intent(activity, NfcOperationActivity.class); - intent.putExtra(NfcOperationActivity.EXTRA_REQUIRED_INPUT, requiredInput); - intent.putExtra(NfcOperationActivity.EXTRA_CRYPTO_INPUT, cryptoInputParcel); + Intent intent = new Intent(activity, SecurityTokenOperationActivity.class); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_REQUIRED_INPUT, requiredInput); + intent.putExtra(SecurityTokenOperationActivity.EXTRA_CRYPTO_INPUT, cryptoInputParcel); startActivityForResult(intent, REQUEST_CODE_NFC); return; } @@ -212,7 +212,7 @@ public class CryptoOperationHelper<T extends Parcelable, S extends OperationResu case REQUEST_CODE_NFC: { if (resultCode == Activity.RESULT_OK && data != null) { CryptoInputParcel cryptoInput = - data.getParcelableExtra(NfcOperationActivity.RESULT_CRYPTO_INPUT); + data.getParcelableExtra(SecurityTokenOperationActivity.RESULT_CRYPTO_INPUT); cryptoOperation(cryptoInput); } break; 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 75a7dcaba..b3d679a0e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -124,8 +124,8 @@ public class Preferences { return mSharedPreferences.getBoolean(Constants.Pref.FIRST_TIME, true); } - public boolean useNumKeypadForYubiKeyPin() { - return mSharedPreferences.getBoolean(Pref.USE_NUMKEYPAD_FOR_YUBIKEY_PIN, true); + public boolean useNumKeypadForSecurityTokenPin() { + return mSharedPreferences.getBoolean(Pref.USE_NUMKEYPAD_FOR_SECURITY_TOKEN_PIN, true); } public void setFirstTime(boolean value) { @@ -322,11 +322,13 @@ public class Preferences { static { HashMap<Integer,Integer> cacheTtlNames = new HashMap<>(); cacheTtlNames.put(0, R.string.cache_ttl_lock_screen); - cacheTtlNames.put(60 * 5, R.string.cache_ttl_five_minutes); + cacheTtlNames.put(60 * 10, R.string.cache_ttl_ten_minutes); + cacheTtlNames.put(60 * 30, R.string.cache_ttl_thirty_minutes); cacheTtlNames.put(60 * 60, R.string.cache_ttl_one_hour); cacheTtlNames.put(60 * 60 * 3, R.string.cache_ttl_three_hours); cacheTtlNames.put(60 * 60 * 24, R.string.cache_ttl_one_day); cacheTtlNames.put(60 * 60 * 24 * 3, R.string.cache_ttl_three_days); + cacheTtlNames.put(Integer.MAX_VALUE, R.string.cache_ttl_forever); CACHE_TTL_NAMES = Collections.unmodifiableMap(cacheTtlNames); CACHE_TTLS = new ArrayList<>(CacheTTLPrefs.CACHE_TTL_NAMES.keySet()); @@ -352,7 +354,7 @@ public class Preferences { public static CacheTTLPrefs getDefault() { ArrayList<String> ttlStrings = new ArrayList<>(); - ttlStrings.add(Integer.toString(60 * 5)); + ttlStrings.add(Integer.toString(0)); ttlStrings.add(Integer.toString(60 * 60)); ttlStrings.add(Integer.toString(60 * 60 * 24)); return new CacheTTLPrefs(ttlStrings); |