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 {
9 Hmac,
10 Rsa,
11 Ec,
12 Ed,
13}
14
15impl AlgorithmFamily {
16 pub fn algorithms(&self) -> &[Algorithm] {
18 match self {
19 Self::Hmac => &[Algorithm::HS256, Algorithm::HS384, Algorithm::HS512],
20 Self::Rsa => &[
21 Algorithm::RS256,
22 Algorithm::RS384,
23 Algorithm::RS512,
24 Algorithm::PS256,
25 Algorithm::PS384,
26 Algorithm::PS512,
27 ],
28 Self::Ec => &[Algorithm::ES256, Algorithm::ES384],
29 Self::Ed => &[Algorithm::EdDSA],
30 }
31 }
32}
33
34#[allow(clippy::upper_case_acronyms)]
36#[derive(Debug, Default, PartialEq, Eq, Hash, Copy, Clone, Serialize, Deserialize)]
37pub enum Algorithm {
38 #[default]
40 HS256,
41 HS384,
43 HS512,
45
46 ES256,
48 ES384,
50
51 RS256,
53 RS384,
55 RS512,
57
58 PS256,
60 PS384,
62 PS512,
64
65 EdDSA,
67}
68
69impl FromStr for Algorithm {
70 type Err = Error;
71 fn from_str(s: &str) -> Result<Self> {
72 match s {
73 "HS256" => Ok(Algorithm::HS256),
74 "HS384" => Ok(Algorithm::HS384),
75 "HS512" => Ok(Algorithm::HS512),
76 "ES256" => Ok(Algorithm::ES256),
77 "ES384" => Ok(Algorithm::ES384),
78 "RS256" => Ok(Algorithm::RS256),
79 "RS384" => Ok(Algorithm::RS384),
80 "PS256" => Ok(Algorithm::PS256),
81 "PS384" => Ok(Algorithm::PS384),
82 "PS512" => Ok(Algorithm::PS512),
83 "RS512" => Ok(Algorithm::RS512),
84 "EdDSA" => Ok(Algorithm::EdDSA),
85 _ => Err(ErrorKind::InvalidAlgorithmName.into()),
86 }
87 }
88}
89
90impl Algorithm {
91 pub(crate) fn family(self) -> AlgorithmFamily {
92 match self {
93 Algorithm::HS256 | Algorithm::HS384 | Algorithm::HS512 => AlgorithmFamily::Hmac,
94 Algorithm::RS256
95 | Algorithm::RS384
96 | Algorithm::RS512
97 | Algorithm::PS256
98 | Algorithm::PS384
99 | Algorithm::PS512 => AlgorithmFamily::Rsa,
100 Algorithm::ES256 | Algorithm::ES384 => AlgorithmFamily::Ec,
101 Algorithm::EdDSA => AlgorithmFamily::Ed,
102 }
103 }
104}
105
106#[cfg(test)]
107mod tests {
108 use wasm_bindgen_test::wasm_bindgen_test;
109
110 use super::*;
111
112 #[test]
113 #[wasm_bindgen_test]
114 fn generate_algorithm_enum_from_str() {
115 assert!(Algorithm::from_str("HS256").is_ok());
116 assert!(Algorithm::from_str("HS384").is_ok());
117 assert!(Algorithm::from_str("HS512").is_ok());
118 assert!(Algorithm::from_str("RS256").is_ok());
119 assert!(Algorithm::from_str("RS384").is_ok());
120 assert!(Algorithm::from_str("RS512").is_ok());
121 assert!(Algorithm::from_str("PS256").is_ok());
122 assert!(Algorithm::from_str("PS384").is_ok());
123 assert!(Algorithm::from_str("PS512").is_ok());
124 assert!(Algorithm::from_str("").is_err());
125 }
126}