hsh is on the road from 0.0.x to 1.0.0 — see the
v0.0.9 milestone. While the crate is pre-1.0, only the latest
minor release receives security fixes. Once v1.0.0 ships, the
support window will follow the policy in
doc/API-STABILITY.md.
| Version | Status |
|---|---|
0.0.9 |
Active — receives security patches |
< 0.0.9 |
Unsupported — please upgrade |
Please do not file public issues for security reports.
- Preferred channel: GitHub private security advisory.
- Email fallback: sebastian.rousseau@gmail.com, subject prefix
[hsh-security]. - Please include: affected version(s), a minimal reproducer, the impact you see, and any suggested remediation.
You should expect:
-
Acknowledgement within 48 hours.
-
For confirmed issues, a triage outcome within 7 days and a patched release per the SLA below:
Severity Patched release Yank window Critical / High 72 hours 24 h Medium 14 days n/a Low Next scheduled release n/a -
Public disclosure window of 90 days (or sooner once a patched release ships) coordinated with the reporter.
-
A
RUSTSEC-YYYY-NNNNadvisory filed for any yanked release.
In scope:
- The
hsh,hsh-cli,hsh-kms, andhsh-digestcrates. - Helper code under
crates/,scripts/,fuzz/. - The GitHub Actions workflows under
.github/workflows/and the release artefacts they produce. - The packaging templates under
pkg/.
Out of scope:
- Vulnerabilities in upstream dependencies — please report directly to the upstream project. We pin / patch promptly once a fix exists.
- Misuse of the crate (e.g. running
api::hashwith attacker-chosen parameters that are deliberately weak). - DoS from caller-chosen prohibitively-expensive parameters
(Argon2id at
m = 2^31is a legitimate operator choice).
- Timing side-channels on verification. Hash byte comparison
uses
subtle::ConstantTimeEqin every code path. The bcrypt verifier delegates to thebcryptcrate, which also usessubtle. - Memory residue. Secret material (
hash,salt, derived buffers, pepper keys) is zeroed on drop viazeroize::ZeroizeOnDrop. Setters explicitly zero the previous buffer before reassignment. - Bcrypt 72-byte truncation (CVE-2025-22228 class). The bcrypt
wrapper rejects inputs
> 72bytes by default; longer inputs require an explicitBcryptParams::with_prehash(Sha256). - Weak default parameters. Scrypt defaults to OWASP-2025
(
N = 2^17). Argon2id defaults to OWASP-2025 (m = 19 456 KiB,t = 2,p = 1). PBKDF2 defaults to OWASP-2025 (iters = 600 000for SHA-256). - Algorithm-drift exposure.
api::verify_and_upgradereturnsOutcome::Valid { needs_rehash: true }whenever the stored algorithm or its parameters fall below the currentPolicy, signalling the caller to persist a fresh hash. - Pepper key compromise window. When using
hsh-kms's pepper support,KeyVersionallows non-destructive rotation;verify_and_upgrademigrates old-versioned hashes on next successful login. - FIPS fail-open. When
Backend::Fips140Requiredis set and the build can't satisfy it,api::hashreturns a typed error rather than silently falling back to non-FIPS crypto. #![forbid(unsafe_code)]workspace-wide (ADR-0006). Everyunsafeblock reachable fromhshlives in an audited upstream crate.
- Real FIPS routing through
aws-lc-rs. ThefipsCargo feature is a forward-compat marker today; thehsh-backend-awslcworkspace member that flipsBackend::fips_available_in_build()totrueis gated on a reliable build environment for AWS-LC FIPS (seedoc/FIPS.md). - Real KMS provider implementations. The AWS / GCP / Azure /
HashiCorp Vault
fetch_pepperfunctions inhsh-kmsare stubs; the trait shape is stable but the network calls are tracked as Phase 3 follow-ups.
#![forbid(unsafe_code)]workspace-wide (ADR-0006).Cargo.lockis committed.cargo-deny+cargo-auditon every PR and weekly cron via.github/workflows/supply-chain.yml.- SLSA L3 build-provenance attestation on every release via
actions/attest-build-provenance. - Sigstore keyless signing of every release artefact via
cosign sign-blob. - SBOM generated per release via
cargo-about(NOTICE.md attached to the GitHub release). - OpenSSF Scorecard rated weekly via
.github/workflows/scorecard.yml; SARIF uploaded to code-scanning. - 5 libfuzzer harnesses under
fuzz/run nightly via.github/workflows/fuzz.yml(10-minute budget per target). - Miri runs per-PR (focused, 60-minute budget) and weekly
(full sweep, 90-minute budget) via
.github/workflows/miri.yml. - Pinned GitHub Actions by SHA where the action ecosystem supports it; Dependabot updates the pins weekly.
All maintainer commits are signed. PRs that cannot be verified will be re-signed or rebased before merge.
For embargoed advisories that need cross-project coordination
(e.g. an issue affecting both hsh and aws-lc-rs):
- Reporter contacts us via the preferred channel above.
- We coordinate with the relevant upstream maintainers and the reporter to set a public disclosure date.
- The pre-staged release PR is merged + tagged + published + the advisory is filed all within one hour of the agreed embargo end.