ps_datachunk/encrypted/
mod.rs

1
2use crate::utils;
3use crate::DataChunk;
4use crate::Result;
5use crate::SerializedDataChunk;
6use bytes::Bytes;
7use ps_buffer::Buffer;
8use ps_buffer::SharedBuffer;
9use ps_cypher::Encrypted;
10use ps_hash::Hash;
11
12#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
13/// represents an encrypted chunk of data and the key needed to decrypt it
14pub struct EncryptedDataChunk {
15    data: Buffer,
16    hash: Hash,
17    key: Hash,
18}
19
20impl EncryptedDataChunk {
21    /// Decrypts this `EncryptedDataChunk`.
22    pub fn decrypt(&self) -> Result<SerializedDataChunk> {
23        utils::decrypt(self.data_ref(), &self.key)
24    }
25
26    #[must_use]
27    pub const fn key(&self) -> Hash {
28        self.key
29    }
30
31    #[must_use]
32    pub const fn key_ref(&self) -> &Hash {
33        &self.key
34    }
35}
36
37impl DataChunk for EncryptedDataChunk {
38    fn data_ref(&self) -> &[u8] {
39        &self.data
40    }
41    fn hash_ref(&self) -> &Hash {
42        &self.hash
43    }
44    fn hash(&self) -> Hash {
45        self.hash
46    }
47
48    /// Transforms this [`DataChunk`] into [`Bytes`].
49    fn into_bytes(self) -> Bytes {
50        Bytes::from_owner(SharedBuffer::from(self.data))
51    }
52
53    /// Transforms this chunk into an [`OwnedDataChunk`]
54    fn into_owned(self) -> crate::OwnedDataChunk {
55        let Self { data, hash, key: _ } = self;
56
57        crate::OwnedDataChunk::from_data_and_hash(data, hash)
58    }
59}
60
61impl From<Encrypted> for EncryptedDataChunk {
62    fn from(value: Encrypted) -> Self {
63        Self {
64            data: value.bytes,
65            hash: value.hash,
66            key: value.key,
67        }
68    }
69}