From af8d9e04424531ac37367269f75e1b1dcd750314 Mon Sep 17 00:00:00 2001
From: HatemMn <19950216+HatemMn@users.noreply.github.com>
Date: Mon, 2 Dec 2024 12:12:23 +0100
Subject: [PATCH] feat: put alltogether memories
---
Cargo.toml | 1 -
benches/benches.rs | 4 +-
examples/insert.rs | 2 +-
rust-toolchain | 1 +
src/encryption_layer.rs | 59 ++++++++++-------------
src/findex.rs | 45 -----------------
src/lib.rs | 4 +-
src/memory/db_stores/mod.rs | 4 --
src/memory/{db_stores => }/error.rs | 10 ----
src/memory/mod.rs | 7 ++-
src/memory/{db_stores => }/redis_store.rs | 13 +++--
src/ovec.rs | 28 +++++------
src/test/memory.rs | 50 ++++++++-----------
13 files changed, 75 insertions(+), 153 deletions(-)
create mode 100644 rust-toolchain
delete mode 100644 src/memory/db_stores/mod.rs
rename src/memory/{db_stores => }/error.rs (85%)
rename src/memory/{db_stores => }/redis_store.rs (95%)
diff --git a/Cargo.toml b/Cargo.toml
index 091c5204..52ccc1b0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -39,7 +39,6 @@ redis = { version = "0.27.5", features = [
"tokio-comp",
"connection-manager",
], optional = true }
-cosmian_crypto_core = "9.6.1"
[dev-dependencies]
criterion = "0.5.1"
diff --git a/benches/benches.rs b/benches/benches.rs
index ca867b7b..407858c0 100644
--- a/benches/benches.rs
+++ b/benches/benches.rs
@@ -1,9 +1,9 @@
use std::{collections::HashSet, time::Duration};
+use cosmian_findex::{Findex, InMemory, IndexADT, MemoryADT, Op, Secret, WORD_LENGTH};
#[cfg(feature = "test-utils")]
use cosmian_findex::{dummy_decode, dummy_encode};
-use cosmian_findex::{Findex, InMemory, IndexADT, MemoryADT, Op, Secret, WORD_LENGTH};
-use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
+use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use futures::{executor::block_on, future::join_all};
use lazy_static::lazy_static;
use rand_chacha::ChaChaRng;
diff --git a/examples/insert.rs b/examples/insert.rs
index b3f96b9a..ebb1b78d 100644
--- a/examples/insert.rs
+++ b/examples/insert.rs
@@ -1,8 +1,8 @@
use std::collections::HashSet;
+use cosmian_findex::{Findex, InMemory, IndexADT, Secret, Value};
#[cfg(feature = "test-utils")]
use cosmian_findex::{dummy_decode, dummy_encode};
-use cosmian_findex::{Findex, InMemory, IndexADT, Secret, Value};
use futures::executor::block_on;
use rand_chacha::ChaChaRng;
use rand_core::{CryptoRngCore, SeedableRng};
diff --git a/rust-toolchain b/rust-toolchain
new file mode 100644
index 00000000..3744db4d
--- /dev/null
+++ b/rust-toolchain
@@ -0,0 +1 @@
+nightly-x86_64-unknown-linux-gnu
diff --git a/src/encryption_layer.rs b/src/encryption_layer.rs
index 5d2b47a4..1aa695a6 100644
--- a/src/encryption_layer.rs
+++ b/src/encryption_layer.rs
@@ -1,14 +1,14 @@
use std::{fmt::Debug, ops::Deref, sync::Arc};
use aes::{
- cipher::{generic_array::GenericArray, BlockEncrypt, KeyInit},
Aes256,
+ cipher::{BlockEncrypt, KeyInit, generic_array::GenericArray},
};
use xts_mode::Xts128;
use crate::{
- address::Address, error::Error, secret::Secret, symmetric_key::SymmetricKey, MemoryADT,
- ADDRESS_LENGTH, KEY_LENGTH,
+ ADDRESS_LENGTH, KEY_LENGTH, MemoryADT, address::Address, error::Error, secret::Secret,
+ symmetric_key::SymmetricKey,
};
#[derive(Clone)]
@@ -44,9 +44,9 @@ pub struct MemoryEncryptionLayer<
}
impl<
- const WORD_LENGTH: usize,
- Memory: Send + Sync + MemoryADT
, Word = [u8; WORD_LENGTH]>,
- > MemoryEncryptionLayer
+ const WORD_LENGTH: usize,
+ Memory: Send + Sync + MemoryADT, Word = [u8; WORD_LENGTH]>,
+> MemoryEncryptionLayer
{
/// Instantiates a new memory encryption layer.
pub fn new(seed: Secret, stm: Memory) -> Self {
@@ -80,9 +80,9 @@ impl<
}
impl<
- const WORD_LENGTH: usize,
- Memory: Send + Sync + MemoryADT, Word = [u8; WORD_LENGTH]>,
- > MemoryADT for MemoryEncryptionLayer
+ const WORD_LENGTH: usize,
+ Memory: Send + Sync + MemoryADT, Word = [u8; WORD_LENGTH]>,
+> MemoryADT for MemoryEncryptionLayer
{
type Address = Address;
type Error = Error;
@@ -126,20 +126,20 @@ impl<
#[cfg(test)]
mod tests {
use aes::{
- cipher::{generic_array::GenericArray, BlockDecrypt, KeyInit},
Aes256,
+ cipher::{BlockDecrypt, KeyInit, generic_array::GenericArray},
};
use futures::executor::block_on;
use rand_chacha::ChaChaRng;
use rand_core::SeedableRng;
use crate::{
+ MemoryADT,
address::Address,
- encryption_layer::{MemoryEncryptionLayer, ADDRESS_LENGTH},
+ encryption_layer::{ADDRESS_LENGTH, MemoryEncryptionLayer},
memory::in_memory_store::InMemory,
secret::Secret,
symmetric_key::SymmetricKey,
- MemoryADT,
};
const WORD_LENGTH: usize = 128;
@@ -192,40 +192,33 @@ mod tests {
let val_addr_4 = Address::::random(&mut rng);
assert_eq!(
- block_on(obf.guarded_write(
- (header_addr.clone(), None),
- vec![
- (header_addr.clone(), [2; WORD_LENGTH]),
- (val_addr_1.clone(), [1; WORD_LENGTH]),
- (val_addr_2.clone(), [1; WORD_LENGTH])
- ]
- ))
+ block_on(obf.guarded_write((header_addr.clone(), None), vec![
+ (header_addr.clone(), [2; WORD_LENGTH]),
+ (val_addr_1.clone(), [1; WORD_LENGTH]),
+ (val_addr_2.clone(), [1; WORD_LENGTH])
+ ]))
.unwrap(),
None
);
assert_eq!(
- block_on(obf.guarded_write(
- (header_addr.clone(), None),
- vec![
- (header_addr.clone(), [2; WORD_LENGTH]),
- (val_addr_1.clone(), [3; WORD_LENGTH]),
- (val_addr_2.clone(), [3; WORD_LENGTH])
- ]
- ))
+ block_on(obf.guarded_write((header_addr.clone(), None), vec![
+ (header_addr.clone(), [2; WORD_LENGTH]),
+ (val_addr_1.clone(), [3; WORD_LENGTH]),
+ (val_addr_2.clone(), [3; WORD_LENGTH])
+ ]))
.unwrap(),
Some([2; WORD_LENGTH])
);
assert_eq!(
- block_on(obf.guarded_write(
- (header_addr.clone(), Some([2; WORD_LENGTH])),
- vec![
+ block_on(
+ obf.guarded_write((header_addr.clone(), Some([2; WORD_LENGTH])), vec![
(header_addr.clone(), [4; WORD_LENGTH]),
(val_addr_3.clone(), [2; WORD_LENGTH]),
(val_addr_4.clone(), [2; WORD_LENGTH])
- ]
- ))
+ ])
+ )
.unwrap(),
Some([2; WORD_LENGTH])
);
diff --git a/src/findex.rs b/src/findex.rs
index a9116a32..950cb26e 100644
--- a/src/findex.rs
+++ b/src/findex.rs
@@ -263,49 +263,4 @@ mod tests {
res
);
}
-
- #[cfg(feature = "redis-mem")]
- fn get_redis_url() -> String {
- if let Ok(var_env) = std::env::var("REDIS_HOST") {
- format!("redis://{var_env}:6379")
- } else {
- "redis://localhost:6379".to_owned()
- }
- }
-
- #[tokio::test]
- #[cfg(feature = "redis-mem")]
- async fn test_redis_insert_search_delete_search() {
- use crate::RedisStore;
-
- let mut rng = ChaChaRng::from_entropy();
- let seed = Secret::random(&mut rng);
- const TEST_ADR_WORD_LENGTH: usize = 16;
- let memory = RedisStore::, TEST_ADR_WORD_LENGTH>::connect(
- &get_redis_url(),
- )
- .await
- .unwrap();
- let findex = Findex::new(seed, memory, dummy_encode::, dummy_decode);
- let bindings = HashMap::<&str, HashSet>::from_iter([
- (
- "cat",
- HashSet::from_iter([Value::from(1), Value::from(3), Value::from(5)]),
- ),
- (
- "dog",
- HashSet::from_iter([Value::from(0), Value::from(2), Value::from(4)]),
- ),
- ]);
- findex.insert(bindings.clone().into_iter()).await.unwrap(); // using block_on here causes a never ending execution
- let res = findex.search(bindings.keys().copied()).await.unwrap();
- assert_eq!(bindings, res);
-
- findex.delete(bindings.clone().into_iter()).await.unwrap();
- let res = findex.search(bindings.keys().copied()).await.unwrap();
- assert_eq!(
- HashMap::from_iter([("cat", HashSet::new()), ("dog", HashSet::new())]),
- res
- );
- }
}
diff --git a/src/lib.rs b/src/lib.rs
index b12f8a1e..e8ea7ef6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -20,10 +20,10 @@ pub use encoding::{Op, WORD_LENGTH};
pub use encoding::{dummy_decode, dummy_encode};
pub use error::Error;
pub use findex::Findex;
-#[cfg(feature = "redis-mem")]
-pub use memory::db_stores::redis_store::RedisStore;
#[cfg(feature = "bench")]
pub use memory::in_memory_store::InMemory;
+#[cfg(feature = "redis-mem")]
+pub use memory::redis_store::RedisStore;
pub use secret::Secret;
#[cfg(feature = "test-utils")]
pub use test::memory::{
diff --git a/src/memory/db_stores/mod.rs b/src/memory/db_stores/mod.rs
deleted file mode 100644
index 224592cc..00000000
--- a/src/memory/db_stores/mod.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-mod error;
-
-#[cfg(feature = "redis-mem")]
-pub(crate) mod redis_store;
diff --git a/src/memory/db_stores/error.rs b/src/memory/error.rs
similarity index 85%
rename from src/memory/db_stores/error.rs
rename to src/memory/error.rs
index 9685d7b2..4051d15d 100644
--- a/src/memory/db_stores/error.rs
+++ b/src/memory/error.rs
@@ -1,8 +1,6 @@
use core::fmt::Display;
use std::num::TryFromIntError;
-use cosmian_crypto_core::CryptoCoreError;
-
#[cfg(feature = "redis-mem")]
use super::redis_store::RedisStoreError;
use crate::{Address, error::Error as FindexCoreError};
@@ -17,7 +15,6 @@ pub(crate) enum DbStoreError {
#[cfg(feature = "redis-mem")]
Redis(RedisStoreError),
Findex(findex_core_error!()),
- CryptoCore(CryptoCoreError),
IntConversion(TryFromIntError),
Io(std::io::Error),
}
@@ -27,7 +24,6 @@ impl Display for DbStoreError {
match self {
#[cfg(feature = "redis-mem")]
Self::Redis(err) => write!(f, "redis: {err}"),
- Self::CryptoCore(err) => write!(f, "crypto_core: {err}"),
Self::Findex(err) => write!(f, "findex: {err}"),
Self::Io(err) => write!(f, "io: {err}"),
Self::IntConversion(err) => write!(f, "conversion: {err}"),
@@ -52,12 +48,6 @@ impl From for DbStoreError {
}
}
-impl From for DbStoreError {
- fn from(e: CryptoCoreError) -> Self {
- Self::CryptoCore(e)
- }
-}
-
impl From for DbStoreError {
fn from(e: findex_core_error!()) -> Self {
Self::Findex(e)
diff --git a/src/memory/mod.rs b/src/memory/mod.rs
index bfbffdd9..b8109067 100644
--- a/src/memory/mod.rs
+++ b/src/memory/mod.rs
@@ -1,5 +1,4 @@
-// pub mod in_memory_store;
-pub(crate) mod in_memory_store;
-
+pub mod error;
+pub mod in_memory_store;
#[cfg(feature = "redis-mem")]
-pub(crate) mod db_stores;
+pub mod redis_store;
diff --git a/src/memory/db_stores/redis_store.rs b/src/memory/redis_store.rs
similarity index 95%
rename from src/memory/db_stores/redis_store.rs
rename to src/memory/redis_store.rs
index 311a41a6..f1bf62aa 100644
--- a/src/memory/db_stores/redis_store.rs
+++ b/src/memory/redis_store.rs
@@ -1,4 +1,3 @@
-//! Redis implementation of the Findex backends.
use std::{
fmt::{self, Debug, Display},
hash::Hash,
@@ -6,7 +5,7 @@ use std::{
ops::Deref,
};
-use redis::{aio::ConnectionManager, AsyncCommands};
+use redis::{AsyncCommands, aio::ConnectionManager};
use crate::MemoryADT;
@@ -104,10 +103,10 @@ impl Display for RedisStoreError {
}
impl<
- Address: Send + Sync + Hash + Eq + Debug + Clone + Deref,
- const ADDRESS_LENGTH: usize,
- const WORD_LENGTH: usize,
- > MemoryADT for RedisStore
+ Address: Send + Sync + Hash + Eq + Debug + Clone + Deref,
+ const ADDRESS_LENGTH: usize,
+ const WORD_LENGTH: usize,
+> MemoryADT for RedisStore
{
type Address = Address;
type Error = RedisStoreError;
@@ -158,10 +157,10 @@ mod tests {
use super::*;
use crate::{
+ Address,
test::memory::{
test_guarded_write_concurrent, test_single_write_and_read, test_wrong_guard,
},
- Address,
};
pub(crate) fn get_redis_url() -> String {
diff --git a/src/ovec.rs b/src/ovec.rs
index 3e73722b..7b4ad0e9 100644
--- a/src/ovec.rs
+++ b/src/ovec.rs
@@ -18,7 +18,7 @@
use std::{fmt::Debug, hash::Hash, ops::Add};
-use crate::{adt::VectorADT, error::Error, MemoryADT};
+use crate::{MemoryADT, adt::VectorADT, error::Error};
/// Headers contain a counter of the number of values stored in the vector.
// TODO: header could store metadata (e.g. sparsity budget)
@@ -80,10 +80,10 @@ pub(crate) struct IVec<
}
impl<
- const WORD_LENGTH: usize,
- Address: Clone,
- Memory: Clone + MemoryADT,
- > Clone for IVec
+ const WORD_LENGTH: usize,
+ Address: Clone,
+ Memory: Clone + MemoryADT,
+> Clone for IVec
{
fn clone(&self) -> Self {
Self {
@@ -95,10 +95,10 @@ impl<
}
impl<
- const WORD_LENGTH: usize,
- Address: Hash + Eq + Debug + Clone + Add,
- Memory: Clone + MemoryADT,
- > IVec
+ const WORD_LENGTH: usize,
+ Address: Hash + Eq + Debug + Clone + Add,
+ Memory: Clone + MemoryADT,
+> IVec
{
/// (Lazily) instantiates a new vector at this address in this memory: no
/// value is written before the first push.
@@ -108,10 +108,10 @@ impl<
}
impl<
- const WORD_LENGTH: usize,
- Address: Send + Sync + Hash + Eq + Debug + Clone + Add,
- Memory: Send + Sync + Clone + MemoryADT,
- > VectorADT for IVec
+ const WORD_LENGTH: usize,
+ Address: Send + Sync + Hash + Eq + Debug + Clone + Add,
+ Memory: Send + Sync + Clone + MemoryADT,
+> VectorADT for IVec
where
Memory::Error: Send + Sync,
{
@@ -217,13 +217,13 @@ mod tests {
use rand_core::SeedableRng;
use crate::{
+ ADDRESS_LENGTH,
address::Address,
adt::tests::{test_vector_concurrent, test_vector_sequential},
encryption_layer::MemoryEncryptionLayer,
memory::in_memory_store::InMemory,
ovec::IVec,
secret::Secret,
- ADDRESS_LENGTH,
};
const WORD_LENGTH: usize = 16;
diff --git a/src/test/memory.rs b/src/test/memory.rs
index 0b57d05e..001e0cee 100644
--- a/src/test/memory.rs
+++ b/src/test/memory.rs
@@ -1,7 +1,7 @@
// ! This module defines tests any implementation of the MemoryADT interface
// must pass.
#[cfg(feature = "test-utils")]
-use rand::{rngs::StdRng, Rng, SeedableRng};
+use rand::{Rng, SeedableRng, rngs::StdRng};
#[cfg(feature = "test-utils")]
use crate::MemoryADT;
@@ -40,10 +40,10 @@ where
// Write the word to the address
let write_result = memory
- .guarded_write(
- (T::Address::from(random_address), None),
- vec![(T::Address::from(random_address), T::Word::from(random_word))],
- )
+ .guarded_write((T::Address::from(random_address), None), vec![(
+ T::Address::from(random_address),
+ T::Word::from(random_word),
+ )])
.await
.unwrap();
assert_eq!(write_result, None);
@@ -75,25 +75,19 @@ where
// Write something to a random address
memory
- .guarded_write(
- (T::Address::from(random_address), None),
- vec![(
- T::Address::from(random_address),
- T::Word::from(word_to_write),
- )],
- )
+ .guarded_write((T::Address::from(random_address), None), vec![(
+ T::Address::from(random_address),
+ T::Word::from(word_to_write),
+ )])
.await
.unwrap();
// Attempt conflicting write with wrong guard value
let conflict_result = memory
- .guarded_write(
- (T::Address::from(random_address), None),
- vec![(
- T::Address::from(random_address),
- T::Word::from(rng.gen::().to_be_bytes()),
- )],
- )
+ .guarded_write((T::Address::from(random_address), None), vec![(
+ T::Address::from(random_address),
+ T::Word::from(rng.gen::().to_be_bytes()),
+ )])
.await
.unwrap();
@@ -144,17 +138,13 @@ where
loop {
// Try to increment
let cur_cnt = mem
- .guarded_write(
- (a.into(), old_cnt.clone()),
- vec![(
- a.into(),
- (u128::from_be_bytes(
- old_cnt.clone().unwrap_or_default().into(),
- ) + 1)
- .to_be_bytes()
- .into(),
- )],
- )
+ .guarded_write((a.into(), old_cnt.clone()), vec![(
+ a.into(),
+ (u128::from_be_bytes(old_cnt.clone().unwrap_or_default().into())
+ + 1)
+ .to_be_bytes()
+ .into(),
+ )])
.await
.unwrap();
if cur_cnt == old_cnt {