From 78c0fd7871d4f72cc5d8c1c4ee1506ce75d9fdb2 Mon Sep 17 00:00:00 2001 From: Lee Smet Date: Wed, 14 May 2025 11:08:37 +0200 Subject: [PATCH] Define the global KeySpace interface Signed-off-by: Lee Smet --- vault/src/error.rs | 25 ++++++++++++++++- vault/src/keyspace.rs | 50 ++++++++++++++++++++++++++++++++++ vault/src/keyspace/fallback.rs | 2 ++ vault/src/keyspace/wasm.rs | 2 ++ vault/src/lib.rs | 1 + 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 vault/src/keyspace.rs create mode 100644 vault/src/keyspace/fallback.rs create mode 100644 vault/src/keyspace/wasm.rs diff --git a/vault/src/error.rs b/vault/src/error.rs index 24311b5..56df3f5 100644 --- a/vault/src/error.rs +++ b/vault/src/error.rs @@ -1,3 +1,20 @@ +#[derive(Debug)] +/// Errors encountered while using the vault +pub enum Error { + /// An error during cryptographic operations + Crypto(CryptoError), +} + +impl core::fmt::Display for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Error::Crypto(e) => f.write_fmt(format_args!("crypto: {e}")), + } + } +} + +impl core::error::Error for Error {} + #[derive(Debug)] /// Errors generated by the vault or keys. /// @@ -18,7 +35,7 @@ pub enum CryptoError { } impl core::fmt::Display for CryptoError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { CryptoError::InvalidKeySize => f.write_str("provided key is not the correct size"), CryptoError::EncryptionFailed => f.write_str("encryption failure"), @@ -33,3 +50,9 @@ impl core::fmt::Display for CryptoError { } impl core::error::Error for CryptoError {} + +impl From for Error { + fn from(value: CryptoError) -> Self { + Self::Crypto(value) + } +} diff --git a/vault/src/keyspace.rs b/vault/src/keyspace.rs new file mode 100644 index 0000000..d121a55 --- /dev/null +++ b/vault/src/keyspace.rs @@ -0,0 +1,50 @@ +#[cfg(target_arch = "wasm32")] +mod wasm; + +#[cfg(not(target_arch = "wasm32"))] +mod fallback; + +#[cfg(target_arch = "wasm32")] +use wasm::KeySpace as KS; + +#[cfg(not(target_arch = "wasm32"))] +use fallback::KeySpace as KS; + +use crate::{error::Error, key::Key}; + +/// A keyspace represents a group of stored cryptographic keys. The storage is encrypted, a +/// password must be provided when opening the KeySpace to decrypt the keys. +pub struct KeySpace { + store: KS, +} + +/// Wasm32 constructor +#[cfg(target_arch = "wasm32")] +impl KeySpace {} + +/// Non-wasm constructor +#[cfg(not(target_arch = "wasm32"))] +impl KeySpace {} + +/// Exposed methods, platform independant +impl KeySpace { + /// Get a [`Key`] previously stored under the provided name. + async fn get(&self, key: &str) -> Result, Error> { + todo!(); + } + + /// Store a [`Key`] under the provided name. + async fn set(&self, key: &str, value: Key) -> Result<(), Error> { + todo!(); + } + + /// Delete the [`Key`] stored under the provided name. + async fn delete(&self, key: &str) -> Result<(), Error> { + todo!(); + } + + /// Iterate over all stored [`keys`](Key) in the KeySpace + async fn iter(&self) -> Result, Error> { + todo!() + } +} diff --git a/vault/src/keyspace/fallback.rs b/vault/src/keyspace/fallback.rs new file mode 100644 index 0000000..851097f --- /dev/null +++ b/vault/src/keyspace/fallback.rs @@ -0,0 +1,2 @@ +/// A KeySpace using the filesystem as storage +pub mod KeySpace {} diff --git a/vault/src/keyspace/wasm.rs b/vault/src/keyspace/wasm.rs new file mode 100644 index 0000000..cc9ad8e --- /dev/null +++ b/vault/src/keyspace/wasm.rs @@ -0,0 +1,2 @@ +/// KeySpace represents an IndexDB keyspace +pub struct KeySpace {} diff --git a/vault/src/lib.rs b/vault/src/lib.rs index 7183a6f..b0e8ef9 100644 --- a/vault/src/lib.rs +++ b/vault/src/lib.rs @@ -1,3 +1,4 @@ pub mod error; pub mod key; +pub mod keyspace; pub mod kvs;