mirror of
https://github.com/pgpainless/pgpainless.git
synced 2025-12-08 21:31:08 +01:00
Merge branch 'eddsaLegacy'
This commit is contained in:
commit
0378145b21
35 changed files with 143 additions and 136 deletions
|
|
@ -60,7 +60,7 @@ enum class PublicKeyAlgorithm(
|
|||
DIFFIE_HELLMAN(21, false, true),
|
||||
|
||||
/** Digital Signature Algorithm based on twisted Edwards Curves. */
|
||||
EDDSA(22, true, false),
|
||||
EDDSA_LEGACY(22, true, false),
|
||||
;
|
||||
|
||||
fun isSigningCapable(): Boolean = signingCapable
|
||||
|
|
|
|||
|
|
@ -12,11 +12,11 @@ import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil
|
|||
import org.bouncycastle.openpgp.PGPPublicKey
|
||||
import org.pgpainless.algorithm.PublicKeyAlgorithm
|
||||
import org.pgpainless.key.OpenPgpFingerprint
|
||||
import org.pgpainless.key.generation.type.eddsa.EdDSACurve
|
||||
import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacyCurve
|
||||
|
||||
/**
|
||||
* For secret keys of types [PublicKeyAlgorithm.ECDSA], [PublicKeyAlgorithm.ECDH] and
|
||||
* [PublicKeyAlgorithm.EDDSA], this method returns the name of the underlying elliptic curve.
|
||||
* [PublicKeyAlgorithm.EDDSA_LEGACY], this method returns the name of the underlying elliptic curve.
|
||||
*
|
||||
* For other key types or unknown curves, this method throws an [IllegalArgumentException].
|
||||
*
|
||||
|
|
@ -28,12 +28,13 @@ fun PGPPublicKey.getCurveName(): String {
|
|||
when (it) {
|
||||
PublicKeyAlgorithm.ECDSA -> publicKeyPacket.key as ECDSAPublicBCPGKey
|
||||
PublicKeyAlgorithm.ECDH -> publicKeyPacket.key as ECDHPublicBCPGKey
|
||||
PublicKeyAlgorithm.EDDSA -> publicKeyPacket.key as EdDSAPublicBCPGKey
|
||||
PublicKeyAlgorithm.EDDSA_LEGACY -> publicKeyPacket.key as EdDSAPublicBCPGKey
|
||||
else -> throw IllegalArgumentException("No an elliptic curve public key ($it).")
|
||||
}
|
||||
}
|
||||
.let {
|
||||
if (it.curveOID == GNUObjectIdentifiers.Ed25519) return EdDSACurve._Ed25519.curveName
|
||||
if (it.curveOID == GNUObjectIdentifiers.Ed25519)
|
||||
return EdDSALegacyCurve._Ed25519.curveName
|
||||
else it.curveOID
|
||||
}
|
||||
.let { it to ECUtil.getCurveName(it) }
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ import org.pgpainless.PGPainless.Companion.buildKeyRing
|
|||
import org.pgpainless.algorithm.KeyFlag
|
||||
import org.pgpainless.key.generation.KeySpec.Companion.getBuilder
|
||||
import org.pgpainless.key.generation.type.KeyType
|
||||
import org.pgpainless.key.generation.type.eddsa.EdDSACurve
|
||||
import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacyCurve
|
||||
import org.pgpainless.key.generation.type.rsa.RsaLength
|
||||
import org.pgpainless.key.generation.type.xdh.XDHSpec
|
||||
import org.pgpainless.key.generation.type.xdh_legacy.XDHLegacySpec
|
||||
import org.pgpainless.util.Passphrase
|
||||
|
||||
class KeyRingTemplates {
|
||||
|
|
@ -131,12 +131,12 @@ class KeyRingTemplates {
|
|||
.apply {
|
||||
setPrimaryKey(
|
||||
getBuilder(
|
||||
KeyType.EDDSA(EdDSACurve._Ed25519),
|
||||
KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519),
|
||||
KeyFlag.CERTIFY_OTHER,
|
||||
KeyFlag.SIGN_DATA))
|
||||
addSubkey(
|
||||
getBuilder(
|
||||
KeyType.XDH(XDHSpec._X25519),
|
||||
KeyType.XDH_LEGACY(XDHLegacySpec._X25519),
|
||||
KeyFlag.ENCRYPT_STORAGE,
|
||||
KeyFlag.ENCRYPT_COMMS))
|
||||
setPassphrase(passphrase)
|
||||
|
|
@ -179,13 +179,16 @@ class KeyRingTemplates {
|
|||
): PGPSecretKeyRing =
|
||||
buildKeyRing()
|
||||
.apply {
|
||||
setPrimaryKey(getBuilder(KeyType.EDDSA(EdDSACurve._Ed25519), KeyFlag.CERTIFY_OTHER))
|
||||
setPrimaryKey(
|
||||
getBuilder(
|
||||
KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519), KeyFlag.CERTIFY_OTHER))
|
||||
addSubkey(
|
||||
getBuilder(
|
||||
KeyType.XDH(XDHSpec._X25519),
|
||||
KeyType.XDH_LEGACY(XDHLegacySpec._X25519),
|
||||
KeyFlag.ENCRYPT_COMMS,
|
||||
KeyFlag.ENCRYPT_STORAGE))
|
||||
addSubkey(getBuilder(KeyType.EDDSA(EdDSACurve._Ed25519), KeyFlag.SIGN_DATA))
|
||||
addSubkey(
|
||||
getBuilder(KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519), KeyFlag.SIGN_DATA))
|
||||
setPassphrase(passphrase)
|
||||
if (userId != null) {
|
||||
addUserId(userId)
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@ import org.pgpainless.algorithm.PublicKeyAlgorithm
|
|||
import org.pgpainless.key.generation.type.ecc.EllipticCurve
|
||||
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.EdDSA
|
||||
import org.pgpainless.key.generation.type.eddsa.EdDSACurve
|
||||
import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacy
|
||||
import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacyCurve
|
||||
import org.pgpainless.key.generation.type.rsa.RSA
|
||||
import org.pgpainless.key.generation.type.rsa.RsaLength
|
||||
import org.pgpainless.key.generation.type.xdh.XDH
|
||||
import org.pgpainless.key.generation.type.xdh.XDHSpec
|
||||
import org.pgpainless.key.generation.type.xdh_legacy.XDHLegacy
|
||||
import org.pgpainless.key.generation.type.xdh_legacy.XDHLegacySpec
|
||||
|
||||
@Suppress("INAPPLICABLE_JVM_NAME") // https://youtrack.jetbrains.com/issue/KT-31420
|
||||
interface KeyType {
|
||||
|
|
@ -100,8 +100,9 @@ interface KeyType {
|
|||
|
||||
@JvmStatic fun ECDSA(curve: EllipticCurve): ECDSA = ECDSA.fromCurve(curve)
|
||||
|
||||
@JvmStatic fun EDDSA(curve: EdDSACurve): EdDSA = EdDSA.fromCurve(curve)
|
||||
@JvmStatic
|
||||
fun EDDSA_LEGACY(curve: EdDSALegacyCurve): EdDSALegacy = EdDSALegacy.fromCurve(curve)
|
||||
|
||||
@JvmStatic fun XDH(curve: XDHSpec): XDH = XDH.fromSpec(curve)
|
||||
@JvmStatic fun XDH_LEGACY(curve: XDHLegacySpec): XDHLegacy = XDHLegacy.fromSpec(curve)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ package org.pgpainless.key.generation.type.ecc
|
|||
/**
|
||||
* Elliptic curves for use with [org.pgpainless.key.generation.type.ecc.ecdh.ECDH] and
|
||||
* [org.pgpainless.key.generation.type.ecc.ecdsa.ECDSA]. For curve25519 related curve definitions
|
||||
* see [XDHSpec] and [org.pgpainless.key.generation.type.eddsa.EdDSACurve].
|
||||
* see [XDHSpec] and [org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacyCurve].
|
||||
*/
|
||||
enum class EllipticCurve(val curveName: String, val bitStrength: Int) {
|
||||
_P256("prime256v1", 256), // prime256v1 is equivalent to P-256, see
|
||||
|
|
|
|||
|
|
@ -2,19 +2,19 @@
|
|||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package org.pgpainless.key.generation.type.eddsa
|
||||
package org.pgpainless.key.generation.type.eddsa_legacy
|
||||
|
||||
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec
|
||||
import org.pgpainless.algorithm.PublicKeyAlgorithm
|
||||
import org.pgpainless.key.generation.type.KeyType
|
||||
|
||||
class EdDSA private constructor(val curve: EdDSACurve) : KeyType {
|
||||
class EdDSALegacy private constructor(val curve: EdDSALegacyCurve) : KeyType {
|
||||
override val name = "EdDSA"
|
||||
override val algorithm = PublicKeyAlgorithm.EDDSA
|
||||
override val algorithm = PublicKeyAlgorithm.EDDSA_LEGACY
|
||||
override val bitStrength = curve.bitStrength
|
||||
override val algorithmSpec = ECNamedCurveGenParameterSpec(curve.curveName)
|
||||
|
||||
companion object {
|
||||
@JvmStatic fun fromCurve(curve: EdDSACurve) = EdDSA(curve)
|
||||
@JvmStatic fun fromCurve(curve: EdDSALegacyCurve) = EdDSALegacy(curve)
|
||||
}
|
||||
}
|
||||
|
|
@ -2,9 +2,9 @@
|
|||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package org.pgpainless.key.generation.type.eddsa
|
||||
package org.pgpainless.key.generation.type.eddsa_legacy
|
||||
|
||||
enum class EdDSACurve(val curveName: String, val bitStrength: Int) {
|
||||
enum class EdDSALegacyCurve(val curveName: String, val bitStrength: Int) {
|
||||
_Ed25519("ed25519", 256),
|
||||
;
|
||||
|
||||
|
|
@ -2,19 +2,19 @@
|
|||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package org.pgpainless.key.generation.type.xdh
|
||||
package org.pgpainless.key.generation.type.xdh_legacy
|
||||
|
||||
import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec
|
||||
import org.pgpainless.algorithm.PublicKeyAlgorithm
|
||||
import org.pgpainless.key.generation.type.KeyType
|
||||
|
||||
class XDH private constructor(spec: XDHSpec) : KeyType {
|
||||
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)
|
||||
|
||||
companion object {
|
||||
@JvmStatic fun fromSpec(spec: XDHSpec) = XDH(spec)
|
||||
@JvmStatic fun fromSpec(spec: XDHLegacySpec) = XDHLegacy(spec)
|
||||
}
|
||||
}
|
||||
|
|
@ -2,9 +2,9 @@
|
|||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package org.pgpainless.key.generation.type.xdh
|
||||
package org.pgpainless.key.generation.type.xdh_legacy
|
||||
|
||||
enum class XDHSpec(val algorithmName: String, val curveName: String, val bitStrength: Int) {
|
||||
enum class XDHLegacySpec(val algorithmName: String, val curveName: String, val bitStrength: Int) {
|
||||
_X25519("X25519", "curve25519", 256),
|
||||
;
|
||||
|
||||
|
|
@ -374,7 +374,7 @@ class Policy(
|
|||
put(PublicKeyAlgorithm.ECDSA, 250)
|
||||
// Note: EdDSA is not mentioned in the BSI document.
|
||||
// We assume that the requirements are similar to other EC algorithms.
|
||||
put(PublicKeyAlgorithm.EDDSA, 250)
|
||||
put(PublicKeyAlgorithm.EDDSA_LEGACY, 250)
|
||||
// §7.2.1
|
||||
put(PublicKeyAlgorithm.DIFFIE_HELLMAN, 2000)
|
||||
// §7.2.2
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue