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

Policy is no longer a Singleton

This commit is contained in:
Paul Schaub 2025-03-20 20:17:50 +01:00
parent 1afcbacb04
commit f2bd36502f
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
5 changed files with 26 additions and 31 deletions

View file

@ -17,6 +17,7 @@ import org.bouncycastle.openpgp.api.OpenPGPKey
import org.bouncycastle.openpgp.api.OpenPGPKeyGenerator import org.bouncycastle.openpgp.api.OpenPGPKeyGenerator
import org.bouncycastle.openpgp.api.OpenPGPKeyReader import org.bouncycastle.openpgp.api.OpenPGPKeyReader
import org.bouncycastle.openpgp.api.bc.BcOpenPGPApi import org.bouncycastle.openpgp.api.bc.BcOpenPGPApi
import org.bouncycastle.openpgp.api.bc.BcOpenPGPImplementation
import org.pgpainless.algorithm.OpenPGPKeyVersion import org.pgpainless.algorithm.OpenPGPKeyVersion
import org.pgpainless.bouncycastle.PolicyAdapter import org.pgpainless.bouncycastle.PolicyAdapter
import org.pgpainless.bouncycastle.extensions.setAlgorithmSuite import org.pgpainless.bouncycastle.extensions.setAlgorithmSuite
@ -34,7 +35,7 @@ import org.pgpainless.util.ArmorUtils
class PGPainless( class PGPainless(
val implementation: OpenPGPImplementation = OpenPGPImplementation.getInstance(), val implementation: OpenPGPImplementation = OpenPGPImplementation.getInstance(),
var algorithmPolicy: Policy = Policy.getInstance() var algorithmPolicy: Policy = Policy()
) { ) {
private var api: OpenPGPApi private var api: OpenPGPApi
@ -107,6 +108,8 @@ class PGPainless(
@Volatile private var instance: PGPainless? = null @Volatile private var instance: PGPainless? = null
@JvmStatic fun newInstance(): PGPainless = PGPainless(BcOpenPGPImplementation(), Policy())
@JvmStatic @JvmStatic
fun getInstance(): PGPainless = fun getInstance(): PGPainless =
instance ?: synchronized(this) { instance ?: PGPainless().also { instance = it } } instance ?: synchronized(this) { instance ?: PGPainless().also { instance = it } }

View file

@ -10,7 +10,7 @@ import org.bouncycastle.openpgp.api.OpenPGPPolicy.OpenPGPNotationRegistry
import org.pgpainless.policy.Policy import org.pgpainless.policy.Policy
/** Adapter class that adapts a PGPainless [Policy] object to Bouncy Castles [OpenPGPPolicy]. */ /** Adapter class that adapts a PGPainless [Policy] object to Bouncy Castles [OpenPGPPolicy]. */
class PolicyAdapter(val policy: Policy = Policy.getInstance()) : OpenPGPPolicy { class PolicyAdapter(val policy: Policy) : OpenPGPPolicy {
/** /**
* Determine, whether the hash algorithm of a document signature is acceptable. * Determine, whether the hash algorithm of a document signature is acceptable.

View file

@ -139,7 +139,7 @@ class CertifyCertificate(private val api: PGPainless) {
ThirdPartyCertificationSignatureBuilder( ThirdPartyCertificationSignatureBuilder(
certificationType.asSignatureType(), secretKey, protector, api) certificationType.asSignatureType(), secretKey, protector, api)
return CertificationOnUserIdWithSubpackets(certificate, userId, sigBuilder) return CertificationOnUserIdWithSubpackets(certificate, userId, sigBuilder, api)
} }
/** /**
@ -154,14 +154,14 @@ class CertifyCertificate(private val api: PGPainless) {
fun withKey( fun withKey(
certificationKey: PGPSecretKeyRing, certificationKey: PGPSecretKeyRing,
protector: SecretKeyRingProtector protector: SecretKeyRingProtector
): CertificationOnUserIdWithSubpackets = ): CertificationOnUserIdWithSubpackets = withKey(api.toKey(certificationKey), protector)
withKey(PGPainless.getInstance().toKey(certificationKey), protector)
} }
class CertificationOnUserIdWithSubpackets( class CertificationOnUserIdWithSubpackets(
val certificate: OpenPGPCertificate, val certificate: OpenPGPCertificate,
val userId: CharSequence, val userId: CharSequence,
val sigBuilder: ThirdPartyCertificationSignatureBuilder val sigBuilder: ThirdPartyCertificationSignatureBuilder,
private val api: PGPainless
) { ) {
@Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.") @Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.")
@ -170,7 +170,7 @@ class CertifyCertificate(private val api: PGPainless) {
userId: String, userId: String,
sigBuilder: ThirdPartyCertificationSignatureBuilder, sigBuilder: ThirdPartyCertificationSignatureBuilder,
api: PGPainless api: PGPainless
) : this(api.toCertificate(certificate), userId, sigBuilder) ) : this(api.toCertificate(certificate), userId, sigBuilder, api)
/** /**
* Apply the given signature subpackets and build the certification. * Apply the given signature subpackets and build the certification.
@ -195,7 +195,7 @@ class CertifyCertificate(private val api: PGPainless) {
fun build(): CertificationResult { fun build(): CertificationResult {
val signature = sigBuilder.build(certificate, userId) val signature = sigBuilder.build(certificate, userId)
val certifiedCertificate = val certifiedCertificate =
OpenPGPCertificate( api.toCertificate(
KeyRingUtils.injectCertification( KeyRingUtils.injectCertification(
certificate.pgpPublicKeyRing, userId, signature.signature)) certificate.pgpPublicKeyRing, userId, signature.signature))
@ -226,7 +226,7 @@ class CertifyCertificate(private val api: PGPainless) {
sigBuilder.hashedSubpackets.setTrust( sigBuilder.hashedSubpackets.setTrust(
true, trustworthiness.depth, trustworthiness.amount) true, trustworthiness.depth, trustworthiness.amount)
} }
return DelegationOnCertificateWithSubpackets(certificate, sigBuilder) return DelegationOnCertificateWithSubpackets(certificate, sigBuilder, api)
} }
/** /**
@ -241,20 +241,21 @@ class CertifyCertificate(private val api: PGPainless) {
fun withKey( fun withKey(
certificationKey: PGPSecretKeyRing, certificationKey: PGPSecretKeyRing,
protector: SecretKeyRingProtector protector: SecretKeyRingProtector
): DelegationOnCertificateWithSubpackets = ): DelegationOnCertificateWithSubpackets = withKey(api.toKey(certificationKey), protector)
withKey(PGPainless.getInstance().toKey(certificationKey), protector)
} }
class DelegationOnCertificateWithSubpackets( class DelegationOnCertificateWithSubpackets(
val certificate: OpenPGPCertificate, val certificate: OpenPGPCertificate,
val sigBuilder: ThirdPartyDirectKeySignatureBuilder val sigBuilder: ThirdPartyDirectKeySignatureBuilder,
private val api: PGPainless
) { ) {
@Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.") @Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.")
constructor( constructor(
certificate: PGPPublicKeyRing, certificate: PGPPublicKeyRing,
sigBuilder: ThirdPartyDirectKeySignatureBuilder sigBuilder: ThirdPartyDirectKeySignatureBuilder,
) : this(PGPainless.getInstance().toCertificate(certificate), sigBuilder) api: PGPainless
) : this(api.toCertificate(certificate), sigBuilder, api)
/** /**
* Apply the given signature subpackets and build the delegation signature. * Apply the given signature subpackets and build the delegation signature.
@ -280,7 +281,7 @@ class CertifyCertificate(private val api: PGPainless) {
val delegatedKey = certificate.primaryKey val delegatedKey = certificate.primaryKey
val delegation = sigBuilder.build(delegatedKey) val delegation = sigBuilder.build(delegatedKey)
val delegatedCertificate = val delegatedCertificate =
OpenPGPCertificate( api.toCertificate(
KeyRingUtils.injectCertification( KeyRingUtils.injectCertification(
certificate.pgpPublicKeyRing, certificate.pgpPublicKeyRing,
delegatedKey.pgpPublicKey, delegatedKey.pgpPublicKey,

View file

@ -411,15 +411,6 @@ class Policy(
DISABLED DISABLED
} }
companion object {
@Volatile private var INSTANCE: Policy? = null
@JvmStatic
fun getInstance() =
INSTANCE ?: synchronized(this) { INSTANCE ?: Policy().also { INSTANCE = it } }
}
class Builder(private val origin: Policy) { class Builder(private val origin: Policy) {
private var certificationSignatureHashAlgorithmPolicy: HashAlgorithmPolicy = private var certificationSignatureHashAlgorithmPolicy: HashAlgorithmPolicy =
origin.certificationSignatureHashAlgorithmPolicy origin.certificationSignatureHashAlgorithmPolicy

View file

@ -17,43 +17,43 @@ public class PolicySetterTest {
@Test @Test
public void testSetCertificationSignatureHashAlgorithmPolicy_NullFails() { public void testSetCertificationSignatureHashAlgorithmPolicy_NullFails() {
Policy policy = Policy.getInstance(); Policy policy = new Policy();
assertThrows(NullPointerException.class, () -> policy.copy().withCertificationSignatureHashAlgorithmPolicy(null)); assertThrows(NullPointerException.class, () -> policy.copy().withCertificationSignatureHashAlgorithmPolicy(null));
} }
@Test @Test
public void testSetDataSignatureHashAlgorithmPolicy_NullFails() { public void testSetDataSignatureHashAlgorithmPolicy_NullFails() {
Policy policy = Policy.getInstance(); Policy policy = new Policy();
assertThrows(NullPointerException.class, () -> policy.copy().withDataSignatureHashAlgorithmPolicy(null)); assertThrows(NullPointerException.class, () -> policy.copy().withDataSignatureHashAlgorithmPolicy(null));
} }
@Test @Test
public void testSetRevocationSignatureHashAlgorithmPolicy_NullFails() { public void testSetRevocationSignatureHashAlgorithmPolicy_NullFails() {
Policy policy = Policy.getInstance(); Policy policy = new Policy();
assertThrows(NullPointerException.class, () -> policy.copy().withRevocationSignatureHashAlgorithmPolicy(null)); assertThrows(NullPointerException.class, () -> policy.copy().withRevocationSignatureHashAlgorithmPolicy(null));
} }
@Test @Test
public void testSetSymmetricKeyEncryptionAlgorithmPolicy_NullFails() { public void testSetSymmetricKeyEncryptionAlgorithmPolicy_NullFails() {
Policy policy = Policy.getInstance(); Policy policy = new Policy();
assertThrows(NullPointerException.class, () -> policy.copy().withSymmetricKeyEncryptionAlgorithmPolicy(null)); assertThrows(NullPointerException.class, () -> policy.copy().withSymmetricKeyEncryptionAlgorithmPolicy(null));
} }
@Test @Test
public void testSetSymmetricKeyDecryptionAlgorithmPolicy_NullFails() { public void testSetSymmetricKeyDecryptionAlgorithmPolicy_NullFails() {
Policy policy = Policy.getInstance(); Policy policy = new Policy();
assertThrows(NullPointerException.class, () -> policy.copy().withSymmetricKeyDecryptionAlgorithmPolicy(null)); assertThrows(NullPointerException.class, () -> policy.copy().withSymmetricKeyDecryptionAlgorithmPolicy(null));
} }
@Test @Test
public void testSetCompressionAlgorithmPolicy_NullFails() { public void testSetCompressionAlgorithmPolicy_NullFails() {
Policy policy = Policy.getInstance(); Policy policy = new Policy();
assertThrows(NullPointerException.class, () -> policy.copy().withCompressionAlgorithmPolicy(null)); assertThrows(NullPointerException.class, () -> policy.copy().withCompressionAlgorithmPolicy(null));
} }
@Test @Test
public void testSetPublicKeyAlgorithmPolicy_NullFails() { public void testSetPublicKeyAlgorithmPolicy_NullFails() {
Policy policy = Policy.getInstance(); Policy policy = new Policy();
assertThrows(NullPointerException.class, () -> policy.copy().withPublicKeyAlgorithmPolicy(null)); assertThrows(NullPointerException.class, () -> policy.copy().withPublicKeyAlgorithmPolicy(null));
} }