jose/jwk/
key_use.rs

1use alloc::string::String;
2
3use serde::{Deserialize, Serialize};
4
5/// This enum represents possible key usage (`use`) parameter as
6/// defined in [Section 4.2 of RFC 7517]. All possible values are registered in
7/// the [IANA `JSON Web Key Use` registry].
8///
9/// [Section 4.2 of RFC 7517]: <https://datatracker.ietf.org/doc/html/rfc7517#section-4.2>
10/// [IANA `JSON Web Key Use` registry]: <https://www.iana.org/assignments/jose/jose.xhtml#web-key-use>
11#[non_exhaustive]
12#[derive(Debug, Clone, Hash, PartialEq, Eq)]
13pub enum KeyUsage {
14    /// The `sig` (signature) value
15    Signing,
16    /// The `enc` (encryption) value
17    Encryption,
18    /// Some other case-sensitive [`String`] that did not match any of the
19    /// publicly known variants
20    Other(String),
21}
22
23impl Serialize for KeyUsage {
24    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
25    where
26        S: serde::Serializer,
27    {
28        match self {
29            Self::Signing => "sig",
30            Self::Encryption => "enc",
31            Self::Other(s) => s,
32        }
33        .serialize(serializer)
34    }
35}
36
37impl<'de> Deserialize<'de> for KeyUsage {
38    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
39    where
40        D: serde::Deserializer<'de>,
41    {
42        let val = <alloc::borrow::Cow<'_, str>>::deserialize(deserializer)?;
43        Ok(match &*val {
44            "sig" => Self::Signing,
45            "enc" => Self::Encryption,
46            _ => Self::Other(val.into_owned()),
47        })
48    }
49}