use alloc::boxed::Box;
use alloc::collections::BTreeSet;
use alloc::string::String;
use alloc::vec::Vec;
use serde::{Deserialize, Serialize};
use jose_b64::base64ct::Base64;
use jose_b64::serde::Bytes;
use jose_jwa::Algorithm;
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Parameters {
#[serde(skip_serializing_if = "Option::is_none", default)]
pub alg: Option<Algorithm>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub kid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default, rename = "use")]
pub cls: Option<Class>,
#[serde(skip_serializing_if = "Option::is_none", default, rename = "key_ops")]
pub ops: Option<BTreeSet<Operations>>,
#[serde(skip_serializing_if = "Option::is_none", default)]
#[cfg(feature = "url")]
pub x5u: Option<url::Url>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub x5c: Option<Vec<Bytes<Box<[u8]>, Base64>>>,
#[serde(flatten)]
pub x5t: Thumbprint,
}
impl<T: Into<Algorithm>> From<T> for Parameters {
fn from(value: T) -> Self {
let alg = Some(value.into());
let cls = match alg {
Some(Algorithm::Signing(..)) => Some(Class::Signing),
_ => None,
};
Self {
alg,
cls,
..Default::default()
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[allow(missing_docs)]
#[non_exhaustive]
pub enum Class {
#[serde(rename = "enc")]
Encryption,
#[serde(rename = "sig")]
Signing,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[allow(missing_docs)]
#[non_exhaustive]
pub enum Operations {
Decrypt,
DeriveBits,
DeriveKey,
Encrypt,
Sign,
UnwrapKey,
Verify,
WrapKey,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Thumbprint {
#[serde(skip_serializing_if = "Option::is_none", rename = "x5t", default)]
pub s1: Option<Bytes<[u8; 20]>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "x5t#S256", default)]
pub s256: Option<Bytes<[u8; 32]>>,
}