Skip to main content

oxicrypto_core/
algo_id.rs

1/// Canonical algorithm category.
2#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum AlgorithmCategory {
4    /// Cryptographic hash functions (SHA-2, SHA-3, BLAKE2, BLAKE3).
5    Hash,
6    /// Authenticated encryption with associated data.
7    Aead,
8    /// Message authentication codes.
9    Mac,
10    /// Digital signature schemes.
11    Signature,
12    /// Key agreement / Diffie-Hellman.
13    KeyExchange,
14    /// Key derivation functions.
15    Kdf,
16    /// Post-quantum primitives (ML-KEM, ML-DSA, hybrid KEMs).
17    PostQuantum,
18}
19
20/// Canonical algorithm identifier covering all OxiCrypto algorithm families.
21///
22/// This enum is `#[non_exhaustive]` so that future algorithm additions do not
23/// constitute a breaking change for crates that match on it in external code.
24/// Inside this crate all matches are exhaustive (no wildcard fallback needed).
25///
26/// Each variant's `name()` returns the canonical IANA/NIST string representation.
27#[non_exhaustive]
28#[derive(Debug, Clone, Copy, PartialEq, Eq, core::hash::Hash)]
29pub enum AlgorithmId {
30    // ------ Hash algorithms ------
31    /// SHA-256 (FIPS 180-4)
32    Sha256,
33    /// SHA-384 (FIPS 180-4)
34    Sha384,
35    /// SHA-512 (FIPS 180-4)
36    Sha512,
37    /// SHA-512/256 (FIPS 180-4 §6.7)
38    Sha512_256,
39    /// SHA3-256 (FIPS 202)
40    Sha3_256,
41    /// SHA3-384 (FIPS 202)
42    Sha3_384,
43    /// SHA3-512 (FIPS 202)
44    Sha3_512,
45    /// BLAKE2b-256
46    Blake2b256,
47    /// BLAKE2b-512
48    Blake2b512,
49    /// BLAKE2s-256
50    Blake2s256,
51    /// BLAKE3
52    Blake3,
53
54    // ------ AEAD algorithms ------
55    /// AES-128-GCM (NIST SP 800-38D, RFC 5116)
56    Aes128Gcm,
57    /// AES-256-GCM (NIST SP 800-38D, RFC 5116)
58    Aes256Gcm,
59    /// ChaCha20-Poly1305 (RFC 8439)
60    ChaCha20Poly1305,
61    /// AES-128-GCM-SIV (RFC 8452)
62    Aes128GcmSiv,
63    /// AES-256-GCM-SIV (RFC 8452)
64    Aes256GcmSiv,
65    /// XChaCha20-Poly1305
66    XChaCha20Poly1305,
67    /// AES-128-CCM (NIST SP 800-38C)
68    Aes128Ccm,
69    /// AES-256-CCM (NIST SP 800-38C)
70    Aes256Ccm,
71    /// AES-128-OCB3 (RFC 7253)
72    Aes128Ocb3,
73    /// AES-256-OCB3 (RFC 7253)
74    Aes256Ocb3,
75    /// Deoxys-II-128-128 (CAESAR final portfolio, nonce-misuse resistant)
76    DeoxysII128,
77    /// AES-128-KW — AES Key Wrap with 128-bit key (RFC 3394)
78    AesKeyWrap128,
79    /// AES-256-KW — AES Key Wrap with 256-bit key (RFC 3394)
80    AesKeyWrap256,
81
82    // ------ MAC algorithms ------
83    /// HMAC-SHA-256 (RFC 2104)
84    HmacSha256,
85    /// HMAC-SHA-384 (RFC 2104)
86    HmacSha384,
87    /// HMAC-SHA-512 (RFC 2104)
88    HmacSha512,
89    /// HMAC-SHA3-256
90    HmacSha3_256,
91    /// HMAC-SHA3-512
92    HmacSha3_512,
93    /// Poly1305 (RFC 8439)
94    Poly1305,
95    /// CMAC-AES-128 (NIST SP 800-38B)
96    CmacAes128,
97    /// CMAC-AES-256 (NIST SP 800-38B)
98    CmacAes256,
99    /// KMAC128 (NIST SP 800-185)
100    Kmac128,
101    /// KMAC256 (NIST SP 800-185)
102    Kmac256,
103
104    // ------ Signature algorithms ------
105    /// Ed25519 (RFC 8032)
106    Ed25519,
107    /// Ed448 (RFC 8032)
108    Ed448,
109    /// ECDSA over P-256 (FIPS 186-4)
110    EcdsaP256,
111    /// ECDSA over P-384 (FIPS 186-4)
112    EcdsaP384,
113    /// ECDSA over P-521 (FIPS 186-4)
114    EcdsaP521,
115    /// RSA PKCS#1 v1.5 with SHA-256
116    RsaPkcs1v15Sha256,
117    /// RSA PKCS#1 v1.5 with SHA-384
118    RsaPkcs1v15Sha384,
119    /// RSA PKCS#1 v1.5 with SHA-512
120    RsaPkcs1v15Sha512,
121    /// RSA-PSS with SHA-256 (RFC 8017)
122    RsaPssSha256,
123    /// RSA-PSS with SHA-384 (RFC 8017)
124    RsaPssSha384,
125    /// RSA-PSS with SHA-512 (RFC 8017)
126    RsaPssSha512,
127    /// BIP-340 Schnorr over secp256k1
128    SchnorrBip340,
129
130    // ------ Key exchange ------
131    /// X25519 (RFC 7748)
132    X25519,
133    /// X448 (RFC 7748)
134    X448,
135    /// ECDH over P-256
136    EcdhP256,
137    /// ECDH over P-384
138    EcdhP384,
139    /// ECDH over P-521
140    EcdhP521,
141
142    // ------ KDF ------
143    /// HKDF-SHA-256 (RFC 5869)
144    HkdfSha256,
145    /// HKDF-SHA-384 (RFC 5869)
146    HkdfSha384,
147    /// HKDF-SHA-512 (RFC 5869)
148    HkdfSha512,
149    /// PBKDF2-SHA-256 (RFC 8018)
150    Pbkdf2Sha256,
151    /// PBKDF2-SHA-512 (RFC 8018)
152    Pbkdf2Sha512,
153    /// Argon2id (RFC 9106)
154    Argon2id,
155    /// scrypt (RFC 7914)
156    Scrypt,
157    /// Balloon memory-hard hashing (SHA-256), Boneh-Corrigan-Gibbs-Schechter
158    Balloon,
159
160    // ------ Post-quantum ------
161    /// ML-KEM-512 (FIPS 203)
162    MlKem512,
163    /// ML-KEM-768 (FIPS 203)
164    MlKem768,
165    /// ML-KEM-1024 (FIPS 203)
166    MlKem1024,
167    /// ML-DSA-44 (FIPS 204)
168    MlDsa44,
169    /// ML-DSA-65 (FIPS 204)
170    MlDsa65,
171    /// ML-DSA-87 (FIPS 204)
172    MlDsa87,
173    /// Hybrid KEM: ML-KEM-768 + X25519 (X-Wing draft)
174    XWing768X25519,
175    /// Hybrid KEM: ML-KEM-1024 + P-384
176    HybridKem1024P384,
177    /// SLH-DSA-SHA2-128s (FIPS 205)
178    SlhDsaSha2_128s,
179    /// SLH-DSA-SHA2-128f (FIPS 205)
180    SlhDsaSha2_128f,
181    /// SLH-DSA-SHA2-192s (FIPS 205, security category 3)
182    SlhDsaSha2_192s,
183    /// SLH-DSA-SHA2-192f (FIPS 205, security category 3)
184    SlhDsaSha2_192f,
185    /// SLH-DSA-SHA2-256s (FIPS 205)
186    SlhDsaSha2_256s,
187    /// SLH-DSA-SHA2-256f (FIPS 205)
188    SlhDsaSha2_256f,
189    /// SLH-DSA-SHAKE-128s (FIPS 205)
190    SlhDsaShake128s,
191    /// SLH-DSA-SHAKE-128f (FIPS 205)
192    SlhDsaShake128f,
193    /// SLH-DSA-SHAKE-256s (FIPS 205, security category 5)
194    SlhDsaShake256s,
195    /// SLH-DSA-SHAKE-256f (FIPS 205, security category 5)
196    SlhDsaShake256f,
197}
198
199impl AlgorithmId {
200    /// Return the canonical IANA/NIST name string for this algorithm.
201    #[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    /// Return the [`AlgorithmCategory`] for this algorithm.
285    #[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}