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

Add new key types X25519, X448, Ed25519, Ed448

This commit is contained in:
Paul Schaub 2025-01-29 12:09:37 +01:00
parent d2532977cc
commit 443361ba03
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
10 changed files with 76 additions and 18 deletions

View file

@ -4,11 +4,14 @@
package org.pgpainless.key.generation.type package org.pgpainless.key.generation.type
import java.security.spec.AlgorithmParameterSpec
import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.PGPKeyPair
import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator
import org.pgpainless.algorithm.PublicKeyAlgorithm 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.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.ecdh.ECDH
import org.pgpainless.key.generation.type.ecc.ecdsa.ECDSA import org.pgpainless.key.generation.type.ecc.ecdsa.ECDSA
import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacy import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacy
@ -42,13 +45,6 @@ interface KeyType {
*/ */
val bitStrength: Int 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 * 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]. * flag. See [org.pgpainless.algorithm.KeyFlag.SIGN_DATA].
@ -107,5 +103,13 @@ interface KeyType {
fun EDDSA_LEGACY(curve: EdDSALegacyCurve): EdDSALegacy = EdDSALegacy.fromCurve(curve) fun EDDSA_LEGACY(curve: EdDSALegacyCurve): EdDSALegacy = EdDSALegacy.fromCurve(curve)
@JvmStatic fun XDH_LEGACY(curve: XDHLegacySpec): XDHLegacy = XDHLegacy.fromSpec(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()
} }
} }

View file

@ -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()
}
}

View file

@ -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()
}
}

View file

@ -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()
}
}

View file

@ -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()
}
}

View file

@ -5,7 +5,6 @@
package org.pgpainless.key.generation.type.ecc.ecdh package org.pgpainless.key.generation.type.ecc.ecdh
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec
import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.PGPKeyPair
import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator
import org.pgpainless.algorithm.PublicKeyAlgorithm import org.pgpainless.algorithm.PublicKeyAlgorithm
@ -16,7 +15,6 @@ class ECDH private constructor(val curve: EllipticCurve) : KeyType {
override val name = "ECDH" override val name = "ECDH"
override val algorithm = PublicKeyAlgorithm.ECDH override val algorithm = PublicKeyAlgorithm.ECDH
override val bitStrength = curve.bitStrength override val bitStrength = curve.bitStrength
override val algorithmSpec = ECNamedCurveGenParameterSpec(curve.curveName)
override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair {
return ECUtil.getNamedCurveOid(curve.curveName).let { generator.generateECDHKeyPair(it) } return ECUtil.getNamedCurveOid(curve.curveName).let { generator.generateECDHKeyPair(it) }

View file

@ -5,7 +5,6 @@
package org.pgpainless.key.generation.type.ecc.ecdsa package org.pgpainless.key.generation.type.ecc.ecdsa
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec
import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.PGPKeyPair
import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator
import org.pgpainless.algorithm.PublicKeyAlgorithm import org.pgpainless.algorithm.PublicKeyAlgorithm
@ -16,7 +15,6 @@ class ECDSA private constructor(val curve: EllipticCurve) : KeyType {
override val name = "ECDSA" override val name = "ECDSA"
override val algorithm = PublicKeyAlgorithm.ECDSA override val algorithm = PublicKeyAlgorithm.ECDSA
override val bitStrength = curve.bitStrength override val bitStrength = curve.bitStrength
override val algorithmSpec = ECNamedCurveGenParameterSpec(curve.curveName)
override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair {
return ECUtil.getNamedCurveOid(curve.curveName).let { generator.generateECDSAKeyPair(it) } return ECUtil.getNamedCurveOid(curve.curveName).let { generator.generateECDSAKeyPair(it) }

View file

@ -4,7 +4,6 @@
package org.pgpainless.key.generation.type.eddsa_legacy package org.pgpainless.key.generation.type.eddsa_legacy
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec
import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.PGPKeyPair
import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator
import org.pgpainless.algorithm.PublicKeyAlgorithm import org.pgpainless.algorithm.PublicKeyAlgorithm
@ -14,7 +13,6 @@ class EdDSALegacy private constructor(val curve: EdDSALegacyCurve) : KeyType {
override val name = "EdDSA" override val name = "EdDSA"
override val algorithm = PublicKeyAlgorithm.EDDSA_LEGACY override val algorithm = PublicKeyAlgorithm.EDDSA_LEGACY
override val bitStrength = curve.bitStrength override val bitStrength = curve.bitStrength
override val algorithmSpec = ECNamedCurveGenParameterSpec(curve.curveName)
override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair {
return generator.generateLegacyEd25519KeyPair() return generator.generateLegacyEd25519KeyPair()

View file

@ -4,7 +4,6 @@
package org.pgpainless.key.generation.type.rsa package org.pgpainless.key.generation.type.rsa
import java.security.spec.RSAKeyGenParameterSpec
import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.PGPKeyPair
import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator
import org.pgpainless.algorithm.PublicKeyAlgorithm import org.pgpainless.algorithm.PublicKeyAlgorithm
@ -16,7 +15,6 @@ class RSA private constructor(length: RsaLength) : KeyType {
override val name = "RSA" override val name = "RSA"
override val algorithm = PublicKeyAlgorithm.RSA_GENERAL override val algorithm = PublicKeyAlgorithm.RSA_GENERAL
override val bitStrength = length.length override val bitStrength = length.length
override val algorithmSpec = RSAKeyGenParameterSpec(length.length, RSAKeyGenParameterSpec.F4)
override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair {
return generator.generateRsaKeyPair(bitStrength) return generator.generateRsaKeyPair(bitStrength)

View file

@ -4,7 +4,6 @@
package org.pgpainless.key.generation.type.xdh_legacy package org.pgpainless.key.generation.type.xdh_legacy
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec
import org.bouncycastle.openpgp.PGPKeyPair import org.bouncycastle.openpgp.PGPKeyPair
import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator import org.bouncycastle.openpgp.operator.PGPKeyPairGenerator
import org.pgpainless.algorithm.PublicKeyAlgorithm import org.pgpainless.algorithm.PublicKeyAlgorithm
@ -14,7 +13,6 @@ class XDHLegacy private constructor(spec: XDHLegacySpec) : KeyType {
override val name = "XDH" override val name = "XDH"
override val algorithm = PublicKeyAlgorithm.ECDH override val algorithm = PublicKeyAlgorithm.ECDH
override val bitStrength = spec.bitStrength override val bitStrength = spec.bitStrength
override val algorithmSpec = ECNamedCurveGenParameterSpec(spec.algorithmName)
override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair { override fun generateKeyPair(generator: PGPKeyPairGenerator): PGPKeyPair {
return generator.generateLegacyX25519KeyPair() return generator.generateLegacyX25519KeyPair()