From 31e6f2e73aa86b3fd9de39c13f2cfc14c2e12ab5 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 29 Jan 2025 11:13:46 +0100 Subject: [PATCH] Allow passing version number to key generator --- .../src/main/kotlin/org/pgpainless/PGPainless.kt | 11 +++++++++-- .../org/pgpainless/algorithm/OpenPGPKeyVersion.kt | 6 ++++++ .../org/pgpainless/key/generation/KeyRingBuilder.kt | 4 +++- .../org/pgpainless/key/generation/KeyRingTemplates.kt | 11 ++++++----- 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/OpenPGPKeyVersion.kt diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt index 81d9e605..896692c2 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt @@ -10,6 +10,7 @@ import org.bouncycastle.openpgp.PGPKeyRing import org.bouncycastle.openpgp.PGPPublicKeyRing import org.bouncycastle.openpgp.PGPSecretKeyRing import org.bouncycastle.openpgp.PGPSignature +import org.pgpainless.algorithm.OpenPGPKeyVersion import org.pgpainless.decryption_verification.DecryptionBuilder import org.pgpainless.encryption_signing.EncryptionBuilder import org.pgpainless.key.certification.CertifyCertificate @@ -31,14 +32,20 @@ class PGPainless private constructor() { * * @return templates */ - @JvmStatic fun generateKeyRing() = KeyRingTemplates() + @JvmStatic + @JvmOverloads + fun generateKeyRing(version: OpenPGPKeyVersion = OpenPGPKeyVersion.v4) = + KeyRingTemplates(version) /** * Build a custom OpenPGP key ring. * * @return builder */ - @JvmStatic fun buildKeyRing() = KeyRingBuilder() + @JvmStatic + @JvmOverloads + fun buildKeyRing(version: OpenPGPKeyVersion = OpenPGPKeyVersion.v4) = + KeyRingBuilder(version) /** * Read an existing OpenPGP key ring. diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/OpenPGPKeyVersion.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/OpenPGPKeyVersion.kt new file mode 100644 index 00000000..2ed21fd1 --- /dev/null +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/OpenPGPKeyVersion.kt @@ -0,0 +1,6 @@ +package org.pgpainless.algorithm + +enum class OpenPGPKeyVersion(val version: Int) { + v4(4), + v6(6), +} diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt index e7caa43b..f5e4515a 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt @@ -16,6 +16,7 @@ import org.bouncycastle.openpgp.operator.PGPDigestCalculator import org.bouncycastle.util.Strings import org.pgpainless.PGPainless import org.pgpainless.algorithm.KeyFlag +import org.pgpainless.algorithm.OpenPGPKeyVersion import org.pgpainless.algorithm.SignatureType import org.pgpainless.bouncycastle.extensions.unlock import org.pgpainless.implementation.ImplementationFactory @@ -25,7 +26,8 @@ import org.pgpainless.signature.subpackets.SignatureSubpackets import org.pgpainless.signature.subpackets.SignatureSubpacketsHelper import org.pgpainless.util.Passphrase -class KeyRingBuilder : KeyRingBuilderInterface { +class KeyRingBuilder(private val version: OpenPGPKeyVersion) : + KeyRingBuilderInterface { private var primaryKeySpec: KeySpec? = null private val subKeySpecs = mutableListOf() diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt index 82743661..98cf9b2b 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt @@ -7,6 +7,7 @@ package org.pgpainless.key.generation import org.bouncycastle.openpgp.PGPSecretKeyRing import org.pgpainless.PGPainless.Companion.buildKeyRing import org.pgpainless.algorithm.KeyFlag +import org.pgpainless.algorithm.OpenPGPKeyVersion import org.pgpainless.key.generation.KeySpec.Companion.getBuilder import org.pgpainless.key.generation.type.KeyType import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacyCurve @@ -14,7 +15,7 @@ import org.pgpainless.key.generation.type.rsa.RsaLength import org.pgpainless.key.generation.type.xdh_legacy.XDHLegacySpec import org.pgpainless.util.Passphrase -class KeyRingTemplates { +class KeyRingTemplates(private val version: OpenPGPKeyVersion) { /** * Generate an RSA OpenPGP key consisting of an RSA primary key used for certification, a @@ -31,7 +32,7 @@ class KeyRingTemplates { length: RsaLength, passphrase: Passphrase = Passphrase.emptyPassphrase() ): PGPSecretKeyRing = - buildKeyRing() + buildKeyRing(version) .apply { setPrimaryKey(getBuilder(KeyType.RSA(length), KeyFlag.CERTIFY_OTHER)) addSubkey(getBuilder(KeyType.RSA(length), KeyFlag.SIGN_DATA)) @@ -78,7 +79,7 @@ class KeyRingTemplates { length: RsaLength, passphrase: Passphrase = Passphrase.emptyPassphrase() ): PGPSecretKeyRing = - buildKeyRing() + buildKeyRing(version) .apply { setPrimaryKey( getBuilder( @@ -125,7 +126,7 @@ class KeyRingTemplates { userId: CharSequence?, passphrase: Passphrase = Passphrase.emptyPassphrase() ): PGPSecretKeyRing = - buildKeyRing() + buildKeyRing(version) .apply { setPrimaryKey( getBuilder( @@ -175,7 +176,7 @@ class KeyRingTemplates { userId: CharSequence?, passphrase: Passphrase = Passphrase.emptyPassphrase() ): PGPSecretKeyRing = - buildKeyRing() + buildKeyRing(version) .apply { setPrimaryKey( getBuilder(