fi_digital_signatures/
algorithms.rs

1use serde::{Deserialize, Serialize};
2use wasm_bindgen::prelude::wasm_bindgen;
3
4/// Algorithms that used to sign and verify content
5#[derive(PartialEq, Eq, Serialize, Deserialize, Copy, Clone)]
6#[wasm_bindgen]
7pub enum Algorithm {
8    /// Sha-256 hash function based HMAC hash algotithm
9    HS256,
10    /// Sha-384 hash function based HMAC hash algotithm
11    HS384,
12    /// Sha-256 hash function based HMAC hash algotithm
13    HS512,
14    /// Sha-256 based RSA algorithm
15    RS256,
16    /// Sha-384 based RSA algorithm
17    RS384,
18    /// Sha-512 based RSA algorithm
19    RS512,
20    /// RSASSA-PSS using SHA-256
21    PS256,
22    /// RSASSA-PSS using SHA-384
23    PS384,
24    /// RSASSA-PSS using SHA-512
25    PS512,
26    /// Elliptic curve with NistP256
27    ES256,
28    /// Elliptic curve with NistP384
29    ES384,
30    /// Elliptic curve with NistP512
31    ES512,
32    /// Elliptic curve with Secp256k1
33    ES256K,
34    /// Elliptic curve with Ed25519
35    EdDSA,
36}
37
38impl Algorithm {
39    pub fn to_str<'a>(&self) -> &'a str {
40        match self {
41            Algorithm::HS256 => "HS256",
42            Algorithm::HS384 => "HS384",
43            Algorithm::HS512 => "HS512",
44            Algorithm::RS256 => "RS256",
45            Algorithm::RS384 => "RS384",
46            Algorithm::RS512 => "RS512",
47            Algorithm::PS256 => "PS256",
48            Algorithm::PS384 => "PS384",
49            Algorithm::PS512 => "PS512",
50            Algorithm::ES256 => "ES256",
51            Algorithm::ES384 => "ES384",
52            Algorithm::ES512 => "ES512",
53            Algorithm::ES256K => "ES256K",
54            Algorithm::EdDSA => "EdDSA",
55        }
56    }
57
58    pub fn from_str(alg: &str) -> Option<Self> {
59        match alg {
60            "HS256" => Some(Algorithm::HS256),
61            "HS384" => Some(Algorithm::HS384),
62            "HS512" => Some(Algorithm::HS512),
63            "RS256" => Some(Algorithm::RS256),
64            "RS384" => Some(Algorithm::RS384),
65            "RS512" => Some(Algorithm::RS512),
66            "PS256" => Some(Algorithm::PS256),
67            "PS384" => Some(Algorithm::PS384),
68            "PS512" => Some(Algorithm::PS512),
69            "ES256" => Some(Algorithm::ES256),
70            "ES384" => Some(Algorithm::ES384),
71            "ES512" => Some(Algorithm::ES512),
72            "ES256K" => Some(Algorithm::ES256K),
73            "EdDSA" => Some(Algorithm::EdDSA),
74            _ => None,
75        }
76    }
77
78    pub fn get_family(&self) -> AlgorithmFamily {
79        match self {
80            Algorithm::HS256 => AlgorithmFamily::HMAC,
81            Algorithm::HS384 => AlgorithmFamily::HMAC,
82            Algorithm::HS512 => AlgorithmFamily::HMAC,
83            Algorithm::RS256 => AlgorithmFamily::RSA,
84            Algorithm::RS384 => AlgorithmFamily::RSA,
85            Algorithm::RS512 => AlgorithmFamily::RSA,
86            Algorithm::PS256 => AlgorithmFamily::RSA,
87            Algorithm::PS384 => AlgorithmFamily::RSA,
88            Algorithm::PS512 => AlgorithmFamily::RSA,
89            Algorithm::ES256 => AlgorithmFamily::EC,
90            Algorithm::ES384 => AlgorithmFamily::EC,
91            Algorithm::ES512 => AlgorithmFamily::EC,
92            Algorithm::ES256K => AlgorithmFamily::EC,
93            Algorithm::EdDSA => AlgorithmFamily::OKP,
94        }
95    }
96}
97
98/// Algorithm family of [`Algorithm`]
99#[wasm_bindgen]
100pub enum AlgorithmFamily {
101    /// [`crate::algorithms::Algorithm::HS256`]
102    /// [`crate::algorithms::Algorithm::HS384`]
103    /// [`crate::algorithms::Algorithm::HS512`]
104    HMAC,
105    /// [`crate::algorithms::Algorithm::ES256`]
106    /// [`crate::algorithms::Algorithm::ES384`]
107    /// [`crate::algorithms::Algorithm::ES512`]
108    /// [`crate::algorithms::Algorithm::ES256K`]
109    EC,
110    /// [`crate::algorithms::Algorithm::RS256`]
111    /// [`crate::algorithms::Algorithm::RS384`]
112    /// [`crate::algorithms::Algorithm::RS512`]
113    /// [`crate::algorithms::Algorithm::PS256`]
114    /// [`crate::algorithms::Algorithm::PS384`]
115    /// [`crate::algorithms::Algorithm::PS512`]
116    RSA,
117    /// [`crate::algorithms::Algorithm::EdDSA`]
118    OKP,
119    None,
120}
121
122impl AlgorithmFamily {
123    pub fn to_str(&self) -> &str {
124        match self {
125            AlgorithmFamily::HMAC => "HMAC",
126            AlgorithmFamily::EC => "EC",
127            AlgorithmFamily::RSA => "RSA",
128            AlgorithmFamily::OKP => "OKP",
129            _ => "None",
130        }
131    }
132
133    pub fn to_string(&self) -> String {
134        String::from(self.to_str())
135    }
136}