Compare commits
2 Commits
tantivy
...
d931770e90
Author | SHA1 | Date | |
---|---|---|---|
|
d931770e90 | ||
|
a87ec4dbb5 |
83
README.md
Normal file
83
README.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# HeroDB
|
||||||
|
|
||||||
|
Redis-compatible database server with encryption and AGE cryptographic operations.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Redis protocol compatibility
|
||||||
|
- String, hash, and list data types
|
||||||
|
- Key expiration and persistence
|
||||||
|
- Database encryption with ChaCha20-Poly1305
|
||||||
|
- AGE encryption/decryption operations
|
||||||
|
- Digital signatures with Ed25519
|
||||||
|
- Persistent storage using redb
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./target/release/herodb --dir /path/to/db --port 6379
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
- `--dir`: Database directory (required)
|
||||||
|
- `--port`: Server port (default: 6379)
|
||||||
|
- `--debug`: Enable debug logging
|
||||||
|
- `--encrypt`: Enable database encryption
|
||||||
|
- `--encryption-key`: Master encryption key for encrypted databases
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Basic server
|
||||||
|
herodb --dir ./data
|
||||||
|
|
||||||
|
# Encrypted database
|
||||||
|
herodb --dir ./data --encrypt --encryption-key "your-key"
|
||||||
|
|
||||||
|
# Custom port with debug
|
||||||
|
herodb --dir ./data --port 7000 --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
## Redis Commands
|
||||||
|
|
||||||
|
Supports standard Redis commands including:
|
||||||
|
|
||||||
|
- **Strings**: GET, SET, MGET, MSET, INCR, DEL
|
||||||
|
- **Hashes**: HGET, HSET, HGETALL, HDEL, HEXISTS
|
||||||
|
- **Lists**: LPUSH, RPUSH, LPOP, RPOP, LLEN, LRANGE
|
||||||
|
- **Keys**: KEYS, SCAN, EXISTS, EXPIRE, TTL
|
||||||
|
- **Transactions**: MULTI, EXEC, DISCARD
|
||||||
|
- **Server**: PING, ECHO, INFO, CONFIG
|
||||||
|
|
||||||
|
## AGE Commands
|
||||||
|
|
||||||
|
Extended commands for cryptographic operations:
|
||||||
|
|
||||||
|
- **Key Generation**: `AGE GENENC`, `AGE GENSIGN`, `AGE KEYGEN`
|
||||||
|
- **Encryption**: `AGE ENCRYPT`, `AGE DECRYPT`, `AGE ENCRYPTNAME`
|
||||||
|
- **Signing**: `AGE SIGN`, `AGE VERIFY`, `AGE SIGNNAME`
|
||||||
|
- **Management**: `AGE LIST`
|
||||||
|
|
||||||
|
## Client Usage
|
||||||
|
|
||||||
|
Connect using any Redis client:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
redis-cli -p 6379 SET key value
|
||||||
|
redis-cli -p 6379 GET key
|
||||||
|
redis-cli -p 6379 AGE GENENC
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
- **Storage**: redb embedded database
|
||||||
|
- **Protocol**: Redis RESP protocol over TCP
|
||||||
|
- **Encryption**: ChaCha20-Poly1305 for data, AGE for operations
|
||||||
|
- **Concurrency**: Tokio async runtime
|
@@ -1,8 +1,8 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "herodb"
|
name = "herodb"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
authors = ["Pin Fang <fpfangpin@hotmail.com>"]
|
authors = ["ThreeFold Tech"]
|
||||||
edition = "2021"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.59"
|
anyhow = "1.0.59"
|
||||||
|
@@ -500,11 +500,11 @@ async fn test_07_age_stateless_suite() {
|
|||||||
let mut s = connect(port).await;
|
let mut s = connect(port).await;
|
||||||
|
|
||||||
// GENENC -> [recipient, identity]
|
// GENENC -> [recipient, identity]
|
||||||
let gen = send_cmd(&mut s, &["AGE", "GENENC"]).await;
|
let gen_result = send_cmd(&mut s, &["AGE", "GENENC"]).await;
|
||||||
assert!(
|
assert!(
|
||||||
gen.starts_with("*2\r\n$"),
|
gen_result.starts_with("*2\r\n$"),
|
||||||
"AGE GENENC should return array [recipient, identity], got:\n{}",
|
"AGE GENENC should return array [recipient, identity], got:\n{}",
|
||||||
gen
|
gen_result
|
||||||
);
|
);
|
||||||
|
|
||||||
// Parse simple RESP array of two bulk strings to extract keys
|
// Parse simple RESP array of two bulk strings to extract keys
|
||||||
@@ -519,7 +519,7 @@ async fn test_07_age_stateless_suite() {
|
|||||||
let ident = lines.next().unwrap_or("").to_string();
|
let ident = lines.next().unwrap_or("").to_string();
|
||||||
(recip, ident)
|
(recip, ident)
|
||||||
}
|
}
|
||||||
let (recipient, identity) = parse_two_bulk_array(&gen);
|
let (recipient, identity) = parse_two_bulk_array(&gen_result);
|
||||||
assert!(
|
assert!(
|
||||||
recipient.starts_with("age1") && identity.starts_with("AGE-SECRET-KEY-1"),
|
recipient.starts_with("age1") && identity.starts_with("AGE-SECRET-KEY-1"),
|
||||||
"Unexpected AGE key formats.\nrecipient: {}\nidentity: {}",
|
"Unexpected AGE key formats.\nrecipient: {}\nidentity: {}",
|
||||||
|
Reference in New Issue
Block a user