ate_crypto/crypto/
signed_protected_data.rs1use 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}