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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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}