navajo_cli/
algorithm.rs

1#![allow(non_camel_case_types)]
2
3use anyhow::bail;
4use clap::ValueEnum;
5
6use navajo::Kind;
7use serde::Deserialize;
8
9#[derive(
10    Clone, Copy, Debug, PartialEq, Eq, ValueEnum, strum::Display, strum::EnumIter, Deserialize,
11)]
12#[serde(try_from = "&str")]
13pub enum Algorithm {
14    // ------------------------------------------
15    // AEAD
16    // ------------------------------------------
17    /// AEAD - AES-128-GCM
18    #[clap(
19        alias = "AES-128-GCM",
20        alias = "aes128gcm",
21        alias = "AES128GCM",
22        alias = "AES_128_GCM",
23        alias = "aes-128-gcm",
24        alias = "aes_128_gcm"
25    )]
26    #[strum(serialize = "AES-128-GCM")]
27    Aes_128_Gcm,
28    /// AEAD - AES-256-GCM
29    #[clap(
30        alias = "AES-256-GCM",
31        alias = "aes256gcm",
32        alias = "AES256GCM",
33        alias = "AES_256_GCM",
34        alias = "aes-256-gcm",
35        alias = "aes_256_gcm"
36    )]
37    #[strum(serialize = "AES-256-GCM")]
38    Aes_256_Gcm,
39    /// AEAD - ChaCha20-Poly1305
40    #[clap(
41        alias = "CHACHA20POLY1305",
42        alias = "chacha20poly1305",
43        alias = "CHACHA20_POLY1305",
44        alias = "chacha20_poly1305",
45        alias = "ChaCha20-Poly1305",
46        alias = "ChaCha20Poly1305",
47        alias = "chacha20-poly1305"
48    )]
49    #[strum(serialize = "ChaCha20-Poly1305")]
50    Chacha20Poly1305,
51    /// AEAD - XChaCha20-Poly1305
52    #[clap(
53        alias = "XCHACHA20POLY1305",
54        alias = "xchacha20poly1305",
55        alias = "XCHACHA20_POLY1305",
56        alias = "xchacha20_poly1305",
57        alias = "XChaCha20-Poly1305",
58        alias = "XchaCha20-Poly1305",
59        alias = "XChaCha20Poly1305",
60        alias = "xchacha20-poly1305"
61    )]
62    #[strum(serialize = "XChaCha20-Poly1305")]
63    Xchacha20Poly1305,
64
65    // ------------------------------------------
66    // DAEAD
67    // ------------------------------------------
68    /// DAEAD - AES-256-SIV
69    #[clap(
70        alias = "AES-256-SIV",
71        alias = "AES_256_SIV",
72        alias = "aes-256-siv",
73        alias = "aes_256_siv"
74    )]
75    #[strum(serialize = "AES-256-SIV")]
76    Aes_256_Siv,
77
78    // ------------------------------------------
79    // MAC
80    // ------------------------------------------
81    /// MAC - HMAC Blake3
82    #[clap(
83        alias = "blake3",
84        alias = "BLAKE3",
85        alias = "Blake3",
86        alias = "BLAKE-3",
87        alias = "blake-3",
88        alias = "BLAKE_3",
89        alias = "blake_3"
90    )]
91    #[strum(serialize = "Blake3")]
92    Blake3,
93    /// MAC - HMAC Sha256
94    #[clap(
95        alias = "sha256",
96        alias = "sha-256",
97        alias = "SHA256",
98        alias = "SHA-256",
99        alias = "SHA_256",
100        alias = "sha_256",
101        alias = "SHA2_256",
102        alias = "sha2_256",
103        alias = "SHA2-256",
104        alias = "sha2-256",
105        alias = "Sha256",
106        alias = "Sha2_256"
107    )]
108    #[strum(serialize = "SHA-256")]
109    Sha2_256,
110    /// MAC - HMAC Sha384
111    #[clap(
112        alias = "sha384",
113        alias = "sha-384",
114        alias = "SHA384",
115        alias = "SHA-384",
116        alias = "SHA_384",
117        alias = "sha_384",
118        alias = "SHA2_384",
119        alias = "sha2_384",
120        alias = "SHA2-384",
121        alias = "sha2-384",
122        alias = "Sha384",
123        alias = "Sha2_384"
124    )]
125    #[strum(serialize = "SHA-384")]
126    Sha2_384,
127    /// MAC - HMAC Sha512
128    #[clap(
129        alias = "sha512",
130        alias = "sha-512",
131        alias = "SHA512",
132        alias = "SHA-512",
133        alias = "SHA_512",
134        alias = "sha_512",
135        alias = "SHA2_512",
136        alias = "sha2_512",
137        alias = "SHA2-512",
138        alias = "sha2-512",
139        alias = "Sha512",
140        alias = "Sha2_512"
141    )]
142    #[strum(serialize = "SHA-512")]
143    Sha2_512,
144    /// MAC - HMAC Sha3-256
145    #[clap(
146        alias = "sha3_256",
147        alias = "sha3-256",
148        alias = "SHA3_256",
149        alias = "SHA3-256",
150        alias = "Sha3_256",
151        alias = "Sha3-256"
152    )]
153    #[strum(serialize = "SHA3-256")]
154    Sha3_256,
155    /// MAC - HMAC Sha3-224
156    #[clap(
157        alias = "sha3_224",
158        alias = "sha3-224",
159        alias = "SHA3_224",
160        alias = "SHA3-224",
161        alias = "Sha3_224",
162        alias = "Sha3-224"
163    )]
164    #[strum(serialize = "SHA3-224")]
165    Sha3_224,
166    /// MAC - HMAC Sha3-384
167    #[clap(
168        alias = "sha3_384",
169        alias = "sha3-384",
170        alias = "SHA3_384",
171        alias = "SHA3-384",
172        alias = "Sha3_384",
173        alias = "Sha3-384"
174    )]
175    #[strum(serialize = "SHA3-384")]
176    Sha3_384,
177    /// MAC - HMAC Sha3-384
178    #[clap(
179        alias = "sha3_512",
180        alias = "sha3-512",
181        alias = "SHA3_512",
182        alias = "SHA3-512",
183        alias = "Sha3_512",
184        alias = "Sha3-512"
185    )]
186    #[strum(serialize = "SHA3-512")]
187    Sha3_512,
188    /// MAC - CMAC AES-128
189    #[clap(
190        alias = "AES-128",
191        alias = "AES128",
192        alias = "AES_128",
193        alias = "aes-128",
194        alias = "aes_128",
195        alias = "aes128",
196        alias = "cmac-aes-128",
197        alias = "cmac_aes_128",
198        alias = "cmac_aes-128",
199        alias = "cmac-aes128",
200        alias = "cmac_aes128"
201    )]
202    #[strum(serialize = "AES-128")]
203    Aes_128,
204    /// MAC - CMAC AES-192
205    #[clap(
206        alias = "AES-192",
207        alias = "AES192",
208        alias = "AES_192",
209        alias = "aes-192",
210        alias = "aes_192",
211        alias = "aes192",
212        alias = "cmac-aes-192",
213        alias = "cmac_aes_192",
214        alias = "cmac_aes-192",
215        alias = "cmac-aes192",
216        alias = "cmac_aes192"
217    )]
218    #[strum(serialize = "AES-192")]
219    Aes_192,
220    /// MAC - CMAC AES-256
221    #[clap(
222        alias = "AES-256",
223        alias = "AES256",
224        alias = "AES_256",
225        alias = "aes-256",
226        alias = "aes_256",
227        alias = "aes256",
228        alias = "cmac-aes-256",
229        alias = "cmac_aes_256",
230        alias = "cmac_aes-256",
231        alias = "cmac-aes256",
232        alias = "cmac_aes256"
233    )]
234    #[strum(serialize = "AES-256")]
235    Aes_256,
236
237    // ------------------------------------------
238    // Signature
239    // ------------------------------------------
240    /// Signature - ECDSA using P-256 and SHA-256
241    #[clap(
242        alias = "ES256",
243        alias = "es256",
244        alias = "ECDSA_P256_SHA256",
245        alias = "ecdsa_p256_sha256"
246    )]
247    #[strum(serialize = "ES256")]
248    Es256,
249    /// Signature - ECDSA using P-384 and SHA-384
250    #[clap(
251        alias = "ES384",
252        alias = "es384",
253        alias = "ECDSA_P384_SHA384",
254        alias = "ecdsa_p384_sha384"
255    )]
256    #[strum(serialize = "ES384")]
257    Es384,
258    /// Signature - Ed25519 Edwards Digital Signature Algorithm (EdDSA) over Curve25519
259    #[clap(alias = "ED25519", alias = "ed25519")]
260    #[strum(serialize = "Ed25519")]
261    Ed25519,
262}
263impl TryFrom<String> for Algorithm {
264    type Error = String;
265
266    fn try_from(value: String) -> Result<Self, Self::Error> {
267        Algorithm::from_str(&value, true)
268    }
269}
270impl TryFrom<&str> for Algorithm {
271    type Error = String;
272
273    fn try_from(value: &str) -> Result<Self, Self::Error> {
274        Algorithm::from_str(value, true)
275    }
276}
277
278impl Algorithm {
279    pub fn kind(&self) -> Kind {
280        match self {
281            Algorithm::Aes_128_Gcm
282            | Algorithm::Aes_256_Gcm
283            | Algorithm::Chacha20Poly1305
284            | Algorithm::Xchacha20Poly1305 => Kind::Aead,
285
286            Algorithm::Aes_256_Siv => Kind::Daead,
287
288            Algorithm::Blake3
289            | Algorithm::Sha2_256
290            | Algorithm::Sha2_384
291            | Algorithm::Sha2_512
292            | Algorithm::Sha3_256
293            | Algorithm::Sha3_224
294            | Algorithm::Sha3_384
295            | Algorithm::Sha3_512
296            | Algorithm::Aes_128
297            | Algorithm::Aes_192
298            | Algorithm::Aes_256 => Kind::Mac,
299
300            Algorithm::Es256 | Algorithm::Es384 | Algorithm::Ed25519 => Kind::Dsa,
301        }
302    }
303}
304impl TryFrom<Algorithm> for navajo::aead::Algorithm {
305    type Error = anyhow::Error;
306
307    fn try_from(value: Algorithm) -> Result<Self, Self::Error> {
308        match value {
309            Algorithm::Aes_128_Gcm => Ok(navajo::aead::Algorithm::Aes128Gcm),
310            Algorithm::Aes_256_Gcm => Ok(navajo::aead::Algorithm::Aes256Gcm),
311            Algorithm::Chacha20Poly1305 => Ok(navajo::aead::Algorithm::ChaCha20Poly1305),
312            Algorithm::Xchacha20Poly1305 => Ok(navajo::aead::Algorithm::XChaCha20Poly1305),
313            _ => bail!("Algorithm {value} is not AEAD"),
314        }
315    }
316}
317impl TryFrom<Algorithm> for navajo::daead::Algorithm {
318    type Error = anyhow::Error;
319
320    fn try_from(value: Algorithm) -> Result<Self, Self::Error> {
321        match value {
322            Algorithm::Aes_256_Siv => Ok(navajo::daead::Algorithm::Aes256Siv),
323            _ => bail!("Algorithm {value} is not DAEAD"),
324        }
325    }
326}
327impl TryFrom<Algorithm> for navajo::dsa::Algorithm {
328    type Error = anyhow::Error;
329
330    fn try_from(value: Algorithm) -> Result<Self, Self::Error> {
331        match value {
332            Algorithm::Es256 => Ok(navajo::dsa::Algorithm::Es256),
333            Algorithm::Es384 => Ok(navajo::dsa::Algorithm::Es384),
334            Algorithm::Ed25519 => Ok(navajo::dsa::Algorithm::Ed25519),
335            _ => bail!("Algorithm {value} is not Signature"),
336        }
337    }
338}
339
340impl TryFrom<Algorithm> for navajo::mac::Algorithm {
341    type Error = anyhow::Error;
342    fn try_from(value: Algorithm) -> Result<Self, Self::Error> {
343        match value {
344            Algorithm::Blake3 => Ok(navajo::mac::Algorithm::Blake3),
345            Algorithm::Sha2_256 => Ok(navajo::mac::Algorithm::Sha256),
346            Algorithm::Sha2_384 => Ok(navajo::mac::Algorithm::Sha384),
347            Algorithm::Sha2_512 => Ok(navajo::mac::Algorithm::Sha512),
348            Algorithm::Sha3_256 => Ok(navajo::mac::Algorithm::Sha3_256),
349            Algorithm::Sha3_224 => Ok(navajo::mac::Algorithm::Sha3_224),
350            Algorithm::Sha3_384 => Ok(navajo::mac::Algorithm::Sha3_384),
351            Algorithm::Sha3_512 => Ok(navajo::mac::Algorithm::Sha3_512),
352            Algorithm::Aes_128 => Ok(navajo::mac::Algorithm::Aes128),
353            Algorithm::Aes_192 => Ok(navajo::mac::Algorithm::Aes192),
354            Algorithm::Aes_256 => Ok(navajo::mac::Algorithm::Aes256),
355            _ => bail!("Algorithm {value} is not MAC"),
356        }
357    }
358}
359impl From<navajo::aead::Algorithm> for Algorithm {
360    fn from(value: navajo::aead::Algorithm) -> Self {
361        match value {
362            navajo::aead::Algorithm::Aes128Gcm => Algorithm::Aes_128_Gcm,
363            navajo::aead::Algorithm::Aes256Gcm => Algorithm::Aes_256_Gcm,
364            navajo::aead::Algorithm::ChaCha20Poly1305 => Algorithm::Chacha20Poly1305,
365            navajo::aead::Algorithm::XChaCha20Poly1305 => Algorithm::Xchacha20Poly1305,
366        }
367    }
368}
369
370impl From<navajo::daead::Algorithm> for Algorithm {
371    fn from(value: navajo::daead::Algorithm) -> Self {
372        match value {
373            navajo::daead::Algorithm::Aes256Siv => Algorithm::Aes_256_Siv,
374        }
375    }
376}
377impl From<navajo::dsa::Algorithm> for Algorithm {
378    fn from(value: navajo::dsa::Algorithm) -> Self {
379        match value {
380            navajo::dsa::Algorithm::Es256 => Algorithm::Es256,
381            navajo::dsa::Algorithm::Es384 => Algorithm::Es384,
382            navajo::dsa::Algorithm::Ed25519 => Algorithm::Ed25519,
383        }
384    }
385}
386impl From<navajo::mac::Algorithm> for Algorithm {
387    fn from(value: navajo::mac::Algorithm) -> Self {
388        match value {
389            navajo::mac::Algorithm::Blake3 => Algorithm::Blake3,
390            navajo::mac::Algorithm::Sha256 => Algorithm::Sha2_256,
391            navajo::mac::Algorithm::Sha384 => Algorithm::Sha2_384,
392            navajo::mac::Algorithm::Sha512 => Algorithm::Sha2_512,
393            navajo::mac::Algorithm::Sha3_256 => Algorithm::Sha3_256,
394            navajo::mac::Algorithm::Sha3_224 => Algorithm::Sha3_224,
395            navajo::mac::Algorithm::Sha3_384 => Algorithm::Sha3_384,
396            navajo::mac::Algorithm::Sha3_512 => Algorithm::Sha3_512,
397            navajo::mac::Algorithm::Aes128 => Algorithm::Aes_128,
398            navajo::mac::Algorithm::Aes192 => Algorithm::Aes_192,
399            navajo::mac::Algorithm::Aes256 => Algorithm::Aes_256,
400        }
401    }
402}