From 443361ba03407f3b5b0f402865c607ac8188719d Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 29 Jan 2025 12:09:37 +0100 Subject: [PATCH] Add new key types X25519, X448, Ed25519, Ed448 --- .../pgpainless/key/generation/type/KeyType.kt | 20 +++++++++++-------- .../key/generation/type/ecc/Ed25519.kt | 16 +++++++++++++++ .../key/generation/type/ecc/Ed448.kt | 16 +++++++++++++++ .../key/generation/type/ecc/X25519.kt | 16 +++++++++++++++ .../key/generation/type/ecc/X448.kt | 16 +++++++++++++++ .../key/generation/type/ecc/ecdh/ECDH.kt | 2 -- .../key/generation/type/ecc/ecdsa/ECDSA.kt | 2 -- .../type/eddsa_legacy/EdDSALegacy.kt | 2 -- .../pgpainless/key/generation/type/rsa/RSA.kt | 2 -- .../generation/type/xdh_legacy/XDHLegacy.kt | 2 -- 10 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed25519.kt create mode 100644 pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed448.kt create mode 100644 pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X25519.kt create mode 100644 pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X448.kt diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/KeyType.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/KeyType.kt index 54718a53..2fa6d0c4 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/KeyType.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/KeyType.kt @@ -4,11 +4,14 @@ package org.pgpainless.key.generation.type -import java.security.spec.AlgorithmParameterSpec import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.pgpainless.algorithm.PublicKeyAlgorithm +import org.pgpainless.key.generation.type.ecc.Ed25519 +import org.pgpainless.key.generation.type.ecc.Ed448 import org.pgpainless.key.generation.type.ecc.EllipticCurve +import org.pgpainless.key.generation.type.ecc.X25519 +import org.pgpainless.key.generation.type.ecc.X448 import org.pgpainless.key.generation.type.ecc.ecdh.ECDH import org.pgpainless.key.generation.type.ecc.ecdsa.ECDSA import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacy @@ -42,13 +45,6 @@ interface KeyType { */ val bitStrength: Int - /** - * Return an implementation of [AlgorithmParameterSpec] that can be used to generate the key. - * - * @return algorithm parameter spec - */ - val algorithmSpec: AlgorithmParameterSpec - /** * Return true if the key that is generated from this type is able to carry the SIGN_DATA key * flag. See [org.pgpainless.algorithm.KeyFlag.SIGN_DATA]. @@ -107,5 +103,13 @@ interface KeyType { fun EDDSA_LEGACY(curve: EdDSALegacyCurve): EdDSALegacy = EdDSALegacy.fromCurve(curve) @JvmStatic fun XDH_LEGACY(curve: XDHLegacySpec): XDHLegacy = XDHLegacy.fromSpec(curve) + + @JvmStatic fun X25519(): X25519 = org.pgpainless.key.generation.type.ecc.X25519() + + @JvmStatic fun X448(): X448 = org.pgpainless.key.generation.type.ecc.X448() + + @JvmStatic fun Ed25519(): Ed25519 = org.pgpainless.key.generation.type.ecc.Ed25519() + + @JvmStatic fun Ed448(): Ed448 = org.pgpainless.key.generation.type.ecc.Ed448() } } diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed25519.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed25519.kt new file mode 100644 index 00000000..bbd1d38d --- /dev/null +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed25519.kt @@ -0,0 +1,16 @@ +package org.pgpainless.key.generation.type.ecc + +import org.bouncycastle.openpgp.PGPKeyPair +import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator +import org.pgpainless.algorithm.PublicKeyAlgorithm +import org.pgpainless.key.generation.type.KeyType + +class Ed25519 : KeyType { + override val name: String = "Ed25519" + override val algorithm: PublicKeyAlgorithm = PublicKeyAlgorithm.ED25519 + override val bitStrength: Int = 256 + + override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { + return generator.generateEd25519KeyPair() + } +} diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed448.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed448.kt new file mode 100644 index 00000000..82b1431a --- /dev/null +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/Ed448.kt @@ -0,0 +1,16 @@ +package org.pgpainless.key.generation.type.ecc + +import org.bouncycastle.openpgp.PGPKeyPair +import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator +import org.pgpainless.algorithm.PublicKeyAlgorithm +import org.pgpainless.key.generation.type.KeyType + +class Ed448 : KeyType { + override val name: String = "Ed448" + override val algorithm: PublicKeyAlgorithm = PublicKeyAlgorithm.ED448 + override val bitStrength: Int = 456 + + override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { + return generator.generateEd448KeyPair() + } +} diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X25519.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X25519.kt new file mode 100644 index 00000000..4b4dd85b --- /dev/null +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X25519.kt @@ -0,0 +1,16 @@ +package org.pgpainless.key.generation.type.ecc + +import org.bouncycastle.openpgp.PGPKeyPair +import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator +import org.pgpainless.algorithm.PublicKeyAlgorithm +import org.pgpainless.key.generation.type.KeyType + +class X25519 : KeyType { + override val name: String = "X25519" + override val algorithm: PublicKeyAlgorithm = PublicKeyAlgorithm.X25519 + override val bitStrength: Int = 256 + + override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { + return generator.generateX25519KeyPair() + } +} diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X448.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X448.kt new file mode 100644 index 00000000..383ba01e --- /dev/null +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/X448.kt @@ -0,0 +1,16 @@ +package org.pgpainless.key.generation.type.ecc + +import org.bouncycastle.openpgp.PGPKeyPair +import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator +import org.pgpainless.algorithm.PublicKeyAlgorithm +import org.pgpainless.key.generation.type.KeyType + +class X448 : KeyType { + override val name: String = "X448" + override val algorithm: PublicKeyAlgorithm = PublicKeyAlgorithm.X448 + override val bitStrength: Int = 448 + + override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { + return generator.generateX448KeyPair() + } +} diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdh/ECDH.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdh/ECDH.kt index 6d488645..650604dc 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdh/ECDH.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdh/ECDH.kt @@ -5,7 +5,6 @@ package org.pgpainless.key.generation.type.ecc.ecdh import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil -import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.pgpainless.algorithm.PublicKeyAlgorithm @@ -16,7 +15,6 @@ class ECDH private constructor(val curve: EllipticCurve) : KeyType { override val name = "ECDH" override val algorithm = PublicKeyAlgorithm.ECDH override val bitStrength = curve.bitStrength - override val algorithmSpec = ECNamedCurveGenParameterSpec(curve.curveName) override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { return ECUtil.getNamedCurveOid(curve.curveName).let { generator.generateECDHKeyPair(it) } diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdsa/ECDSA.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdsa/ECDSA.kt index 173af972..49e917cd 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdsa/ECDSA.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/ecc/ecdsa/ECDSA.kt @@ -5,7 +5,6 @@ package org.pgpainless.key.generation.type.ecc.ecdsa import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil -import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.pgpainless.algorithm.PublicKeyAlgorithm @@ -16,7 +15,6 @@ class ECDSA private constructor(val curve: EllipticCurve) : KeyType { override val name = "ECDSA" override val algorithm = PublicKeyAlgorithm.ECDSA override val bitStrength = curve.bitStrength - override val algorithmSpec = ECNamedCurveGenParameterSpec(curve.curveName) override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { return ECUtil.getNamedCurveOid(curve.curveName).let { generator.generateECDSAKeyPair(it) } diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/eddsa_legacy/EdDSALegacy.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/eddsa_legacy/EdDSALegacy.kt index 0d316cd6..8ed48619 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/eddsa_legacy/EdDSALegacy.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/eddsa_legacy/EdDSALegacy.kt @@ -4,7 +4,6 @@ package org.pgpainless.key.generation.type.eddsa_legacy -import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.pgpainless.algorithm.PublicKeyAlgorithm @@ -14,7 +13,6 @@ class EdDSALegacy private constructor(val curve: EdDSALegacyCurve) : KeyType { override val name = "EdDSA" override val algorithm = PublicKeyAlgorithm.EDDSA_LEGACY override val bitStrength = curve.bitStrength - override val algorithmSpec = ECNamedCurveGenParameterSpec(curve.curveName) override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { return generator.generateLegacyEd25519KeyPair() diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/rsa/RSA.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/rsa/RSA.kt index aa78f113..c73d6293 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/rsa/RSA.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/rsa/RSA.kt @@ -4,7 +4,6 @@ package org.pgpainless.key.generation.type.rsa -import java.security.spec.RSAKeyGenParameterSpec import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.pgpainless.algorithm.PublicKeyAlgorithm @@ -16,7 +15,6 @@ class RSA private constructor(length: RsaLength) : KeyType { override val name = "RSA" override val algorithm = PublicKeyAlgorithm.RSA_GENERAL override val bitStrength = length.length - override val algorithmSpec = RSAKeyGenParameterSpec(length.length, RSAKeyGenParameterSpec.F4) override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { return generator.generateRsaKeyPair(bitStrength) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/xdh_legacy/XDHLegacy.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/xdh_legacy/XDHLegacy.kt index 262930c1..288603fa 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/xdh_legacy/XDHLegacy.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/type/xdh_legacy/XDHLegacy.kt @@ -4,7 +4,6 @@ package org.pgpainless.key.generation.type.xdh_legacy -import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.pgpainless.algorithm.PublicKeyAlgorithm @@ -14,7 +13,6 @@ class XDHLegacy private constructor(spec: XDHLegacySpec) : KeyType { override val name = "XDH" override val algorithm = PublicKeyAlgorithm.ECDH override val bitStrength = spec.bitStrength - override val algorithmSpec = ECNamedCurveGenParameterSpec(spec.algorithmName) override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { return generator.generateLegacyX25519KeyPair()