use super::{EncryptedSteVecTerm, TokenizedSelector};
use crate::zerokms::encrypted_record;
use serde::{Deserialize, Serialize};
#[cfg_attr(test, derive(PartialEq, Eq))]
#[derive(Debug, Serialize, Deserialize)]
pub struct EncryptedEntry<const N: usize> {
#[serde(rename = "s")]
pub tokenized_selector: TokenizedSelector<N>,
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub term: Option<EncryptedSteVecTerm>,
#[serde(rename = "c", with = "encrypted_record::formats::base85")]
pub ciphertext: Vec<u8>,
pub parent_is_array: bool,
}
impl<const N: usize> EncryptedEntry<N> {
pub(crate) fn new(
tokenized_selector: TokenizedSelector<N>,
term: Option<EncryptedSteVecTerm>,
ciphertext: Vec<u8>,
parent_is_array: bool,
) -> Self {
Self {
tokenized_selector,
term,
ciphertext,
parent_is_array,
}
}
}
#[cfg(test)]
use super::QueryEntry;
impl<const N: usize> EncryptedEntry<N> {
#[cfg(test)]
pub fn contains(&self, q: &QueryEntry<N>) -> bool {
self.tokenized_selector == q.0
&& match &q.1 {
None => true,
Some(term) => self.term.as_ref() == Some(term),
}
}
}
#[cfg(test)]
mod tests {
use crate::encryption::{
json_indexer::ste_vec::encrypted_term::EncryptedSteVecTerm, EncryptedEntry,
TokenizedSelector,
};
use serde_json::json;
use std::vec;
fn make_encrypted_entry(term: Option<EncryptedSteVecTerm>) -> EncryptedEntry<16> {
EncryptedEntry::new(TokenizedSelector([0; 16]), term, vec![1, 2, 3], false)
}
fn c_base85() -> String {
base85::encode(&[1, 2, 3])
}
mod term_less {
use super::*;
fn expected() -> serde_json::Value {
json!({
"parent_is_array": false,
"s": "00000000000000000000000000000000",
"c": c_base85()
})
}
#[test]
fn serialize_shape() {
let entry = make_encrypted_entry(None);
let serialized = serde_json::to_string(&entry).unwrap();
assert_eq!(
serde_json::from_str::<serde_json::Value>(&serialized).unwrap(),
expected()
);
}
#[test]
fn deserialize_shape() {
let serialized = expected();
let entry: EncryptedEntry<16> = serde_json::from_value(serialized).unwrap();
assert!(entry.term.is_none());
}
#[test]
fn legacy_stray_hm_is_ignored_yielding_a_term_less_entry() {
let mut with_hm = expected();
with_hm["hm"] = json!("abcd");
let entry: EncryptedEntry<16> = serde_json::from_value(with_hm).unwrap();
assert!(entry.term.is_none());
}
}
mod ore {
use super::*;
use cllw_ore::OreCllw8VariableV1;
fn expected() -> serde_json::Value {
json!({
"parent_is_array": false,
"s": "00000000000000000000000000000000",
"oc": "04040404040404040404040404040404040404",
"c": c_base85()
})
}
#[test]
fn serialize_shape() {
let bytes = vec![4; 19];
let entry = make_encrypted_entry(Some(EncryptedSteVecTerm::Standard {
oc: OreCllw8VariableV1::from(bytes),
}));
let serialized = serde_json::to_string(&entry).unwrap();
assert_eq!(
serde_json::from_str::<serde_json::Value>(&serialized).unwrap(),
expected()
);
}
#[test]
fn deserialize_shape() {
let serialized = expected();
let entry: EncryptedEntry<16> = serde_json::from_value(serialized).unwrap();
assert!(entry.term.is_some());
}
}
mod ope {
use super::*;
use cllw_ore::OpeCllw8VariableV1;
fn expected() -> serde_json::Value {
json!({
"parent_is_array": false,
"s": "00000000000000000000000000000000",
"op": "07070707070707070707",
"c": c_base85()
})
}
#[test]
fn serialize_shape() {
let bytes = vec![7; 10];
let entry = make_encrypted_entry(Some(EncryptedSteVecTerm::Compat {
op: OpeCllw8VariableV1::from_bytes(bytes),
}));
let serialized = serde_json::to_string(&entry).unwrap();
assert_eq!(
serde_json::from_str::<serde_json::Value>(&serialized).unwrap(),
expected()
);
}
#[test]
fn deserialize_shape() {
let serialized = expected();
let entry: EncryptedEntry<16> = serde_json::from_value(serialized).unwrap();
assert!(entry.term.is_some());
}
}
}