mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-11 11:35:07 -05:00
first go at saving IDs correctly
This commit is contained in:
parent
1a28a4e921
commit
a39c73ca12
@ -28,6 +28,7 @@ import java.security.SignatureException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
import org.spongycastle.bcpg.CompressionAlgorithmTags;
|
import org.spongycastle.bcpg.CompressionAlgorithmTags;
|
||||||
@ -68,6 +69,7 @@ import org.sufficientlysecure.keychain.util.Primes;
|
|||||||
import org.sufficientlysecure.keychain.util.ProgressDialogUpdater;
|
import org.sufficientlysecure.keychain.util.ProgressDialogUpdater;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
public class PgpKeyOperation {
|
public class PgpKeyOperation {
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
@ -361,6 +363,21 @@ public class PgpKeyOperation {
|
|||||||
if (mKR == null)
|
if (mKR == null)
|
||||||
buildNewSecretKey(userIds, keys, keysExpiryDates, keysUsages, newPassPhrase, oldPassPhrase); //new Keyring
|
buildNewSecretKey(userIds, keys, keysExpiryDates, keysUsages, newPassPhrase, oldPassPhrase); //new Keyring
|
||||||
|
|
||||||
|
/*
|
||||||
|
IDs -
|
||||||
|
remove deleted ids
|
||||||
|
if the primary ID changed we need to:
|
||||||
|
remove all of the IDs from the keyring, saving their certifications
|
||||||
|
add them all in again, updating certs of IDs which have changed
|
||||||
|
else
|
||||||
|
remove changed IDs and add in with new certs
|
||||||
|
|
||||||
|
Keys
|
||||||
|
remove deleted keys
|
||||||
|
if a key is modified, re-sign it
|
||||||
|
do we need to remove and add in?
|
||||||
|
*/
|
||||||
|
|
||||||
masterKey = mKR.getSecretKey();
|
masterKey = mKR.getSecretKey();
|
||||||
PGPPublicKey masterPublicKey = masterKey.getPublicKey();
|
PGPPublicKey masterPublicKey = masterKey.getPublicKey();
|
||||||
|
|
||||||
@ -374,22 +391,55 @@ public class PgpKeyOperation {
|
|||||||
|
|
||||||
updateProgress(R.string.progress_certifying_master_key, 20, 100);
|
updateProgress(R.string.progress_certifying_master_key, 20, 100);
|
||||||
|
|
||||||
|
for (String delID : deletedIDs) {
|
||||||
|
masterPublicKey = PGPPublicKey.removeCertification(masterPublicKey, delID);
|
||||||
|
}
|
||||||
|
|
||||||
int user_id_index = 0;
|
int user_id_index = 0;
|
||||||
for (String userId : userIds) {
|
if (primaryIDChanged) {
|
||||||
if (!OriginalIDs.get(user_id_index).equals(userIds.get(user_id_index))) {
|
ArrayList<Pair<String, PGPSignature>> sigList = new ArrayList<Pair<String, PGPSignature>>();
|
||||||
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
for (String userId : userIds) {
|
||||||
masterPublicKey.getAlgorithm(), HashAlgorithmTags.SHA1)
|
String orig_id = OriginalIDs.get(user_id_index);
|
||||||
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
if (orig_id.equals(userId)) {
|
||||||
PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder);
|
Iterator<PGPSignature> orig_sigs = masterPublicKey.getSignaturesForID(orig_id); //TODO: make sure this iterator only has signatures we are interested in
|
||||||
|
while (orig_sigs.hasNext()) {
|
||||||
|
PGPSignature orig_sig = orig_sigs.next();
|
||||||
|
sigList.add(new Pair<String, PGPSignature>(orig_id, orig_sig));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
||||||
|
masterPublicKey.getAlgorithm(), HashAlgorithmTags.SHA1)
|
||||||
|
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
||||||
|
PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder);
|
||||||
|
|
||||||
sGen.init(PGPSignature.POSITIVE_CERTIFICATION, masterPrivateKey);
|
sGen.init(PGPSignature.POSITIVE_CERTIFICATION, masterPrivateKey);
|
||||||
|
|
||||||
PGPSignature certification = sGen.generateCertification(userId, masterPublicKey);
|
PGPSignature certification = sGen.generateCertification(userId, masterPublicKey);
|
||||||
|
sigList.add(new Pair<String, PGPSignature>(userId, certification));
|
||||||
//masterPublicKey = PGPPublicKey.removeCertification();
|
}
|
||||||
masterPublicKey = PGPPublicKey.addCertification(masterPublicKey, userId, certification);
|
masterPublicKey = PGPPublicKey.removeCertification(masterPublicKey, orig_id);
|
||||||
|
user_id_index++;
|
||||||
|
}
|
||||||
|
for (Pair<String, PGPSignature> to_add : sigList) {
|
||||||
|
masterPublicKey = PGPPublicKey.addCertification(masterPublicKey, to_add.first, to_add.second);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (String userId : userIds) {
|
||||||
|
String orig_id = OriginalIDs.get(user_id_index);
|
||||||
|
if (!orig_id.equals(userId)) {
|
||||||
|
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
||||||
|
masterPublicKey.getAlgorithm(), HashAlgorithmTags.SHA1)
|
||||||
|
.setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME);
|
||||||
|
PGPSignatureGenerator sGen = new PGPSignatureGenerator(signerBuilder);
|
||||||
|
|
||||||
|
sGen.init(PGPSignature.POSITIVE_CERTIFICATION, masterPrivateKey);
|
||||||
|
|
||||||
|
PGPSignature certification = sGen.generateCertification(userId, masterPublicKey);
|
||||||
|
masterPublicKey = PGPPublicKey.removeCertification(masterPublicKey, orig_id);
|
||||||
|
masterPublicKey = PGPPublicKey.addCertification(masterPublicKey, userId, certification);
|
||||||
|
}
|
||||||
|
user_id_index++;
|
||||||
}
|
}
|
||||||
user_id_index++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PGPKeyPair masterKeyPair = new PGPKeyPair(masterPublicKey, masterPrivateKey);
|
PGPKeyPair masterKeyPair = new PGPKeyPair(masterPublicKey, masterPrivateKey);
|
||||||
|
Loading…
Reference in New Issue
Block a user