mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-12-25 00:18:51 -05:00
Use PublicKeyAlgorithmTags instead of homebrew choices constants, fix expiry selection for adding new subkeys
This commit is contained in:
parent
39380a3617
commit
f8a222983e
@ -92,13 +92,6 @@ public final class Constants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final class choice {
|
public static final class choice {
|
||||||
public static final class algorithm {
|
|
||||||
// TODO: legacy reasons :/ better: PublicKeyAlgorithmTags
|
|
||||||
public static final int dsa = 0x21070001;
|
|
||||||
public static final int elgamal = 0x21070002;
|
|
||||||
public static final int rsa = 0x21070003;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final class compression {
|
public static final class compression {
|
||||||
// TODO: legacy reasons :/ better: CompressionAlgorithmTags.UNCOMPRESSED
|
// TODO: legacy reasons :/ better: CompressionAlgorithmTags.UNCOMPRESSED
|
||||||
public static final int none = 0x21070001;
|
public static final int none = 0x21070001;
|
||||||
|
@ -24,7 +24,7 @@ import android.text.Spannable;
|
|||||||
import android.text.SpannableStringBuilder;
|
import android.text.SpannableStringBuilder;
|
||||||
import android.text.style.ForegroundColorSpan;
|
import android.text.style.ForegroundColorSpan;
|
||||||
|
|
||||||
import org.spongycastle.openpgp.PGPPublicKey;
|
import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
|
||||||
import org.spongycastle.util.encoders.Hex;
|
import org.spongycastle.util.encoders.Hex;
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
@ -37,9 +37,6 @@ import java.util.Locale;
|
|||||||
|
|
||||||
public class PgpKeyHelper {
|
public class PgpKeyHelper {
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Only used in HkpKeyServer. Get rid of this one!
|
|
||||||
*/
|
|
||||||
public static String getAlgorithmInfo(int algorithm) {
|
public static String getAlgorithmInfo(int algorithm) {
|
||||||
return getAlgorithmInfo(null, algorithm, 0);
|
return getAlgorithmInfo(null, algorithm, 0);
|
||||||
}
|
}
|
||||||
@ -55,25 +52,25 @@ public class PgpKeyHelper {
|
|||||||
String algorithmStr;
|
String algorithmStr;
|
||||||
|
|
||||||
switch (algorithm) {
|
switch (algorithm) {
|
||||||
case PGPPublicKey.RSA_ENCRYPT:
|
case PublicKeyAlgorithmTags.RSA_ENCRYPT:
|
||||||
case PGPPublicKey.RSA_GENERAL:
|
case PublicKeyAlgorithmTags.RSA_GENERAL:
|
||||||
case PGPPublicKey.RSA_SIGN: {
|
case PublicKeyAlgorithmTags.RSA_SIGN: {
|
||||||
algorithmStr = "RSA";
|
algorithmStr = "RSA";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PGPPublicKey.DSA: {
|
case PublicKeyAlgorithmTags.DSA: {
|
||||||
algorithmStr = "DSA";
|
algorithmStr = "DSA";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PGPPublicKey.ELGAMAL_ENCRYPT:
|
case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT:
|
||||||
case PGPPublicKey.ELGAMAL_GENERAL: {
|
case PublicKeyAlgorithmTags.ELGAMAL_GENERAL: {
|
||||||
algorithmStr = "ElGamal";
|
algorithmStr = "ElGamal";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PGPPublicKey.ECDSA:
|
case PublicKeyAlgorithmTags.ECDSA:
|
||||||
case PGPPublicKey.ECDH: {
|
case PublicKeyAlgorithmTags.ECDH: {
|
||||||
algorithmStr = "ECC";
|
algorithmStr = "ECC";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -82,7 +79,6 @@ public class PgpKeyHelper {
|
|||||||
if (context != null) {
|
if (context != null) {
|
||||||
algorithmStr = context.getResources().getString(R.string.unknown_algorithm);
|
algorithmStr = context.getResources().getString(R.string.unknown_algorithm);
|
||||||
} else {
|
} else {
|
||||||
// TODO
|
|
||||||
algorithmStr = "unknown";
|
algorithmStr = "unknown";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.pgp;
|
|||||||
|
|
||||||
import org.spongycastle.bcpg.CompressionAlgorithmTags;
|
import org.spongycastle.bcpg.CompressionAlgorithmTags;
|
||||||
import org.spongycastle.bcpg.HashAlgorithmTags;
|
import org.spongycastle.bcpg.HashAlgorithmTags;
|
||||||
|
import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
|
||||||
import org.spongycastle.bcpg.SymmetricKeyAlgorithmTags;
|
import org.spongycastle.bcpg.SymmetricKeyAlgorithmTags;
|
||||||
import org.spongycastle.bcpg.sig.KeyFlags;
|
import org.spongycastle.bcpg.sig.KeyFlags;
|
||||||
import org.spongycastle.jce.spec.ElGamalParameterSpec;
|
import org.spongycastle.jce.spec.ElGamalParameterSpec;
|
||||||
@ -138,7 +139,7 @@ public class PgpKeyOperation {
|
|||||||
KeyPairGenerator keyGen;
|
KeyPairGenerator keyGen;
|
||||||
|
|
||||||
switch (algorithmChoice) {
|
switch (algorithmChoice) {
|
||||||
case Constants.choice.algorithm.dsa: {
|
case PublicKeyAlgorithmTags.DSA: {
|
||||||
progress(R.string.progress_generating_dsa, 30);
|
progress(R.string.progress_generating_dsa, 30);
|
||||||
keyGen = KeyPairGenerator.getInstance("DSA", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
keyGen = KeyPairGenerator.getInstance("DSA", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
||||||
keyGen.initialize(keySize, new SecureRandom());
|
keyGen.initialize(keySize, new SecureRandom());
|
||||||
@ -146,7 +147,7 @@ public class PgpKeyOperation {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Constants.choice.algorithm.elgamal: {
|
case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT: {
|
||||||
progress(R.string.progress_generating_elgamal, 30);
|
progress(R.string.progress_generating_elgamal, 30);
|
||||||
keyGen = KeyPairGenerator.getInstance("ElGamal", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
keyGen = KeyPairGenerator.getInstance("ElGamal", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
||||||
BigInteger p = Primes.getBestPrime(keySize);
|
BigInteger p = Primes.getBestPrime(keySize);
|
||||||
@ -159,7 +160,7 @@ public class PgpKeyOperation {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case Constants.choice.algorithm.rsa: {
|
case PublicKeyAlgorithmTags.RSA_GENERAL: {
|
||||||
progress(R.string.progress_generating_rsa, 30);
|
progress(R.string.progress_generating_rsa, 30);
|
||||||
keyGen = KeyPairGenerator.getInstance("RSA", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
keyGen = KeyPairGenerator.getInstance("RSA", Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
||||||
keyGen.initialize(keySize, new SecureRandom());
|
keyGen.initialize(keySize, new SecureRandom());
|
||||||
@ -217,7 +218,7 @@ public class PgpKeyOperation {
|
|||||||
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
|
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (add.mAlgorithm == Constants.choice.algorithm.elgamal) {
|
if (add.mAlgorithm == PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT) {
|
||||||
log.add(LogLevel.ERROR, LogType.MSG_CR_ERROR_MASTER_ELGAMAL, indent);
|
log.add(LogLevel.ERROR, LogType.MSG_CR_ERROR_MASTER_ELGAMAL, indent);
|
||||||
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
|
return new EditKeyResult(EditKeyResult.RESULT_ERROR, log, null);
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,9 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
|
||||||
import org.spongycastle.bcpg.sig.KeyFlags;
|
import org.spongycastle.bcpg.sig.KeyFlags;
|
||||||
|
import org.spongycastle.openpgp.PGPPublicKey;
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.helper.Preferences;
|
import org.sufficientlysecure.keychain.helper.Preferences;
|
||||||
@ -169,9 +171,9 @@ public class CreateKeyFinalFragment extends Fragment {
|
|||||||
Bundle data = new Bundle();
|
Bundle data = new Bundle();
|
||||||
|
|
||||||
SaveKeyringParcel parcel = new SaveKeyringParcel();
|
SaveKeyringParcel parcel = new SaveKeyringParcel();
|
||||||
parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.CERTIFY_OTHER, null));
|
parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(PublicKeyAlgorithmTags.RSA_GENERAL, 4096, KeyFlags.CERTIFY_OTHER, null));
|
||||||
parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.SIGN_DATA, null));
|
parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(PublicKeyAlgorithmTags.RSA_GENERAL, 4096, KeyFlags.SIGN_DATA, null));
|
||||||
parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, null));
|
parcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(PublicKeyAlgorithmTags.RSA_GENERAL, 4096, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, null));
|
||||||
String userId = KeyRing.createUserId(mName, mEmail, null);
|
String userId = KeyRing.createUserId(mName, mEmail, null);
|
||||||
parcel.mAddUserIds.add(userId);
|
parcel.mAddUserIds.add(userId);
|
||||||
parcel.mChangePrimaryUserId = userId;
|
parcel.mChangePrimaryUserId = userId;
|
||||||
|
@ -397,15 +397,16 @@ public class EditKeyFragment extends LoaderFragment implements
|
|||||||
|
|
||||||
private void editSubkeyExpiry(final int position) {
|
private void editSubkeyExpiry(final int position) {
|
||||||
final long keyId = mSubkeysAdapter.getKeyId(position);
|
final long keyId = mSubkeysAdapter.getKeyId(position);
|
||||||
final long creationDate = mSubkeysAdapter.getCreationDate(position);
|
final Long creationDate = mSubkeysAdapter.getCreationDate(position);
|
||||||
final long expiryDate = mSubkeysAdapter.getExpiryDate(position);
|
final Long expiryDate = mSubkeysAdapter.getExpiryDate(position);
|
||||||
|
|
||||||
Handler returnHandler = new Handler() {
|
Handler returnHandler = new Handler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(Message message) {
|
public void handleMessage(Message message) {
|
||||||
switch (message.what) {
|
switch (message.what) {
|
||||||
case EditSubkeyExpiryDialogFragment.MESSAGE_NEW_EXPIRY_DATE:
|
case EditSubkeyExpiryDialogFragment.MESSAGE_NEW_EXPIRY_DATE:
|
||||||
long expiry = message.getData().getLong(EditSubkeyExpiryDialogFragment.MESSAGE_DATA_EXPIRY_DATE);
|
Long expiry = (Long) message.getData().
|
||||||
|
getSerializable(EditSubkeyExpiryDialogFragment.MESSAGE_DATA_EXPIRY_DATE);
|
||||||
Log.d(Constants.TAG, "new expiry: " + expiry);
|
Log.d(Constants.TAG, "new expiry: " + expiry);
|
||||||
mSaveKeyringParcel.getOrCreateSubkeyChange(keyId).mExpiry = expiry;
|
mSaveKeyringParcel.getOrCreateSubkeyChange(keyId).mExpiry = expiry;
|
||||||
break;
|
break;
|
||||||
@ -464,7 +465,7 @@ public class EditKeyFragment extends LoaderFragment implements
|
|||||||
new AddSubkeyDialogFragment.OnAlgorithmSelectedListener() {
|
new AddSubkeyDialogFragment.OnAlgorithmSelectedListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onAlgorithmSelected(SaveKeyringParcel.SubkeyAdd newSubkey) {
|
public void onAlgorithmSelected(SaveKeyringParcel.SubkeyAdd newSubkey) {
|
||||||
mSubkeysAddedAdapter.add(new SaveKeyringParcel.SubkeyAdd(Constants.choice.algorithm.rsa, 4096, KeyFlags.SIGN_DATA, null));
|
mSubkeysAddedAdapter.add(newSubkey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -95,9 +95,13 @@ public class SubkeysAdapter extends CursorAdapter {
|
|||||||
return mCursor.getLong(INDEX_CREATION);
|
return mCursor.getLong(INDEX_CREATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getExpiryDate(int position) {
|
public Long getExpiryDate(int position) {
|
||||||
mCursor.moveToPosition(position);
|
mCursor.moveToPosition(position);
|
||||||
return mCursor.getLong(INDEX_EXPIRY);
|
if (mCursor.isNull(INDEX_EXPIRY)) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return mCursor.getLong(INDEX_EXPIRY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -178,8 +182,9 @@ public class SubkeysAdapter extends CursorAdapter {
|
|||||||
|
|
||||||
SaveKeyringParcel.SubkeyChange subkeyChange = mSaveKeyringParcel.getSubkeyChange(keyId);
|
SaveKeyringParcel.SubkeyChange subkeyChange = mSaveKeyringParcel.getSubkeyChange(keyId);
|
||||||
if (subkeyChange != null) {
|
if (subkeyChange != null) {
|
||||||
// 0 is "no expiry"
|
if (subkeyChange.mExpiry == null) {
|
||||||
if (subkeyChange.mExpiry != null && subkeyChange.mExpiry != 0) {
|
expiryDate = null;
|
||||||
|
} else {
|
||||||
expiryDate = new Date(subkeyChange.mExpiry * 1000);
|
expiryDate = new Date(subkeyChange.mExpiry * 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,35 +102,27 @@ public class SubkeysAddedAdapter extends ArrayAdapter<SaveKeyringParcel.SubkeyAd
|
|||||||
holder.mModel.mAlgorithm,
|
holder.mModel.mAlgorithm,
|
||||||
holder.mModel.mKeysize
|
holder.mModel.mKeysize
|
||||||
);
|
);
|
||||||
holder.vKeyId.setText("new");
|
holder.vKeyId.setText(R.string.edit_key_new_subkey);
|
||||||
holder.vKeyDetails.setText(algorithmStr);
|
holder.vKeyDetails.setText(algorithmStr);
|
||||||
|
|
||||||
|
if (holder.mModel.mExpiry != null) {
|
||||||
|
Date expiryDate = new Date(holder.mModel.mExpiry * 1000);
|
||||||
|
|
||||||
|
holder.vKeyExpiry.setText(getContext().getString(R.string.label_expiry) + ": "
|
||||||
|
+ DateFormat.getDateFormat(getContext()).format(expiryDate));
|
||||||
|
} else {
|
||||||
|
holder.vKeyExpiry.setText(getContext().getString(R.string.label_expiry) + ": "
|
||||||
|
+ getContext().getString(R.string.none));
|
||||||
|
}
|
||||||
|
|
||||||
|
// holder.mModel.mFlags
|
||||||
|
|
||||||
// Set icons according to properties
|
// Set icons according to properties
|
||||||
// holder.vMasterIcon.setVisibility(cursor.getInt(INDEX_RANK) == 0 ? View.VISIBLE : View.INVISIBLE);
|
// holder.vMasterIcon.setVisibility(cursor.getInt(INDEX_RANK) == 0 ? View.VISIBLE : View.INVISIBLE);
|
||||||
// holder.vCertifyIcon.setVisibility(cursor.getInt(INDEX_CAN_CERTIFY) != 0 ? View.VISIBLE : View.GONE);
|
// holder.vCertifyIcon.setVisibility(cursor.getInt(INDEX_CAN_CERTIFY) != 0 ? View.VISIBLE : View.GONE);
|
||||||
// holder.vEncryptIcon.setVisibility(cursor.getInt(INDEX_CAN_ENCRYPT) != 0 ? View.VISIBLE : View.GONE);
|
// holder.vEncryptIcon.setVisibility(cursor.getInt(INDEX_CAN_ENCRYPT) != 0 ? View.VISIBLE : View.GONE);
|
||||||
// holder.vSignIcon.setVisibility(cursor.getInt(INDEX_CAN_SIGN) != 0 ? View.VISIBLE : View.GONE);
|
// holder.vSignIcon.setVisibility(cursor.getInt(INDEX_CAN_SIGN) != 0 ? View.VISIBLE : View.GONE);
|
||||||
// if (!cursor.isNull(INDEX_EXPIRY)) {
|
|
||||||
// Date expiryDate = new Date(cursor.getLong(INDEX_EXPIRY) * 1000);
|
|
||||||
// isExpired = expiryDate.before(new Date());
|
|
||||||
//
|
|
||||||
// holder.vKeyExpiry.setText(context.getString(R.string.label_expiry) + ": "
|
|
||||||
// + DateFormat.getDateFormat(context).format(expiryDate));
|
|
||||||
// } else {
|
|
||||||
// isExpired = false;
|
|
||||||
//
|
|
||||||
// holder.vKeyExpiry.setText(context.getString(R.string.label_expiry) + ": " + context.getString(R.string.none));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// holder.vAddress.setText(holder.mModel.address);
|
|
||||||
// holder.vAddress.setThreshold(1); // Start working from first character
|
|
||||||
// holder.vAddress.setAdapter(mAutoCompleteEmailAdapter);
|
|
||||||
//
|
|
||||||
// holder.vName.setText(holder.mModel.name);
|
|
||||||
// holder.vName.setThreshold(1); // Start working from first character
|
|
||||||
// holder.vName.setAdapter(mAutoCompleteNameAdapter);
|
|
||||||
//
|
|
||||||
// holder.vComment.setText(holder.mModel.comment);
|
|
||||||
|
|
||||||
return convertView;
|
return convertView;
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ import android.support.v4.app.DialogFragment;
|
|||||||
import android.support.v4.app.FragmentActivity;
|
import android.support.v4.app.FragmentActivity;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
|
import android.text.format.DateUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
@ -40,7 +41,9 @@ import android.widget.Spinner;
|
|||||||
import android.widget.TableRow;
|
import android.widget.TableRow;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
|
||||||
import org.spongycastle.bcpg.sig.KeyFlags;
|
import org.spongycastle.bcpg.sig.KeyFlags;
|
||||||
|
import org.spongycastle.openpgp.PGPPublicKey;
|
||||||
import org.sufficientlysecure.keychain.Constants;
|
import org.sufficientlysecure.keychain.Constants;
|
||||||
import org.sufficientlysecure.keychain.R;
|
import org.sufficientlysecure.keychain.R;
|
||||||
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
|
||||||
@ -48,6 +51,9 @@ import org.sufficientlysecure.keychain.util.Choice;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
public class AddSubkeyDialogFragment extends DialogFragment {
|
public class AddSubkeyDialogFragment extends DialogFragment {
|
||||||
|
|
||||||
@ -125,14 +131,18 @@ public class AddSubkeyDialogFragment extends DialogFragment {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
|
||||||
|
mExpiryDatePicker.setMinDate(new Date().getTime() + DateUtils.DAY_IN_MILLIS);
|
||||||
|
}
|
||||||
|
|
||||||
ArrayList<Choice> choices = new ArrayList<Choice>();
|
ArrayList<Choice> choices = new ArrayList<Choice>();
|
||||||
choices.add(new Choice(Constants.choice.algorithm.dsa, getResources().getString(
|
choices.add(new Choice(PublicKeyAlgorithmTags.DSA, getResources().getString(
|
||||||
R.string.dsa)));
|
R.string.dsa)));
|
||||||
if (!willBeMasterKey) {
|
if (!willBeMasterKey) {
|
||||||
choices.add(new Choice(Constants.choice.algorithm.elgamal, getResources().getString(
|
choices.add(new Choice(PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT, getResources().getString(
|
||||||
R.string.elgamal)));
|
R.string.elgamal)));
|
||||||
}
|
}
|
||||||
choices.add(new Choice(Constants.choice.algorithm.rsa, getResources().getString(
|
choices.add(new Choice(PublicKeyAlgorithmTags.RSA_GENERAL, getResources().getString(
|
||||||
R.string.rsa)));
|
R.string.rsa)));
|
||||||
ArrayAdapter<Choice> adapter = new ArrayAdapter<Choice>(context,
|
ArrayAdapter<Choice> adapter = new ArrayAdapter<Choice>(context,
|
||||||
android.R.layout.simple_spinner_item, choices);
|
android.R.layout.simple_spinner_item, choices);
|
||||||
@ -140,13 +150,12 @@ public class AddSubkeyDialogFragment extends DialogFragment {
|
|||||||
mAlgorithmSpinner.setAdapter(adapter);
|
mAlgorithmSpinner.setAdapter(adapter);
|
||||||
// make RSA the default
|
// make RSA the default
|
||||||
for (int i = 0; i < choices.size(); ++i) {
|
for (int i = 0; i < choices.size(); ++i) {
|
||||||
if (choices.get(i).getId() == Constants.choice.algorithm.rsa) {
|
if (choices.get(i).getId() == PublicKeyAlgorithmTags.RSA_GENERAL) {
|
||||||
mAlgorithmSpinner.setSelection(i);
|
mAlgorithmSpinner.setSelection(i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// dynamic ArrayAdapter must be created (instead of ArrayAdapter.getFromResource), because it's content may change
|
// dynamic ArrayAdapter must be created (instead of ArrayAdapter.getFromResource), because it's content may change
|
||||||
ArrayAdapter<CharSequence> keySizeAdapter = new ArrayAdapter<CharSequence>(context, android.R.layout.simple_spinner_item,
|
ArrayAdapter<CharSequence> keySizeAdapter = new ArrayAdapter<CharSequence>(context, android.R.layout.simple_spinner_item,
|
||||||
new ArrayList<CharSequence>(Arrays.asList(getResources().getStringArray(R.array.rsa_key_size_spinner_values))));
|
new ArrayList<CharSequence>(Arrays.asList(getResources().getStringArray(R.array.rsa_key_size_spinner_values))));
|
||||||
@ -161,11 +170,37 @@ public class AddSubkeyDialogFragment extends DialogFragment {
|
|||||||
di.dismiss();
|
di.dismiss();
|
||||||
Choice newKeyAlgorithmChoice = (Choice) mAlgorithmSpinner.getSelectedItem();
|
Choice newKeyAlgorithmChoice = (Choice) mAlgorithmSpinner.getSelectedItem();
|
||||||
int newKeySize = getProperKeyLength(newKeyAlgorithmChoice.getId(), getSelectedKeyLength());
|
int newKeySize = getProperKeyLength(newKeyAlgorithmChoice.getId(), getSelectedKeyLength());
|
||||||
|
|
||||||
|
int flags = 0;
|
||||||
|
if (mFlagCertify.isChecked()) {
|
||||||
|
flags += KeyFlags.CERTIFY_OTHER;
|
||||||
|
}
|
||||||
|
if (mFlagSign.isChecked()) {
|
||||||
|
flags += KeyFlags.SIGN_DATA;
|
||||||
|
}
|
||||||
|
if (mFlagEncrypt.isChecked()) {
|
||||||
|
flags += KeyFlags.ENCRYPT_COMMS + KeyFlags.ENCRYPT_STORAGE;
|
||||||
|
}
|
||||||
|
if (mFlagAuthenticate.isChecked()) {
|
||||||
|
flags += KeyFlags.AUTHENTICATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
Long expiry;
|
||||||
|
if (mNoExpiryCheckBox.isChecked()) {
|
||||||
|
expiry = null;
|
||||||
|
} else {
|
||||||
|
Calendar selectedCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
|
||||||
|
//noinspection ResourceType
|
||||||
|
selectedCal.set(mExpiryDatePicker.getYear(),
|
||||||
|
mExpiryDatePicker.getMonth(), mExpiryDatePicker.getDayOfMonth());
|
||||||
|
expiry = selectedCal.getTime().getTime() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
SaveKeyringParcel.SubkeyAdd newSubkey = new SaveKeyringParcel.SubkeyAdd(
|
SaveKeyringParcel.SubkeyAdd newSubkey = new SaveKeyringParcel.SubkeyAdd(
|
||||||
newKeyAlgorithmChoice.getId(),
|
newKeyAlgorithmChoice.getId(),
|
||||||
newKeySize,
|
newKeySize,
|
||||||
KeyFlags.SIGN_DATA, //TODO
|
flags,
|
||||||
null
|
expiry
|
||||||
);
|
);
|
||||||
mAlgorithmSelectedListener.onAlgorithmSelected(newSubkey);
|
mAlgorithmSelectedListener.onAlgorithmSelected(newSubkey);
|
||||||
}
|
}
|
||||||
@ -261,12 +296,12 @@ public class AddSubkeyDialogFragment extends DialogFragment {
|
|||||||
final int[] elGamalSupportedLengths = {1536, 2048, 3072, 4096, 8192};
|
final int[] elGamalSupportedLengths = {1536, 2048, 3072, 4096, 8192};
|
||||||
int properKeyLength = -1;
|
int properKeyLength = -1;
|
||||||
switch (algorithmId) {
|
switch (algorithmId) {
|
||||||
case Constants.choice.algorithm.rsa:
|
case PublicKeyAlgorithmTags.RSA_GENERAL:
|
||||||
if (currentKeyLength > 1024 && currentKeyLength <= 8192) {
|
if (currentKeyLength > 1024 && currentKeyLength <= 8192) {
|
||||||
properKeyLength = currentKeyLength + ((8 - (currentKeyLength % 8)) % 8);
|
properKeyLength = currentKeyLength + ((8 - (currentKeyLength % 8)) % 8);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Constants.choice.algorithm.elgamal:
|
case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT:
|
||||||
int[] elGammalKeyDiff = new int[elGamalSupportedLengths.length];
|
int[] elGammalKeyDiff = new int[elGamalSupportedLengths.length];
|
||||||
for (int i = 0; i < elGamalSupportedLengths.length; i++) {
|
for (int i = 0; i < elGamalSupportedLengths.length; i++) {
|
||||||
elGammalKeyDiff[i] = Math.abs(elGamalSupportedLengths[i] - currentKeyLength);
|
elGammalKeyDiff[i] = Math.abs(elGamalSupportedLengths[i] - currentKeyLength);
|
||||||
@ -281,7 +316,7 @@ public class AddSubkeyDialogFragment extends DialogFragment {
|
|||||||
}
|
}
|
||||||
properKeyLength = elGamalSupportedLengths[minimalIndex];
|
properKeyLength = elGamalSupportedLengths[minimalIndex];
|
||||||
break;
|
break;
|
||||||
case Constants.choice.algorithm.dsa:
|
case PublicKeyAlgorithmTags.DSA:
|
||||||
if (currentKeyLength >= 512 && currentKeyLength <= 1024) {
|
if (currentKeyLength >= 512 && currentKeyLength <= 1024) {
|
||||||
properKeyLength = currentKeyLength + ((64 - (currentKeyLength % 64)) % 64);
|
properKeyLength = currentKeyLength + ((64 - (currentKeyLength % 64)) % 64);
|
||||||
}
|
}
|
||||||
@ -320,15 +355,15 @@ public class AddSubkeyDialogFragment extends DialogFragment {
|
|||||||
final Object selectedItem = mKeySizeSpinner.getSelectedItem();
|
final Object selectedItem = mKeySizeSpinner.getSelectedItem();
|
||||||
keySizeAdapter.clear();
|
keySizeAdapter.clear();
|
||||||
switch (algorithmId) {
|
switch (algorithmId) {
|
||||||
case Constants.choice.algorithm.rsa:
|
case PublicKeyAlgorithmTags.RSA_GENERAL:
|
||||||
replaceArrayAdapterContent(keySizeAdapter, R.array.rsa_key_size_spinner_values);
|
replaceArrayAdapterContent(keySizeAdapter, R.array.rsa_key_size_spinner_values);
|
||||||
mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_rsa));
|
mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_rsa));
|
||||||
break;
|
break;
|
||||||
case Constants.choice.algorithm.elgamal:
|
case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT:
|
||||||
replaceArrayAdapterContent(keySizeAdapter, R.array.elgamal_key_size_spinner_values);
|
replaceArrayAdapterContent(keySizeAdapter, R.array.elgamal_key_size_spinner_values);
|
||||||
mCustomKeyInfoTextView.setText(""); // ElGamal does not support custom key length
|
mCustomKeyInfoTextView.setText(""); // ElGamal does not support custom key length
|
||||||
break;
|
break;
|
||||||
case Constants.choice.algorithm.dsa:
|
case PublicKeyAlgorithmTags.DSA:
|
||||||
replaceArrayAdapterContent(keySizeAdapter, R.array.dsa_key_size_spinner_values);
|
replaceArrayAdapterContent(keySizeAdapter, R.array.dsa_key_size_spinner_values);
|
||||||
mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_dsa));
|
mCustomKeyInfoTextView.setText(getResources().getString(R.string.key_size_custom_info_dsa));
|
||||||
break;
|
break;
|
||||||
|
@ -56,12 +56,12 @@ public class EditSubkeyExpiryDialogFragment extends DialogFragment {
|
|||||||
* Creates new instance of this dialog fragment
|
* Creates new instance of this dialog fragment
|
||||||
*/
|
*/
|
||||||
public static EditSubkeyExpiryDialogFragment newInstance(Messenger messenger,
|
public static EditSubkeyExpiryDialogFragment newInstance(Messenger messenger,
|
||||||
long creationDate, long expiryDate) {
|
Long creationDate, Long expiryDate) {
|
||||||
EditSubkeyExpiryDialogFragment frag = new EditSubkeyExpiryDialogFragment();
|
EditSubkeyExpiryDialogFragment frag = new EditSubkeyExpiryDialogFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putParcelable(ARG_MESSENGER, messenger);
|
args.putParcelable(ARG_MESSENGER, messenger);
|
||||||
args.putLong(ARG_CREATION_DATE, creationDate);
|
args.putSerializable(ARG_CREATION_DATE, creationDate);
|
||||||
args.putLong(ARG_EXPIRY_DATE, expiryDate);
|
args.putSerializable(ARG_EXPIRY_DATE, expiryDate);
|
||||||
|
|
||||||
frag.setArguments(args);
|
frag.setArguments(args);
|
||||||
|
|
||||||
@ -124,12 +124,12 @@ public class EditSubkeyExpiryDialogFragment extends DialogFragment {
|
|||||||
- (mExpiryCal.getTimeInMillis() / 86400000);
|
- (mExpiryCal.getTimeInMillis() / 86400000);
|
||||||
if (numDays > 0) {
|
if (numDays > 0) {
|
||||||
Bundle data = new Bundle();
|
Bundle data = new Bundle();
|
||||||
data.putLong(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime().getTime() / 1000);
|
data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime().getTime() / 1000);
|
||||||
sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
|
sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Bundle data = new Bundle();
|
Bundle data = new Bundle();
|
||||||
data.putLong(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime().getTime() / 1000);
|
data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, selectedCal.getTime().getTime() / 1000);
|
||||||
sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
|
sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -140,9 +140,8 @@ public class EditSubkeyExpiryDialogFragment extends DialogFragment {
|
|||||||
public void onClick(DialogInterface dialog, int id) {
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
dismiss();
|
dismiss();
|
||||||
|
|
||||||
// "no expiry" corresponds to a 0
|
|
||||||
Bundle data = new Bundle();
|
Bundle data = new Bundle();
|
||||||
data.putLong(MESSAGE_DATA_EXPIRY_DATE, 0);
|
data.putSerializable(MESSAGE_DATA_EXPIRY_DATE, null);
|
||||||
sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
|
sendMessageToHandler(MESSAGE_NEW_EXPIRY_DATE, data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -446,7 +446,7 @@
|
|||||||
<item>Change Expiry</item>
|
<item>Change Expiry</item>
|
||||||
<item>Revoke Subkey</item>
|
<item>Revoke Subkey</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string name="edit_key_new_subkey">new</string>
|
||||||
|
|
||||||
<!-- Create key -->
|
<!-- Create key -->
|
||||||
<string name="create_key_upload">Upload key to keyserver</string>
|
<string name="create_key_upload">Upload key to keyserver</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user