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    /// BLAKE3
50    Blake3,
51
52    // ------ AEAD algorithms ------
53    /// AES-128-GCM (NIST SP 800-38D, RFC 5116)
54    Aes128Gcm,
55    /// AES-256-GCM (NIST SP 800-38D, RFC 5116)
56    Aes256Gcm,
57    /// ChaCha20-Poly1305 (RFC 8439)
58    ChaCha20Poly1305,
59    /// AES-128-GCM-SIV (RFC 8452)
60    Aes128GcmSiv,
61    /// AES-256-GCM-SIV (RFC 8452)
62    Aes256GcmSiv,
63    /// XChaCha20-Poly1305
64    XChaCha20Poly1305,
65    /// AES-128-CCM (NIST SP 800-38C)
66    Aes128Ccm,
67    /// AES-256-CCM (NIST SP 800-38C)
68    Aes256Ccm,
69    /// Deoxys-II-128-128 (CAESAR final portfolio, nonce-misuse resistant)
70    DeoxysII128,
71    /// AES-128-KW — AES Key Wrap with 128-bit key (RFC 3394)
72    AesKeyWrap128,
73    /// AES-256-KW — AES Key Wrap with 256-bit key (RFC 3394)
74    AesKeyWrap256,
75
76    // ------ MAC algorithms ------
77    /// HMAC-SHA-256 (RFC 2104)
78    HmacSha256,
79    /// HMAC-SHA-384 (RFC 2104)
80    HmacSha384,
81    /// HMAC-SHA-512 (RFC 2104)
82    HmacSha512,
83    /// HMAC-SHA3-256
84    HmacSha3_256,
85    /// HMAC-SHA3-512
86    HmacSha3_512,
87    /// Poly1305 (RFC 8439)
88    Poly1305,
89    /// CMAC-AES-128 (NIST SP 800-38B)
90    CmacAes128,
91    /// CMAC-AES-256 (NIST SP 800-38B)
92    CmacAes256,
93    /// KMAC128 (NIST SP 800-185)
94    Kmac128,
95    /// KMAC256 (NIST SP 800-185)
96    Kmac256,
97
98    // ------ Signature algorithms ------
99    /// Ed25519 (RFC 8032)
100    Ed25519,
101    /// Ed448 (RFC 8032)
102    Ed448,
103    /// ECDSA over P-256 (FIPS 186-4)
104    EcdsaP256,
105    /// ECDSA over P-384 (FIPS 186-4)
106    EcdsaP384,
107    /// ECDSA over P-521 (FIPS 186-4)
108    EcdsaP521,
109    /// RSA PKCS#1 v1.5 with SHA-256
110    RsaPkcs1v15Sha256,
111    /// RSA PKCS#1 v1.5 with SHA-384
112    RsaPkcs1v15Sha384,
113    /// RSA PKCS#1 v1.5 with SHA-512
114    RsaPkcs1v15Sha512,
115    /// RSA-PSS with SHA-256 (RFC 8017)
116    RsaPssSha256,
117    /// BIP-340 Schnorr over secp256k1
118    SchnorrBip340,
119
120    // ------ Key exchange ------
121    /// X25519 (RFC 7748)
122    X25519,
123    /// X448 (RFC 7748)
124    X448,
125    /// ECDH over P-256
126    EcdhP256,
127    /// ECDH over P-384
128    EcdhP384,
129    /// ECDH over P-521
130    EcdhP521,
131
132    // ------ KDF ------
133    /// HKDF-SHA-256 (RFC 5869)
134    HkdfSha256,
135    /// HKDF-SHA-384 (RFC 5869)
136    HkdfSha384,
137    /// HKDF-SHA-512 (RFC 5869)
138    HkdfSha512,
139    /// PBKDF2-SHA-256 (RFC 8018)
140    Pbkdf2Sha256,
141    /// PBKDF2-SHA-512 (RFC 8018)
142    Pbkdf2Sha512,
143    /// Argon2id (RFC 9106)
144    Argon2id,
145    /// scrypt (RFC 7914)
146    Scrypt,
147    /// Balloon memory-hard hashing (SHA-256), Boneh-Corrigan-Gibbs-Schechter
148    Balloon,
149
150    // ------ Post-quantum ------
151    /// ML-KEM-512 (FIPS 203)
152    MlKem512,
153    /// ML-KEM-768 (FIPS 203)
154    MlKem768,
155    /// ML-KEM-1024 (FIPS 203)
156    MlKem1024,
157    /// ML-DSA-44 (FIPS 204)
158    MlDsa44,
159    /// ML-DSA-65 (FIPS 204)
160    MlDsa65,
161    /// ML-DSA-87 (FIPS 204)
162    MlDsa87,
163    /// Hybrid KEM: ML-KEM-768 + X25519 (X-Wing draft)
164    XWing768X25519,
165    /// Hybrid KEM: ML-KEM-1024 + P-384
166    HybridKem1024P384,
167    /// SLH-DSA-SHA2-128s (FIPS 205)
168    SlhDsaSha2_128s,
169    /// SLH-DSA-SHA2-128f (FIPS 205)
170    SlhDsaSha2_128f,
171    /// SLH-DSA-SHA2-192s (FIPS 205, security category 3)
172    SlhDsaSha2_192s,
173    /// SLH-DSA-SHA2-192f (FIPS 205, security category 3)
174    SlhDsaSha2_192f,
175    /// SLH-DSA-SHA2-256s (FIPS 205)
176    SlhDsaSha2_256s,
177    /// SLH-DSA-SHA2-256f (FIPS 205)
178    SlhDsaSha2_256f,
179    /// SLH-DSA-SHAKE-128s (FIPS 205)
180    SlhDsaShake128s,
181    /// SLH-DSA-SHAKE-128f (FIPS 205)
182    SlhDsaShake128f,
183    /// SLH-DSA-SHAKE-256s (FIPS 205, security category 5)
184    SlhDsaShake256s,
185    /// SLH-DSA-SHAKE-256f (FIPS 205, security category 5)
186    SlhDsaShake256f,
187}
188
189impl AlgorithmId {
190    /// Return the canonical IANA/NIST name string for this algorithm.
191    #[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    /// Return the [`AlgorithmCategory`] for this algorithm.
270    #[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}