diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/PublicKeyAlgorithm.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/PublicKeyAlgorithm.kt index b8fc6836..dd4c900c 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/PublicKeyAlgorithm.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/algorithm/PublicKeyAlgorithm.kt @@ -4,19 +4,17 @@ package org.pgpainless.algorithm +import org.bouncycastle.bcpg.PublicKeyUtils + /** * Enumeration of public key algorithms as defined in RFC4880. * * See [RFC4880: Public-Key Algorithms](https://tools.ietf.org/html/rfc4880#section-9.1) */ -enum class PublicKeyAlgorithm( - val algorithmId: Int, - val signingCapable: Boolean, - val encryptionCapable: Boolean -) { +enum class PublicKeyAlgorithm(val algorithmId: Int) { /** RSA capable of encryption and signatures. */ - RSA_GENERAL(1, true, true), + RSA_GENERAL(1), /** * RSA with usage encryption. @@ -25,7 +23,7 @@ enum class PublicKeyAlgorithm( * notice */ @Deprecated("RSA_ENCRYPT is deprecated in favor of RSA_GENERAL", ReplaceWith("RSA_GENERAL")) - RSA_ENCRYPT(2, false, true), + RSA_ENCRYPT(2), /** * RSA with usage of creating signatures. @@ -34,19 +32,19 @@ enum class PublicKeyAlgorithm( * notice */ @Deprecated("RSA_SIGN is deprecated in favor of RSA_GENERAL", ReplaceWith("RSA_GENERAL")) - RSA_SIGN(3, true, false), + RSA_SIGN(3), /** ElGamal with usage encryption. */ - ELGAMAL_ENCRYPT(16, false, true), + ELGAMAL_ENCRYPT(16), /** Digital Signature Algorithm. */ - DSA(17, true, false), + DSA(17), /** Elliptic Curve Diffie-Hellman. */ - ECDH(18, false, true), + ECDH(18), /** Elliptic Curve Digital Signature Algorithm. */ - ECDSA(19, true, false), + ECDSA(19), /** * ElGamal General. @@ -54,26 +52,50 @@ enum class PublicKeyAlgorithm( * @deprecated see Deprecation * notice */ - @Deprecated("ElGamal is deprecated") ELGAMAL_GENERAL(20, true, true), + @Deprecated("ElGamal is deprecated") ELGAMAL_GENERAL(20), /** Diffie-Hellman key exchange algorithm. */ - DIFFIE_HELLMAN(21, false, true), + DIFFIE_HELLMAN(21), /** Digital Signature Algorithm based on twisted Edwards Curves. */ - EDDSA_LEGACY(22, true, false), + EDDSA_LEGACY(22), /** X25519 encryption algorithm. */ - X25519(25, false, true), + X25519(25), /** X448 encryption algorithm. */ - X448(26, false, true), + X448(26), /** Ed25519 signature algorithm. */ - ED25519(27, true, false), + ED25519(27), /** Ed448 signature algorithm. */ - ED448(28, true, false), - ; + ED448(28), + + /** + * AEAD can be used as a persistent key symmetric encryption algorithm for message encryption. + * + * @see + * [Persistent Symmetric Keys in OpenPGP](https://datatracker.ietf.org/doc/draft-ietf-openpgp-persistent-symmetric-keys/) + */ + AEAD(128) { + override val signingCapable = false + override val encryptionCapable = true + }, + + /** + * HMAC can be used as a persistent key symmetric signing algorithm for message signing. + * + * @see + * [Persistent Symmetric Keys in OpenPGP](https://datatracker.ietf.org/doc/draft-ietf-openpgp-persistent-symmetric-keys/) + */ + HMAC(129) { + override val signingCapable = true + override val encryptionCapable = false + }; + + open val signingCapable: Boolean = PublicKeyUtils.isSigningAlgorithm(algorithmId) + open val encryptionCapable: Boolean = PublicKeyUtils.isEncryptionAlgorithm(algorithmId) fun isSigningCapable(): Boolean = signingCapable