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