From 2dea73c584fb7dcab175cc07c3842b6e8a48b2ae Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 2 Apr 2025 13:45:21 +0200 Subject: [PATCH] KeySpecBuilder: Expose API for overriding default AEAD algorithms and features --- .../key/generation/KeySpecBuilder.kt | 24 ++++++++++++++----- .../key/generation/KeySpecBuilderInterface.kt | 6 +++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilder.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilder.kt index 2ed50ffa..21cf5ec0 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilder.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilder.kt @@ -12,8 +12,7 @@ import org.pgpainless.signature.subpackets.SelfSignatureSubpackets import org.pgpainless.signature.subpackets.SignatureSubpackets import org.pgpainless.signature.subpackets.SignatureSubpacketsUtil -class KeySpecBuilder -constructor( +class KeySpecBuilder( private val type: KeyType, private val keyFlags: List, ) : KeySpecBuilderInterface { @@ -27,6 +26,7 @@ constructor( private var preferredSymmetricAlgorithms: Set? = algorithmSuite.symmetricKeyAlgorithms private var preferredAEADAlgorithms: Set? = algorithmSuite.aeadAlgorithms + private var features: Set? = algorithmSuite.features private var keyCreationDate: Date? = null constructor(type: KeyType, vararg keyFlags: KeyFlag) : this(type, listOf(*keyFlags)) @@ -37,11 +37,13 @@ constructor( override fun overridePreferredCompressionAlgorithms( vararg algorithms: CompressionAlgorithm - ): KeySpecBuilder = apply { this.preferredCompressionAlgorithms = algorithms.toSet() } + ): KeySpecBuilder = apply { + this.preferredCompressionAlgorithms = if (algorithms.isEmpty()) null else algorithms.toSet() + } override fun overridePreferredHashAlgorithms(vararg algorithms: HashAlgorithm): KeySpecBuilder = apply { - this.preferredHashAlgorithms = algorithms.toSet() + this.preferredHashAlgorithms = if (algorithms.isEmpty()) null else algorithms.toSet() } override fun overridePreferredSymmetricKeyAlgorithms( @@ -50,7 +52,17 @@ constructor( require(!algorithms.contains(SymmetricKeyAlgorithm.NULL)) { "NULL (unencrypted) is an invalid symmetric key algorithm preference." } - this.preferredSymmetricAlgorithms = algorithms.toSet() + this.preferredSymmetricAlgorithms = if (algorithms.isEmpty()) null else algorithms.toSet() + } + + override fun overridePreferredAEADAlgorithms( + vararg algorithms: AEADCipherMode + ): KeySpecBuilder = apply { + this.preferredAEADAlgorithms = if (algorithms.isEmpty()) null else algorithms.toSet() + } + + override fun overrideFeatures(vararg features: Feature): KeySpecBuilder = apply { + this.features = if (features.isEmpty()) null else features.toSet() } override fun setKeyCreationDate(creationDate: Date): KeySpecBuilder = apply { @@ -65,7 +77,7 @@ constructor( preferredHashAlgorithms?.let { setPreferredHashAlgorithms(it) } preferredSymmetricAlgorithms?.let { setPreferredSymmetricKeyAlgorithms(it) } preferredAEADAlgorithms?.let { setPreferredAEADCiphersuites(it) } - setFeatures(Feature.MODIFICATION_DETECTION) + features?.let { setFeatures(*it.toTypedArray()) } } .let { KeySpec(type, hashedSubpackets as SignatureSubpackets, false, keyCreationDate) } } diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilderInterface.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilderInterface.kt index 7fb767e4..956a70b0 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilderInterface.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeySpecBuilderInterface.kt @@ -5,7 +5,9 @@ package org.pgpainless.key.generation import java.util.* +import org.pgpainless.algorithm.AEADCipherMode import org.pgpainless.algorithm.CompressionAlgorithm +import org.pgpainless.algorithm.Feature import org.pgpainless.algorithm.HashAlgorithm import org.pgpainless.algorithm.SymmetricKeyAlgorithm @@ -21,6 +23,10 @@ interface KeySpecBuilderInterface { vararg algorithms: SymmetricKeyAlgorithm ): KeySpecBuilder + fun overridePreferredAEADAlgorithms(vararg algorithms: AEADCipherMode): KeySpecBuilder + + fun overrideFeatures(vararg features: Feature): KeySpecBuilder + fun setKeyCreationDate(creationDate: Date): KeySpecBuilder fun build(): KeySpec