1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2024-11-17 18:02:05 +01:00

Make sure that provided key sets are not empty and return result on encryption stream

This commit is contained in:
Paul Schaub 2018-06-27 14:53:52 +02:00
parent 1bfc54828c
commit fb5d351de7
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
2 changed files with 59 additions and 6 deletions

View file

@ -67,6 +67,9 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
@Override @Override
public WithAlgorithms toRecipients(PGPPublicKey... keys) { public WithAlgorithms toRecipients(PGPPublicKey... keys) {
if (keys.length == 0) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
for (PGPPublicKey k : keys) { for (PGPPublicKey k : keys) {
if (encryptionKeySelector().accept(null, k)) { if (encryptionKeySelector().accept(null, k)) {
EncryptionBuilder.this.encryptionKeys.add(k); EncryptionBuilder.this.encryptionKeys.add(k);
@ -79,6 +82,9 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
@Override @Override
public WithAlgorithms toRecipients(PGPPublicKeyRing... keys) { public WithAlgorithms toRecipients(PGPPublicKeyRing... keys) {
if (keys.length == 0) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
for (PGPPublicKeyRing ring : keys) { for (PGPPublicKeyRing ring : keys) {
for (PGPPublicKey k : ring) { for (PGPPublicKey k : ring) {
if (encryptionKeySelector().accept(null, k)) { if (encryptionKeySelector().accept(null, k)) {
@ -92,6 +98,9 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
@Override @Override
public <O>WithAlgorithms toRecipients(PublicKeyRingSelectionStrategy<O> ringSelectionStrategy, public <O>WithAlgorithms toRecipients(PublicKeyRingSelectionStrategy<O> ringSelectionStrategy,
MultiMap<O, PGPPublicKeyRingCollection> keys) { MultiMap<O, PGPPublicKeyRingCollection> keys) {
if (keys.isEmpty()) {
throw new IllegalArgumentException("Recipient map MUST NOT be empty.");
}
MultiMap<O, PGPPublicKeyRing> acceptedKeyRings = ringSelectionStrategy.selectKeyRingsFromCollections(keys); MultiMap<O, PGPPublicKeyRing> acceptedKeyRings = ringSelectionStrategy.selectKeyRingsFromCollections(keys);
for (O identifier : acceptedKeyRings.keySet()) { for (O identifier : acceptedKeyRings.keySet()) {
Set<PGPPublicKeyRing> acceptedSet = acceptedKeyRings.get(identifier); Set<PGPPublicKeyRing> acceptedSet = acceptedKeyRings.get(identifier);
@ -116,6 +125,9 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
@Override @Override
public WithAlgorithms andToSelf(PGPPublicKey... keys) { public WithAlgorithms andToSelf(PGPPublicKey... keys) {
if (keys.length == 0) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
for (PGPPublicKey k : keys) { for (PGPPublicKey k : keys) {
if (encryptionKeySelector().accept(null, k)) { if (encryptionKeySelector().accept(null, k)) {
EncryptionBuilder.this.encryptionKeys.add(k); EncryptionBuilder.this.encryptionKeys.add(k);
@ -127,8 +139,11 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
} }
@Override @Override
public WithAlgorithms andToSelf(PGPPublicKeyRing... keyRings) { public WithAlgorithms andToSelf(PGPPublicKeyRing... keys) {
for (PGPPublicKeyRing ring : keyRings) { if (keys.length == 0) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
for (PGPPublicKeyRing ring : keys) {
for (Iterator<PGPPublicKey> i = ring.getPublicKeys(); i.hasNext(); ) { for (Iterator<PGPPublicKey> i = ring.getPublicKeys(); i.hasNext(); ) {
PGPPublicKey key = i.next(); PGPPublicKey key = i.next();
if (encryptionKeySelector().accept(null, key)) { if (encryptionKeySelector().accept(null, key)) {
@ -140,9 +155,12 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
} }
public <O>WithAlgorithms andToSelf(PublicKeyRingSelectionStrategy<O> ringSelectionStrategy, public <O>WithAlgorithms andToSelf(PublicKeyRingSelectionStrategy<O> ringSelectionStrategy,
MultiMap<O, PGPPublicKeyRingCollection> keyRingCollections) { MultiMap<O, PGPPublicKeyRingCollection> keys) {
if (keys.isEmpty()) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
MultiMap<O, PGPPublicKeyRing> acceptedKeyRings = MultiMap<O, PGPPublicKeyRing> acceptedKeyRings =
ringSelectionStrategy.selectKeyRingsFromCollections(keyRingCollections); ringSelectionStrategy.selectKeyRingsFromCollections(keys);
for (O identifier : acceptedKeyRings.keySet()) { for (O identifier : acceptedKeyRings.keySet()) {
Set<PGPPublicKeyRing> acceptedSet = acceptedKeyRings.get(identifier); Set<PGPPublicKeyRing> acceptedSet = acceptedKeyRings.get(identifier);
for (PGPPublicKeyRing k : acceptedSet) { for (PGPPublicKeyRing k : acceptedSet) {
@ -183,6 +201,9 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
@Override @Override
public <O> Armor signWith(SecretKeyRingProtector decryptor, PGPSecretKey... keys) { public <O> Armor signWith(SecretKeyRingProtector decryptor, PGPSecretKey... keys) {
if (keys.length == 0) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
for (PGPSecretKey s : keys) { for (PGPSecretKey s : keys) {
if (EncryptionBuilder.this.<O>signingKeySelector().accept(null, s)) { if (EncryptionBuilder.this.<O>signingKeySelector().accept(null, s)) {
signingKeys.add(s); signingKeys.add(s);
@ -196,6 +217,9 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
@Override @Override
public <O> Armor signWith(SecretKeyRingProtector decryptor, PGPSecretKeyRing... keys) { public <O> Armor signWith(SecretKeyRingProtector decryptor, PGPSecretKeyRing... keys) {
if (keys.length == 0) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
for (PGPSecretKeyRing key : keys) { for (PGPSecretKeyRing key : keys) {
for (Iterator<PGPSecretKey> i = key.getSecretKeys(); i.hasNext(); ) { for (Iterator<PGPSecretKey> i = key.getSecretKeys(); i.hasNext(); ) {
PGPSecretKey s = i.next(); PGPSecretKey s = i.next();
@ -211,9 +235,12 @@ public class EncryptionBuilder implements EncryptionBuilderInterface {
@Override @Override
public <O>Armor signWith(SecretKeyRingSelectionStrategy<O> ringSelectionStrategy, public <O>Armor signWith(SecretKeyRingSelectionStrategy<O> ringSelectionStrategy,
SecretKeyRingProtector decryptor, SecretKeyRingProtector decryptor,
MultiMap<O, PGPSecretKeyRingCollection> keyRingCollections) { MultiMap<O, PGPSecretKeyRingCollection> keys) {
if (keys.isEmpty()) {
throw new IllegalArgumentException("Recipient list MUST NOT be empty.");
}
MultiMap<O, PGPSecretKeyRing> acceptedKeyRings = MultiMap<O, PGPSecretKeyRing> acceptedKeyRings =
ringSelectionStrategy.selectKeyRingsFromCollections(keyRingCollections); ringSelectionStrategy.selectKeyRingsFromCollections(keys);
for (O identifier : acceptedKeyRings.keySet()) { for (O identifier : acceptedKeyRings.keySet()) {
Set<PGPSecretKeyRing> acceptedSet = acceptedKeyRings.get(identifier); Set<PGPSecretKeyRing> acceptedSet = acceptedKeyRings.get(identifier);
for (PGPSecretKeyRing k : acceptedSet) { for (PGPSecretKeyRing k : acceptedSet) {

View file

@ -19,6 +19,7 @@ import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
@ -27,6 +28,7 @@ import java.util.logging.Logger;
import de.vanitasvitae.crypto.pgpainless.algorithm.CompressionAlgorithm; import de.vanitasvitae.crypto.pgpainless.algorithm.CompressionAlgorithm;
import de.vanitasvitae.crypto.pgpainless.algorithm.HashAlgorithm; import de.vanitasvitae.crypto.pgpainless.algorithm.HashAlgorithm;
import de.vanitasvitae.crypto.pgpainless.algorithm.SymmetricKeyAlgorithm; import de.vanitasvitae.crypto.pgpainless.algorithm.SymmetricKeyAlgorithm;
import de.vanitasvitae.crypto.pgpainless.decryption_verification.PainlessResult;
import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.bouncycastle.bcpg.BCPGOutputStream; import org.bouncycastle.bcpg.BCPGOutputStream;
import org.bouncycastle.openpgp.PGPCompressedDataGenerator; import org.bouncycastle.openpgp.PGPCompressedDataGenerator;
@ -36,6 +38,7 @@ import org.bouncycastle.openpgp.PGPLiteralData;
import org.bouncycastle.openpgp.PGPLiteralDataGenerator; import org.bouncycastle.openpgp.PGPLiteralDataGenerator;
import org.bouncycastle.openpgp.PGPPrivateKey; import org.bouncycastle.openpgp.PGPPrivateKey;
import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.openpgp.PGPPublicKeyRing;
import org.bouncycastle.openpgp.PGPSignature; import org.bouncycastle.openpgp.PGPSignature;
import org.bouncycastle.openpgp.PGPSignatureGenerator; import org.bouncycastle.openpgp.PGPSignatureGenerator;
import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder; import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder;
@ -53,6 +56,8 @@ public class EncryptionStream extends OutputStream {
private static final int BUFFER_SIZE = 1 << 8; private static final int BUFFER_SIZE = 1 << 8;
private final PainlessResult result;
private List<PGPSignatureGenerator> signatureGenerators = new ArrayList<>(); private List<PGPSignatureGenerator> signatureGenerators = new ArrayList<>();
private boolean closed = false; private boolean closed = false;
@ -139,6 +144,23 @@ public class EncryptionStream extends OutputStream {
literalDataGenerator = new PGPLiteralDataGenerator(); literalDataGenerator = new PGPLiteralDataGenerator();
literalDataStream = literalDataGenerator.open(basicCompressionStream, literalDataStream = literalDataGenerator.open(basicCompressionStream,
PGPLiteralData.BINARY, PGPLiteralData.CONSOLE, new Date(), new byte[BUFFER_SIZE]); PGPLiteralData.BINARY, PGPLiteralData.CONSOLE, new Date(), new byte[BUFFER_SIZE]);
// Prepare result
Set<Long> recipientKeyIds = new HashSet<>();
for (PGPPublicKey recipient : encryptionKeys) {
recipientKeyIds.add(recipient.getKeyID());
}
Set<Long> signingKeyIds = new HashSet<>();
for (PGPPrivateKey signer : signingKeys) {
signingKeyIds.add(signer.getKeyID());
}
this.result = new PainlessResult(recipientKeyIds,
null, symmetricKeyAlgorithm,
compressionAlgorithm, true,
signingKeyIds, null);
} }
static EncryptionStream create(OutputStream outputStream, static EncryptionStream create(OutputStream outputStream,
@ -236,4 +258,8 @@ public class EncryptionStream extends OutputStream {
throw new IllegalArgumentException("Argument '" + name + "' MUST NOT be null."); throw new IllegalArgumentException("Argument '" + name + "' MUST NOT be null.");
} }
} }
public PainlessResult getResult() {
return result;
}
} }