#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AlgorithmCategory {
Hash,
Aead,
Mac,
Signature,
KeyExchange,
Kdf,
PostQuantum,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, core::hash::Hash)]
pub enum AlgorithmId {
Sha256,
Sha384,
Sha512,
Sha512_256,
Sha3_256,
Sha3_384,
Sha3_512,
Blake2b256,
Blake2b512,
Blake3,
Aes128Gcm,
Aes256Gcm,
ChaCha20Poly1305,
Aes128GcmSiv,
Aes256GcmSiv,
XChaCha20Poly1305,
Aes128Ccm,
Aes256Ccm,
DeoxysII128,
AesKeyWrap128,
AesKeyWrap256,
HmacSha256,
HmacSha384,
HmacSha512,
HmacSha3_256,
HmacSha3_512,
Poly1305,
CmacAes128,
CmacAes256,
Kmac128,
Kmac256,
Ed25519,
Ed448,
EcdsaP256,
EcdsaP384,
EcdsaP521,
RsaPkcs1v15Sha256,
RsaPkcs1v15Sha384,
RsaPkcs1v15Sha512,
RsaPssSha256,
SchnorrBip340,
X25519,
X448,
EcdhP256,
EcdhP384,
EcdhP521,
HkdfSha256,
HkdfSha384,
HkdfSha512,
Pbkdf2Sha256,
Pbkdf2Sha512,
Argon2id,
Scrypt,
Balloon,
MlKem512,
MlKem768,
MlKem1024,
MlDsa44,
MlDsa65,
MlDsa87,
XWing768X25519,
HybridKem1024P384,
SlhDsaSha2_128s,
SlhDsaSha2_128f,
SlhDsaSha2_192s,
SlhDsaSha2_192f,
SlhDsaSha2_256s,
SlhDsaSha2_256f,
SlhDsaShake128s,
SlhDsaShake128f,
SlhDsaShake256s,
SlhDsaShake256f,
}
impl AlgorithmId {
#[must_use]
pub fn name(&self) -> &'static str {
match self {
Self::Sha256 => "SHA-256",
Self::Sha384 => "SHA-384",
Self::Sha512 => "SHA-512",
Self::Sha512_256 => "SHA-512/256",
Self::Sha3_256 => "SHA3-256",
Self::Sha3_384 => "SHA3-384",
Self::Sha3_512 => "SHA3-512",
Self::Blake2b256 => "BLAKE2b-256",
Self::Blake2b512 => "BLAKE2b-512",
Self::Blake3 => "BLAKE3",
Self::Aes128Gcm => "AES-128-GCM",
Self::Aes256Gcm => "AES-256-GCM",
Self::ChaCha20Poly1305 => "ChaCha20-Poly1305",
Self::Aes128GcmSiv => "AES-128-GCM-SIV",
Self::Aes256GcmSiv => "AES-256-GCM-SIV",
Self::XChaCha20Poly1305 => "XChaCha20-Poly1305",
Self::Aes128Ccm => "AES-128-CCM",
Self::Aes256Ccm => "AES-256-CCM",
Self::DeoxysII128 => "Deoxys-II-128-128",
Self::AesKeyWrap128 => "AES-KW-128",
Self::AesKeyWrap256 => "AES-KW-256",
Self::HmacSha256 => "HMAC-SHA-256",
Self::HmacSha384 => "HMAC-SHA-384",
Self::HmacSha512 => "HMAC-SHA-512",
Self::HmacSha3_256 => "HMAC-SHA3-256",
Self::HmacSha3_512 => "HMAC-SHA3-512",
Self::Poly1305 => "Poly1305",
Self::CmacAes128 => "CMAC-AES-128",
Self::CmacAes256 => "CMAC-AES-256",
Self::Kmac128 => "KMAC128",
Self::Kmac256 => "KMAC256",
Self::Ed25519 => "Ed25519",
Self::Ed448 => "Ed448",
Self::EcdsaP256 => "ECDSA-P256",
Self::EcdsaP384 => "ECDSA-P384",
Self::EcdsaP521 => "ECDSA-P521",
Self::RsaPkcs1v15Sha256 => "RSA-PKCS1v15-SHA-256",
Self::RsaPkcs1v15Sha384 => "RSA-PKCS1v15-SHA-384",
Self::RsaPkcs1v15Sha512 => "RSA-PKCS1v15-SHA-512",
Self::RsaPssSha256 => "RSA-PSS-SHA-256",
Self::SchnorrBip340 => "Schnorr-BIP340",
Self::X25519 => "X25519",
Self::X448 => "X448",
Self::EcdhP256 => "ECDH-P256",
Self::EcdhP384 => "ECDH-P384",
Self::EcdhP521 => "ECDH-P521",
Self::HkdfSha256 => "HKDF-SHA-256",
Self::HkdfSha384 => "HKDF-SHA-384",
Self::HkdfSha512 => "HKDF-SHA-512",
Self::Pbkdf2Sha256 => "PBKDF2-SHA-256",
Self::Pbkdf2Sha512 => "PBKDF2-SHA-512",
Self::Argon2id => "Argon2id",
Self::Scrypt => "scrypt",
Self::Balloon => "Balloon-SHA256",
Self::MlKem512 => "ML-KEM-512",
Self::MlKem768 => "ML-KEM-768",
Self::MlKem1024 => "ML-KEM-1024",
Self::MlDsa44 => "ML-DSA-44",
Self::MlDsa65 => "ML-DSA-65",
Self::MlDsa87 => "ML-DSA-87",
Self::XWing768X25519 => "X-Wing-768-X25519",
Self::HybridKem1024P384 => "Hybrid-ML-KEM-1024-P384",
Self::SlhDsaSha2_128s => "SLH-DSA-SHA2-128s",
Self::SlhDsaSha2_128f => "SLH-DSA-SHA2-128f",
Self::SlhDsaSha2_192s => "SLH-DSA-SHA2-192s",
Self::SlhDsaSha2_192f => "SLH-DSA-SHA2-192f",
Self::SlhDsaSha2_256s => "SLH-DSA-SHA2-256s",
Self::SlhDsaSha2_256f => "SLH-DSA-SHA2-256f",
Self::SlhDsaShake128s => "SLH-DSA-SHAKE-128s",
Self::SlhDsaShake128f => "SLH-DSA-SHAKE-128f",
Self::SlhDsaShake256s => "SLH-DSA-SHAKE-256s",
Self::SlhDsaShake256f => "SLH-DSA-SHAKE-256f",
}
}
#[must_use]
pub fn category(&self) -> AlgorithmCategory {
match self {
Self::Sha256
| Self::Sha384
| Self::Sha512
| Self::Sha512_256
| Self::Sha3_256
| Self::Sha3_384
| Self::Sha3_512
| Self::Blake2b256
| Self::Blake2b512
| Self::Blake3 => AlgorithmCategory::Hash,
Self::Aes128Gcm
| Self::Aes256Gcm
| Self::ChaCha20Poly1305
| Self::Aes128GcmSiv
| Self::Aes256GcmSiv
| Self::XChaCha20Poly1305
| Self::Aes128Ccm
| Self::Aes256Ccm
| Self::DeoxysII128
| Self::AesKeyWrap128
| Self::AesKeyWrap256 => AlgorithmCategory::Aead,
Self::HmacSha256
| Self::HmacSha384
| Self::HmacSha512
| Self::HmacSha3_256
| Self::HmacSha3_512
| Self::Poly1305
| Self::CmacAes128
| Self::CmacAes256
| Self::Kmac128
| Self::Kmac256 => AlgorithmCategory::Mac,
Self::Ed25519
| Self::Ed448
| Self::EcdsaP256
| Self::EcdsaP384
| Self::EcdsaP521
| Self::RsaPkcs1v15Sha256
| Self::RsaPkcs1v15Sha384
| Self::RsaPkcs1v15Sha512
| Self::RsaPssSha256
| Self::SchnorrBip340 => AlgorithmCategory::Signature,
Self::X25519 | Self::X448 | Self::EcdhP256 | Self::EcdhP384 | Self::EcdhP521 => {
AlgorithmCategory::KeyExchange
}
Self::HkdfSha256
| Self::HkdfSha384
| Self::HkdfSha512
| Self::Pbkdf2Sha256
| Self::Pbkdf2Sha512
| Self::Argon2id
| Self::Scrypt
| Self::Balloon => AlgorithmCategory::Kdf,
Self::MlKem512
| Self::MlKem768
| Self::MlKem1024
| Self::MlDsa44
| Self::MlDsa65
| Self::MlDsa87
| Self::XWing768X25519
| Self::HybridKem1024P384
| Self::SlhDsaSha2_128s
| Self::SlhDsaSha2_128f
| Self::SlhDsaSha2_192s
| Self::SlhDsaSha2_192f
| Self::SlhDsaSha2_256s
| Self::SlhDsaSha2_256f
| Self::SlhDsaShake128s
| Self::SlhDsaShake128f
| Self::SlhDsaShake256s
| Self::SlhDsaShake256f => AlgorithmCategory::PostQuantum,
}
}
}
impl core::fmt::Display for AlgorithmId {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.name())
}
}