...
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
[package]
|
||||
name = "herocrypto"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
redis = { version = "0.24", features = ["tokio-comp"] }
|
||||
thiserror = { workspace = true }
|
||||
libcrypto = { path = "../libcrypto" }
|
||||
libcryptoa = { path = "../libcryptoa" }
|
@@ -1,14 +1,45 @@
|
||||
pub fn add(left: u64, right: u64) -> u64 {
|
||||
left + right
|
||||
// In crates/herocrypto/src/lib.rs
|
||||
use redis::{Commands, RedisResult};
|
||||
use thiserror::Error;
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum Error {
|
||||
#[error("Redis connection error: {0}")]
|
||||
Redis(#[from] redis::RedisError),
|
||||
#[error("Asymmetric crypto error: {0}")]
|
||||
Asymmetric(#[from] libcryptoa::AsymmetricCryptoError),
|
||||
#[error("Key not found in database: {0}")]
|
||||
KeyNotFound(String),
|
||||
#[error("Command failed on server: {0}")]
|
||||
CommandError(String),
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
pub struct HeroCrypto {
|
||||
// e.g., using a connection manager from redis-rs
|
||||
client: redis::Client,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn it_works() {
|
||||
let result = add(2, 2);
|
||||
assert_eq!(result, 4);
|
||||
impl HeroCrypto {
|
||||
pub fn new(redis_url: &str) -> Result<Self, Error> {
|
||||
Ok(Self { client: redis::Client::open(redis_url)? })
|
||||
}
|
||||
}
|
||||
|
||||
// --- High-level functions to be implemented ---
|
||||
|
||||
/// Generates a new keypair and stores it in HeroDB under the given name.
|
||||
pub async fn generate_keypair(&self, name: &str) -> Result<(), Error> {
|
||||
let mut con = self.client.get_async_connection().await?;
|
||||
let (_pub, _priv): (String, String) = redis::cmd("AGE")
|
||||
.arg("KEYGEN")
|
||||
.arg(name)
|
||||
.query_async(&mut con)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Encrypts a message using a key stored in HeroDB.
|
||||
pub async fn encrypt_by_name(&self, key_name: &str, plaintext: &str) -> Result<String, Error> {
|
||||
// Implementation will call 'AGE ENCRYPTNAME ...'
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user