mrcord77/rust_citadel
GitHub: mrcord77/rust_citadel
Stars: 1 | Forks: 0
# Citadel
Post-quantum hybrid encryption and key management server.
Citadel combines X25519 + ML-KEM-768 for key encapsulation and AES-256-GCM for data encryption, following NIST's hybrid approach for the post-quantum transition. Applications encrypt and decrypt data through a REST API. Citadel manages the keys — generation, rotation, revocation, access control, and audit logging.
**Status:** Working implementation. Unaudited. No production deployments. See [Security](#security) below.
## What It Does
Your Application Citadel Database
| | |
|-- POST /encrypt ------->| |
| |-- hybrid KEM (X25519+ML-KEM) |
| |-- derive AES-256 key (HKDF) |
| |-- encrypt with AES-256-GCM |
|<-- encrypted blob ------| |
| |
|-- store blob ------------------------------------------>|
Your application never touches raw key material. The encrypted blob is self-contained — it includes the wrapped key, algorithm identifiers, and ciphertext. Store it in any database. Decrypt by sending it back to Citadel with the same AAD and context.
## Architecture
citadel-envelope Hybrid encryption core (X25519 + ML-KEM-768 + AES-256-GCM)
citadel-keystore Key lifecycle management, 4-level hierarchy, threat-adaptive policies
citadel-api HTTP server, scoped API key auth, rate limiting, real-time dashboard
## Quick Start
### Docker (recommended)
# Clone
git clone https://github.com/mrcord77/rust_citadel.git
cd rust_citadel
# Set your admin API key
echo -n "your-secret-key" | sha256sum | cut -d' ' -f1
# Copy the hash
# Start
CITADEL_API_KEY_HASH= docker compose up -d
# Verify
curl http://localhost:3000/health
# {"status":"ok","version":"0.2.0"}
Dashboard: http://localhost:3000
### From Source
Requires Rust 1.75+.
cargo build --release -p citadel-api
CITADEL_API_KEY="your-secret-key" CITADEL_SEED_DEMO=true ./target/release/citadel-api
## Usage
### Python
import requests
api = "http://localhost:3000"
headers = {"Authorization": "Bearer your-secret-key"}
# Encrypt
r = requests.post(f"{api}/api/keys/{dek_id}/encrypt", headers=headers, json={
"plaintext": "sensitive data",
"aad": "record-001", # binds ciphertext to this record
"context": "patient-records" # domain separation
})
blob = r.json()
# Decrypt
r = requests.post(f"{api}/api/decrypt", headers=headers, json={
"blob": blob,
"aad": "record-001",
"context": "patient-records"
})
plaintext = r.json()["plaintext"]
See [citadel_example.py](citadel_example.py) for a complete working example with AAD binding, key rotation, and threat-aware application behavior.
### curl
# Status
curl http://localhost:3000/api/status -H "Authorization: Bearer $KEY"
# List keys
curl http://localhost:3000/api/keys -H "Authorization: Bearer $KEY"
# Encrypt
curl -X POST http://localhost:3000/api/keys/$DEK_ID/encrypt \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"plaintext":"hello","aad":"test","context":"demo"}'
## API Endpoints
| Endpoint | Method | Scope | Description |
|----------|--------|-------|-------------|
| `/health` | GET | — | Health check |
| `/api/status` | GET | read | Threat level, key counts |
| `/api/metrics` | GET | read | Security metrics |
| `/api/keys` | GET | read | List all keys |
| `/api/keys` | POST | manage | Generate new key |
| `/api/keys/:id` | GET | read | Get key details |
| `/api/keys/:id/activate` | POST | manage | Activate a pending key |
| `/api/keys/:id/rotate` | POST | manage | Rotate key (new version) |
| `/api/keys/:id/revoke` | POST | manage | Permanently revoke key |
| `/api/keys/:id/destroy` | POST | manage | Destroy key material |
| `/api/keys/:id/encrypt` | POST | encrypt | Encrypt data |
| `/api/decrypt` | POST | encrypt | Decrypt data |
| `/api/threat` | GET | read | Threat intelligence details |
| `/api/policies` | GET | read | Active key policies |
| `/api/auth/whoami` | GET | read | Current API key info |
| `/api/auth/keys` | GET | admin | List API keys |
| `/api/auth/keys` | POST | admin | Create API key |
| `/api/auth/keys/:id` | DELETE | admin | Revoke API key |
## Key Hierarchy
Root Key
└── Domain Key (per environment / business unit)
└── KEK — Key Encrypting Key (wraps DEKs)
└── DEK — Data Encrypting Key (encrypts application data)
Follows NIST SP 800-57. Each level contains the blast radius of a compromise — a leaked DEK doesn't expose other DEKs because the KEK is separate.
## API Key Scopes
| Scope | Permissions |
|-------|-------------|
| `read` | View keys, status, metrics, threat level |
| `encrypt` | Encrypt and decrypt data |
| `manage` | Create, rotate, revoke, destroy keys |
| `admin` | All of the above + manage API keys |
`admin` implies all other scopes. Principle of least privilege: give monitoring dashboards `read`, application services `read + encrypt`, admin tools `admin`.
## Adaptive Threat System
Citadel monitors security events and automatically adjusts key policies:
| Level | Trigger | Response |
|-------|---------|----------|
| LOW | Normal operations | Standard crypto-periods |
| GUARDED | Minor anomalies | Slightly tighter rotation |
| ELEVATED | Suspicious patterns | Compressed rotation schedules |
| HIGH | Active threat indicators | Forced rotation, reduced usage limits |
| CRITICAL | Under attack | Maximum restrictions |
Events that raise threat level: failed authentication, decryption failures, rapid access patterns, manual escalation. Score decays over time.
## Cryptography
| Component | Algorithm | Standard |
|-----------|-----------|----------|
| Key encapsulation (classical) | X25519 ECDH | RFC 7748 |
| Key encapsulation (post-quantum) | ML-KEM-768 | FIPS 203 |
| Data encryption | AES-256-GCM | NIST SP 800-38D |
| Key derivation | HKDF-SHA256 | NIST SP 800-56C |
Hybrid construction: both shared secrets are concatenated and fed through HKDF. Security holds if **either** X25519 or ML-KEM-768 remains secure.
### Wire Format
version[1] || suite_kem[1] || suite_aead[1] || flags[1] || kem_ct_len[2] ||
x25519_ephemeral_pk[32] || mlkem768_ct[1088] || nonce[12] || aead_ct[variable]
Self-describing, versioned, no negotiation (prevents downgrade attacks). See [SPEC.md](SPEC.md) for full specification.
### Security Properties
- **Constant-time comparison** — API key verification via `subtle` crate prevents timing attacks
- **Zeroization** — All shared secrets and AES keys wrapped in `Zeroizing`, zeroed on drop
- **Uniform errors** — Decryption failures return identical error messages (no decryption oracle)
- **Integrity-chained audit log** — SHA-256 hash chain detects log tampering
- **Rate limiting** — Per-IP token bucket with threat escalation on violations
## Security
**Citadel is unaudited software.**
The implementation uses NIST-standardized primitives via established Rust crates (`ml-kem`, `x25519-dalek`, `aes-gcm`, `hkdf`). It does not implement any cryptographic algorithms. The value is in correct composition, not novel math.
What has been done:
- Comprehensive test suite including known-answer tests
- Fuzz testing of wire format parser and full decryption path
- Timing analysis of encryption/decryption operations
- Uniform error handling to prevent decryption oracles
What has NOT been done:
- Independent security audit
- Formal verification
- FIPS validation
- Production deployment
**Do not use for sensitive data without independent review.** See [SECURITY.md](SECURITY.md) for vulnerability reporting.
## Compliance
Mapped against 34 NIST SP 800-57 controls: 26 satisfied, 7 partial, 1 gap. See [COMPLIANCE_MATRIX.md](COMPLIANCE_MATRIX.md) for the full mapping.
Relevant frameworks: NIST SP 800-57 (key management), CNSA 2.0 (PQC timeline), HIPAA (encryption at rest), SOC 2 (access controls and audit).
## Project Structure
rust_citadel/
├── citadel-envelope/ # Core hybrid encryption library
│ ├── src/
│ │ ├── envelope.rs # Encrypt/decrypt operations
│ │ ├── kem.rs # X25519 + ML-KEM-768 hybrid KEM
│ │ ├── kdf.rs # HKDF-SHA256 key derivation
│ │ ├── wire.rs # Wire format encode/decode
│ │ ├── aead.rs # AES-256-GCM wrapper
│ │ ├── aad.rs # Additional authenticated data
│ │ ├── error.rs # Uniform error types
│ │ └── sdk.rs # High-level API
│ ├── tests/ # KAT + roundtrip tests
│ └── fuzz/ # Fuzz targets
├── citadel-keystore/ # Key lifecycle management
│ └── src/
│ ├── keystore.rs # Key CRUD + state machine
│ ├── policy.rs # Crypto-period policies
│ ├── threat.rs # Adaptive threat intelligence
│ ├── storage.rs # File-based key storage
│ ├── audit.rs # Integrity-chained audit log
│ └── types.rs # Key types and states
├── citadel-api/ # HTTP server
│ └── src/
│ ├── main.rs # API routes, auth, rate limiting
│ └── dashboard.html # Real-time security dashboard
├── citadel_example.py # Python integration example
├── Backup-Citadel.ps1 # Backup/restore tooling
├── docker-compose.yml # Development deployment
├── docker-compose-production.yml # Production with TLS
├── SPEC.md # Wire format specification
├── THREAT_MODEL.md # Security goals and attacker model
├── COMPLIANCE_MATRIX.md # NIST 800-57 control mapping
└── CITADEL_OVERVIEW.md # Commercial overview
## Documentation
| Document | Audience |
|----------|----------|
| [SPEC.md](SPEC.md) | Wire format specification |
| [THREAT_MODEL.md](THREAT_MODEL.md) | Security goals and assumptions |
| [COMPLIANCE_MATRIX.md](COMPLIANCE_MATRIX.md) | NIST 800-57 compliance mapping |
| [CITADEL_OVERVIEW.md](CITADEL_OVERVIEW.md) | Commercial positioning |
| [SECURITY.md](SECURITY.md) | Vulnerability reporting |
| [API_FREEZE.md](API_FREEZE.md) | API stability guarantees |
| [DEPLOYMENT.md](DEPLOYMENT.md) | Production deployment guide |
| [QUICKSTART.md](QUICKSTART.md) | Getting started |
## License
This project is dual-licensed:
- **GNU Affero General Public License v3 (AGPL)** — for open source use
- **Commercial License** — for proprietary or commercial use
If you are using this software in a commercial environment or do not wish to comply with AGPL terms, you must obtain a commercial license.
See [COMMERCIAL_LICENSE.md](COMMERCIAL_LICENSE.md) for commercial terms.
The full text of the AGPL is provided in [AGPL-3.0.txt](AGPL-3.0.txt) and [COPYING](COPYING).
Contact: commit@reposignal.io
## Author
Andre Cordero — andre.cordero36@gmail.com
标签:通知系统