1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2025-09-09 10:19:39 +02:00

Remove ProviderFactory classes

It is no longer possible to inject custom SecurityProviders.
Instead, you can create and inject your own implementation of BCs OpenPGPImplementation
This commit is contained in:
Paul Schaub 2025-03-19 11:08:03 +01:00
parent 6951911520
commit 5f64e92724
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
5 changed files with 11 additions and 102 deletions

View file

@ -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,

View file

@ -1,12 +0,0 @@
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// 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()
}

View file

@ -1,33 +0,0 @@
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// 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
}
}

View file

@ -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,

View file

@ -1,46 +0,0 @@
// SPDX-FileCopyrightText: 2020 Paul Schaub <vanitasvitae@fsfe.org>
//
// 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());
}
}