mirror of
https://github.com/moparisthebest/open-keychain
synced 2025-02-20 04:41:52 -05:00
support addition of user attributes
Conflicts: OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/SaveKeyringParcel.java OpenKeychain/src/main/res/values/strings.xml
This commit is contained in:
parent
50e515c6cd
commit
84eece622b
@ -495,6 +495,8 @@ public abstract class OperationResult implements Parcelable {
|
|||||||
MSG_MF_UID_PRIMARY (LogLevel.INFO, R.string.msg_mf_uid_primary),
|
MSG_MF_UID_PRIMARY (LogLevel.INFO, R.string.msg_mf_uid_primary),
|
||||||
MSG_MF_UID_REVOKE (LogLevel.INFO, R.string.msg_mf_uid_revoke),
|
MSG_MF_UID_REVOKE (LogLevel.INFO, R.string.msg_mf_uid_revoke),
|
||||||
MSG_MF_UID_ERROR_EMPTY (LogLevel.ERROR, R.string.msg_mf_uid_error_empty),
|
MSG_MF_UID_ERROR_EMPTY (LogLevel.ERROR, R.string.msg_mf_uid_error_empty),
|
||||||
|
MSG_MF_UAT_ADD_IMAGE (LogLevel.INFO, R.string.msg_mf_uat_add_image),
|
||||||
|
MSG_MF_UAT_ADD_UNKNOWN (LogLevel.INFO, R.string.msg_mf_uat_add_unknown),
|
||||||
MSG_MF_UNLOCK_ERROR (LogLevel.ERROR, R.string.msg_mf_unlock_error),
|
MSG_MF_UNLOCK_ERROR (LogLevel.ERROR, R.string.msg_mf_unlock_error),
|
||||||
MSG_MF_UNLOCK (LogLevel.DEBUG, R.string.msg_mf_unlock),
|
MSG_MF_UNLOCK (LogLevel.DEBUG, R.string.msg_mf_unlock),
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ import org.spongycastle.openpgp.PGPSecretKeyRing;
|
|||||||
import org.spongycastle.openpgp.PGPSignature;
|
import org.spongycastle.openpgp.PGPSignature;
|
||||||
import org.spongycastle.openpgp.PGPSignatureGenerator;
|
import org.spongycastle.openpgp.PGPSignatureGenerator;
|
||||||
import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator;
|
import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator;
|
||||||
|
import org.spongycastle.openpgp.PGPUserAttributeSubpacketVector;
|
||||||
import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor;
|
import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor;
|
||||||
import org.spongycastle.openpgp.operator.PBESecretKeyEncryptor;
|
import org.spongycastle.openpgp.operator.PBESecretKeyEncryptor;
|
||||||
import org.spongycastle.openpgp.operator.PGPContentSignerBuilder;
|
import org.spongycastle.openpgp.operator.PGPContentSignerBuilder;
|
||||||
@ -478,7 +479,7 @@ public class PgpKeyOperation {
|
|||||||
PGPPublicKey modifiedPublicKey = masterPublicKey;
|
PGPPublicKey modifiedPublicKey = masterPublicKey;
|
||||||
|
|
||||||
// 2a. Add certificates for new user ids
|
// 2a. Add certificates for new user ids
|
||||||
subProgressPush(15, 25);
|
subProgressPush(15, 23);
|
||||||
for (int i = 0; i < saveParcel.mAddUserIds.size(); i++) {
|
for (int i = 0; i < saveParcel.mAddUserIds.size(); i++) {
|
||||||
|
|
||||||
progress(R.string.progress_modify_adduid, (i - 1) * (100 / saveParcel.mAddUserIds.size()));
|
progress(R.string.progress_modify_adduid, (i - 1) * (100 / saveParcel.mAddUserIds.size()));
|
||||||
@ -522,8 +523,33 @@ public class PgpKeyOperation {
|
|||||||
}
|
}
|
||||||
subProgressPop();
|
subProgressPop();
|
||||||
|
|
||||||
// 2b. Add revocations for revoked user ids
|
// 2b. Add certificates for new user ids
|
||||||
subProgressPush(25, 40);
|
subProgressPush(23, 32);
|
||||||
|
for (int i = 0; i < saveParcel.mAddUserAttribute.size(); i++) {
|
||||||
|
|
||||||
|
progress(R.string.progress_modify_adduat, (i - 1) * (100 / saveParcel.mAddUserAttribute.size()));
|
||||||
|
WrappedUserAttribute attribute = saveParcel.mAddUserAttribute.get(i);
|
||||||
|
|
||||||
|
switch (attribute.getType()) {
|
||||||
|
case WrappedUserAttribute.UAT_UNKNOWN:
|
||||||
|
log.add(LogType.MSG_MF_UAT_ADD_UNKNOWN, indent);
|
||||||
|
break;
|
||||||
|
case WrappedUserAttribute.UAT_IMAGE:
|
||||||
|
log.add(LogType.MSG_MF_UAT_ADD_IMAGE, indent);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
PGPUserAttributeSubpacketVector vector = attribute.getVector();
|
||||||
|
|
||||||
|
// generate and add new certificate
|
||||||
|
PGPSignature cert = generateUserAttributeSignature(masterPrivateKey,
|
||||||
|
masterPublicKey, vector);
|
||||||
|
modifiedPublicKey = PGPPublicKey.addCertification(modifiedPublicKey, vector, cert);
|
||||||
|
}
|
||||||
|
subProgressPop();
|
||||||
|
|
||||||
|
// 2c. Add revocations for revoked user ids
|
||||||
|
subProgressPush(32, 40);
|
||||||
for (int i = 0; i < saveParcel.mRevokeUserIds.size(); i++) {
|
for (int i = 0; i < saveParcel.mRevokeUserIds.size(); i++) {
|
||||||
|
|
||||||
progress(R.string.progress_modify_revokeuid, (i - 1) * (100 / saveParcel.mRevokeUserIds.size()));
|
progress(R.string.progress_modify_revokeuid, (i - 1) * (100 / saveParcel.mRevokeUserIds.size()));
|
||||||
@ -1174,6 +1200,26 @@ public class PgpKeyOperation {
|
|||||||
return sGen.generateCertification(userId, pKey);
|
return sGen.generateCertification(userId, pKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static PGPSignature generateUserAttributeSignature(
|
||||||
|
PGPPrivateKey masterPrivateKey, PGPPublicKey pKey,
|
||||||
|
PGPUserAttributeSubpacketVector vector)
|
||||||
|
throws IOException, PGPException, SignatureException {
|
||||||
|
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
||||||
|
masterPrivateKey.getPublicKeyPacket().getAlgorithm(), HashAlgorithmTags.SHA512)
|
||||||
|
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
||||||
|
PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder);
|
||||||
|
|
||||||
|
PGPSignatureSubpacketGenerator hashedPacketsGen = new PGPSignatureSubpacketGenerator();
|
||||||
|
{
|
||||||
|
/* critical subpackets: we consider those important for a modern pgp implementation */
|
||||||
|
hashedPacketsGen.setSignatureCreationTime(true, new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
sGen.setHashedSubpackets(hashedPacketsGen.generate());
|
||||||
|
sGen.init(PGPSignature.POSITIVE_CERTIFICATION, masterPrivateKey);
|
||||||
|
return sGen.generateCertification(vector, pKey);
|
||||||
|
}
|
||||||
|
|
||||||
private static PGPSignature generateRevocationSignature(
|
private static PGPSignature generateRevocationSignature(
|
||||||
PGPPrivateKey masterPrivateKey, PGPPublicKey pKey, String userId)
|
PGPPrivateKey masterPrivateKey, PGPPublicKey pKey, String userId)
|
||||||
throws IOException, PGPException, SignatureException {
|
throws IOException, PGPException, SignatureException {
|
||||||
|
@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.service;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import org.sufficientlysecure.keychain.pgp.WrappedUserAttribute;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@ -49,6 +50,7 @@ public class SaveKeyringParcel implements Parcelable {
|
|||||||
public ChangeUnlockParcel mNewUnlock;
|
public ChangeUnlockParcel mNewUnlock;
|
||||||
|
|
||||||
public ArrayList<String> mAddUserIds;
|
public ArrayList<String> mAddUserIds;
|
||||||
|
public ArrayList<WrappedUserAttribute> mAddUserAttribute;
|
||||||
public ArrayList<SubkeyAdd> mAddSubKeys;
|
public ArrayList<SubkeyAdd> mAddSubKeys;
|
||||||
|
|
||||||
public ArrayList<SubkeyChange> mChangeSubKeys;
|
public ArrayList<SubkeyChange> mChangeSubKeys;
|
||||||
@ -71,6 +73,7 @@ public class SaveKeyringParcel implements Parcelable {
|
|||||||
public void reset() {
|
public void reset() {
|
||||||
mNewUnlock = null;
|
mNewUnlock = null;
|
||||||
mAddUserIds = new ArrayList<String>();
|
mAddUserIds = new ArrayList<String>();
|
||||||
|
mAddUserAttribute = new ArrayList<WrappedUserAttribute>();
|
||||||
mAddSubKeys = new ArrayList<SubkeyAdd>();
|
mAddSubKeys = new ArrayList<SubkeyAdd>();
|
||||||
mChangePrimaryUserId = null;
|
mChangePrimaryUserId = null;
|
||||||
mChangeSubKeys = new ArrayList<SubkeyChange>();
|
mChangeSubKeys = new ArrayList<SubkeyChange>();
|
||||||
@ -162,6 +165,7 @@ public class SaveKeyringParcel implements Parcelable {
|
|||||||
mNewUnlock = source.readParcelable(getClass().getClassLoader());
|
mNewUnlock = source.readParcelable(getClass().getClassLoader());
|
||||||
|
|
||||||
mAddUserIds = source.createStringArrayList();
|
mAddUserIds = source.createStringArrayList();
|
||||||
|
mAddUserAttribute = (ArrayList<WrappedUserAttribute>) source.readSerializable();
|
||||||
mAddSubKeys = (ArrayList<SubkeyAdd>) source.readSerializable();
|
mAddSubKeys = (ArrayList<SubkeyAdd>) source.readSerializable();
|
||||||
|
|
||||||
mChangeSubKeys = (ArrayList<SubkeyChange>) source.readSerializable();
|
mChangeSubKeys = (ArrayList<SubkeyChange>) source.readSerializable();
|
||||||
@ -184,6 +188,7 @@ public class SaveKeyringParcel implements Parcelable {
|
|||||||
destination.writeParcelable(mNewUnlock, 0);
|
destination.writeParcelable(mNewUnlock, 0);
|
||||||
|
|
||||||
destination.writeStringList(mAddUserIds);
|
destination.writeStringList(mAddUserIds);
|
||||||
|
destination.writeSerializable(mAddUserAttribute);
|
||||||
destination.writeSerializable(mAddSubKeys);
|
destination.writeSerializable(mAddSubKeys);
|
||||||
|
|
||||||
destination.writeSerializable(mChangeSubKeys);
|
destination.writeSerializable(mChangeSubKeys);
|
||||||
@ -214,6 +219,7 @@ public class SaveKeyringParcel implements Parcelable {
|
|||||||
String out = "mMasterKeyId: " + mMasterKeyId + "\n";
|
String out = "mMasterKeyId: " + mMasterKeyId + "\n";
|
||||||
out += "mNewUnlock: " + mNewUnlock + "\n";
|
out += "mNewUnlock: " + mNewUnlock + "\n";
|
||||||
out += "mAddUserIds: " + mAddUserIds + "\n";
|
out += "mAddUserIds: " + mAddUserIds + "\n";
|
||||||
|
out += "mAddUserAttribute: " + mAddUserAttribute + "\n";
|
||||||
out += "mAddSubKeys: " + mAddSubKeys + "\n";
|
out += "mAddSubKeys: " + mAddSubKeys + "\n";
|
||||||
out += "mChangeSubKeys: " + mChangeSubKeys + "\n";
|
out += "mChangeSubKeys: " + mChangeSubKeys + "\n";
|
||||||
out += "mChangePrimaryUserId: " + mChangePrimaryUserId + "\n";
|
out += "mChangePrimaryUserId: " + mChangePrimaryUserId + "\n";
|
||||||
|
@ -309,6 +309,7 @@
|
|||||||
|
|
||||||
<string name="progress_modify_unlock">"unlocking keyring…"</string>
|
<string name="progress_modify_unlock">"unlocking keyring…"</string>
|
||||||
<string name="progress_modify_adduid">"adding user IDs…"</string>
|
<string name="progress_modify_adduid">"adding user IDs…"</string>
|
||||||
|
<string name="progress_modify_adduat">"adding user attributes…"</string>
|
||||||
<string name="progress_modify_revokeuid">"revoking user IDs…"</string>
|
<string name="progress_modify_revokeuid">"revoking user IDs…"</string>
|
||||||
<string name="progress_modify_primaryuid">"changing primary user ID…"</string>
|
<string name="progress_modify_primaryuid">"changing primary user ID…"</string>
|
||||||
<string name="progress_modify_subkeychange">"modifying subkeys…"</string>
|
<string name="progress_modify_subkeychange">"modifying subkeys…"</string>
|
||||||
@ -839,6 +840,8 @@
|
|||||||
<string name="msg_mf_uid_primary">"Changing primary user ID to %s"</string>
|
<string name="msg_mf_uid_primary">"Changing primary user ID to %s"</string>
|
||||||
<string name="msg_mf_uid_revoke">"Revoking user ID %s"</string>
|
<string name="msg_mf_uid_revoke">"Revoking user ID %s"</string>
|
||||||
<string name="msg_mf_uid_error_empty">"User ID must not be empty!"</string>
|
<string name="msg_mf_uid_error_empty">"User ID must not be empty!"</string>
|
||||||
|
<string name="msg_mf_uat_add_image">"Adding user attribute of type image"</string>
|
||||||
|
<string name="msg_mf_uat_add_unknown">"Adding user attribute of unknown type"</string>
|
||||||
<string name="msg_mf_unlock_error">"Error unlocking keyring!"</string>
|
<string name="msg_mf_unlock_error">"Error unlocking keyring!"</string>
|
||||||
<string name="msg_mf_unlock">"Unlocking keyring"</string>
|
<string name="msg_mf_unlock">"Unlocking keyring"</string>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user