ferrocrypt 0.3.0

Recipient-oriented file and directory encryption: passphrase (Argon2id) and X25519 public-key recipients, XChaCha20-Poly1305 STREAM payloads, HKDF-SHA3-256 / HMAC-SHA3-256 key derivation and authentication.
Documentation
# Release config for the ferrocrypt (lib) crate.
#
# cargo-release applies a rule to a pre-release version (0.3.0-beta.3,
# 1.0.0-rc.1, …) only if the rule sets `prerelease = true`. Every rule here sets
# it except the README rule. Every rule runs during the lib's release step; the
# lib is always part of a shared-version release.
#
# Paths are relative to this directory (ferrocrypt-lib/):
#   - ../CHANGELOG.md            workspace-root changelog; gets a dated section.
#   - ../ferrocrypt-desktop/...  excluded from the workspace, so shared-version
#                                does not bump it; its version is synced here.
#   - ../README.md               the crates.io page of both crates; its version
#                                links and install commands are synced here.

# The hook updates the lock files outside the workspace and runs the tests,
# once for the whole workspace, before the release commit; a failure stops the
# release. It is set here rather than in ../release.toml, which would run it
# once for every crate. cargo-release runs it in this directory.
pre-release-hook = ["bash", "../scripts/release_hook.sh"]

[[pre-release-replacements]]
file = "../CHANGELOG.md"
search = "(?m)^## \\[Unreleased\\]\\n\\n"
replace = """## [Unreleased]

## [{{version}}] - {{date}}

"""
prerelease = true

[[pre-release-replacements]]
file = "../ferrocrypt-desktop/Cargo.toml"
search = '^version = ".*"'
replace = 'version = "{{version}}"'
exactly = 1
prerelease = true

# No `prerelease = true`: a pre-release leaves the versions in the README as
# they are, so its install commands keep naming the last release without a
# pre-release suffix. Set it only for a pre-release whose README describes a
# changed API or CLI, such as 0.4.0-rc.1.
#
# A README that gains or loses a pinned version stops the release here until
# `exactly` is updated with it.
[[pre-release-replacements]]
file = "../README.md"
search = '(crates\.io/crates/ferrocrypt(?:-cli)?/|docs\.rs/ferrocrypt/|cargo add ferrocrypt@|cargo install ferrocrypt-cli@)[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?'
replace = '${1}{{version}}'
exactly = 5