sos_core/encoding/v1/
vault.rs1use crate::{
2 commit::CommitHash, crypto::AeadPack, encoding::encoding_error,
3 VaultCommit, VaultEntry,
4};
5use async_trait::async_trait;
6use binary_stream::futures::{
7 BinaryReader, BinaryWriter, Decodable, Encodable,
8};
9use std::io::{Result, SeekFrom};
10use tokio::io::{AsyncRead, AsyncSeek, AsyncWrite};
11
12#[async_trait]
13impl Encodable for VaultEntry {
14 async fn encode<W: AsyncWrite + AsyncSeek + Unpin + Send>(
15 &self,
16 writer: &mut BinaryWriter<W>,
17 ) -> Result<()> {
18 self.0.encode(&mut *writer).await?;
19 self.1.encode(&mut *writer).await?;
20 Ok(())
21 }
22}
23
24#[async_trait]
25impl Decodable for VaultEntry {
26 async fn decode<R: AsyncRead + AsyncSeek + Unpin + Send>(
27 &mut self,
28 reader: &mut BinaryReader<R>,
29 ) -> Result<()> {
30 let mut meta: AeadPack = Default::default();
31 meta.decode(&mut *reader).await?;
32 let mut secret: AeadPack = Default::default();
33 secret.decode(&mut *reader).await?;
34 *self = VaultEntry(meta, secret);
35 Ok(())
36 }
37}
38
39#[async_trait]
40impl Encodable for VaultCommit {
41 async fn encode<W: AsyncWrite + AsyncSeek + Unpin + Send>(
42 &self,
43 writer: &mut BinaryWriter<W>,
44 ) -> Result<()> {
45 writer.write_bytes(self.0.as_ref()).await?;
47
48 let size_pos = writer.stream_position().await?;
49
50 writer.write_u32(0).await?;
51
52 self.1.encode(&mut *writer).await?;
53
54 let row_pos = writer.stream_position().await?;
56 let row_len = row_pos - (size_pos + 4);
57 writer.seek(SeekFrom::Start(size_pos)).await?;
58 writer.write_u32(row_len as u32).await?;
59 writer.seek(SeekFrom::Start(row_pos)).await?;
60
61 Ok(())
62 }
63}
64
65#[async_trait]
66impl Decodable for VaultCommit {
67 async fn decode<R: AsyncRead + AsyncSeek + Unpin + Send>(
68 &mut self,
69 reader: &mut BinaryReader<R>,
70 ) -> Result<()> {
71 let commit: [u8; 32] = reader
72 .read_bytes(32)
73 .await?
74 .as_slice()
75 .try_into()
76 .map_err(encoding_error)?;
77 let commit = CommitHash(commit);
78
79 let _ = reader.read_u32().await?;
81
82 let mut group: VaultEntry = Default::default();
83 group.decode(&mut *reader).await?;
84 self.0 = commit;
85 self.1 = group;
86 Ok(())
87 }
88}