use picky::jose::jws::Jws;
use super::{
header::{DPoPProofHeader, InvalidDPoPProofHeader},
payload::DPoPProofClaims,
};
#[derive(Debug, Clone)]
pub struct DPoPProofEssence {
pub header: DPoPProofHeader<'static>,
pub claims: DPoPProofClaims,
}
impl From<DPoPProofEssence> for Jws {
fn from(essence: DPoPProofEssence) -> Self {
Jws {
header: essence.header.into(),
payload: serde_json::to_vec(&essence.claims).expect("Must be json serializable."),
}
}
}
impl From<&DPoPProofEssence> for Jws {
fn from(essence: &DPoPProofEssence) -> Self {
Jws {
header: essence.header.clone().into(),
payload: serde_json::to_vec(&essence.claims).expect("Must be json serializable."),
}
}
}
impl TryFrom<Jws> for DPoPProofEssence {
type Error = InvalidDPoPProofJws;
fn try_from(jws: Jws) -> Result<Self, Self::Error> {
let header = DPoPProofHeader::try_from(jws.header).map_err(|e| e.error)?;
let claims = serde_json::from_slice::<DPoPProofClaims>(&jws.payload)?;
Ok(DPoPProofEssence { header, claims })
}
}
#[derive(Debug, thiserror::Error)]
pub enum InvalidDPoPProofJws {
#[error("Jws header is invalid dpop-proof header.\n{0}")]
InvalidHeader(#[from] InvalidDPoPProofHeader),
#[error("Jws payload json is invalid.\n{0}")]
InvalidPayloadJson(#[from] serde_json::Error),
}