sos_core/encoding/v1/
vault.rs

1use 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        // Write the UUID
46        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        // Encodable the data length for lazy iteration
55        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        // Read in the length of the data blob
80        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}