1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum AlgorithmCategory {
4 Hash,
6 Aead,
8 Mac,
10 Signature,
12 KeyExchange,
14 Kdf,
16 PostQuantum,
18}
19
20#[non_exhaustive]
28#[derive(Debug, Clone, Copy, PartialEq, Eq, core::hash::Hash)]
29pub enum AlgorithmId {
30 Sha256,
33 Sha384,
35 Sha512,
37 Sha512_256,
39 Sha3_256,
41 Sha3_384,
43 Sha3_512,
45 Blake2b256,
47 Blake2b512,
49 Blake3,
51
52 Aes128Gcm,
55 Aes256Gcm,
57 ChaCha20Poly1305,
59 Aes128GcmSiv,
61 Aes256GcmSiv,
63 XChaCha20Poly1305,
65 Aes128Ccm,
67 Aes256Ccm,
69 DeoxysII128,
71 AesKeyWrap128,
73 AesKeyWrap256,
75
76 HmacSha256,
79 HmacSha384,
81 HmacSha512,
83 HmacSha3_256,
85 HmacSha3_512,
87 Poly1305,
89 CmacAes128,
91 CmacAes256,
93 Kmac128,
95 Kmac256,
97
98 Ed25519,
101 Ed448,
103 EcdsaP256,
105 EcdsaP384,
107 EcdsaP521,
109 RsaPkcs1v15Sha256,
111 RsaPkcs1v15Sha384,
113 RsaPkcs1v15Sha512,
115 RsaPssSha256,
117 SchnorrBip340,
119
120 X25519,
123 X448,
125 EcdhP256,
127 EcdhP384,
129 EcdhP521,
131
132 HkdfSha256,
135 HkdfSha384,
137 HkdfSha512,
139 Pbkdf2Sha256,
141 Pbkdf2Sha512,
143 Argon2id,
145 Scrypt,
147 Balloon,
149
150 MlKem512,
153 MlKem768,
155 MlKem1024,
157 MlDsa44,
159 MlDsa65,
161 MlDsa87,
163 XWing768X25519,
165 HybridKem1024P384,
167 SlhDsaSha2_128s,
169 SlhDsaSha2_128f,
171 SlhDsaSha2_192s,
173 SlhDsaSha2_192f,
175 SlhDsaSha2_256s,
177 SlhDsaSha2_256f,
179 SlhDsaShake128s,
181 SlhDsaShake128f,
183 SlhDsaShake256s,
185 SlhDsaShake256f,
187}
188
189impl AlgorithmId {
190 #[must_use]
192 pub fn name(&self) -> &'static str {
193 match self {
194 Self::Sha256 => "SHA-256",
195 Self::Sha384 => "SHA-384",
196 Self::Sha512 => "SHA-512",
197 Self::Sha512_256 => "SHA-512/256",
198 Self::Sha3_256 => "SHA3-256",
199 Self::Sha3_384 => "SHA3-384",
200 Self::Sha3_512 => "SHA3-512",
201 Self::Blake2b256 => "BLAKE2b-256",
202 Self::Blake2b512 => "BLAKE2b-512",
203 Self::Blake3 => "BLAKE3",
204 Self::Aes128Gcm => "AES-128-GCM",
205 Self::Aes256Gcm => "AES-256-GCM",
206 Self::ChaCha20Poly1305 => "ChaCha20-Poly1305",
207 Self::Aes128GcmSiv => "AES-128-GCM-SIV",
208 Self::Aes256GcmSiv => "AES-256-GCM-SIV",
209 Self::XChaCha20Poly1305 => "XChaCha20-Poly1305",
210 Self::Aes128Ccm => "AES-128-CCM",
211 Self::Aes256Ccm => "AES-256-CCM",
212 Self::DeoxysII128 => "Deoxys-II-128-128",
213 Self::AesKeyWrap128 => "AES-KW-128",
214 Self::AesKeyWrap256 => "AES-KW-256",
215 Self::HmacSha256 => "HMAC-SHA-256",
216 Self::HmacSha384 => "HMAC-SHA-384",
217 Self::HmacSha512 => "HMAC-SHA-512",
218 Self::HmacSha3_256 => "HMAC-SHA3-256",
219 Self::HmacSha3_512 => "HMAC-SHA3-512",
220 Self::Poly1305 => "Poly1305",
221 Self::CmacAes128 => "CMAC-AES-128",
222 Self::CmacAes256 => "CMAC-AES-256",
223 Self::Kmac128 => "KMAC128",
224 Self::Kmac256 => "KMAC256",
225 Self::Ed25519 => "Ed25519",
226 Self::Ed448 => "Ed448",
227 Self::EcdsaP256 => "ECDSA-P256",
228 Self::EcdsaP384 => "ECDSA-P384",
229 Self::EcdsaP521 => "ECDSA-P521",
230 Self::RsaPkcs1v15Sha256 => "RSA-PKCS1v15-SHA-256",
231 Self::RsaPkcs1v15Sha384 => "RSA-PKCS1v15-SHA-384",
232 Self::RsaPkcs1v15Sha512 => "RSA-PKCS1v15-SHA-512",
233 Self::RsaPssSha256 => "RSA-PSS-SHA-256",
234 Self::SchnorrBip340 => "Schnorr-BIP340",
235 Self::X25519 => "X25519",
236 Self::X448 => "X448",
237 Self::EcdhP256 => "ECDH-P256",
238 Self::EcdhP384 => "ECDH-P384",
239 Self::EcdhP521 => "ECDH-P521",
240 Self::HkdfSha256 => "HKDF-SHA-256",
241 Self::HkdfSha384 => "HKDF-SHA-384",
242 Self::HkdfSha512 => "HKDF-SHA-512",
243 Self::Pbkdf2Sha256 => "PBKDF2-SHA-256",
244 Self::Pbkdf2Sha512 => "PBKDF2-SHA-512",
245 Self::Argon2id => "Argon2id",
246 Self::Scrypt => "scrypt",
247 Self::Balloon => "Balloon-SHA256",
248 Self::MlKem512 => "ML-KEM-512",
249 Self::MlKem768 => "ML-KEM-768",
250 Self::MlKem1024 => "ML-KEM-1024",
251 Self::MlDsa44 => "ML-DSA-44",
252 Self::MlDsa65 => "ML-DSA-65",
253 Self::MlDsa87 => "ML-DSA-87",
254 Self::XWing768X25519 => "X-Wing-768-X25519",
255 Self::HybridKem1024P384 => "Hybrid-ML-KEM-1024-P384",
256 Self::SlhDsaSha2_128s => "SLH-DSA-SHA2-128s",
257 Self::SlhDsaSha2_128f => "SLH-DSA-SHA2-128f",
258 Self::SlhDsaSha2_192s => "SLH-DSA-SHA2-192s",
259 Self::SlhDsaSha2_192f => "SLH-DSA-SHA2-192f",
260 Self::SlhDsaSha2_256s => "SLH-DSA-SHA2-256s",
261 Self::SlhDsaSha2_256f => "SLH-DSA-SHA2-256f",
262 Self::SlhDsaShake128s => "SLH-DSA-SHAKE-128s",
263 Self::SlhDsaShake128f => "SLH-DSA-SHAKE-128f",
264 Self::SlhDsaShake256s => "SLH-DSA-SHAKE-256s",
265 Self::SlhDsaShake256f => "SLH-DSA-SHAKE-256f",
266 }
267 }
268
269 #[must_use]
271 pub fn category(&self) -> AlgorithmCategory {
272 match self {
273 Self::Sha256
274 | Self::Sha384
275 | Self::Sha512
276 | Self::Sha512_256
277 | Self::Sha3_256
278 | Self::Sha3_384
279 | Self::Sha3_512
280 | Self::Blake2b256
281 | Self::Blake2b512
282 | Self::Blake3 => AlgorithmCategory::Hash,
283
284 Self::Aes128Gcm
285 | Self::Aes256Gcm
286 | Self::ChaCha20Poly1305
287 | Self::Aes128GcmSiv
288 | Self::Aes256GcmSiv
289 | Self::XChaCha20Poly1305
290 | Self::Aes128Ccm
291 | Self::Aes256Ccm
292 | Self::DeoxysII128
293 | Self::AesKeyWrap128
294 | Self::AesKeyWrap256 => AlgorithmCategory::Aead,
295
296 Self::HmacSha256
297 | Self::HmacSha384
298 | Self::HmacSha512
299 | Self::HmacSha3_256
300 | Self::HmacSha3_512
301 | Self::Poly1305
302 | Self::CmacAes128
303 | Self::CmacAes256
304 | Self::Kmac128
305 | Self::Kmac256 => AlgorithmCategory::Mac,
306
307 Self::Ed25519
308 | Self::Ed448
309 | Self::EcdsaP256
310 | Self::EcdsaP384
311 | Self::EcdsaP521
312 | Self::RsaPkcs1v15Sha256
313 | Self::RsaPkcs1v15Sha384
314 | Self::RsaPkcs1v15Sha512
315 | Self::RsaPssSha256
316 | Self::SchnorrBip340 => AlgorithmCategory::Signature,
317
318 Self::X25519 | Self::X448 | Self::EcdhP256 | Self::EcdhP384 | Self::EcdhP521 => {
319 AlgorithmCategory::KeyExchange
320 }
321
322 Self::HkdfSha256
323 | Self::HkdfSha384
324 | Self::HkdfSha512
325 | Self::Pbkdf2Sha256
326 | Self::Pbkdf2Sha512
327 | Self::Argon2id
328 | Self::Scrypt
329 | Self::Balloon => AlgorithmCategory::Kdf,
330
331 Self::MlKem512
332 | Self::MlKem768
333 | Self::MlKem1024
334 | Self::MlDsa44
335 | Self::MlDsa65
336 | Self::MlDsa87
337 | Self::XWing768X25519
338 | Self::HybridKem1024P384
339 | Self::SlhDsaSha2_128s
340 | Self::SlhDsaSha2_128f
341 | Self::SlhDsaSha2_192s
342 | Self::SlhDsaSha2_192f
343 | Self::SlhDsaSha2_256s
344 | Self::SlhDsaSha2_256f
345 | Self::SlhDsaShake128s
346 | Self::SlhDsaShake128f
347 | Self::SlhDsaShake256s
348 | Self::SlhDsaShake256f => AlgorithmCategory::PostQuantum,
349 }
350 }
351}
352
353impl core::fmt::Display for AlgorithmId {
354 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
355 f.write_str(self.name())
356 }
357}