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)]
42pub enum Algorithm {
43 #[default]
45 HS256,
46 HS384,
48 HS512,
50
51 ES256,
53 ES384,
55
56 RS256,
58 RS384,
60 RS512,
62
63 PS256,
65 PS384,
67 PS512,
69
70 EdDSA,
72}
73
74impl FromStr for Algorithm {
75 type Err = Error;
76 fn from_str(s: &str) -> Result<Self> {
77 match s {
78 "HS256" => Ok(Algorithm::HS256),
79 "HS384" => Ok(Algorithm::HS384),
80 "HS512" => Ok(Algorithm::HS512),
81 "ES256" => Ok(Algorithm::ES256),
82 "ES384" => Ok(Algorithm::ES384),
83 "RS256" => Ok(Algorithm::RS256),
84 "RS384" => Ok(Algorithm::RS384),
85 "PS256" => Ok(Algorithm::PS256),
86 "PS384" => Ok(Algorithm::PS384),
87 "PS512" => Ok(Algorithm::PS512),
88 "RS512" => Ok(Algorithm::RS512),
89 "EdDSA" => Ok(Algorithm::EdDSA),
90 _ => Err(ErrorKind::InvalidAlgorithmName.into()),
91 }
92 }
93}
94
95impl Algorithm {
96 pub(crate) fn family(self) -> AlgorithmFamily {
97 match self {
98 Algorithm::HS256 | Algorithm::HS384 | Algorithm::HS512 => AlgorithmFamily::Hmac,
99 Algorithm::RS256
100 | Algorithm::RS384
101 | Algorithm::RS512
102 | Algorithm::PS256
103 | Algorithm::PS384
104 | Algorithm::PS512 => AlgorithmFamily::Rsa,
105 Algorithm::ES256 | Algorithm::ES384 => AlgorithmFamily::Ec,
106 Algorithm::EdDSA => AlgorithmFamily::Ed,
107 }
108 }
109}
110
111#[cfg(test)]
112mod tests {
113 use wasm_bindgen_test::wasm_bindgen_test;
114
115 use super::*;
116
117 #[test]
118 #[wasm_bindgen_test]
119 fn generate_algorithm_enum_from_str() {
120 assert!(Algorithm::from_str("HS256").is_ok());
121 assert!(Algorithm::from_str("HS384").is_ok());
122 assert!(Algorithm::from_str("HS512").is_ok());
123 assert!(Algorithm::from_str("RS256").is_ok());
124 assert!(Algorithm::from_str("RS384").is_ok());
125 assert!(Algorithm::from_str("RS512").is_ok());
126 assert!(Algorithm::from_str("PS256").is_ok());
127 assert!(Algorithm::from_str("PS384").is_ok());
128 assert!(Algorithm::from_str("PS512").is_ok());
129 assert!(Algorithm::from_str("").is_err());
130 }
131}