1use simple_ring::Polynomial;
3use crate::BFV;
4
5#[derive(Clone)]
6pub struct BFVPlaintext {
7 pub plain: Polynomial,
8 pub len: usize,
9}
10
11impl BFVPlaintext {
12 pub fn empty(bfv: &BFV) -> Self { Self {
14 plain: Polynomial::zeros(bfv.params.n),
15 len: 0, }
17 }
18
19 pub fn push(mut self, to_push: &str) -> Self { let encoded: Vec<u64> = to_push.as_bytes().iter().map(|&b| b as u64).collect(); let remaining = self.plain.coeffs.len() - self.len; let len_to_write = encoded.len().min(remaining);
26
27 for i in 0..len_to_write { self.plain.coeffs[self.len + i] = encoded[i];
29 }
30
31 self.len += len_to_write; self
33 }
34
35 pub fn new(text: &str, bfv: &BFV) -> Self { let n = bfv.params.n;
37
38 let mut coeffs: Vec<u64> = vec![0; n]; let bytes = text.as_bytes(); let len_to_write = bytes.len().min(n); for i in 0..len_to_write { coeffs[i] = bytes[i] as u64;
46 }
47
48 Self {
49 plain: Polynomial::new(coeffs), len: len_to_write,
51 }
52 }
53
54 pub fn new_from_coeffs(coeffs: Vec<u64>, bfv: &BFV) -> Self { Self { plain: Polynomial::new(coeffs), len: bfv.params.n }
56 }
57
58 pub fn decode(&self) -> String { let vec = self.plain.coeffs.to_vec();
60 let vec: Vec<u8> = vec.iter().map(|&b| b as u8).collect();
61 str::from_utf8(&vec).unwrap().to_string()
62 }
63
64}