1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2024-06-30 15:26:43 +02:00

Refactoring: move KeyRingEditor to SecretKeyRingEditor in prep for more editor classes

This commit is contained in:
Paul Schaub 2020-11-19 17:51:57 +01:00
parent 9f95e7925b
commit 5cdbb125b0
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
5 changed files with 73 additions and 53 deletions

View file

@ -27,8 +27,8 @@ import org.pgpainless.decryption_verification.DecryptionStream;
import org.pgpainless.encryption_signing.EncryptionBuilder; import org.pgpainless.encryption_signing.EncryptionBuilder;
import org.pgpainless.encryption_signing.EncryptionStream; import org.pgpainless.encryption_signing.EncryptionStream;
import org.pgpainless.key.generation.KeyRingBuilder; import org.pgpainless.key.generation.KeyRingBuilder;
import org.pgpainless.key.modification.KeyRingEditor; import org.pgpainless.key.modification.secretkeyring.SecretKeyRingEditor;
import org.pgpainless.key.modification.KeyRingEditorInterface; import org.pgpainless.key.modification.secretkeyring.SecretKeyRingEditorInterface;
import org.pgpainless.key.parsing.KeyRingReader; import org.pgpainless.key.parsing.KeyRingReader;
import org.pgpainless.symmetric_encryption.SymmetricEncryptorDecryptor; import org.pgpainless.symmetric_encryption.SymmetricEncryptorDecryptor;
import org.pgpainless.util.Passphrase; import org.pgpainless.util.Passphrase;
@ -67,8 +67,8 @@ public class PGPainless {
return new DecryptionBuilder(); return new DecryptionBuilder();
} }
public static KeyRingEditorInterface modifyKeyRing(PGPSecretKeyRing secretKeys) { public static SecretKeyRingEditorInterface modifyKeyRing(PGPSecretKeyRing secretKeys) {
return new KeyRingEditor(secretKeys); return new SecretKeyRingEditor(secretKeys);
} }
/** /**

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.pgpainless.key.modification; package org.pgpainless.key.modification.secretkeyring;
import static org.pgpainless.key.util.KeyUtils.unlockSecretKey; import static org.pgpainless.key.util.KeyUtils.unlockSecretKey;
@ -61,7 +61,7 @@ import org.pgpainless.key.util.KeyRingUtils;
import org.pgpainless.key.util.SignatureUtils; import org.pgpainless.key.util.SignatureUtils;
import org.pgpainless.util.Passphrase; import org.pgpainless.util.Passphrase;
public class KeyRingEditor implements KeyRingEditorInterface { public class SecretKeyRingEditor implements SecretKeyRingEditorInterface {
// Default algorithm for calculating private key checksums // Default algorithm for calculating private key checksums
// While I'd like to use something else, eg. SHA256, BC seems to lack support for // While I'd like to use something else, eg. SHA256, BC seems to lack support for
@ -70,7 +70,7 @@ public class KeyRingEditor implements KeyRingEditorInterface {
private PGPSecretKeyRing secretKeyRing; private PGPSecretKeyRing secretKeyRing;
public KeyRingEditor(PGPSecretKeyRing secretKeyRing) { public SecretKeyRingEditor(PGPSecretKeyRing secretKeyRing) {
if (secretKeyRing == null) { if (secretKeyRing == null) {
throw new NullPointerException("SecretKeyRing MUST NOT be null."); throw new NullPointerException("SecretKeyRing MUST NOT be null.");
} }
@ -78,12 +78,12 @@ public class KeyRingEditor implements KeyRingEditorInterface {
} }
@Override @Override
public KeyRingEditorInterface addUserId(String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException { public SecretKeyRingEditorInterface addUserId(String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException {
return addUserId(secretKeyRing.getPublicKey().getKeyID(), userId, secretKeyRingProtector); return addUserId(secretKeyRing.getPublicKey().getKeyID(), userId, secretKeyRingProtector);
} }
@Override @Override
public KeyRingEditorInterface addUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException { public SecretKeyRingEditorInterface addUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException {
userId = sanitizeUserId(userId); userId = sanitizeUserId(userId);
List<PGPSecretKey> secretKeyList = new ArrayList<>(); List<PGPSecretKey> secretKeyList = new ArrayList<>();
@ -135,13 +135,13 @@ public class KeyRingEditor implements KeyRingEditorInterface {
} }
@Override @Override
public KeyRingEditorInterface deleteUserId(String userId, SecretKeyRingProtector protector) { public SecretKeyRingEditorInterface deleteUserId(String userId, SecretKeyRingProtector protector) {
PGPPublicKey publicKey = secretKeyRing.getPublicKey(); PGPPublicKey publicKey = secretKeyRing.getPublicKey();
return deleteUserId(publicKey.getKeyID(), userId, protector); return deleteUserId(publicKey.getKeyID(), userId, protector);
} }
@Override @Override
public KeyRingEditorInterface deleteUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector) { public SecretKeyRingEditorInterface deleteUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector) {
List<PGPPublicKey> publicKeys = new ArrayList<>(); List<PGPPublicKey> publicKeys = new ArrayList<>();
Iterator<PGPPublicKey> publicKeyIterator = secretKeyRing.getPublicKeys(); Iterator<PGPPublicKey> publicKeyIterator = secretKeyRing.getPublicKeys();
boolean foundKey = false; boolean foundKey = false;
@ -175,9 +175,9 @@ public class KeyRingEditor implements KeyRingEditorInterface {
} }
@Override @Override
public KeyRingEditorInterface addSubKey(@Nonnull KeySpec keySpec, public SecretKeyRingEditorInterface addSubKey(@Nonnull KeySpec keySpec,
@Nonnull Passphrase subKeyPassphrase, @Nonnull Passphrase subKeyPassphrase,
SecretKeyRingProtector secretKeyRingProtector) SecretKeyRingProtector secretKeyRingProtector)
throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, PGPException { throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, PGPException {
PGPSecretKey secretSubKey = generateSubKey(keySpec, subKeyPassphrase); PGPSecretKey secretSubKey = generateSubKey(keySpec, subKeyPassphrase);
@ -188,9 +188,9 @@ public class KeyRingEditor implements KeyRingEditorInterface {
} }
@Override @Override
public KeyRingEditorInterface addSubKey(PGPSecretKey secretSubKey, public SecretKeyRingEditorInterface addSubKey(PGPSecretKey secretSubKey,
SecretKeyRingProtector subKeyProtector, SecretKeyRingProtector subKeyProtector,
SecretKeyRingProtector keyRingProtector) SecretKeyRingProtector keyRingProtector)
throws PGPException { throws PGPException {
PGPPublicKey primaryKey = secretKeyRing.getSecretKey().getPublicKey(); PGPPublicKey primaryKey = secretKeyRing.getSecretKey().getPublicKey();
@ -232,14 +232,14 @@ public class KeyRingEditor implements KeyRingEditorInterface {
} }
@Override @Override
public KeyRingEditorInterface deleteSubKey(OpenPgpV4Fingerprint fingerprint, public SecretKeyRingEditorInterface deleteSubKey(OpenPgpV4Fingerprint fingerprint,
SecretKeyRingProtector protector) { SecretKeyRingProtector protector) {
return deleteSubKey(fingerprint.getKeyId(), protector); return deleteSubKey(fingerprint.getKeyId(), protector);
} }
@Override @Override
public KeyRingEditorInterface deleteSubKey(long subKeyId, public SecretKeyRingEditorInterface deleteSubKey(long subKeyId,
SecretKeyRingProtector protector) { SecretKeyRingProtector protector) {
if (secretKeyRing.getSecretKey().getKeyID() == subKeyId) { if (secretKeyRing.getSecretKey().getKeyID() == subKeyId) {
throw new IllegalArgumentException("You cannot delete the primary key of this key ring."); throw new IllegalArgumentException("You cannot delete the primary key of this key ring.");
} }
@ -255,13 +255,13 @@ public class KeyRingEditor implements KeyRingEditorInterface {
} }
@Override @Override
public KeyRingEditorInterface revokeSubKey(OpenPgpV4Fingerprint fingerprint, SecretKeyRingProtector protector) public SecretKeyRingEditorInterface revokeSubKey(OpenPgpV4Fingerprint fingerprint, SecretKeyRingProtector protector)
throws PGPException { throws PGPException {
return revokeSubKey(fingerprint.getKeyId(), protector); return revokeSubKey(fingerprint.getKeyId(), protector);
} }
@Override @Override
public KeyRingEditorInterface revokeSubKey(long subKeyId, SecretKeyRingProtector protector) throws PGPException { public SecretKeyRingEditorInterface revokeSubKey(long subKeyId, SecretKeyRingProtector protector) throws PGPException {
PGPPublicKey revokeeSubKey = secretKeyRing.getPublicKey(subKeyId); PGPPublicKey revokeeSubKey = secretKeyRing.getPublicKey(subKeyId);
if (revokeeSubKey == null) { if (revokeeSubKey == null) {
throw new NoSuchElementException("No subkey with id " + Long.toHexString(subKeyId) + " found."); throw new NoSuchElementException("No subkey with id " + Long.toHexString(subKeyId) + " found.");
@ -356,24 +356,24 @@ public class KeyRingEditor implements KeyRingEditorInterface {
} }
@Override @Override
public KeyRingEditorInterface toNewPassphrase(Passphrase passphrase) throws PGPException { public SecretKeyRingEditorInterface toNewPassphrase(Passphrase passphrase) throws PGPException {
SecretKeyRingProtector newProtector = new PasswordBasedSecretKeyRingProtector( SecretKeyRingProtector newProtector = new PasswordBasedSecretKeyRingProtector(
newProtectionSettings, new SolitaryPassphraseProvider(passphrase)); newProtectionSettings, new SolitaryPassphraseProvider(passphrase));
PGPSecretKeyRing secretKeys = changePassphrase(keyId, KeyRingEditor.this.secretKeyRing, oldProtector, newProtector); PGPSecretKeyRing secretKeys = changePassphrase(keyId, SecretKeyRingEditor.this.secretKeyRing, oldProtector, newProtector);
KeyRingEditor.this.secretKeyRing = secretKeys; SecretKeyRingEditor.this.secretKeyRing = secretKeys;
return KeyRingEditor.this; return SecretKeyRingEditor.this;
} }
@Override @Override
public KeyRingEditorInterface toNoPassphrase() throws PGPException { public SecretKeyRingEditorInterface toNoPassphrase() throws PGPException {
SecretKeyRingProtector newProtector = new UnprotectedKeysProtector(); SecretKeyRingProtector newProtector = new UnprotectedKeysProtector();
PGPSecretKeyRing secretKeys = changePassphrase(keyId, KeyRingEditor.this.secretKeyRing, oldProtector, newProtector); PGPSecretKeyRing secretKeys = changePassphrase(keyId, SecretKeyRingEditor.this.secretKeyRing, oldProtector, newProtector);
KeyRingEditor.this.secretKeyRing = secretKeys; SecretKeyRingEditor.this.secretKeyRing = secretKeys;
return KeyRingEditor.this; return SecretKeyRingEditor.this;
} }
} }

View file

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.pgpainless.key.modification; package org.pgpainless.key.modification.secretkeyring;
import java.security.InvalidAlgorithmParameterException; import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
@ -30,9 +30,9 @@ import org.pgpainless.key.protection.SecretKeyRingProtector;
import org.pgpainless.key.util.UserId; import org.pgpainless.key.util.UserId;
import org.pgpainless.util.Passphrase; import org.pgpainless.util.Passphrase;
public interface KeyRingEditorInterface { public interface SecretKeyRingEditorInterface {
default KeyRingEditorInterface addUserId(UserId userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException { default SecretKeyRingEditorInterface addUserId(UserId userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException {
return addUserId(userId.toString(), secretKeyRingProtector); return addUserId(userId.toString(), secretKeyRingProtector);
} }
@ -42,21 +42,21 @@ public interface KeyRingEditorInterface {
* @param userId user-id * @param userId user-id
* @return the builder * @return the builder
*/ */
KeyRingEditorInterface addUserId(String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException; SecretKeyRingEditorInterface addUserId(String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException;
default KeyRingEditorInterface addUserId(OpenPgpV4Fingerprint fingerprint, UserId userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException { default SecretKeyRingEditorInterface addUserId(OpenPgpV4Fingerprint fingerprint, UserId userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException {
return addUserId(fingerprint, userId.toString(), secretKeyRingProtector); return addUserId(fingerprint, userId.toString(), secretKeyRingProtector);
} }
default KeyRingEditorInterface addUserId(OpenPgpV4Fingerprint fingerprint, String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException { default SecretKeyRingEditorInterface addUserId(OpenPgpV4Fingerprint fingerprint, String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException {
return addUserId(fingerprint.getKeyId(), userId, secretKeyRingProtector); return addUserId(fingerprint.getKeyId(), userId, secretKeyRingProtector);
} }
default KeyRingEditorInterface addUserId(long keyId, UserId userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException { default SecretKeyRingEditorInterface addUserId(long keyId, UserId userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException {
return addUserId(keyId, userId.toString(), secretKeyRingProtector); return addUserId(keyId, userId.toString(), secretKeyRingProtector);
} }
KeyRingEditorInterface addUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException; SecretKeyRingEditorInterface addUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException;
/** /**
* Remove a user-id from the primary key of the key ring. * Remove a user-id from the primary key of the key ring.
@ -64,13 +64,13 @@ public interface KeyRingEditorInterface {
* @param userId exact user-id to be removed * @param userId exact user-id to be removed
* @return the builder * @return the builder
*/ */
KeyRingEditorInterface deleteUserId(String userId, SecretKeyRingProtector secretKeyRingProtector); SecretKeyRingEditorInterface deleteUserId(String userId, SecretKeyRingProtector secretKeyRingProtector);
default KeyRingEditorInterface deleteUserId(OpenPgpV4Fingerprint fingerprint, String userId, SecretKeyRingProtector secretKeyRingProtector) { default SecretKeyRingEditorInterface deleteUserId(OpenPgpV4Fingerprint fingerprint, String userId, SecretKeyRingProtector secretKeyRingProtector) {
return deleteUserId(fingerprint.getKeyId(), userId, secretKeyRingProtector); return deleteUserId(fingerprint.getKeyId(), userId, secretKeyRingProtector);
} }
KeyRingEditorInterface deleteUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector); SecretKeyRingEditorInterface deleteUserId(long keyId, String userId, SecretKeyRingProtector secretKeyRingProtector);
/** /**
* Add a subkey to the key ring. * Add a subkey to the key ring.
@ -79,12 +79,12 @@ public interface KeyRingEditorInterface {
* @param keySpec key specification * @param keySpec key specification
* @return the builder * @return the builder
*/ */
KeyRingEditorInterface addSubKey(@Nonnull KeySpec keySpec, SecretKeyRingEditorInterface addSubKey(@Nonnull KeySpec keySpec,
@Nonnull Passphrase subKeyPassphrase, @Nonnull Passphrase subKeyPassphrase,
SecretKeyRingProtector secretKeyRingProtector) SecretKeyRingProtector secretKeyRingProtector)
throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, PGPException; throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, PGPException;
KeyRingEditorInterface addSubKey(PGPSecretKey subKey, SecretKeyRingProtector subKeyProtector, SecretKeyRingProtector keyRingProtector) SecretKeyRingEditorInterface addSubKey(PGPSecretKey subKey, SecretKeyRingProtector subKeyProtector, SecretKeyRingProtector keyRingProtector)
throws PGPException; throws PGPException;
/** /**
@ -95,7 +95,7 @@ public interface KeyRingEditorInterface {
* @param fingerprint fingerprint of the subkey to be removed * @param fingerprint fingerprint of the subkey to be removed
* @return the builder * @return the builder
*/ */
KeyRingEditorInterface deleteSubKey(OpenPgpV4Fingerprint fingerprint, SecretKeyRingProtector secretKeyRingProtector); SecretKeyRingEditorInterface deleteSubKey(OpenPgpV4Fingerprint fingerprint, SecretKeyRingProtector secretKeyRingProtector);
/** /**
* Delete a subkey from the key ring. * Delete a subkey from the key ring.
@ -105,7 +105,7 @@ public interface KeyRingEditorInterface {
* @param subKeyId id of the subkey * @param subKeyId id of the subkey
* @return the builder * @return the builder
*/ */
KeyRingEditorInterface deleteSubKey(long subKeyId, SecretKeyRingProtector secretKeyRingProtector); SecretKeyRingEditorInterface deleteSubKey(long subKeyId, SecretKeyRingProtector secretKeyRingProtector);
/** /**
* Revoke the subkey binding signature of a subkey. * Revoke the subkey binding signature of a subkey.
@ -115,7 +115,7 @@ public interface KeyRingEditorInterface {
* @param fingerprint fingerprint of the subkey to be revoked * @param fingerprint fingerprint of the subkey to be revoked
* @return the builder * @return the builder
*/ */
KeyRingEditorInterface revokeSubKey(OpenPgpV4Fingerprint fingerprint, SecretKeyRingProtector secretKeyRingProtector) throws PGPException; SecretKeyRingEditorInterface revokeSubKey(OpenPgpV4Fingerprint fingerprint, SecretKeyRingProtector secretKeyRingProtector) throws PGPException;
/** /**
* Revoke the subkey binding signature of a subkey. * Revoke the subkey binding signature of a subkey.
@ -125,7 +125,7 @@ public interface KeyRingEditorInterface {
* @param subKeyId id of the subkey * @param subKeyId id of the subkey
* @return the builder * @return the builder
*/ */
KeyRingEditorInterface revokeSubKey(long subKeyId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException; SecretKeyRingEditorInterface revokeSubKey(long subKeyId, SecretKeyRingProtector secretKeyRingProtector) throws PGPException;
/** /**
* Change the passphrase of the whole key ring. * Change the passphrase of the whole key ring.
@ -187,14 +187,14 @@ public interface KeyRingEditorInterface {
* @param passphrase passphrase * @param passphrase passphrase
* @return editor builder * @return editor builder
*/ */
KeyRingEditorInterface toNewPassphrase(Passphrase passphrase) throws PGPException; SecretKeyRingEditorInterface toNewPassphrase(Passphrase passphrase) throws PGPException;
/** /**
* Leave the key unprotected. * Leave the key unprotected.
* *
* @return editor builder * @return editor builder
*/ */
KeyRingEditorInterface toNoPassphrase() throws PGPException; SecretKeyRingEditorInterface toNoPassphrase() throws PGPException;
} }
/** /**

View file

@ -0,0 +1,19 @@
/*
* Copyright 2020 Paul Schaub.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Classes that deal with modifications made to {@link org.bouncycastle.openpgp.PGPSecretKeyRing PGPSecretKeyRings}.
*/
package org.pgpainless.key.modification.secretkeyring;

View file

@ -18,12 +18,13 @@ package org.pgpainless.key.modification;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.pgpainless.key.modification.secretkeyring.SecretKeyRingEditor;
public class KeyRingEditorTest { public class KeyRingEditorTest {
@Test @Test
public void testConstructorThrowsNpeForNull() { public void testConstructorThrowsNpeForNull() {
assertThrows(NullPointerException.class, assertThrows(NullPointerException.class,
() -> new KeyRingEditor(null)); () -> new SecretKeyRingEditor(null));
} }
} }