mirror of
https://github.com/pgpainless/pgpainless.git
synced 2025-09-09 18:29: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:
parent
6951911520
commit
5f64e92724
5 changed files with 11 additions and 102 deletions
|
@ -50,7 +50,8 @@ class Policy(
|
||||||
* regardless of usage date.
|
* regardless of usage date.
|
||||||
*
|
*
|
||||||
* @param defaultHashAlgorithm default hash algorithm
|
* @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(
|
class HashAlgorithmPolicy(
|
||||||
val defaultHashAlgorithm: HashAlgorithm,
|
val defaultHashAlgorithm: HashAlgorithm,
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,6 +8,7 @@ import java.security.InvalidAlgorithmParameterException;
|
||||||
import java.security.KeyPair;
|
import java.security.KeyPair;
|
||||||
import java.security.KeyPairGenerator;
|
import java.security.KeyPairGenerator;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.Provider;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import org.bouncycastle.bcpg.CompressionAlgorithmTags;
|
import org.bouncycastle.bcpg.CompressionAlgorithmTags;
|
||||||
|
@ -16,6 +17,7 @@ import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;
|
||||||
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
|
import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
|
||||||
import org.bouncycastle.bcpg.sig.Features;
|
import org.bouncycastle.bcpg.sig.Features;
|
||||||
import org.bouncycastle.bcpg.sig.KeyFlags;
|
import org.bouncycastle.bcpg.sig.KeyFlags;
|
||||||
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec;
|
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec;
|
||||||
import org.bouncycastle.openpgp.PGPException;
|
import org.bouncycastle.openpgp.PGPException;
|
||||||
import org.bouncycastle.openpgp.PGPKeyPair;
|
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.JcaPGPContentSignerBuilder;
|
||||||
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
|
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
|
||||||
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
|
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
|
||||||
import org.junit.jupiter.api.TestTemplate;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
|
||||||
import org.pgpainless.provider.ProviderFactory;
|
|
||||||
import org.pgpainless.util.TestAllImplementations;
|
|
||||||
|
|
||||||
public class BouncycastleExportSubkeys {
|
public class BouncycastleExportSubkeys {
|
||||||
|
|
||||||
@TestTemplate
|
@Test
|
||||||
@ExtendWith(TestAllImplementations.class)
|
|
||||||
public void testExportImport() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException {
|
public void testExportImport() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, PGPException {
|
||||||
|
Provider provider = new BouncyCastleProvider();
|
||||||
KeyPairGenerator generator;
|
KeyPairGenerator generator;
|
||||||
KeyPair pair;
|
KeyPair pair;
|
||||||
|
|
||||||
// Generate master key
|
// Generate master key
|
||||||
|
|
||||||
generator = KeyPairGenerator.getInstance("ECDSA", ProviderFactory.getProvider());
|
generator = KeyPairGenerator.getInstance("ECDSA", provider);
|
||||||
generator.initialize(new ECNamedCurveGenParameterSpec("P-256"));
|
generator.initialize(new ECNamedCurveGenParameterSpec("P-256"));
|
||||||
|
|
||||||
pair = generator.generateKeyPair();
|
pair = generator.generateKeyPair();
|
||||||
|
@ -70,7 +69,7 @@ public class BouncycastleExportSubkeys {
|
||||||
|
|
||||||
// Generate sub key
|
// Generate sub key
|
||||||
|
|
||||||
generator = KeyPairGenerator.getInstance("ECDH", ProviderFactory.getProvider());
|
generator = KeyPairGenerator.getInstance("ECDH", provider);
|
||||||
generator.initialize(new ECNamedCurveGenParameterSpec("P-256"));
|
generator.initialize(new ECNamedCurveGenParameterSpec("P-256"));
|
||||||
|
|
||||||
pair = generator.generateKeyPair();
|
pair = generator.generateKeyPair();
|
||||||
|
@ -79,13 +78,13 @@ public class BouncycastleExportSubkeys {
|
||||||
// Assemble key
|
// Assemble key
|
||||||
|
|
||||||
PGPDigestCalculator calculator = new JcaPGPDigestCalculatorProviderBuilder()
|
PGPDigestCalculator calculator = new JcaPGPDigestCalculatorProviderBuilder()
|
||||||
.setProvider(ProviderFactory.getProvider())
|
.setProvider(provider)
|
||||||
.build()
|
.build()
|
||||||
.get(HashAlgorithmTags.SHA1);
|
.get(HashAlgorithmTags.SHA1);
|
||||||
|
|
||||||
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
PGPContentSignerBuilder signerBuilder = new JcaPGPContentSignerBuilder(
|
||||||
pgpMasterKey.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA512)
|
pgpMasterKey.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA512)
|
||||||
.setProvider(ProviderFactory.getProvider());
|
.setProvider(provider);
|
||||||
|
|
||||||
PGPKeyRingGenerator pgpGenerator = new PGPKeyRingGenerator(PGPSignature.POSITIVE_CERTIFICATION,
|
PGPKeyRingGenerator pgpGenerator = new PGPKeyRingGenerator(PGPSignature.POSITIVE_CERTIFICATION,
|
||||||
pgpMasterKey, "alice@wonderland.lit", calculator, subPackets.generate(), null,
|
pgpMasterKey, "alice@wonderland.lit", calculator, subPackets.generate(), null,
|
||||||
|
|
|
@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue