Offline Post-Quantum Hybrid Cryptographic Vault for Cross-Platform Data Sovereignty
Ombracrypt is a local-first, zero-escrow post-quantum cryptographic vault engineered to protect files against contemporary interception and "Harvest Now, Decrypt Later" (HNDL) attacks. Operating offline with zero telemetry or key custody, it combines hybrid ML-KEM with X25519 and bounded in-memory AEAD streaming, avoiding plaintext staging. Decoupled vault payloads (.obv), offline private keys (.obk), and public sealing keys (.obp) support user-controlled data sovereignty for cold storage and recipient-based sharing.
| Track | Version | Status & Deployment Guidance |
|---|---|---|
| Legacy | v1 |
Deprecated architecture. Existing binary installers remain accessible on GitHub Releases for historical access and data recovery. Not recommended for new deployments. |
| Beta | v2 |
Current architecture under active development on main. The v2.0.0-beta architecture is now available with standalone binary packages under Releases for wider community testing and security auditing following internal validation. |
Ombracrypt does not operate a centralized key-management service, remote recovery infrastructure, or third-party escrow mechanism. Cryptographic operations are performed locally, and users retain sole responsibility for managing, protecting, and backing up their private key material and recovery artifacts.
Ombracrypt maintains no administrative backdoor, recovery phrase, or password reset mechanism. Loss or corruption of the required .obk private key file or Master Password results in permanent, irreversible loss of access to the encrypted vault. Users are responsible for maintaining secure, independent backups of their cryptographic artifacts on isolated physical media.
- Dual-Profile Hybrid KEM: Combines post-quantum lattice primitives with classical Diffie-Hellman (RFC 7748 X25519) to resist quantum cryptanalysis while retaining classical computational hardness.
- In-Memory Encryption Streaming: Streams directory trees directly through bounded in-process buffers into an authenticated encryption pipeline in chunks of up to 1 MiB, eliminating unencrypted intermediate TAR archives on disk during encryption.
- Designated Buffer Zeroization: Designated plaintext buffers are wrapped in zeroizing containers and cleared from memory immediately following cipher operations.
- Cryptographic Artifact Separation (
.obv/.obk/.obp): Encrypted vaults (.obv) are mathematically decoupled from private keys (.obk). Reusable public sealing keys (.obp) enable one-way vault encryption without exposing private decapsulation keys. - Interactive Duress Response: An optional deception passcode triggers an in-place CSPRNG overwrite attempt against the target
.obkprivate key file on disk, enforcingst_nlink > 1rejection and returning a generic authentication failure message. - Defensive Filesystem Architecture: Enforces pre-flight storage allocation checks, canonical path collision guards, advisory sentinel file locks, best-effort transactional rollback, and defensive TAR parsing limits.
- Offline & Network-Independent: Operates without network dependencies, external APIs, cloud accounts, or diagnostic telemetry beacons.
Downloadable desktop packages are available on GitHub Releases:
| Operating System | Package Formats | Architecture & Distribution |
|---|---|---|
| Linux | .deb, .AppImage, .rpm |
x86_64 (Debian, Ubuntu, Linux Mint, Fedora, RHEL, Arch) |
| Windows | .msi, .exe |
x86_64 (Windows 10, Windows 11) |
| macOS | .dmg |
Apple Silicon (ARM64, macOS 12+) |
For setup instructions and usage workflows, refer to the Quickstart Guide.
[ Input Folder ] ───(Encrypt)───> [ Vault Payload: .obv ]
[ Private Key: .obk ] <── Keep Offline & Protected
[ Public Key: .obp ] <── Shareable for Sealing
.obv(Encrypted Vault): The authenticated, encrypted payload containing the streaming archive, chunk-level authentication tags, metadata preamble, and KEM ciphertext. Suitable for transit or storage on untrusted media..obk(Private Key File): The private decapsulation key file required to unlock the vault. Must be stored securely on isolated offline media. Possession of the.obkfile alone is insufficient to decrypt a vault without the Master Password, but the file must still be protected against unauthorized physical and digital access..obp(Public Sealing Key): The public encapsulation key file. Can be shared with automated backup agents or collaborators to encrypt vaults without granting them the ability to decrypt existing archives.
The .obv header is not encrypted. It exposes the following operational parameters in cleartext:
| Header Field | Size | Description |
|---|---|---|
| Format Magic & Version | 5 bytes | File format identifier (OMBV\x02) |
| Cipher Identifier | 1 byte | Symmetric algorithm (1 = XChaCha20-Poly1305, 2 = AES-256-GCM) |
| KEM Profile Identifier | 1 byte | Key encapsulation profile (1 = X-Wing, 2 = Cypherpunk) |
| Argon2id Parameters | 12 bytes | Little-endian u32 triple: memory cost, pass count, parallelism lanes |
| Source Content Size | 8 bytes | Little-endian u64: exact aggregate uncompressed content bytes across all source files (excluding TAR headers, directory records, and padding) |
| Salt | 16 bytes | Cryptographically secure random salt used for Argon2id and HKDF-Extract |
| Nonce Length | 1 byte | Byte length of the base initialization vector (24 for XChaCha20, 12 for AES-GCM) |
| Base Nonce | 12 or 24 bytes | Cryptographically secure random base initialization vector |
| KEM Ciphertext Length | 2 bytes | Little-endian u16: size of the encapsulated KEM payload |
| KEM Ciphertext | 1,120 or 1,600 bytes | Raw encapsulated post-quantum hybrid ciphertext |
Although these fields are not confidential, their integrity is cryptographically protected: the entire serialized header is hashed using SHA-256, and its 32-byte digest is bound into the authenticated associated data (AAD) of every encrypted payload chunk. Any modification to the cleartext header causes authentication failure when the affected chunk is validated during extraction.
The vault's overall file size and chunk framing reveal the approximate total size of the protected payload including archive overhead. Vault filenames may also disclose contextual information if source folder names are not sanitized prior to storage.
Ombracrypt uses a layered cryptographic construction combining memory-hard password derivation, post-quantum hybrid key encapsulation, and Bounded-memory symmetric streaming.
Master Password + 16-byte Salt Recipient Public Key (.obp)
│ │
▼ ▼
Argon2id (64 MiB, 3 T, 4 p) Hybrid KEM Encapsulation
│ (ML-KEM + X25519)
▼ │
Derived Key (32 bytes) ▼
│ KEM Shared Secret (32 bytes)
│ │
└───────────────────┬─────────────────────┘
│
▼
IKM = Derived Key ∥ KEM Shared Secret (64 bytes)
│
▼
HKDF-Extract(Salt, IKM) using SHA-256
│
▼
HKDF-Expand (Info: "OMBRACRYPT-V2-MASTER-KEY")
│
▼
Master Symmetric Key (32 bytes)
Ombracrypt implements two hybrid key encapsulation profiles:
| Profile Name | Specification Reference | Cryptographic Primitives | Ciphertext Wire Size | Private Key Structure (.obk) |
|---|---|---|---|---|
| Profile 1: X-Wing | IETF draft-connolly-cfrg-xwing-kem-11 | NIST FIPS 203 ML-KEM-768 + RFC 7748 X25519 | 1,120 bytes | 86 bytes (32-byte canonical seed + duress block) |
| Profile 2: Cypherpunk | Ombracrypt Custom Non-Standard Profile | NIST FIPS 203 ML-KEM-1024 + RFC 7748 X25519 | 1,600 bytes | 3,254 bytes (Expanded key material + duress block) |
Profile 1 implements the X-Wing construction defined in IETF Internet-Draft draft-connolly-cfrg-xwing-kem-11 (work in progress):
-
Key Derivation: A 32-byte seed expands via SHAKE256 into 96 bytes. The first 64 bytes seed deterministic key generation for ML-KEM-768 (
$d \parallel z$ ), while the final 32 bytes form the scalar for X25519. -
On-the-Fly Expansion: Private keys (
.obk) store the 32-byte seed directly. Key expansion occurs in volatile memory upon unlock; expanded key material is zeroized immediately after decapsulation. -
Combiner: Shared secret synthesis strictly follows the draft concatenation formula using the canonical 6-byte domain separator
5c 2e 2f 2f 5e 5c(ASCII\.//^\):
A custom hybrid profile engineered for environments seeking Category 5 post-quantum security parameters:
- Primitives: Combines NIST FIPS 203 ML-KEM-1024 with classical RFC 7748 X25519 using the isolated 6-byte domain separator
OMBMX2. - Standardization Notice: Profile 2 is a custom Ombracrypt design. While ML-KEM-1024 uses the NIST Category 5 parameter set and X25519 follows RFC 7748, the hybrid composition itself is not an independently standardized NIST or IETF profile.
ML-KEM encapsulation and decapsulation operations are executed by the fips203 crate, a pure-Rust, #![no_std] implementation of the finalized NIST FIPS 203 standard. The crate documents source-level constant-time behavior with the documented exception of the public parameter
-
Argon2id Memory-Hard KDF: User passphrases pass through Argon2id configured with explicit parameters:
- Memory Cost (
$m$ ):$65{,}536\text{ KiB}$ ($64\text{ MiB}$ ) - Time Cost (
$t$ ):$3\text{ passes}$ - Parallelism (
$p$ ):$4\text{ lanes}$ - Salt: 16 cryptographically secure random bytes generated per vault operation.
- Memory Cost (
-
RFC 5869 HKDF-SHA256 Master Key Expansion: The 32-byte Argon2id output and the 32-byte KEM hybrid shared secret concatenate into a 64-byte input keying material (
$\text{IKM}$ ). HKDF-SHA256 expands this input using the vault header's 16-byte salt and domain contextOMBRACRYPT-V2-MASTER-KEYinto a uniform 256-bit symmetric Master Key:
- In-Memory Streaming: Archive streams pass through bounded in-process buffers into an authenticated cipher pipeline. Plaintext buffers are wrapped in zeroizing containers and cleared immediately following cipher operations. This zeroization applies to designated internal buffers and does not guarantee protection against operating-system memory paging, crash dumps, or physical RAM imaging.
-
Symmetric Ciphers:
- XChaCha20-Poly1305: 256-bit key with an extended 192-bit (24-byte) random base nonce.
- AES-256-GCM: 256-bit key with a 96-bit (12-byte) random base nonce.
- Chunk Framing: Data is encrypted in discrete chunks of up to 1 MiB. The final chunk in a stream may be smaller.
-
Per-Chunk Nonce Derivation: To prevent nonce reuse across multi-gigabyte streams, each chunk uses a unique nonce derived by XORing a 64-bit little-endian chunk counter (
$i$ ) into the final 8 bytes of the base nonce:
-
Header-Bound Associated Data (AAD): The serialized cleartext header is hashed using SHA-256 to produce a 32-byte digest. For each chunk (
$i$ ), this digest is combined with an 8-byte chunk index and a 1-byte finalization flag to construct a 41-byte AAD payload:
This cryptographically binds the cleartext header and chunk sequence to every ciphertext block. Any modification to the cleartext header causes authentication failure when the affected chunk is validated during extraction.
Ombracrypt includes an optional defensive countermeasure for physical coercion scenarios:
-
The Phantom Block: When generating a keypair, an optional Deception Passcode derives a 32-byte block via Argon2id using an independent salt, which is stored in the
.obkfile. If no passcode is configured, 32 bytes of CSPRNG noise are written. - Duress Verification: During decryption, the entered passphrase is verified in constant time against the Phantom Block.
-
In-Place Overwrite Attempt: If the Deception Passcode matches:
- The target
.obkfile is checked to ensure it is a regular file within valid bounds ($64\text{ B} \le \text{size} \le 8{,}192\text{ B}$ ) and not a symlink. - On Unix, the operation rejects targets with multiple hard links (
st_nlink > 1) and verifies matching device (st_dev) and inode (st_ino) identity between the inspected path and opened file descriptor. - The file is overwritten in place with CSPRNG noise and flushed via
sync_all(). - The application halts and returns a standard decryption failure message:
Decryption Failed! Data corruption or mismatched cryptographic key.
- The target
-
Operational Boundaries & Limitations: Entering the duress passcode attempts to overwrite the selected local
.obkfile. Data recovery may still be possible from separate offline backups, but the targeted file should be treated as destroyed. In-place overwriting does not guarantee physical erasure on NAND flash storage subject to controller wear-leveling, filesystem snapshots, or copy-on-write filesystems (Btrfs, ZFS, APFS).
Writing and extracting archives on shared or untrusted storage introduces race conditions and namespace collisions. Ombracrypt addresses these through defensive filesystem guards implemented in src-tauri/src/fs_guard.rs.
- Restricted Staging Artifacts: Staged files use a strict 54-byte namespace (
.ombracrypt_part_<32hex>.part). Private key staging files enforce strict0600(owner read/write) permissions on Unix. Extraction directories use a strict 50-byte namespace (.ombracrypt_stage_<32hex>) with0700(owner read/write/traverse) permissions on Unix. Public keys (.obp) and vault archives (.obv) inherit standard system umask permissions. - Sentinel Locking: Active extraction staging directories contain an exclusively locked
.active.lockfile descriptor. - Post-Lock File-Identity Validation: Background cleaners attempting to sweep abandoned directories verify the locked file handle against the filesystem before unlinking. On Unix, the cleaner verifies
st_nlink > 0and checks matchingst_devandst_ino. On Windows, the cleaner inspectsBY_HANDLE_FILE_INFORMATIONviaGetFileInformationByHandleto confirm volume serial number and file index matching, preventing stale-handle deletion races. - Process-Local Registry: A thread-safe global registry tracks active staging paths within the running process, preventing internal worker threads from cleaning files currently being written.
Ombracrypt implements two distinct publication pathways depending on whether the artifact is a file or a directory:
- File Publication (
CommitRollbackGuard::commit_file): Staged files (.obv,.obk,.obp) promote to final destinations via atomic hard links on supported filesystems (ext4, NTFS, APFS, XFS, Btrfs, ZFS), followed by unlinking the staged.partentry. If hard-linking fails for reasons other than an existing target (such as on filesystems without hard-link support like FAT32 and exFAT), it falls back to native atomic no-replace operations. - Directory Publication (
atomic_publish_dir_noreplace): Successfully decrypted directories promote from staging to destination directly via platform-native atomic no-replace syscalls:- Linux:
libc::renameat2withRENAME_NOREPLACE - macOS:
libc::renamex_npwithRENAME_EXCL - Windows:
MoveFileExWwithoutMOVEFILE_REPLACE_EXISTINGDirectories are never published through hard links.
- Linux:
- Fail-Closed Guarantees: If the target directory or file already exists—or is a dangling symlink—publication fails closed with an explicit error, leaving existing user files untouched. If the underlying filesystem lacks support for atomic no-replace operations, the operation aborts to prevent silent data clobbering.
Staging operations for multi-file commits (such as .obv, .obk, and .obp creation) are tracked by CommitRollbackGuard. If publication of a subsequent artifact fails, the transaction guard attempts to remove artifacts already committed during the operation. This rollback is not crash-atomic across multiple filesystem entries. Unexpected process termination, power loss, kernel failure, or filesystem errors may leave partially published artifacts behind.
Untrusted TAR archives inside .obv containers pass through defensive boundary checks during extraction:
-
Path Traversal Prevention: Rejects paths containing parent directories (
..), absolute prefixes (/), or Windows drive letters. - Disallowed Entry Types: Rejects non-regular filesystem objects (symlinks, hard links, FIFOs, sockets, character/block devices). Only regular files and directories are unpacked.
-
Anti-Bomb Limits: Enforces a maximum recursion depth of
$\le 64$ levels, relative path length of$\le 512$ bytes, component length of$\le 255$ bytes, and a total entry cap of$50{,}000$ items. Conflicting duplicate entry paths trigger immediate extraction termination. -
Permission Sanitization: Disables archive permission preservation and extended attributes. On Unix, special permission bits (setuid, setgid, sticky /
07000) are stripped.
- Post-Quantum Data Confidentiality: Protecting static archives on cloud storage or untrusted media against future cryptanalysis by quantum computers.
- Cryptographic Agility: Supporting both XChaCha20-Poly1305 and AES-256-GCM symmetric streaming alongside standard (X-Wing) and high-security (Cypherpunk) KEM profiles.
- Artifact Decoupling: Enabling workflows where vault data (
.obv) and private keys (.obk) reside on isolated media. - Archive Safety: Defending host filesystems against TAR path-traversal attacks, symlink hijacking, and archive bomb denial-of-service during extraction.
- Interactive Coercion Response: Providing a mechanism to destroy private key material in place when forced to enter credentials.
- Compromised Host Operating Systems: Cannot protect against active kernel rootkits, memory scrapers, keyloggers, or compromised display servers on the host machine.
- Zero-Escrow Recovery: There are no backdoors, recovery keys, or escrow bypasses. A lost Master Password or lost
.obkfile renders data permanently unrecoverable. - Offline Phantom Block Analysis: The Duress Trapdoor is an interactive countermeasure. An adversary who clones the
.obkfile prior to the interaction can bypass the in-place overwrite. - Flash Storage Wear-Leveling Residue: Overwriting an
.obkfile flushes CSPRNG noise to the filesystem, but SSD controllers using dynamic wear-leveling may retain latent physical flash blocks until trimmed or garbage-collected. - Decryption Staging Residue: Encryption streams directly from memory without writing temporary TAR archives to disk. Decryption extracts validated plaintext files into a restricted local staging folder before atomic publication. A crash or power loss during extraction can leave partial plaintext files in that staging folder until cleared by the user.
- Linux Extraction Filesystem Compatibility: Final extraction requires atomic no-replace directory publication. Some Linux mounts, notably eCryptfs and NTFS-3G/FUSE, may reject
RENAME_NOREPLACE(EINVAL). Use a compatible destination filesystem such as ext4 or the tested native exFAT driver.
The cryptographic implementation and filesystem safety invariants of the Rust backend engine are validated through automated regression test suites executed across Ubuntu 22.04, macOS, and Windows runners via GitHub Actions:
cd src-tauri
cargo test --releaseAt the latest audited commit, the test suite reported 53 passing tests on Ubuntu, 53 on macOS, and 49 on Windows (platform-gated tests account for the variance).
- X-Wing Independent Reference KAT (
test_sprint10_xwing_independent_reference_kat): Byte-exact verification against independent Known-Answer Test fixtures generated with Cloudflare CIRCL v1.6.5, validating public key encoding (1,216 bytes), ciphertext layout (1,120 bytes), ephemeral X25519 scalar multiplication, and decapsulated shared secret matching. - IETF Combiner KAT (
test_sprint9_xwing_combiner_specification_kat): Validates the SHA3-256 combiner against the static literal test vector using the5c 2e 2f 2f 5e 5cdomain separator. - NIST FIPS 202 & RFC 7748 KATs (
test_sprint6_nist_fips202_and_rfc7748_official_kat_vectors): Asserts SHA3-256, SHAKE256, and X25519 Diffie-Hellman operations against official standards vectors. - Implicit Rejection Verification: Asserts that decapsulating corrupted ML-KEM ciphertexts triggers implicit rejection, returning an alternate pseudorandom key rather than failing noisily.
- Filesystem Race & Concurrency Tests: Validates multi-threaded contention using
Arc<Barrier>across simultaneous file and directory publishers (atomic_publish_noreplaceandatomic_publish_dir_noreplace), asserting that winning publishers commit atomically while losers fail closed without clobbering data. - Sentinel & Stale FD Validation: Tests active locked directory protection, stale sentinel reclamation, and post-lock file-identity verification (
st_nlink == 0on Unix andBY_HANDLE_FILE_INFORMATIONindex validation on Windows).
Audit Notice: Automated regression tests and Known-Answer Tests confirm specification conformance and internal implementation consistency, but do not substitute for an independent third-party security audit. CI runs validate the native Rust backend engine; they do not perform complete frontend packaging or installer compilation.
- Git
- Node.js (v18 or higher)
- Rust & Cargo (latest stable toolchain)
- Linux (Debian / Ubuntu / Linux Mint):
sudo apt-get update sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential curl wget file \ libssl-dev libgtk-3-dev libayatana-appindicator3-dev \ librsvg2-dev libxdo-dev - macOS: Xcode Command Line Tools:
xcode-select --install
- Windows: Visual Studio C++ Build Tools with the Desktop development with C++ workload.
# 1. Clone the repository
git clone https://github.com/ABiswasDev/Ombracrypt.git
cd Ombracrypt
# 2. Install reproducible frontend dependencies
npm ci
# 3. Launch application in desktop development mode
npm run tauri dev
# 4. Compile optimized standalone installer bundles
npm run tauri buildCompiled desktop bundles (.deb, .AppImage, .rpm, .msi, .exe, .dmg) are output to src-tauri/target/release/bundle/.
ombracrypt/
├── .github/
│ └── workflows/
│ ├── ci.yml # Multi-platform CI backend regression suite
│ └── release.yml # Multi-platform release bundle packaging
├── docs/
│ └── QUICKSTART.md # User onboarding & key generation guide
├── images/ # Application captures and schematics
├── src/ # Frontend Presentation Layer (Tauri WebView)
│ ├── assets/ # Static UI assets and icons
│ ├── index.html # Fixed-geometry workspace layout & controls
│ ├── main.js # IPC event dispatchers, progress telemetry
│ └── styles.css # Ombraveil dark UI styling & typography
├── src-tauri/ # Native Rust Core Engine
│ ├── build.rs # Tauri native build script
│ ├── Cargo.lock # Locked Rust dependency tree
│ ├── Cargo.toml # Manifest (fips203, x25519-dalek, sha3, argon2)
│ ├── tauri.conf.json # Fixed 650x900 window geometry & app metadata
│ ├── capabilities/
│ │ └── default.json # Desktop security policy & IPC permissions
│ ├── icons/ # Desktop application icon set
│ ├── tests/
│ │ └── fixtures/
│ │ └── xwing_revision11/ # CIRCL v1.6.5 Known-Answer Test fixtures
│ └── src/
│ ├── main.rs # Desktop application entry point
│ ├── lib.rs # Tauri command handlers & application state
│ ├── crypto.rs # Hybrid KEM (X-Wing & Cypherpunk), Argon2id, HKDF
│ ├── fs_guard.rs # Staging namespaces, sentinel locking, atomic commit
│ ├── pipeline.rs # Streaming encryption & decryption controllers
│ ├── stream.rs # In-memory chunked AEAD readers/writers & TAR guards
│ ├── deception.rs # Duress key scrambling & metadata validation
│ └── tests.rs # Multi-platform regression & KAT test suite
├── tools/
│ └── xwing-fixture-generator/ # Go / CIRCL reference KAT generator
├── package-lock.json # Locked npm dependency tree
├── package.json # Node workspace & build scripts
├── SECURITY.md # Vulnerability disclosure policy
└── LICENSE # Cryptographic Autonomy License 1.0
- Abhishek Biswas – Lead Architect & Maintainer – @ABiswasDev
- Cryptographic Autonomy License 1.0 (CAL-1.0): Ombracrypt is open-source software licensed under the Cryptographic Autonomy License (CAL-1.0). You are free to inspect, modify, and redistribute this software. Any deployment or derivative service offered over a network legally requires providing users access to the source code, their data, and their cryptographic keys/credentials, guaranteeing data sovereignty without vendor lock-in.
- Cryptographic & Research Notice: Ombracrypt is designed for defensive personal data sovereignty. The maintainers assume zero liability for data loss resulting from forgotten passwords, lost key files, or unauthorized use. Users are solely responsible for ensuring compliance with cryptographic import, export, and usage regulations in their respective jurisdictions.
- Zero Backdoors, Zero Escrow: Ombracrypt enforces a local, zero-escrow security architecture. There are no backdoor master keys, recovery phrases, password reset mechanisms, or administrative bypasses. If you lose your Master Password or your
.obkprivate key file, your data is cryptographically unrecoverable. Always maintain independent, verified backups of your private keys in offline, tamper-evident physical storage.- Irreversible Duress Key Scrambling: Entering your optional Deception Passcode initiates an in-place CSPRNG overwrite of the selected
.obkprivate key file on disk. Once overwritten, that specific key file copy is permanently corrupted, and any vault relying exclusively upon it can never be decrypted again. Data recovery is only possible if an independent offline backup of the key exists. Configure and use this countermeasure only with full awareness of its operational consequences.

