From 994ba47b3055695d5e81dda36cf0c5519e9c7f8a Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 9 Jan 2025 14:05:15 +0100 Subject: [PATCH] Adjust to latest changes and add tests from test suite --- bcsop/pom.xml | 15 +++++ .../bouncycastle/sop/BouncyCastleSOP.java | 65 ++++++++++++++----- .../sop/operation/AbstractBCOperation.java | 36 +++++++++- .../bouncycastle/sop/operation/BCArmor.java | 5 ++ .../bouncycastle/sop/operation/BCDearmor.java | 5 ++ .../bouncycastle/sop/operation/BCDecrypt.java | 22 +++---- .../sop/operation/BCDetachedSign.java | 11 +++- .../sop/operation/BCDetachedVerify.java | 12 ++-- .../bouncycastle/sop/operation/BCEncrypt.java | 20 +++--- .../sop/operation/BCExtractCert.java | 11 +++- .../sop/operation/BCGenerateKey.java | 8 ++- .../sop/operation/BCInlineSign.java | 11 +++- .../sop/operation/BCInlineVerify.java | 11 +++- .../sop/operation/BCListProfiles.java | 5 ++ .../bouncycastle/sop/operation/BCVersion.java | 5 ++ .../sop/BouncyCastleSOPInstanceFactory.java | 15 +++++ .../sop/operation/BCSopArmorDearmorTest.java | 6 ++ .../operation/BCSopChangeKeyPasswordTest.java | 6 ++ .../BCSopDecryptWithSessionKeyTest.java | 6 ++ .../BCSopDetachedSignDetachedVerifyTest.java | 6 ++ .../operation/BCSopEncryptDecryptTest.java | 6 ++ .../sop/operation/BCSopExtractCertTest.java | 6 ++ .../sop/operation/BCSopGenerateKeyTest.java | 6 ++ ...ineSignInlineDetachDetachedVerifyTest.java | 6 ++ .../BCSopInlineSignInlineVerifyTest.java | 6 ++ .../sop/operation/BCSopRevokeKeyTest.java | 6 ++ .../sop/operation/BCSopVersionTest.java | 6 ++ pom.xml | 6 ++ 28 files changed, 272 insertions(+), 57 deletions(-) create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOPInstanceFactory.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopArmorDearmorTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopChangeKeyPasswordTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDecryptWithSessionKeyTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDetachedSignDetachedVerifyTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopEncryptDecryptTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopExtractCertTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopGenerateKeyTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineDetachDetachedVerifyTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineVerifyTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopRevokeKeyTest.java create mode 100644 bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopVersionTest.java diff --git a/bcsop/pom.xml b/bcsop/pom.xml index c945daf..b8d37fb 100644 --- a/bcsop/pom.xml +++ b/bcsop/pom.xml @@ -23,6 +23,11 @@ org.pgpainless sop-java + + org.pgpainless + sop-java-testfixtures + test + org.bouncycastle bcprov-jdk18on @@ -47,6 +52,16 @@ org.apache.maven.plugins maven-compiler-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + org.pgpainless.bouncycastle.sop.BouncyCastleSOPInstanceFactory + + + diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOP.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOP.java index 7fc22a9..e401493 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOP.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOP.java @@ -1,108 +1,139 @@ package org.pgpainless.bouncycastle.sop; import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.openpgp.api.OpenPGPApi; +import org.bouncycastle.openpgp.api.bc.BcOpenPGPApi; import org.jetbrains.annotations.NotNull; -import org.pgpainless.bouncycastle.sop.operation.*; +import org.pgpainless.bouncycastle.sop.operation.BCArmor; +import org.pgpainless.bouncycastle.sop.operation.BCDearmor; +import org.pgpainless.bouncycastle.sop.operation.BCDecrypt; +import org.pgpainless.bouncycastle.sop.operation.BCDetachedSign; +import org.pgpainless.bouncycastle.sop.operation.BCDetachedVerify; +import org.pgpainless.bouncycastle.sop.operation.BCEncrypt; +import org.pgpainless.bouncycastle.sop.operation.BCExtractCert; +import org.pgpainless.bouncycastle.sop.operation.BCGenerateKey; +import org.pgpainless.bouncycastle.sop.operation.BCInlineSign; +import org.pgpainless.bouncycastle.sop.operation.BCInlineVerify; +import org.pgpainless.bouncycastle.sop.operation.BCListProfiles; +import org.pgpainless.bouncycastle.sop.operation.BCVersion; import sop.SOP; -import sop.operation.*; +import sop.exception.SOPGPException; +import sop.operation.Armor; +import sop.operation.ChangeKeyPassword; +import sop.operation.Dearmor; +import sop.operation.Decrypt; +import sop.operation.DetachedSign; +import sop.operation.DetachedVerify; +import sop.operation.Encrypt; +import sop.operation.ExtractCert; +import sop.operation.GenerateKey; +import sop.operation.InlineDetach; +import sop.operation.InlineSign; +import sop.operation.InlineVerify; +import sop.operation.ListProfiles; +import sop.operation.RevokeKey; +import sop.operation.Version; import java.security.Security; public class BouncyCastleSOP implements SOP { + private final OpenPGPApi api; + public BouncyCastleSOP() { Security.removeProvider("BC"); Security.addProvider(new BouncyCastleProvider()); + this.api = new BcOpenPGPApi(); } @NotNull @Override public Armor armor() { - return new BCArmor(); + return new BCArmor(api); } @NotNull @Override public GenerateKey generateKey() { - return new BCGenerateKey(); + return new BCGenerateKey(api); } @NotNull @Override public ExtractCert extractCert() { - return new BCExtractCert(); + return new BCExtractCert(api); } @NotNull @Override public DetachedSign detachedSign() { - return new BCDetachedSign(); + return new BCDetachedSign(api); } @NotNull @Override public InlineSign inlineSign() { - return new BCInlineSign(); + return new BCInlineSign(api); } @NotNull @Override public InlineDetach inlineDetach() { - return null; + throw new SOPGPException.UnsupportedSubcommand("inline-detach is not implemented."); } @NotNull @Override public Encrypt encrypt() { - return new BCEncrypt(); + return new BCEncrypt(api); } @NotNull @Override public Decrypt decrypt() { - return new BCDecrypt(); + return new BCDecrypt(api); } @NotNull @Override public Dearmor dearmor() { - return new BCDearmor(); + return new BCDearmor(api); } @NotNull @Override public ListProfiles listProfiles() { - return new BCListProfiles(); + return new BCListProfiles(api); } @NotNull @Override public RevokeKey revokeKey() { - return null; + throw new SOPGPException.UnsupportedSubcommand("revoke-key is not implemented."); } @NotNull @Override public ChangeKeyPassword changeKeyPassword() { - return null; + throw new SOPGPException.UnsupportedSubcommand("change-key-password is not implemented."); } @NotNull @Override public Version version() { - return new BCVersion(); + return new BCVersion(api); } @NotNull @Override public DetachedVerify detachedVerify() { - return new BCDetachedVerify(); + return new BCDetachedVerify(api); } @NotNull @Override public InlineVerify inlineVerify() { - return new BCInlineVerify(); + return new BCInlineVerify(api); } } diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/AbstractBCOperation.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/AbstractBCOperation.java index 68ad348..f79adb0 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/AbstractBCOperation.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/AbstractBCOperation.java @@ -2,18 +2,30 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.openpgp.PGPSessionKey; import org.bouncycastle.openpgp.PGPSignatureException; +import org.bouncycastle.openpgp.api.OpenPGPApi; +import org.bouncycastle.openpgp.api.OpenPGPCertificate; +import org.bouncycastle.openpgp.api.OpenPGPKey; import org.bouncycastle.openpgp.api.OpenPGPMessageInputStream; import org.bouncycastle.openpgp.api.OpenPGPSignature; -import org.bouncycastle.openpgp.api.exception.MalformedPGPSignatureException; import org.bouncycastle.util.encoders.Hex; import sop.SessionKey; import sop.Verification; +import sop.exception.SOPGPException; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Locale; public abstract class AbstractBCOperation { + protected final OpenPGPApi api; + + protected AbstractBCOperation(OpenPGPApi api) + { + this.api = api; + } protected SessionKey getSessionKey(OpenPGPMessageInputStream.Result result) { @@ -35,8 +47,8 @@ public abstract class AbstractBCOperation if (sig.isValid()) { Verification verification = new Verification(sig.getCreationTime(), - Hex.toHexString(sig.getIssuer().getKeyIdentifier().getFingerprint()), - Hex.toHexString(sig.getIssuerCertificate().getFingerprint())); + Hex.toHexString(sig.getIssuer().getKeyIdentifier().getFingerprint()).toUpperCase(Locale.ROOT), + Hex.toHexString(sig.getIssuerCertificate().getFingerprint()).toUpperCase(Locale.ROOT)); verifications.add(verification); } } @@ -47,4 +59,22 @@ public abstract class AbstractBCOperation } return verifications; } + + protected OpenPGPCertificate parseCertificate(InputStream inputStream) + { + try { + return api.readKeyOrCertificate().parseCertificate(inputStream); + } catch (IOException e) { + throw new SOPGPException.BadData(e); + } + } + + protected OpenPGPKey parseKey(InputStream inputStream) + { + try { + return api.readKeyOrCertificate().parseKey(inputStream); + } catch (IOException e) { + throw new SOPGPException.BadData(e); + } + } } diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCArmor.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCArmor.java index 28706ed..9ac8ba2 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCArmor.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCArmor.java @@ -1,6 +1,7 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.bcpg.ArmoredOutputStream; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.util.io.Streams; import org.jetbrains.annotations.NotNull; import sop.Ready; @@ -15,6 +16,10 @@ public class BCArmor extends AbstractBCOperation implements Armor { + public BCArmor(OpenPGPApi api) { + super(api); + } + @NotNull @Override public Ready data(@NotNull InputStream inputStream) throws SOPGPException.BadData, IOException { diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDearmor.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDearmor.java index 78f3de7..8bfda06 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDearmor.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDearmor.java @@ -1,6 +1,7 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.bcpg.ArmoredInputStream; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.util.io.Streams; import org.jetbrains.annotations.NotNull; import sop.Ready; @@ -15,6 +16,10 @@ public class BCDearmor extends AbstractBCOperation implements Dearmor { + public BCDearmor(OpenPGPApi api) { + super(api); + } + @NotNull @Override public Ready data(@NotNull InputStream inputStream) throws SOPGPException.BadData, IOException { diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDecrypt.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDecrypt.java index d27423f..238dd83 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDecrypt.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDecrypt.java @@ -1,8 +1,8 @@ package org.pgpainless.bouncycastle.sop.operation; -import org.bouncycastle.openpgp.*; -import org.bouncycastle.openpgp.api.OpenPGPCertificate; -import org.bouncycastle.openpgp.api.OpenPGPKey; +import org.bouncycastle.openpgp.PGPException; +import org.bouncycastle.openpgp.PGPSessionKey; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.api.OpenPGPMessageInputStream; import org.bouncycastle.openpgp.api.OpenPGPMessageProcessor; import org.bouncycastle.util.io.Streams; @@ -16,18 +16,20 @@ import sop.operation.Decrypt; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.ArrayList; import java.util.Date; -import java.util.List; public class BCDecrypt extends AbstractBCOperation implements Decrypt { + private final OpenPGPMessageProcessor processor; + private char[] keyPassword; - private final OpenPGPMessageProcessor processor = new OpenPGPMessageProcessor(); - + public BCDecrypt(OpenPGPApi api) { + super(api); + this.processor = api.decryptAndOrVerifyMessage(); + } @NotNull @Override @@ -67,8 +69,7 @@ public class BCDecrypt @NotNull @Override public Decrypt verifyWithCert(@NotNull InputStream inputStream) throws SOPGPException.BadData, SOPGPException.UnsupportedAsymmetricAlgo, IOException { - OpenPGPCertificate cert = OpenPGPCertificate.fromInputStream(inputStream); - processor.addVerificationCertificate(cert); + processor.addVerificationCertificate(parseCertificate(inputStream)); return this; } @@ -89,8 +90,7 @@ public class BCDecrypt @NotNull @Override public Decrypt withKey(@NotNull InputStream inputStream) throws SOPGPException.BadData, SOPGPException.UnsupportedAsymmetricAlgo, IOException { - OpenPGPKey key = OpenPGPKey.fromInputStream(inputStream); - processor.addDecryptionKey(key, keyPassword); + processor.addDecryptionKey(parseKey(inputStream), keyPassword); return this; } diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedSign.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedSign.java index f046414..6b74ca9 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedSign.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedSign.java @@ -3,8 +3,8 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.bcpg.BCPGOutputStream; import org.bouncycastle.openpgp.PGPException; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.api.OpenPGPDetachedSignatureGenerator; -import org.bouncycastle.openpgp.api.OpenPGPKey; import org.bouncycastle.openpgp.api.OpenPGPSignature; import org.bouncycastle.openpgp.api.exception.InvalidSigningKeyException; import org.jetbrains.annotations.NotNull; @@ -24,10 +24,15 @@ public class BCDetachedSign extends AbstractBCOperation implements DetachedSign { - private final OpenPGPDetachedSignatureGenerator sigGen = new OpenPGPDetachedSignatureGenerator(); + private final OpenPGPDetachedSignatureGenerator sigGen; private boolean armored = true; private char[] keyPassword = null; + public BCDetachedSign(OpenPGPApi api) { + super(api); + sigGen = api.createDetachedSignature(); + } + @NotNull @Override public ReadyWithResult data(@NotNull InputStream inputStream) throws IOException, SOPGPException.KeyIsProtected, SOPGPException.ExpectedText { @@ -97,7 +102,7 @@ public class BCDetachedSign public DetachedSign key(@NotNull InputStream inputStream) throws SOPGPException.KeyCannotSign, SOPGPException.BadData, SOPGPException.UnsupportedAsymmetricAlgo, IOException { try { - sigGen.addSigningKey(OpenPGPKey.fromInputStream(inputStream), keyPassword); + sigGen.addSigningKey(parseKey(inputStream), keyPassword); } catch (InvalidSigningKeyException e) { diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedVerify.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedVerify.java index ce6c282..33e15f1 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedVerify.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCDetachedVerify.java @@ -1,6 +1,6 @@ package org.pgpainless.bouncycastle.sop.operation; -import org.bouncycastle.openpgp.api.OpenPGPCertificate; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.api.OpenPGPDetachedSignatureProcessor; import org.bouncycastle.openpgp.api.OpenPGPSignature; import org.jetbrains.annotations.NotNull; @@ -19,10 +19,12 @@ public class BCDetachedVerify implements DetachedVerify { - OpenPGPDetachedSignatureProcessor processor = new OpenPGPDetachedSignatureProcessor(); + private final OpenPGPDetachedSignatureProcessor processor; - public BCDetachedVerify() + public BCDetachedVerify(OpenPGPApi api) { + super(api); + this.processor = api.verifyDetachedSignature(); processor.setExceptionCallback(e -> System.err.println(e.getMessage())); } @@ -47,14 +49,14 @@ public class BCDetachedVerify @Override public DetachedVerify cert(@NotNull InputStream inputStream) throws SOPGPException.BadData, IOException { - processor.addVerificationCertificate(OpenPGPCertificate.fromInputStream(inputStream)); + processor.addVerificationCertificate(parseCertificate(inputStream)); return this; } @NotNull @Override public List data(@NotNull InputStream inputStream) throws IOException, SOPGPException.NoSignature, SOPGPException.BadData { - List signatures = processor.verify(inputStream); + List signatures = processor.process(inputStream); List verifications = getVerifications(signatures); if (verifications.isEmpty()) diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCEncrypt.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCEncrypt.java index 44f3ea6..4260480 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCEncrypt.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCEncrypt.java @@ -1,10 +1,10 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.openpgp.PGPException; -import org.bouncycastle.openpgp.api.OpenPGPCertificate; -import org.bouncycastle.openpgp.api.OpenPGPKey; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.api.OpenPGPMessageGenerator; import org.bouncycastle.openpgp.api.OpenPGPMessageOutputStream; +import org.bouncycastle.openpgp.api.exception.InvalidEncryptionKeyException; import org.bouncycastle.util.io.Streams; import org.jetbrains.annotations.NotNull; import sop.EncryptionResult; @@ -21,13 +21,12 @@ import java.io.OutputStream; public class BCEncrypt extends AbstractBCOperation implements Encrypt { - private final OpenPGPMessageGenerator mGen; private char[] keyPassword; - public BCEncrypt() - { - this.mGen = new OpenPGPMessageGenerator(); + public BCEncrypt(OpenPGPApi api) { + super(api); + this.mGen = api.signAndOrEncryptMessage(); } @NotNull @@ -47,8 +46,7 @@ public class BCEncrypt @NotNull @Override public Encrypt signWith(@NotNull InputStream inputStream) throws SOPGPException.KeyCannotSign, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData, IOException { - OpenPGPKey key = OpenPGPKey.fromInputStream(inputStream); - mGen.addSigningKey(key, k -> keyPassword); + mGen.addSigningKey(parseKey(inputStream), k -> keyPassword); return this; } @@ -69,7 +67,11 @@ public class BCEncrypt @NotNull @Override public Encrypt withCert(@NotNull InputStream inputStream) throws SOPGPException.CertCannotEncrypt, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData, IOException { - mGen.addEncryptionCertificate(OpenPGPCertificate.fromInputStream(inputStream)); + try { + mGen.addEncryptionCertificate(parseCertificate(inputStream)); + } catch (InvalidEncryptionKeyException e) { + throw new SOPGPException.CertCannotEncrypt("Certificate cannot encrypt", e); + } return this; } diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCExtractCert.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCExtractCert.java index 2f43c31..94a7fd4 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCExtractCert.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCExtractCert.java @@ -1,7 +1,12 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.bcpg.ArmoredOutputStream; -import org.bouncycastle.openpgp.*; +import org.bouncycastle.openpgp.PGPObjectFactory; +import org.bouncycastle.openpgp.PGPPublicKey; +import org.bouncycastle.openpgp.PGPPublicKeyRing; +import org.bouncycastle.openpgp.PGPSecretKeyRing; +import org.bouncycastle.openpgp.PGPUtil; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.bc.BcPGPObjectFactory; import org.jetbrains.annotations.NotNull; import sop.Ready; @@ -21,6 +26,10 @@ public class BCExtractCert private boolean armor = true; + public BCExtractCert(OpenPGPApi api) { + super(api); + } + @NotNull @Override public Ready key(@NotNull InputStream inputStream) throws IOException, SOPGPException.BadData { diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCGenerateKey.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCGenerateKey.java index efc6c53..82c353d 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCGenerateKey.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCGenerateKey.java @@ -1,9 +1,9 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.openpgp.PGPException; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.api.OpenPGPKey; import org.bouncycastle.openpgp.api.OpenPGPV6KeyGenerator; -import org.bouncycastle.openpgp.api.bc.BcOpenPGPV6KeyGenerator; import org.jetbrains.annotations.NotNull; import sop.Ready; import sop.exception.SOPGPException; @@ -23,6 +23,10 @@ public class BCGenerateKey private String userId; private char[] passphrase; + public BCGenerateKey(OpenPGPApi api) { + super(api); + } + @NotNull @Override public Ready generate() throws SOPGPException.MissingArg, SOPGPException.UnsupportedAsymmetricAlgo, IOException { @@ -33,7 +37,7 @@ public class BCGenerateKey { OpenPGPV6KeyGenerator generator = null; try { - generator = new BcOpenPGPV6KeyGenerator(new Date()); + generator = api.generateKey(new Date()); } catch (PGPException e) { throw new RuntimeException(e); } diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineSign.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineSign.java index 3f187fe..6f8d7c3 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineSign.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineSign.java @@ -1,7 +1,7 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.openpgp.PGPException; -import org.bouncycastle.openpgp.api.OpenPGPKey; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.api.OpenPGPMessageGenerator; import org.bouncycastle.openpgp.api.OpenPGPMessageOutputStream; import org.bouncycastle.util.io.Streams; @@ -20,9 +20,14 @@ public class BCInlineSign implements InlineSign { - private final OpenPGPMessageGenerator mGen = new OpenPGPMessageGenerator(); + private final OpenPGPMessageGenerator mGen; private char[] keyPassword; + public BCInlineSign(OpenPGPApi api) { + super(api); + this.mGen = api.signAndOrEncryptMessage(); + } + @NotNull @Override public Ready data(@NotNull InputStream inputStream) throws IOException, SOPGPException.KeyIsProtected, SOPGPException.ExpectedText { @@ -54,7 +59,7 @@ public class BCInlineSign @Override public InlineSign key(@NotNull InputStream inputStream) throws SOPGPException.KeyCannotSign, SOPGPException.BadData, SOPGPException.UnsupportedAsymmetricAlgo, IOException { - mGen.addSigningKey(OpenPGPKey.fromInputStream(inputStream), k -> keyPassword); + mGen.addSigningKey(api.readKeyOrCertificate().parseKey(inputStream), k -> keyPassword); return this; } diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineVerify.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineVerify.java index fcd3619..be7dd3e 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineVerify.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCInlineVerify.java @@ -1,7 +1,7 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.openpgp.PGPException; -import org.bouncycastle.openpgp.api.OpenPGPCertificate; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.bouncycastle.openpgp.api.OpenPGPMessageInputStream; import org.bouncycastle.openpgp.api.OpenPGPMessageProcessor; import org.bouncycastle.util.io.Streams; @@ -21,7 +21,12 @@ public class BCInlineVerify extends AbstractBCOperation implements InlineVerify { - private final OpenPGPMessageProcessor processor = new OpenPGPMessageProcessor(); + private final OpenPGPMessageProcessor processor; + + public BCInlineVerify(OpenPGPApi api) { + super(api); + this.processor = api.decryptAndOrVerifyMessage(); + } @NotNull @Override @@ -61,7 +66,7 @@ public class BCInlineVerify @Override public InlineVerify cert(@NotNull InputStream inputStream) throws SOPGPException.BadData, IOException { - processor.addVerificationCertificate(OpenPGPCertificate.fromInputStream(inputStream)); + processor.addVerificationCertificate(api.readKeyOrCertificate().parseCertificate(inputStream)); return this; } } diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCListProfiles.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCListProfiles.java index 5d3317d..9f81c1b 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCListProfiles.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCListProfiles.java @@ -1,5 +1,6 @@ package org.pgpainless.bouncycastle.sop.operation; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.jetbrains.annotations.NotNull; import sop.Profile; import sop.operation.ListProfiles; @@ -10,6 +11,10 @@ public class BCListProfiles extends AbstractBCOperation implements ListProfiles { + public BCListProfiles(OpenPGPApi api) { + super(api); + } + @NotNull @Override public List subcommand(@NotNull String s) { diff --git a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCVersion.java b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCVersion.java index 02c53a6..3e924f9 100644 --- a/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCVersion.java +++ b/bcsop/src/main/java/org/pgpainless/bouncycastle/sop/operation/BCVersion.java @@ -1,6 +1,7 @@ package org.pgpainless.bouncycastle.sop.operation; import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.openpgp.api.OpenPGPApi; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import sop.exception.SOPGPException; @@ -10,6 +11,10 @@ public class BCVersion extends AbstractBCOperation implements Version { + public BCVersion(OpenPGPApi api) { + super(api); + } + @NotNull @Override public String getBackendVersion() { diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOPInstanceFactory.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOPInstanceFactory.java new file mode 100644 index 0000000..b5275ec --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/BouncyCastleSOPInstanceFactory.java @@ -0,0 +1,15 @@ +package org.pgpainless.bouncycastle.sop; + +import sop.SOP; +import sop.testsuite.SOPInstanceFactory; + +import java.util.Collections; +import java.util.Map; + +public class BouncyCastleSOPInstanceFactory extends SOPInstanceFactory { + + @Override + public Map provideSOPInstances() { + return Collections.singletonMap("bcsop", new BouncyCastleSOP()); + } +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopArmorDearmorTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopArmorDearmorTest.java new file mode 100644 index 0000000..a37495a --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopArmorDearmorTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.ArmorDearmorTest; + +public class BCSopArmorDearmorTest extends ArmorDearmorTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopChangeKeyPasswordTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopChangeKeyPasswordTest.java new file mode 100644 index 0000000..30167b6 --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopChangeKeyPasswordTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.ChangeKeyPasswordTest; + +public class BCSopChangeKeyPasswordTest extends ChangeKeyPasswordTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDecryptWithSessionKeyTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDecryptWithSessionKeyTest.java new file mode 100644 index 0000000..7c97172 --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDecryptWithSessionKeyTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.DecryptWithSessionKeyTest; + +public class BCSopDecryptWithSessionKeyTest extends DecryptWithSessionKeyTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDetachedSignDetachedVerifyTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDetachedSignDetachedVerifyTest.java new file mode 100644 index 0000000..abfdfe1 --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopDetachedSignDetachedVerifyTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.DetachedSignDetachedVerifyTest; + +public class BCSopDetachedSignDetachedVerifyTest extends DetachedSignDetachedVerifyTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopEncryptDecryptTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopEncryptDecryptTest.java new file mode 100644 index 0000000..bf53f56 --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopEncryptDecryptTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.EncryptDecryptTest; + +public class BCSopEncryptDecryptTest extends EncryptDecryptTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopExtractCertTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopExtractCertTest.java new file mode 100644 index 0000000..8f0d38b --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopExtractCertTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.ExtractCertTest; + +public class BCSopExtractCertTest extends ExtractCertTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopGenerateKeyTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopGenerateKeyTest.java new file mode 100644 index 0000000..ec3a3c0 --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopGenerateKeyTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.GenerateKeyTest; + +public class BCSopGenerateKeyTest extends GenerateKeyTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineDetachDetachedVerifyTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineDetachDetachedVerifyTest.java new file mode 100644 index 0000000..7e38e43 --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineDetachDetachedVerifyTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.InlineSignInlineDetachDetachedVerifyTest; + +public class BCSopInlineSignInlineDetachDetachedVerifyTest extends InlineSignInlineDetachDetachedVerifyTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineVerifyTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineVerifyTest.java new file mode 100644 index 0000000..e1eca6d --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopInlineSignInlineVerifyTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.InlineSignInlineVerifyTest; + +public class BCSopInlineSignInlineVerifyTest extends InlineSignInlineVerifyTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopRevokeKeyTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopRevokeKeyTest.java new file mode 100644 index 0000000..6b23ee3 --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopRevokeKeyTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.RevokeKeyTest; + +public class BCSopRevokeKeyTest extends RevokeKeyTest { +} diff --git a/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopVersionTest.java b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopVersionTest.java new file mode 100644 index 0000000..07788eb --- /dev/null +++ b/bcsop/src/test/java/org/pgpainless/bouncycastle/sop/operation/BCSopVersionTest.java @@ -0,0 +1,6 @@ +package org.pgpainless.bouncycastle.sop.operation; + +import sop.testsuite.operation.VersionTest; + +public class BCSopVersionTest extends VersionTest { +} diff --git a/pom.xml b/pom.xml index 6ba8e59..076c524 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,12 @@ sop-java-picocli 10.0.3-SNAPSHOT + + org.pgpainless + sop-java-testfixtures + 10.0.3-SNAPSHOT + test +