CipherFS
In development · unreleased · format may change

Algorithm registry

This registry defines stable algorithm IDs and the textual values introduced in ADR 005. IDs belong to one family; signature and public-key IDs are separate. An ID or text name is never reassigned. Zero is unspecified and cannot select an algorithm. Registration permits representation; execution also requires support for the requested scope.

All current entries are active with no deadline. — in deprecated_after means unset (None). Protobuf persistence, repository policy checks and capability advertisement are implemented; the architecture describes the current boundary and the implementation record records verification.

Hash

IDAlgorithmText IDValue bytesStatusdeprecated_after (UTC)Current scope
1BLAKE3b332active—Content hashes and protocol identities
2SHA-256sha25632active—Typed digest values; content and protocol identities reject this algorithm
3SHA-512sha51264active—Typed digest values; content and protocol identities reject this algorithm

AEAD

IDAlgorithmText IDNonce bytesTag bytesStatusdeprecated_after (UTC)Current scope
1XChaCha20-Poly1305xchacha20poly13052416active—Content, local protection, index segments/snapshots and key wrapping
2AES-256-GCMaes256gcm1216active—Content
3ChaCha20-Poly1305chacha20poly13051216active—Content

Signature

IDAlgorithmText IDValue bytesStatusdeprecated_after (UTC)Current scope
1Ed25519ed2551964active—Device and recovery-authority signatures

Public key

IDAlgorithmText IDValue bytesStatusdeprecated_after (UTC)Current scope
1Ed25519ed2551932active—Device identity and signature verification
2X25519x2551932active—Sealed-box recipients and ephemeral keys

KDF

IDAlgorithmText IDStatusdeprecated_after (UTC)Current scope
1Argon2idargon2idactive—Password-derived wrapping keys; salt, wire memory_cost_bytes, iterations, parallelism, output length and version are explicit

The Rust VaultConfig.argon2_m_cost remains in KiB; the protobuf codec converts it to/from memory_cost_bytes with strict alignment and bounds. Existing domain-separated key-derivation labels retain their current meanings.

Chunking

IDAlgorithmText IDStatusdeprecated_after (UTC)Current scope
1FastCDC 2020fastcdc-2020active—Content writer with min/average/max size parameters
2Fixed boundariesfixedactive—Content writer with a chunk-size parameter

These IDs are assigned to the existing writer strategies. Readers follow stored unit boundaries.

Canonical text and validation

Digest, Signature and PublicKey render as <text-id>.<base58-value>. The algorithm prefix is exactly the lower-case registered name; the value is case-sensitive Bitcoin base58 using 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz. Encode raw bytes without a checksum, preserving each leading zero byte as a leading 1. Decoding must satisfy the exact byte length in its family and reproduce the same text when encoded again. Reject whitespace, aliases, unknown prefixes, empty values, invalid characters and noncanonical encodings. AEAD, KDF and chunking text IDs identify algorithms; they do not encode a value by themselves.

DeviceId and public peer NodeId use ed25519.; VersionId, RetirementId and KeyEpoch use b3.. FileId, SubtreeId, StoreId and VaultId are exact 16-byte random identities with unprefixed base58, not digests or public keys. Public JSON uses canonical strings and rejects old hex aliases. Private recovery keys and pairing tickets keep their existing representation.

Genesis anchors the repository's allowed algorithms. Parsing a registered value does not authorize execution: the policy and implemented scope/deadline checks must also pass. Current local protection, index envelopes and key wrapping use XChaCha20-Poly1305; other registered AEADs are content-only. Runtime policy switching is not implemented. Pairing retains its keyed BLAKE3 MAC/SAS, rather than adding an independent signature.

deprecated marks an algorithm scheduled for retirement. Before a deadline, or when none is set, a deprecated entry remains usable in an implemented scope. A deadline is an optional UTC instant written as RFC 3339 with Z; code stores it as deprecated_after_epoch_ms: Option<u64> (Unix epoch milliseconds). Registry validation through ensure_usable_at(scope, now_epoch_ms) rejects an expired entry when now_epoch_ms >= deprecated_after_epoch_ms, including the exact boundary. Unknown algorithms and algorithms unimplemented for the requested scope also fail explicitly. Parsing a registered SHA digest does not authorize its use for content or identities. No failure selects another algorithm or ignores a deadline.

Copied or manually constructed registration metadata must match the static entry's family, ID, and text identifier. It may restrict supported uses or shorten a deadline, but cannot enable an unimplemented use or extend the registry deadline.

Source file in the repository