- alkcall 0.9.0 -> 0.10.0 (the gateway ownership-seam release): the GatewayDispatch ownership-provider threading + the loud unwired-spine default are not on this crate's paths (no gateway module use; registry dispatch on the native wire untouched). Zero API/wire change here. - alktunnels 0.3.0 -> 0.4.0 (its dependency-major ride): no alktunnels API/wire change; the composed providers see none of it. - fuzz/shared: the harness's own alkcall pin bumped in lockstep (its ChannelOpenError construction makes a drifting pin a duplicate-type compile failure, not silent drift) — the only bump contact. - Docs: CHANGELOG 0.3.0 entry, README version blurb (alktunnels style), AGENTS.md pin update, deps tree in overview.md. - Minor-not-patch for the established reason: semver-incompatible dependency bumps + this crate's public ChannelOpenError re-exports (SocksOpenError::Open/open_ref) are semver-visible downstream. Verification: cargo test (default 145 unit + suites green), --features local, --all-features (171 unit + all suites), clippy --all-targets --all-features -D warnings, fmt --check, wasm32-unknown-unknown check + clippy, fuzz corpus replay 3/3, publish --dry-run clean.
10 KiB
Changelog
All notable changes to this crate are documented here. The format is based on Keep a Changelog, and this crate adheres to Semantic Versioning.
Unreleased
[0.3.0] - 2026-10-19
The dependency-major release: the alkcall substrate bumped 0.9.0 →
0.10.0 (the gateway ownership-seam release) and the alktunnels sibling
bumped 0.3.0 → 0.4.0 (its dependency-major ride on alkcall 0.10.0). No
alksocks API change, no wire change; zero code contact with the
0.10.0 breaking surface (compile + suite green unchanged), which is
why this is a minor bump rather than a patch: the semver-incompatible
dependency bumps plus this crate's public re-exports of alkcall types
(SocksOpenError::Open/open_ref carry ChannelOpenError) make it
semver-visible to downstream consumers (matching the alktunnels
0.3.0 → 0.4.0 ride).
Changed
- alkcall 0.9.0 → 0.10.0 (crates.io). The gateway
ownership-seam release (review 012):
GatewayDispatchgainswith_ownership_provider/with_static_ownership_fallback, and the previously-silent static fallback becomes loud — an unwired spine refuses (an error envelope,FORBIDDEN, pre-dispatch) an op whose spec carriesaccess_control.resource_type. None of it is on this crate's paths: alksocks does not use the gateway module — SOCKS5 opens serve viaChannelCore::register_openable/register_openable_with_establisherregistry dispatch on the native wire, which 0.10.0 leaves untouched. All of this crate's alkcall contact points (ChannelClient::open_channel*,ChannelOpenError,Establishment::default(),register_openable*,pump_bidi, thecoretypes) are unchanged between 0.9.0 and 0.10.0. 145 default / 171 all-features tests pass; wasm-clean verified. - alktunnels 0.3.0 → 0.4.0 (the dependency-major ride on alkcall 0.10.0). No alktunnels API/wire change; the composed providers see none of it.
- fuzz/shared harness pin (the only bump contact): the harness
declares its own
alkcallpin (it constructsChannelOpenErrorvalues for the invariant functions), so the two pins must stay in lockstep — bumped 0.9.0 → 0.10.0 with the substrate (a drifting pin produces a duplicate-type compile failure, not silent drift).
0.2.0 - 2026-10-14
The dependency-major release: the alkcall substrate bumped 0.8.1 → 0.9.0 (the stub-sweep release) and the alktunnels sibling bumped 0.2.1 → 0.3.0. No alksocks API change, no wire change; no code contact with the 0.9.0 breaking surface at all (compile + suite green unchanged), which is why this is a minor bump rather than a patch: the semver-incompatible dependency bumps plus this crate's public re-exports of alkcall types make it semver-visible to downstream consumers (matching the alktunnels 0.2.1 → 0.3.0 ride).
Changed
- alkcall 0.8.1 → 0.9.0 (crates.io). The stub-sweep release: the
marked-pub open contract (S-01),
channel/control(S-02),channel/resources/subscribe(S-03), andop/registerforward-through (S-04) replace the four always-failing stubs. None of the four stubs were on this crate's paths (no marked-pub registration, no control-handle subscription, no resource enumerator use, no genericop/registerannouncements). The 0.9.0 breaking list (ManagerError::InvalidAdoptadditive,RelayError::PubTypedOpenremoval, theregister_imported/register_imported_allreturn change,Establishmentdropping itsDebugderive) is untouched by this crate's API use —Establishment::default()is the onlyEstablishmentcontact, in the session gate. 145 default / 171 all-features tests pass; wasm-clean verified. - alktunnels 0.2.1 → 0.3.0 (the dependency-major ride on alkcall 0.9.0). No alktunnels API/wire change; the composed providers see none of it.
0.1.0 - 2026-09-27
The initial release: SOCKS5 (RFC 1928) as a produced resource on
alkcall channels — the -D flavor as a first-class protocol crate,
over alkcall 0.8.1. The defining posture: the protocol never binds a
port; kernel binds exist only as explicit, feature-gated assembly
shapes. Composed against by the alktunnels 0.2.1 graduation (the
direct op + the bind-first/forwarded flow power the composed
providers). Fuzzing adopted (the fuzz/ workspace — excluded from
the published package) over the crate's two attacker-reachable
parsers: the ASSOCIATE datagram codec and the RFC 1928 handshake;
campaigns clean, no crate bugs.
Added
- The RFC 1928 core (
src/rfc1928/, ADR-013) — the targeted fork of fast-socks5 v1.0.0'sT-generic subset, extracted in-tree as fully owned code (MIT notice bundled; extraction per ADR-011): the wire consts, codecs, errors, the explicit typestate server API (Socks5ServerProtocol<T, states::*>, generic overT: AsyncRead + AsyncWrite + Unpin), and the clientuse_streampath. Two deliberate changes carried from the fork point: BIND support in the base (ADR-007) and thenew_replypublication. No kernel-net code — the default crate is wasm-clean by construction. - The wire codec (
wire, ADR-003) — the ASSOCIATE datagram frame ([len: u16 BE][addr + data]), framing applied exactly once at this layer; theDatagramReaderincremental parser; theMAX_INNER_LENoversize guard. - The wire-stable open-op surface (
params, ADR-001/006) — thealk/socks5ALPN, thechannels/socks5/subop id, the trivial{}params (the RFC conversation is the data plane; nothing to negotiate at open time), and the two scope constants (socks5:open,socks5:bind— two grants, never implied). The typed open-error vocabulary rideserror(the ADR-049 reasons). - The three seams (
egress, ADR-004) —DialFn/EgressFactory/BindAcceptFactory: functions, not traits, at the three I/O planes; ownership rides the handle structurally (TargetHandle/BindTargetHandle/BindAccept); the egress readiness contract (next_replyPendingwhen nothing is ready) is load-bearing API. - The producer half (
producer) — the session-gate establisher (validates the opener identity; the target is unknown at open time), the command-dispatch pump handler (CONNECT pass-through / ASSOCIATE datagram stage / BIND phase model — reply#1 → quiet wait → exactly one accept → reply#2 → pass-through), the command gate (socks5:bindat BIND dispatch), the identity witness, and both wiring shapes: the free functions (register_socks5_openable/socks5_session_establisher/make_socks5_pump_handler/serve_socks5_over) and the builder (Socks5Producer::builder()— dial/egress/accept/bind_policy). Data planes ridealkcall::channels::pump_bidi(ADR-050). - The consumer half (
consumer) — the typed channels-native sessions, each owning its channel's teardown (Dropaborts + reaps; noClone):Socks5ChannelSession(CONNECT — raw pass-through, thesplit/into_innerpostures),AssociateSession(the framed datagram stage —send_datagram/recv_datagram/split),BindSession(the reply#1/reply#2 reader + theBindDataPlanepass-through), and the token-carrying surface (TokenClient+ the*_with_tokenconstructor twins — the cred-bearing front door's re-origination). - The
localfeature (ADR-008/009) — the socket-backed seam providers (tcp_dial/udp_egress/bind_accept— the explicit bind decisions, resolving via the non-blockingtokio::net::lookup_hostresolver), plus both doors: the consumer-side front doors (FrontDoor— the NoAuth raw pipe + the RFC 1929 cred-bearing door with the credential→identity mapping, ADR-005;UdpFrontDoor— one association per bound relay socket, the RFC codec at the door boundary only, the peer-pin posture: the client's source IP pins on the first parsed datagram, replies follow the latest-seen port from that IP, foreign-IP datagrams are dropped per RFC 1928's MUST — OQ-SK2-09) and the producer-side listener (ProducerDoor— vanilla clients dial it, each accepted connection is served viaserve_socks5_over; the ADR-014 idle-first-byte window + max-sessions cap knobs). - The
composedfeature (ADR-008/009) — the alktunnels 0.2.1 composed providers:direct_egress(the direct-op egress — a lazy destination→tunnel table,DEFAULT_MAX_TUNNELSbounded), andbindfirst_accept+register_forwarded_serving(the BIND accept whose listener lives on a bind-first listen resource; theCorrelationRegistrycorrelates the forwarded op's peer metadata intoForwardedSessions). - The idle-timeout posture (ADR-014) — every phase teardown-governed, no protocol-layer idle bound; the doors own the accept-path defense.
- The suites — the differential suite against the upstream
reference checkout (
tests/rfc1928-differential.rs), the protocol-core integration suite (tests/core-integration.rs), and the assembly-layer integration suite (tests/assembly-integration.rs). - Fuzzing (
fuzz/workspace,docs/research/fuzzing.md) — the alkcall §5 pattern adopted for this crate's two attacker-reachable parser classes:datagram_codec(thewirecodec — no-panic, infallible decode, size bound, re-frame round-trip, theretained_bytesbound) andrfc1928_codec(the RFC 1928 handshake state machine, fed attacker bytes from both protocol directions), plusparams_parse. Invariant logic lives infuzz/shared/— a stable-toolchain crate replayed as plaincargo test(the corpus replay is the fuzz gate). 129 committed seeds; detached campaigns clean (oom/timeout/crash: 0/0/0, coverage saturated). The one diagnostic added:DatagramReader::retained_bytes().fuzz/is excluded from the workspace and from the published package.