use serde::{de::Error, Deserialize};
use crate::misc::base64url_decode;
#[derive(Deserialize)]
pub struct KeySet {
pub keys: Vec<Key>,
}
#[derive(Deserialize)]
pub struct Key {
pub kid: String,
#[serde(flatten)]
pub data: KeyData,
}
#[derive(Deserialize)]
#[serde(tag = "kty")]
pub enum KeyData {
#[serde(rename = "RSA")]
Rsa(RsaKey),
#[serde(rename = "OKP")]
Okp(OkpKey),
#[serde(other)]
Unknown,
}
#[derive(Debug)]
pub struct Binary(Vec<u8>);
impl<'de> Deserialize<'de> for Binary {
fn deserialize<D>(de: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let data: &str = Deserialize::deserialize(de)?;
base64url_decode(data).map(Self).map_err(Error::custom)
}
}
impl AsRef<[u8]> for Binary {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
#[derive(Deserialize)]
pub struct RsaKey {
pub alg: RsaAlg,
pub n: Binary,
pub e: Binary,
}
#[derive(Clone, Copy, Deserialize, PartialEq, Eq)]
pub enum RsaAlg {
#[serde(rename = "RS256")]
Rs256,
#[serde(other)]
Unknown,
}
#[derive(Deserialize)]
pub struct OkpKey {
pub alg: OkpAlg,
pub crv: OkpCurve,
pub x: Binary,
}
#[derive(Clone, Copy, Deserialize, PartialEq, Eq)]
pub enum OkpAlg {
#[serde(rename = "EdDSA")]
EdDsa,
#[serde(other)]
Unknown,
}
#[derive(Clone, Copy, Deserialize, PartialEq, Eq)]
pub enum OkpCurve {
Ed25519,
#[serde(other)]
Unknown,
}