implement set_enc_key for builders

without.crypto
Niko 2 years ago
parent 9853db7823
commit 84674c20e2
  1. 3
      Cargo.toml
  2. 7
      src/backend/impl_lmdb/environment.rs
  3. 7
      src/backend/impl_safe/environment.rs
  4. 3
      src/backend/traits.rs
  5. 20
      src/env.rs
  6. 1
      src/manager.rs
  7. 16
      tests/env-lmdb.rs

@ -4,6 +4,7 @@ authors = [
"Nan Jiang <najiang@mozilla.com>",
"Myk Melez <myk@mykzilla.org>",
"Victor Porof <vporof@mozilla.com>",
"NikoPLP <info@parlepeuple.fr>"
]
categories = ["database"]
description = "A simple, humane, typed key-value storage solution, with encryption at rest"
@ -13,7 +14,7 @@ exclude = ["/tests/envs/*"]
homepage = "https://github.com/mozilla/rkv"
keywords = ["lmdb", "database", "storage"]
license = "Apache-2.0"
name = "rkv-lofire"
name = "rkv"
readme = "README.md"
repository = "https://github.com/nikoPLP/rkv"
version = "0.18.0"

@ -24,6 +24,8 @@ use crate::backend::traits::{
BackendRoCursorTransaction, BackendStat,
};
use crate::env::Key;
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub struct EnvironmentBuilderImpl {
builder: lmdb::EnvironmentBuilder,
@ -81,6 +83,11 @@ impl<'b> BackendEnvironmentBuilder<'b> for EnvironmentBuilderImpl {
self
}
fn set_enc_key(&mut self, key: Key) -> &mut Self {
self.builder.set_enc_key(key);
self
}
fn set_make_dir_if_needed(&mut self, make_dir_if_needed: bool) -> &mut Self {
self.make_dir_if_needed = make_dir_if_needed;
self

@ -25,6 +25,7 @@ use super::{
RoTransactionImpl, RwTransactionImpl, StatImpl,
};
use crate::backend::traits::{BackendEnvironment, BackendEnvironmentBuilder};
use crate::env::Key;
const DEFAULT_DB_FILENAME: &str = "data.safe.bin";
@ -75,6 +76,12 @@ impl<'b> BackendEnvironmentBuilder<'b> for EnvironmentBuilderImpl {
self
}
fn set_enc_key(&mut self, _key: Key) -> &mut Self {
// NOOP
warn!("set_enc_key is ignored by this storage backend.");
self
}
fn set_map_size(&mut self, map_size: usize) -> &mut Self {
self.map_size = Some(map_size);
self

@ -15,6 +15,7 @@ use std::{
use crate::{
backend::common::{DatabaseFlags, EnvironmentFlags, WriteFlags},
env::Key,
error::StoreError,
};
@ -81,6 +82,8 @@ pub trait BackendEnvironmentBuilder<'b>: Debug + Eq + PartialEq + Copy + Clone {
fn set_map_size(&mut self, size: usize) -> &mut Self;
fn set_enc_key(&mut self, key: Key) -> &mut Self;
fn set_make_dir_if_needed(&mut self, make_dir_if_needed: bool) -> &mut Self;
fn set_discard_if_corrupted(&mut self, discard_if_corrupted: bool) -> &mut Self;

@ -14,6 +14,8 @@ use std::{
path::{Path, PathBuf},
};
pub type Key = [u8; 32];
#[cfg(any(feature = "db-dup-sort", feature = "db-int-key"))]
use crate::backend::{BackendDatabaseFlags, DatabaseFlags};
use crate::{
@ -79,6 +81,24 @@ where
Rkv::from_builder(path, builder)
}
/// Return a new Rkv environment that supports the specified number of open databases.
pub fn with_encryption_key_and_mapsize<B>(
path: &Path,
key: Key,
size: usize,
) -> Result<Rkv<E>, StoreError>
where
B: BackendEnvironmentBuilder<'e, Environment = E>,
{
let mut builder = B::new();
builder.set_enc_key(key);
builder.set_map_size(size);
builder.set_max_dbs(DEFAULT_MAX_DBS);
// Future: set flags, maximum size, etc. here if necessary.
Rkv::from_builder(path, builder)
}
/// Return a new Rkv environment from the provided builder.
pub fn from_builder<B>(path: &Path, builder: B) -> Result<Rkv<E>, StoreError>
where

@ -190,6 +190,7 @@ impl Manager<SafeModeEnvironment> {
}
}
#[allow(unused_imports)]
#[cfg(test)]
mod tests {
use super::*;

@ -81,6 +81,22 @@ fn test_open() {
check_rkv(&k);
}
#[test]
fn test_open_with_encryption() {
let root = Builder::new()
.prefix("test_open")
.tempdir()
.expect("tempdir");
println!("Root path: {:?}", root.path());
fs::create_dir_all(root.path()).expect("dir created");
assert!(root.path().is_dir());
let key: [u8; 32] = [0; 32];
let k = Rkv::with_encryption_key_and_mapsize::<Lmdb>(root.path(), key, 2 * 1024 * 1024 * 1024)
.expect("new succeeded");
check_rkv(&k);
}
#[test]
fn test_open_from_builder() {
let root = Builder::new()

Loading…
Cancel
Save