1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2025-09-09 10:19: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 b24d0ef99c
commit 2d42457ce4
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.OpenPGPKeyReader
import org.bouncycastle.openpgp.api.bc.BcOpenPGPApi
import org.bouncycastle.openpgp.api.bc.BcOpenPGPImplementation
import org.pgpainless.algorithm.OpenPGPKeyVersion
import org.pgpainless.bouncycastle.PolicyAdapter
import org.pgpainless.bouncycastle.extensions.setAlgorithmSuite
@ -34,7 +35,7 @@ import org.pgpainless.util.ArmorUtils
class PGPainless(
val implementation: OpenPGPImplementation = OpenPGPImplementation.getInstance(),
var algorithmPolicy: Policy = Policy.getInstance()
var algorithmPolicy: Policy = Policy()
) {
private var api: OpenPGPApi
@ -107,6 +108,8 @@ class PGPainless(
@Volatile private var instance: PGPainless? = null
@JvmStatic fun newInstance(): PGPainless = PGPainless(BcOpenPGPImplementation(), Policy())
@JvmStatic
fun getInstance(): PGPainless =
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
/** 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.

View file

@ -139,7 +139,7 @@ class CertifyCertificate(private val api: PGPainless) {
ThirdPartyCertificationSignatureBuilder(
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(
certificationKey: PGPSecretKeyRing,
protector: SecretKeyRingProtector
): CertificationOnUserIdWithSubpackets =
withKey(PGPainless.getInstance().toKey(certificationKey), protector)
): CertificationOnUserIdWithSubpackets = withKey(api.toKey(certificationKey), protector)
}
class CertificationOnUserIdWithSubpackets(
val certificate: OpenPGPCertificate,
val userId: CharSequence,
val sigBuilder: ThirdPartyCertificationSignatureBuilder
val sigBuilder: ThirdPartyCertificationSignatureBuilder,
private val api: PGPainless
) {
@Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.")
@ -170,7 +170,7 @@ class CertifyCertificate(private val api: PGPainless) {
userId: String,
sigBuilder: ThirdPartyCertificationSignatureBuilder,
api: PGPainless
) : this(api.toCertificate(certificate), userId, sigBuilder)
) : this(api.toCertificate(certificate), userId, sigBuilder, api)
/**
* Apply the given signature subpackets and build the certification.
@ -195,7 +195,7 @@ class CertifyCertificate(private val api: PGPainless) {
fun build(): CertificationResult {
val signature = sigBuilder.build(certificate, userId)
val certifiedCertificate =
OpenPGPCertificate(
api.toCertificate(
KeyRingUtils.injectCertification(
certificate.pgpPublicKeyRing, userId, signature.signature))
@ -226,7 +226,7 @@ class CertifyCertificate(private val api: PGPainless) {
sigBuilder.hashedSubpackets.setTrust(
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(
certificationKey: PGPSecretKeyRing,
protector: SecretKeyRingProtector
): DelegationOnCertificateWithSubpackets =
withKey(PGPainless.getInstance().toKey(certificationKey), protector)
): DelegationOnCertificateWithSubpackets = withKey(api.toKey(certificationKey), protector)
}
class DelegationOnCertificateWithSubpackets(
val certificate: OpenPGPCertificate,
val sigBuilder: ThirdPartyDirectKeySignatureBuilder
val sigBuilder: ThirdPartyDirectKeySignatureBuilder,
private val api: PGPainless
) {
@Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.")
constructor(
certificate: PGPPublicKeyRing,
sigBuilder: ThirdPartyDirectKeySignatureBuilder
) : this(PGPainless.getInstance().toCertificate(certificate), sigBuilder)
sigBuilder: ThirdPartyDirectKeySignatureBuilder,
api: PGPainless
) : this(api.toCertificate(certificate), sigBuilder, api)
/**
* 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 delegation = sigBuilder.build(delegatedKey)
val delegatedCertificate =
OpenPGPCertificate(
api.toCertificate(
KeyRingUtils.injectCertification(
certificate.pgpPublicKeyRing,
delegatedKey.pgpPublicKey,

View file

@ -411,15 +411,6 @@ class Policy(
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) {
private var certificationSignatureHashAlgorithmPolicy: HashAlgorithmPolicy =
origin.certificationSignatureHashAlgorithmPolicy

View file

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