1#![no_std]
5
6use heapless_bytes::Bytes;
7use serde::{Deserialize, Serialize};
8use trussed_core::types::SerializedKey;
9
10#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
12#[non_exhaustive]
13pub enum ErrorKind {
14 SerializeBufferFull,
16 SerializeCustom,
19 Deseralization,
21}
22
23#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
26pub struct Error {
27 kind: ErrorKind,
28}
29
30pub(crate) fn postcard_serialize_bytes<T: serde::Serialize, const N: usize>(
31 object: &T,
32) -> postcard::Result<Bytes<N>> {
33 let mut vec = Bytes::new();
34 vec.resize_to_capacity();
35 let serialized = postcard::to_slice(object, &mut vec)?.len();
36 vec.resize(serialized, 0).unwrap();
37 Ok(vec)
38}
39
40#[derive(Serialize, Deserialize)]
47pub struct RsaPublicParts<'d> {
48 pub n: &'d [u8],
50 pub e: &'d [u8],
52}
53
54impl<'d> RsaPublicParts<'d> {
55 pub fn serialize(&self) -> Result<SerializedKey, Error> {
56 use postcard::Error as PError;
57 postcard_serialize_bytes(self).map_err(|err| match err {
58 PError::SerializeBufferFull => Error {
59 kind: ErrorKind::SerializeBufferFull,
60 },
61 _ => Error {
62 kind: ErrorKind::SerializeCustom,
63 },
64 })
65 }
66
67 pub fn deserialize(data: &'d [u8]) -> Result<Self, Error> {
68 postcard::from_bytes(data).map_err(|_err| Error {
69 kind: ErrorKind::Deseralization,
70 })
71 }
72}
73
74#[derive(Debug, Deserialize, Serialize)]
81pub struct RsaImportFormat<'d> {
82 pub e: &'d [u8],
84 pub p: &'d [u8],
86 pub q: &'d [u8],
88}
89
90impl<'d> RsaImportFormat<'d> {
91 pub fn serialize(&self) -> Result<SerializedKey, Error> {
92 use postcard::Error as PError;
93 postcard_serialize_bytes(self).map_err(|err| match err {
94 PError::SerializeBufferFull => Error {
95 kind: ErrorKind::SerializeBufferFull,
96 },
97 _ => Error {
98 kind: ErrorKind::SerializeCustom,
99 },
100 })
101 }
102
103 pub fn deserialize(data: &'d [u8]) -> Result<Self, Error> {
104 postcard::from_bytes(data).map_err(|_err| Error {
105 kind: ErrorKind::Deseralization,
106 })
107 }
108}