ate_crypto/crypto/
signed_protected_data.rs

1use crate::spec::SerializationFormat;
2use crate::utils::vec_deserialize;
3use crate::utils::vec_serialize;
4use serde::{Deserialize, Serialize};
5use std::io::ErrorKind;
6use std::result::Result;
7#[allow(unused_imports)]
8use tracing::{debug, error, info, instrument, span, trace, warn, Level};
9
10use super::*;
11
12#[derive(Serialize, Deserialize, Debug, Clone)]
13pub struct SignedProtectedData<T> {
14    format: SerializationFormat,
15    #[serde(serialize_with = "vec_serialize", deserialize_with = "vec_deserialize")]
16    sig: Vec<u8>,
17    data: T,
18}
19
20impl<T> SignedProtectedData<T> {
21    pub fn new(sign_key: &PrivateSignKey, data: T) -> Result<SignedProtectedData<T>, std::io::Error>
22    where
23        T: Serialize,
24    {
25        let format = SerializationFormat::Bincode;
26        let binary_data = match format.serialize(&data) {
27            Ok(a) => a,
28            Err(err) => {
29                return Err(std::io::Error::new(ErrorKind::Other, err.to_string()));
30            }
31        };
32        let binary_data_hash = AteHash::from_bytes(&binary_data[..]);
33        let sig = sign_key.sign(&binary_data_hash.val)?;
34
35        Ok(SignedProtectedData { format, sig, data })
36    }
37
38    pub fn verify(&self, key: &PublicSignKey) -> Result<bool, std::io::Error>
39    where
40        T: Serialize,
41    {
42        let binary_data = match self.format.serialize(&self.data) {
43            Ok(a) => a,
44            Err(err) => {
45                return Err(std::io::Error::new(ErrorKind::Other, err.to_string()));
46            }
47        };
48        let binary_data_hash = AteHash::from_bytes(&binary_data[..]);
49        match key.verify(&binary_data_hash.val, &self.sig[..]) {
50            Ok(a) => Ok(a),
51            Err(err) => Err(std::io::Error::new(
52                std::io::ErrorKind::Other,
53                err.to_string(),
54            )),
55        }
56    }
57
58    pub fn sig64(&self) -> String {
59        base64::encode(&self.sig)
60    }
61
62    pub fn sig_hash64(&self) -> String {
63        AteHash::from_bytes(&self.sig[..]).to_string()
64    }
65}
66
67impl<T> std::ops::Deref for SignedProtectedData<T> {
68    type Target = T;
69
70    fn deref(&self) -> &Self::Target {
71        &self.data
72    }
73}