#![no_std]
use heapless_bytes::Bytes;
use serde::{Deserialize, Serialize};
use trussed_core::types::SerializedKey;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
#[non_exhaustive]
pub enum ErrorKind {
SerializeBufferFull,
SerializeCustom,
Deseralization,
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
pub struct Error {
kind: ErrorKind,
}
pub(crate) fn postcard_serialize_bytes<T: serde::Serialize, const N: usize>(
object: &T,
) -> postcard::Result<Bytes<N>> {
let mut vec = Bytes::new();
vec.resize_to_capacity();
let serialized = postcard::to_slice(object, &mut vec)?.len();
vec.resize(serialized, 0).unwrap();
Ok(vec)
}
#[derive(Serialize, Deserialize)]
pub struct RsaPublicParts<'d> {
pub n: &'d [u8],
pub e: &'d [u8],
}
impl<'d> RsaPublicParts<'d> {
pub fn serialize(&self) -> Result<SerializedKey, Error> {
use postcard::Error as PError;
postcard_serialize_bytes(self).map_err(|err| match err {
PError::SerializeBufferFull => Error {
kind: ErrorKind::SerializeBufferFull,
},
_ => Error {
kind: ErrorKind::SerializeCustom,
},
})
}
pub fn deserialize(data: &'d [u8]) -> Result<Self, Error> {
postcard::from_bytes(data).map_err(|_err| Error {
kind: ErrorKind::Deseralization,
})
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct RsaImportFormat<'d> {
pub e: &'d [u8],
pub p: &'d [u8],
pub q: &'d [u8],
}
impl<'d> RsaImportFormat<'d> {
pub fn serialize(&self) -> Result<SerializedKey, Error> {
use postcard::Error as PError;
postcard_serialize_bytes(self).map_err(|err| match err {
PError::SerializeBufferFull => Error {
kind: ErrorKind::SerializeBufferFull,
},
_ => Error {
kind: ErrorKind::SerializeCustom,
},
})
}
pub fn deserialize(data: &'d [u8]) -> Result<Self, Error> {
postcard::from_bytes(data).map_err(|_err| Error {
kind: ErrorKind::Deseralization,
})
}
}