use super::errors::Error;
use jsonwebtoken::jwk;
use serde::{Deserialize, Serialize};
use serde_json::value::RawValue;
#[serde_with::serde_as]
#[derive(Clone, Deserialize, Serialize, Debug)]
pub struct Cpak {
#[serde(rename = "pkey")]
pub raw_pkey: Box<RawValue>,
#[serde(skip)]
pub pkey: Option<jwk::Jwk>,
#[serde(rename = "implementation-id")]
#[serde_as(as = "serde_with::hex::Hex")]
pub impl_id: [u8; 32],
#[serde(rename = "instance-id")]
#[serde_as(as = "serde_with::hex::Hex")]
pub inst_id: [u8; 33],
}
impl Default for Cpak {
fn default() -> Self {
Self::new()
}
}
impl Cpak {
pub fn new() -> Self {
Self {
impl_id: Default::default(),
inst_id: [0; 33],
pkey: None,
raw_pkey: Default::default(),
}
}
pub fn parse_pkey(&mut self) -> Result<(), Error> {
let s = self.raw_pkey.get();
let pkey = serde_json::from_str::<jwk::Jwk>(s).map_err(|e| Error::Syntax(e.to_string()))?;
self.pkey = Some(pkey);
Ok(())
}
pub fn get_pkey(&mut self) -> Result<Option<&jwk::Jwk>, Error> {
Ok(self.pkey.as_ref())
}
}