From 5f64e92724ababc26aae7c7ee3d0628f45d6ef33 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 19 Mar 2025 11:08:03 +0100 Subject: [PATCH] Remove ProviderFactory classes It is no longer possible to inject custom SecurityProviders. Instead, you can create and inject your own implementation of BCs OpenPGPImplementation --- .../kotlin/org/pgpainless/policy/Policy.kt | 3 +- .../provider/BouncyCastleProviderFactory.kt | 12 ----- .../pgpainless/provider/ProviderFactory.kt | 33 ------------- .../key/BouncycastleExportSubkeys.java | 19 ++++---- .../provider/ProviderFactoryTest.java | 46 ------------------- 5 files changed, 11 insertions(+), 102 deletions(-) delete mode 100644 pgpainless-core/src/main/kotlin/org/pgpainless/provider/BouncyCastleProviderFactory.kt delete mode 100644 pgpainless-core/src/main/kotlin/org/pgpainless/provider/ProviderFactory.kt delete mode 100644 pgpainless-core/src/test/java/org/pgpainless/provider/ProviderFactoryTest.java diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt index 315c04d0..a82875ec 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt @@ -50,7 +50,8 @@ class Policy( * regardless of usage date. * * @param defaultHashAlgorithm default hash algorithm - * @param acceptableHashAlgorithmsAndTerminationDates map of acceptable algorithms and their termination dates + * @param acceptableHashAlgorithmsAndTerminationDates map of acceptable algorithms and their + * termination dates */ class HashAlgorithmPolicy( val defaultHashAlgorithm: HashAlgorithm, diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/provider/BouncyCastleProviderFactory.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/provider/BouncyCastleProviderFactory.kt deleted file mode 100644 index 27192953..00000000 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/provider/BouncyCastleProviderFactory.kt +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Paul Schaub -// -// SPDX-License-Identifier: Apache-2.0 - -package org.pgpainless.provider - -import java.security.Provider -import org.bouncycastle.jce.provider.BouncyCastleProvider - -class BouncyCastleProviderFactory : ProviderFactory() { - override val securityProvider: Provider = BouncyCastleProvider() -} diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/provider/ProviderFactory.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/provider/ProviderFactory.kt deleted file mode 100644 index 531ae54b..00000000 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/provider/ProviderFactory.kt +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Paul Schaub -// -// SPDX-License-Identifier: Apache-2.0 - -package org.pgpainless.provider - -import java.security.Provider - -/** - * Allow the use of different [Provider] implementations to provide cryptographic primitives by - * setting a [ProviderFactory] singleton. By default, the class is initialized with a - * [BouncyCastleProviderFactory]. To make use of your own custom [Provider], call [setFactory], - * passing your own custom [ProviderFactory] instance. - */ -abstract class ProviderFactory { - - protected abstract val securityProvider: Provider - protected open val securityProviderName: String - get() = securityProvider.name - - companion object { - // singleton instance - @JvmStatic var factory: ProviderFactory = BouncyCastleProviderFactory() - - @JvmStatic - val provider: Provider - @JvmName("getProvider") get() = factory.securityProvider - - @JvmStatic - val providerName: String - get() = factory.securityProviderName - } -} diff --git a/pgpainless-core/src/test/java/org/pgpainless/key/BouncycastleExportSubkeys.java b/pgpainless-core/src/test/java/org/pgpainless/key/BouncycastleExportSubkeys.java index f8ea991b..9836e077 100644 --- a/pgpainless-core/src/test/java/org/pgpainless/key/BouncycastleExportSubkeys.java +++ b/pgpainless-core/src/test/java/org/pgpainless/key/BouncycastleExportSubkeys.java @@ -8,6 +8,7 @@ import java.security.InvalidAlgorithmParameterException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; +import java.security.Provider; import java.util.Date; import org.bouncycastle.bcpg.CompressionAlgorithmTags; @@ -16,6 +17,7 @@ import org.bouncycastle.bcpg.PublicKeyAlgorithmTags; import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags; import org.bouncycastle.bcpg.sig.Features; import org.bouncycastle.bcpg.sig.KeyFlags; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPKeyPair; @@ -29,22 +31,19 @@ import org.bouncycastle.openpgp.operator.PGPDigestCalculator; import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder; import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder; import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair; -import org.junit.jupiter.api.TestTemplate; -import org.junit.jupiter.api.extension.ExtendWith; -import org.pgpainless.provider.ProviderFactory; -import org.pgpainless.util.TestAllImplementations; +import org.junit.jupiter.api.Test; public class BouncycastleExportSubkeys { - @TestTemplate - @ExtendWith(TestAllImplementations.class) + @Test public void testExportImport() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException { + Provider provider = new BouncyCastleProvider(); KeyPairGenerator generator; KeyPair pair; // Generate master key - generator = KeyPairGenerator.getInstance("ECDSA", ProviderFactory.getProvider()); + generator = KeyPairGenerator.getInstance("ECDSA", provider); generator.initialize(new ECNamedCurveGenParameterSpec("P-256")); pair = generator.generateKeyPair(); @@ -70,7 +69,7 @@ public class BouncycastleExportSubkeys { // Generate sub key - generator = KeyPairGenerator.getInstance("ECDH", ProviderFactory.getProvider()); + generator = KeyPairGenerator.getInstance("ECDH", provider); generator.initialize(new ECNamedCurveGenParameterSpec("P-256")); pair = generator.generateKeyPair(); @@ -79,13 +78,13 @@ public class BouncycastleExportSubkeys { // Assemble key PGPDigestCalculator calculator = new JcaPGPDigestCalculatorProviderBuilder() - .setProvider(ProviderFactory.getProvider()) + .setProvider(provider) .build() .get(HashAlgorithmTags.SHA1); PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder( pgpMasterKey.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA512) - .setProvider(ProviderFactory.getProvider()); + .setProvider(provider); PGPKeyRingGenerator pgpGenerator = new PGPKeyRingGenerator(PGPSignature.POSITIVE_CERTIFICATION, pgpMasterKey, "alice@wonderland.lit", calculator, subPackets.generate(), null, diff --git a/pgpainless-core/src/test/java/org/pgpainless/provider/ProviderFactoryTest.java b/pgpainless-core/src/test/java/org/pgpainless/provider/ProviderFactoryTest.java deleted file mode 100644 index 5489a11c..00000000 --- a/pgpainless-core/src/test/java/org/pgpainless/provider/ProviderFactoryTest.java +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-FileCopyrightText: 2020 Paul Schaub -// -// SPDX-License-Identifier: Apache-2.0 - -package org.pgpainless.provider; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.security.Provider; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; - -public class ProviderFactoryTest { - - private final ProviderFactory customProviderFactory = new ProviderFactory() { - - @SuppressWarnings("deprecation") - final Provider provider = new Provider("PL", 1L, "PGPainlessTestProvider") { - - }; - - @Override - protected Provider getSecurityProvider() { - return provider; - } - - }; - - @Test - public void providerFactoryDefaultIsBouncyCastleTest() { - assertEquals("BC", ProviderFactory.getProviderName()); - } - - @Test - public void setCustomProviderTest() { - ProviderFactory.setFactory(customProviderFactory); - assertEquals("PL", ProviderFactory.getProviderName()); - } - - @AfterEach - public void resetToDefault() { - // Reset back to BouncyCastle - ProviderFactory.setFactory(new BouncyCastleProviderFactory()); - } -}