mas_jose/jwa/
symmetric.rs1use mas_iana::jose::JsonWebSignatureAlg;
8use thiserror::Error;
9
10use super::signature::Signature;
11
12#[non_exhaustive]
14pub enum SymmetricKey {
15 Hs256(super::Hs256Key),
16 Hs384(super::Hs384Key),
17 Hs512(super::Hs512Key),
18}
19
20#[derive(Debug, Error)]
21#[error("Invalid algorithm {alg} used for symetric key")]
22pub struct InvalidAlgorithm {
23 pub alg: JsonWebSignatureAlg,
24 pub key: Vec<u8>,
25}
26
27impl SymmetricKey {
28 pub fn new_for_alg(key: Vec<u8>, alg: &JsonWebSignatureAlg) -> Result<Self, InvalidAlgorithm> {
34 match alg {
35 JsonWebSignatureAlg::Hs256 => Ok(Self::hs256(key)),
36 JsonWebSignatureAlg::Hs384 => Ok(Self::hs384(key)),
37 JsonWebSignatureAlg::Hs512 => Ok(Self::hs512(key)),
38 _ => Err(InvalidAlgorithm {
39 alg: alg.clone(),
40 key,
41 }),
42 }
43 }
44
45 #[must_use]
47 pub const fn hs256(key: Vec<u8>) -> Self {
48 Self::Hs256(super::Hs256Key::new(key))
49 }
50
51 #[must_use]
53 pub const fn hs384(key: Vec<u8>) -> Self {
54 Self::Hs384(super::Hs384Key::new(key))
55 }
56
57 #[must_use]
59 pub const fn hs512(key: Vec<u8>) -> Self {
60 Self::Hs512(super::Hs512Key::new(key))
61 }
62}
63
64impl From<super::Hs256Key> for SymmetricKey {
65 fn from(key: super::Hs256Key) -> Self {
66 Self::Hs256(key)
67 }
68}
69
70impl From<super::Hs384Key> for SymmetricKey {
71 fn from(key: super::Hs384Key) -> Self {
72 Self::Hs384(key)
73 }
74}
75
76impl From<super::Hs512Key> for SymmetricKey {
77 fn from(key: super::Hs512Key) -> Self {
78 Self::Hs512(key)
79 }
80}
81
82impl signature::RandomizedSigner<Signature> for SymmetricKey {
83 fn try_sign_with_rng(
84 &self,
85 _rng: &mut (impl rand::CryptoRng + rand::RngCore),
86 msg: &[u8],
87 ) -> Result<Signature, signature::Error> {
88 signature::Signer::try_sign(self, msg)
90 }
91}
92
93impl signature::Signer<Signature> for SymmetricKey {
94 fn try_sign(&self, msg: &[u8]) -> Result<Signature, signature::Error> {
95 match self {
96 Self::Hs256(key) => {
97 let signature = key.try_sign(msg)?;
98 Ok(Signature::from_signature(&signature))
99 }
100 Self::Hs384(key) => {
101 let signature = key.try_sign(msg)?;
102 Ok(Signature::from_signature(&signature))
103 }
104 Self::Hs512(key) => {
105 let signature = key.try_sign(msg)?;
106 Ok(Signature::from_signature(&signature))
107 }
108 }
109 }
110}
111
112impl signature::Verifier<Signature> for SymmetricKey {
113 fn verify(&self, msg: &[u8], signature: &Signature) -> Result<(), signature::Error> {
114 match self {
115 Self::Hs256(key) => {
116 let signature = signature.to_signature()?;
117 key.verify(msg, &signature)
118 }
119 Self::Hs384(key) => {
120 let signature = signature.to_signature()?;
121 key.verify(msg, &signature)
122 }
123 Self::Hs512(key) => {
124 let signature = signature.to_signature()?;
125 key.verify(msg, &signature)
126 }
127 }
128 }
129}