Skip to main content

sendcipher_core/crypto/
blob.rs

1/* Created on 2025.11.05 */
2/* Copyright (c) 2025-2026 Youcef Lemsafer */
3/* SPDX-License-Identifier: MIT */
4
5use crate::crypto::blob_header::*;
6use crate::crypto::metadata::*;
7
8#[derive(Debug, Default)]
9pub struct Blob {
10    /// Fully equipped serialized blob: header + ciphertext
11    raw: Vec<u8>,
12    /// Parsed header, lazily evaluated from raw
13    header: Option<BlobHeader>,
14    /// Position of the first byte after the header
15    pos_after_header: Option<u64>,
16}
17
18impl Blob {
19    pub fn new(raw_blob: Vec<u8>) -> Self {
20        Blob {
21            raw: raw_blob,
22            header: None,
23            pos_after_header: None,
24        }
25    }
26
27    pub(crate) fn new_parsed(raw: Vec<u8>, blob_header: BlobHeader, pos_after_header: u64) -> Self {
28        Self {
29            raw: raw,
30            header: Some(blob_header),
31            pos_after_header: Some(pos_after_header),
32        }
33    }
34
35    pub fn data(&self) -> &Vec<u8> {
36        &self.raw
37    }
38    pub fn data_mut(&mut self) -> &mut Vec<u8> {
39        &mut self.raw
40    }
41
42    pub fn parse_header(&mut self) -> Result<&mut Self, crate::error::Error> {
43        let (header, pos) = BlobHeader::parse(&self.raw)?;
44        self.header = Some(header);
45        self.pos_after_header = Some(pos);
46        Ok(self)
47    }
48
49    pub fn get_header(&self) -> &Option<BlobHeader> {
50        &self.header
51    }
52
53    pub fn get_position_after_header(&self) -> Option<u64> {
54        self.pos_after_header
55    }
56}
57
58pub struct DecryptedBlob {
59    /// The header read from the blob
60    header: Option<BlobHeader>,
61    /// The metadata revealed by decrypting the ciphertext
62    metadata: Option<Metadata>,
63    /// Clear text
64    text: Vec<u8>,
65}
66
67impl DecryptedBlob {
68    pub fn new(header: BlobHeader, text: Vec<u8>, metadata: Metadata) -> Self {
69        Self {
70            header: Some(header),
71            metadata: Some(metadata),
72            text: text,
73        }
74    }
75
76    pub fn get_blob_header(&self) -> &Option<BlobHeader> {
77        &self.header
78    }
79
80    pub fn get_metadata(&self) -> &Option<Metadata> {
81        &self.metadata
82    }
83
84    pub fn get_text(&self) -> &Vec<u8> {
85        &self.text
86    }
87    pub fn get_text_mut(&mut self) -> &mut Vec<u8> {
88        &mut self.text
89    }
90}