jsonwebtoken/
algorithms.rs1use std::str::FromStr;
2
3use serde::{Deserialize, Serialize};
4
5use crate::errors::{Error, ErrorKind, Result};
6
7#[derive(Debug, Eq, PartialEq, Copy, Clone, Serialize, Deserialize)]
8pub enum AlgorithmFamily {
10 Hmac,
12 Rsa,
14 Ec,
16 Ed,
18}
19
20impl AlgorithmFamily {
21 pub fn algorithms(&self) -> &[Algorithm] {
23 match self {
24 Self::Hmac => &[Algorithm::HS256, Algorithm::HS384, Algorithm::HS512],
25 Self::Rsa => &[
26 Algorithm::RS256,
27 Algorithm::RS384,
28 Algorithm::RS512,
29 Algorithm::PS256,
30 Algorithm::PS384,
31 Algorithm::PS512,
32 ],
33 Self::Ec => &[Algorithm::ES256, Algorithm::ES384],
34 Self::Ed => &[Algorithm::EdDSA],
35 }
36 }
37}
38
39#[allow(clippy::upper_case_acronyms)]
41#[derive(Debug, Default, PartialEq, Eq, Hash, Copy, Clone, Serialize, Deserialize)]
42#[non_exhaustive]
43pub enum Algorithm {
44 #[default]
46 HS256,
47 HS384,
49 HS512,
51
52 ES256,
54 ES384,
56
57 RS256,
59 RS384,
61 RS512,
63
64 PS256,
66 PS384,
68 PS512,
70
71 EdDSA,
73}
74
75impl FromStr for Algorithm {
76 type Err = Error;
77 fn from_str(s: &str) -> Result<Self> {
78 match s {
79 "HS256" => Ok(Algorithm::HS256),
80 "HS384" => Ok(Algorithm::HS384),
81 "HS512" => Ok(Algorithm::HS512),
82 "ES256" => Ok(Algorithm::ES256),
83 "ES384" => Ok(Algorithm::ES384),
84 "RS256" => Ok(Algorithm::RS256),
85 "RS384" => Ok(Algorithm::RS384),
86 "PS256" => Ok(Algorithm::PS256),
87 "PS384" => Ok(Algorithm::PS384),
88 "PS512" => Ok(Algorithm::PS512),
89 "RS512" => Ok(Algorithm::RS512),
90 "EdDSA" => Ok(Algorithm::EdDSA),
91 _ => Err(ErrorKind::InvalidAlgorithmName.into()),
92 }
93 }
94}
95
96impl Algorithm {
97 pub fn family(self) -> AlgorithmFamily {
99 match self {
100 Algorithm::HS256 | Algorithm::HS384 | Algorithm::HS512 => AlgorithmFamily::Hmac,
101 Algorithm::RS256
102 | Algorithm::RS384
103 | Algorithm::RS512
104 | Algorithm::PS256
105 | Algorithm::PS384
106 | Algorithm::PS512 => AlgorithmFamily::Rsa,
107 Algorithm::ES256 | Algorithm::ES384 => AlgorithmFamily::Ec,
108 Algorithm::EdDSA => AlgorithmFamily::Ed,
109 }
110 }
111}
112
113#[cfg(test)]
114mod tests {
115 use wasm_bindgen_test::wasm_bindgen_test;
116
117 use super::*;
118
119 #[test]
120 #[wasm_bindgen_test]
121 fn generate_algorithm_enum_from_str() {
122 assert!(Algorithm::from_str("HS256").is_ok());
123 assert!(Algorithm::from_str("HS384").is_ok());
124 assert!(Algorithm::from_str("HS512").is_ok());
125 assert!(Algorithm::from_str("RS256").is_ok());
126 assert!(Algorithm::from_str("RS384").is_ok());
127 assert!(Algorithm::from_str("RS512").is_ok());
128 assert!(Algorithm::from_str("PS256").is_ok());
129 assert!(Algorithm::from_str("PS384").is_ok());
130 assert!(Algorithm::from_str("PS512").is_ok());
131 assert!(Algorithm::from_str("").is_err());
132 }
133}