Skip to content

Commit 834c215

Browse files
UnbreakableMJclaude
andcommitted
chore(release): anvil-ssh 0.7.0 -> 0.8.0; CHANGELOG (M17 algorithm overrides)
Final Anvil-side slice of M17. Bumps anvil-ssh from 0.7.0 to 0.8.0 to publish the M17.1 + M17.2 work as a single crates.io release. The Gitway-side CLI flags + list-algorithms subcommand (M17.4 + M17.5) land against this 0.8.0; the M17.X PRD doc PR closes the milestone with Gitway v1.0.0-rc.8. Cargo.toml: - version "0.7.0" -> "0.8.0" Cargo.lock: - regenerated locally; reflects the 0.8.0 version. CHANGELOG.md: - 0.8.0 entry covering the new anvil_ssh::algorithms module, the four new AnvilConfig fields + builder setters, the apply_ssh_config algorithm-directive consumption, the build_russh_config signature change, and the FR-66 / CAT_KEX tracing event for offered algorithm preferences. Stacked after PRs #25 (M17.1, merged) and #26 (M17.2, merged). Plan: M17.3 of anvil-gitway-milestone-plan.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 8019513 commit 834c215

3 files changed

Lines changed: 28 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,32 @@
22

33
All notable changes to Anvil are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow [SemVer](https://semver.org/).
44

5+
## [0.8.0] — 2026-05-04
6+
7+
### Added
8+
9+
- **Algorithm overrides** — the M17 chapter of [Gitway PRD §5.8.6](https://github.com/Steelbore/Gitway/blob/main/Gitway-PRD-v1.0.md), FR-76..FR-79. Closes the M12.6 algorithm-override loop: `KexAlgorithms` / `Ciphers` / `MACs` / `HostKeyAlgorithms` directives from `~/.ssh/config` (and the matching CLI overrides M17.4 will land in Gitway 1.0.0-rc.8) now flow through to russh's `Preferred` set instead of being parsed and discarded.
10+
- **New `anvil_ssh::algorithms` module** — public surface: `pub const DENYLIST: &[&str]` (DSA, 3DES, Arcfour variants, hmac-sha1-96, ssh-1.0); `pub fn is_denylisted` / `apply_denylist`; `pub enum AlgCategory { Kex, Cipher, Mac, HostKey }`; `pub fn apply_overrides(category, base, override_str)` implementing OpenSSH's `+algo` (append) / `-algo` (remove) / `^algo` (front-load) / `algo,algo` (replace) syntax; `pub fn anvil_default_kex` / `anvil_default_ciphers` / `anvil_default_macs` / `anvil_default_host_keys` returning the curated default base for `+/-/^` overrides; `pub struct Catalogue { kex, cipher, mac, host_key }` of `pub struct AlgEntry { name, is_default, denylisted }` and `pub fn all_supported() -> Catalogue` for `gitway list-algorithms` (FR-79).
11+
- **New `AnvilConfig` fields**: `kex_algorithms`, `ciphers`, `macs`, `host_key_algorithms` (each `Option<Vec<String>>`). `None` selects the curated default; `Some` is a list already filtered through `apply_overrides`. Matching `AnvilConfigBuilder` setters added.
12+
- **`apply_ssh_config` consumption**: `KexAlgorithms` / `Ciphers` / `MACs` / `HostKeyAlgorithms` directives are now plumbed through `apply_overrides` against the curated default and stored on the builder. The M17 deferral warning that pointed at this work has been removed.
13+
- **`build_russh_config(&AnvilConfig)`**: signature changed (was `(Duration)`). Now consumes the four config fields, falling back to `anvil_default_*()` when each `Option` is `None`. Three new private lookups (`russh_kex_name` / `russh_cipher_name` / `russh_mac_name`) map user strings to russh's `&'static str`-backed `Name` constants; unknown names are silently dropped (russh's `Name` types only accept `'static`). Host-key field uses the existing `russh::keys::Algorithm::FromStr` impl.
14+
- **FR-66 / M15 instrumentation**: new `tracing::trace!` event at `CAT_KEX` listing the four offered preference vectors before `client::connect` — answers "what did Gitway TRY to negotiate?" alongside M15.2's `check_server_key` event.
15+
16+
### Changed
17+
18+
- **`anvil-ssh` minor bump** 0.7.0 → 0.8.0 to signal the new `algorithms` module + four new public `AnvilConfig` fields + the `build_russh_config` signature change. Pre-1.0 SemVer: 0.7.x consumers must explicitly opt in.
19+
20+
### Notes
21+
22+
- **FR-78 enforcement** is deliberate. Russh 0.59 already excludes most denylisted algorithms by default; the explicit list in `algorithms::DENYLIST` is a defensive belt-and-suspenders pass at the override boundary. Operators who genuinely need to reach a legacy peer that only speaks DSA / 3DES / Arcfour / SHA-1 HMAC <96-bit must use external `ssh -W` as a `ProxyCommand` and accept the security loss explicitly.
23+
- **HMAC-SHA1 caveat** (M19 inheritance): the privacy-only HMAC-SHA1 used for `HashKnownHosts` is unrelated to the FR-78 `hmac-sha1-96` denylist entry. The denylist targets MAC negotiation in the SSH protocol, not the privacy-preserving hostname hash.
24+
- **Public-API additions only** — no breaking changes from 0.7.x for downstream consumers (the `build_russh_config` signature change is crate-private).
25+
26+
### Tests
27+
28+
- 23 new unit tests in `algorithms::tests` covering: denylist case-insensitivity, every prefix branch (none / + / - / ^ / empty), case-insensitive dedup on append, silent skip on remove of absent, OpenSSH front-load semantics (reorder-not-add), denylisted-token rejection in any prefix form, error-hint shape, whitespace trim + empty-token drop, catalogue invariants (≥1 default per category, default+denylisted disjoint, ssh-dss tagged), curated-defaults exclude denylist, host-key default excludes ssh-dss / includes ssh-ed25519, category-label stability.
29+
- Existing `session::tests` updated to construct an `AnvilConfig` for the new `build_russh_config` signature.
30+
531
## [0.7.0] — 2026-05-04
632

733
### Added

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# SPDX-License-Identifier: GPL-3.0-or-later
22
[package]
33
name = "anvil-ssh"
4-
version = "0.7.0"
4+
version = "0.8.0"
55
edition = "2021"
66
license = "GPL-3.0-or-later"
77
authors = ["Mohamed Hammad <MJ@S3cure.me>"]

0 commit comments

Comments
 (0)