### Notes This file describes changes in Arti through the current release. Once Arti is more mature, we may switch to using a separate changelog for each crate. # Arti 2.5.0 — 30 June 2026 Arti 2.5.0 comes with lots of progress in the relay and directory authority space, including ntor handshake handling, as well as encoding/decoding support for router- and micro descriptors. This release also includes a number of important bug fixes, as well as two security fixes for medium-severity security issues, [TROVE-2026-24] and [TROVE-2026-27]. As usual, there are also many small changes and improvements which are detailed below. ### Breaking changes - Arti now requires Rust 1.91 or later. ([!4105]) ### Security fixes - Fixed the medium-severity DoS security vulnerability ([TROVE-2026-24]), which could allow a malicious directory mirror to trigger a `tor-netdoc` parser crash, eventually leading to Arti's `tor-dirmgr` task to stop working. We have not observed this being abused in the wild, as this attack cannot be performed silently, due to various crash logs that would be reported to Arti. ([#2566], [!4062]) - Disabled and removed various uses of string slices as the aftermath of [TROVE-2026-24]. ([#2571], [!4062], [!4068], [!4103], [!4092], [!4142], [!4143]) - Fixed the medium-severity DoS security vulnerability ([TROVE-2026-27]), which could lead to an attacker exploiting an inefficient algorithm, resulting in the stalling of the CPU. We have not observed this being abused in the wild. ([#2601]) ### Major features - [Congestion control](https://blog.torproject.org/congestion-contrl-047/) (alias `flowctl-cc`) is now enabled by default in `arti`. ([!4042]) - [Counter Galois Onion cryptography](https://blog.torproject.org/introducing-cgo/) is now stable in `arti`. To enable it, build arti with the `counter-galois-onion` feature, or use `full` to enable all stable reatures. ([!4069]) - Reworked the output of the `arti keys list` subcommand. ([!4015], [!4125], [!4126]) ### Major bugfixes - `arti-client` now honors manual bootstrapping and considers this as a valid reason for why bootstrapping may be blocked. ([!4047]) - `arti-client` now returns an error if a reconfiguration may have left the client in an invalid state. ([!4101]) ### Breaking changes in lower-level crates - `TokenBucket` was moved from `tor-proto` to `tor-basic-utils`. ([!4077]) - Boolean values got replaced by `Option>` in `tor-netdoc`. ([!4080]) - `InternCache` related logic now returns a new type called `Intern` instead of `Arc`. ([#2587], [!4130]) - Removed `sha256` from `Microdesc` and introduced alternative logic for obtaining it. ([!4138]) - Removed `Into for RelayEarly` implementation in `tor-cell`. ([!4146]) - Re-exported many stream-related types from `tor_proto::stream` rather than `tor_proto::client::stream`. ([!4123]) - `tor_proto`: `CreateRequestHandler::new()` now takes `IncomingStreamRequestFilterFactory` as an extra argument. ([!4145]) - Deprecated `tor_config::derive::assert_not_impl`, use it from `tor-basic-utils` instead. ([!4070]) - `tor-rtcompat`: `NetStreamProvider` now has an associated `ConnectOptions` type. - `tor-rtcompat`: `NetStreamProvider::connect()` now requires an addtional argument. - `tor-rtcompat`: `Runtime` trait requirements have changed. ([!4020]) - `NetdocUnverified` is now called `NetdocParseableUnverified` in `tor-netdoc`. ([!4043]) - `tor-netdoc`: `SoftwareVersion` is now stored as a `String` instead of `Arc`. ([!4155]) - Various `Arc` items got replaced by `Intern` inside `tor-netdoc` document types. ([!4130]) - `tor-netdoc`: Ed25519 certificate methods now wrap around a `TimerangeBound`. ([!4136]) - Replaced `ItemArgumentParseable` with `ItemValueParseable` in the `tor-netdoc` `RelayPlatform` type. ([!4114]) - `tor-netdoc`: `RouterDesc` related boolean values are now stored in an `Option>`. ([!4080]) - `tor-netdoc`: `RelayPlatform::Tor` now stores the platform as an `Option` instead of a `String`. ([!4024]) - `tor-netdoc`: `AuthCertUnverified::verify()` no longer takes times but instead returns a `TimerangeBound`. ([!4070]) - `tor-netdoc`: `Microdesc` got split into `Microdesc` and `MicrodescAndHash`. ([!4070]) ### Relay development - `ClientDataStreamCtrl` is now optional throughout the code base. ([!4074]) - Added new `CircuitRxSender`/`CircuitRxReceiver` queue types for priorization of `DESTROY` cells in the reactor. ([!4025]) - On circuit handshake failure, Arti relays now always use `DestroyReason::NONE` when tearing down the circuit. ([!4088]) - Re-exported various client-side stream types for future use with relays. ([!4123]) - Added circuit reactor scaffolding logic for rejecting pending streams. ([#2590], [!4139]) - Better separation between `Relay` and `RelayEarly` messages. ([!4146]) - Support for incoming ntor (non-v3) handshakes in `CREATE2` cells. ([!4149]) - Set stream filters via the `CREATE` handler. ([!4145]) ### Directory authority development - `RelayPlatform` got improved in various ways, including support for encoding. ([!4024], [!4114]) - Added various small fields to `RouterDesc`, including `hibernating`, `contact` and `extra-info-digest`. ([!4006]) - Improved accessors for `ParseInput`. ([!4057]) - Added `ItemPresent` for wrapping ZST like fields such as `tunnelled-dir-server`. ([!3988], [!4080]) - Support for encoding `RouterStatus` entries. ([!4058]) - Added `F64Finite` for representing the floating point values in votes. ([!4060]) - Added a top-level `NetworkStatus` type. ([!4067]) - Moved validity time range for network status preambles to its own place. ([!4054]) - Added `Ed25519NtorCrossCert` which implements validating and signing ntor cross-certificates. ([!4022], [!4155], [!4173]) - Added further fields to router statuses, making it field-complete. ([!4061]) - Improved testing by replacing ad-hoc pseudo diffs with `imara-diff`. ([!4096]) - Added `RecommendedTorVersions` for encoding/decoding recommended versions in netdocs. ([!4059]) - Added `NtorOnionKeyCrossCert` for encoding/decoding `Ed25519NtorCrossCert` properly. ([!4023], [!4109]) - Overhaul for consensus verification with regard to `parse2`. ([!4065]) - Internal naming improvements. ([!4099]) - Added `stats` to vote `RouterStatus`. ([!4097]) - Arti now uses the shorter rule kind when encoding an `accept/reject` port policy. ([!4108]) - Added more derives for various types. ([!4115]) - Added encoding for `SpFingerprint`. ([!4116]) - Added encoding and decoding for consensuses. ([!4100]) - Use `EmbeddedCert` for authority certificates in votes. ([!4098]) - Allow the handling of deprecated fields in `parse2`. ([!4118]) - Support for encoding `AddrPolicy` and other various improvements. ([!4113], [!4128]) - Support for verifying votes. ([!4121]) - Support for encoding microdescriptors. ([!4117]) - Support for decoding router descriptors. ([!4134]) - Return `TimerangeBound` for all netdoc related Ed25519 certificates and do verification logic there. ([!4136]) - `parse2` support for intern logic by replacing `Arc` with `Intern`. ([!4130]) ### RPC development - Support for deferred bootstraping. Programs can use this to create Arti in mode that will not use the network, and then later enable network support after having configured Arti to their liking. ([!4056]) - Internal dependencies for rpc-related functionality are now marked as such in `Cargo.toml`. ([!4090]) ### Testing - `tor-chanmgr` now supports metrics. ([!4018]) - Bump in chutney to add middle node test net. ([!4111]) - Added unit test for `XonXoffReader`. ([!4093]) - Added round trip test for encoding/decoding consensuses. ([!4100]) - Improved testing for `NetDir::pick_n_relays`. ([!4110]) - Rewrote hand-written test for `arti keys` using `trycmd`. ([!4126]) - No longer include `-` in random hostnames, to comply with DNS standards. ([!4178]) ### Documentation - Typo fixes for `ResolveCmdChecker` in `tor-proto`. ([!4035]) - Improvements on internal `tor-netdoc` documentation. ([!4044]) - Removed leftover TODO comments. ([!4081], [!4124]) - Added a specification for a yet-to-be-written plugin API for C Tor in order to let C Tor directory authorities use consensus methods implemented solely in Rust. ([!4089]) - Outlined a plan for handling incoming streams for relays. ([!4107]) - Fixed wrong documentation regarding the minimum for a named protocol subversion. ([!4151]) - Fixed option name in `arti-example-config.toml`. ([!4148]) ### Infrastructure - Various routine cargo updates. ([!4045], [!4053], [!4064], [!4033], [!4083], [!4140], [!4174]) - Fix `coverage_fuzz_corpora` to use `target-coverage-dir`. ([!4071]) - Acknowledge `RUSTSEC-2026-0173` in `maint/cargo-audit`. ([!4075]) - More fuzzing support for `tor-netdoc` related types. ([!4068]) - Bumped docker images. ([!4078]) ### Cleanups, minor features, and bugfixes - Empty sequences are now handled preemptively in `tor-netdir`. ([!4034]) - Inverted certificate signatures are now properly handled in handshakes. ([#2501], [#2502], [!4048]) - No longer import `crate::Result` in `tor_netdoc::doc::netstatus`. ([!4050]) - Support `connect()` options in `tor-rtcompat`. ([!4020]) - Minor fixes for encoding `SoftwareVersion` and `*-protocols` in `tor-netdoc`. ([!4055]) - `Timebound` implementations now treats bounds as inclusive. ([!4070], [!4096]) - More use of `tor_basic_utils::iter_join` in various places. ([!4091]) - Small `EncodedAuthCert` parsing in `tor-netdoc`. ([!4104]) - Enable the use of `wasm_js` in the `getrandom`. ([!4119]) - Reply with IPv6 and/or hostname in SOCKS5. ([!4063]) - Refactored `NetDir::pick_n_relays`. ([!4110]) - Added empty `arti-dirauth` and `tor-dirauth` crates. ([!4122]) - Small semantic `Cargo.toml` improvements. ([!4122]) - Rolled-out more deftly in `tor-config`. ([!4095]) - Fixed some grammar mistakes in log messages. ([!4076]) - Updated fallback directory list. ([!4157]) - Implement more common traits on `ExpandedKeypair` in `tor-llcrypto`. ([!4154]) - Removed unnecessary `Box::pin` wrapper in `tor-ptmgr`. ([!4172]) - Derive more `Eq` related traits in `tor-cert`. ([!4150]) - Windows compatibility for `maint/add_warning`. ([!4084]) ### Acknowledgments Thanks to everybody who's contributed to this release, including 5225225, Neel Chauhan, hjrgrn, moumenalaoui, pryty26. Also, our deep thanks to the [Bureau of Democracy, Human Rights, and Labor], and our [other sponsors] for funding the development of Arti! [!3988]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3988 [!4006]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4006 [!4015]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4015 [!4018]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4018 [!4020]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4020 [!4022]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4022 [!4023]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4023 [!4024]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4024 [!4025]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4025 [!4033]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4033 [!4034]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4034 [!4035]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4035 [!4042]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4042 [!4043]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4043 [!4044]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4044 [!4045]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4045 [!4047]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4047 [!4048]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4048 [!4050]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4050 [!4053]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4053 [!4054]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4054 [!4055]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4055 [!4056]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4056 [!4057]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4057 [!4058]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4058 [!4059]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4059 [!4060]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4060 [!4061]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4061 [!4062]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4062 [!4063]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4063 [!4064]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4064 [!4065]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4065 [!4067]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4067 [!4068]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4068 [!4069]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4069 [!4070]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4070 [!4071]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4071 [!4074]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4074 [!4075]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4075 [!4076]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4076 [!4077]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4077 [!4078]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4078 [!4080]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4080 [!4081]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4081 [!4083]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4083 [!4084]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4084 [!4088]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4088 [!4089]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4089 [!4090]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4090 [!4091]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4091 [!4092]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4092 [!4093]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4093 [!4095]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4095 [!4096]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4096 [!4097]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4097 [!4098]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4098 [!4099]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4099 [!4100]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4100 [!4101]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4101 [!4103]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4103 [!4104]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4104 [!4105]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4105 [!4107]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4107 [!4108]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4108 [!4109]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4109 [!4110]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4110 [!4111]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4111 [!4113]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4113 [!4114]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4114 [!4115]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4115 [!4116]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4116 [!4117]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4117 [!4118]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4118 [!4119]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4119 [!4121]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4121 [!4122]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4122 [!4123]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4123 [!4124]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4124 [!4125]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4125 [!4126]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4126 [!4128]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4128 [!4130]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4130 [!4134]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4134 [!4136]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4136 [!4138]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4138 [!4139]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4139 [!4140]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4140 [!4142]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4142 [!4143]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4143 [!4145]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4145 [!4146]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4146 [!4148]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4148 [!4149]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4149 [!4150]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4150 [!4151]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4151 [!4154]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4154 [!4155]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4155 [!4157]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4157 [!4172]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4172 [!4173]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4173 [!4174]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4174 [!4178]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4178 [#2501]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2501 [#2502]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2502 [#2566]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2566 [#2571]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2571 [#2587]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2587 [#2590]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2590 [#2601]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2601 [Bureau of Democracy, Human Rights, and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [TROVE-2026-24]: https://gitlab.torproject.org/tpo/core/arti/-/work_items/2566 [TROVE-2026-27]: https://gitlab.torproject.org/tpo/core/arti/-/work_items/2601 [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 2.4.0 — 1 June 2026 Arti 2.4.0 continues our work on relay and directory authority development, and brings us even closer to a working middle relay. This release also includes a number of important bug fixes in our onion service client implementation, and a number of breaking changes in the `arti-client` APIs. As usual, there are also many small changes and improvements which are detailed below. ### Breaking changes - In `arti-client`, all `TorClient` constructors now return `Arc`, `TorClient` no longer implements `Clone`, `set_stream_prefs` has been removed, and `clone_with_prefs` has been renamed to `with_prefs`. ([!3990]) - In `arti-client`, the `use_obsolete_software` option has been removed. ([!3995]) - In `arti-client`, several `experimental-api` methods are now fallible. ([!4011]) ### Major features - The `flowctl-cc` feature is now marked as stable. ([#2419], [!4014]) ### Major bugfixes - Numerous fixes to the onion service client timeout calculations. ([#2482], [!3940]) - Fixed a bug where window-based flow control was wrongly being applied to XON/XOFF flow control half-streams. ([#2195], [#2505], [!3941]) - Fixed a bug causing onion service clients to fail to refetch the service descriptor after introduction failure ([#966], [!3925]). ### Breaking changes in lower-level crates - Removed `flatten()` from `tor-basic-utils`. `Result::flatten()` provides the same functionality, and has been available in the standard library since Rust 1.89. ([be10d98832cb5ff1]) - In `tor-netdoc`, `RouterDesc` has been reworked, and several of its functions have been renamed, and now have a different signature. ([!3966], [!3978], [!3976], [!4010], [!4007], [!4003]) - In `tor-netdoc`, `netstatus::Preamble*` now contain new `SharedRandStatuses`, not individual fields, and `DigestName` `Ord` implementation was corrected to always sort by string representation. ([!3948]) - In `tor-netdoc`, `Footer` is renamed to `ConsensusFooterFields`, `Footer.weights` is renamed to `ConsensusFooterFields.bandwidth_weights`, `SignatureGroup` contains `DirectorySignaturesHashesAccu` instead of hash fields, `RouterStatus.weight` contains the new `RelayWeightsItem`. ([!3985], [!3991]) - In `tor-netdoc`, many undocumented features were removed, and various public APIs have been reworked or removed. - In `tor-chanmgr`, the Error type has been refactored; the `ChannelBuild` variant has been renamed to `Connect`, its members have changed, and `Proxy` has been removed. ([!3932]) - In `tor-config`, `resolve_return_results` now takes a `ConfigResolveOptions`. ([!4001]) - In `tor-dirclient`, our methods take `RequestBody` instead of `String. ([!3924]) - In `tor-keymgr`, `KeystoreEntryResult` was removed. ([!3997]) - In `tor-proto`, `CIRCUIT_BUFFER_SIZE` is no longer public. ([!4009]) - In `tor-rtcompat`, the `NetStreamProvider` trait has a new `ListenOptions` associated type, the `NetStreamProvider::listen()` trait method requires an additional argument, and the `Runtime` trait requirements has changed. ([!3957]) - In `tor-key-forge`, `KeygenRng` now has `Rng` as a supertrait. - In `tor-config`, `ResolutionResults` is no longer `UnwindSafe` or `RefUnwindSafe`. - In `tor-ptmgr`, `PtMgr::new` and `PtMgr::reconfigure` APIs have changed. ### Relay development - New `tor-dirpublish` crate for documents that need to be uploaded to multiple places. ([#2499], [!3924]) - Fixed a bug causing Arti to miscalculate SRV lifetimes in test networks configured to use a voting interval != 1h. ([#2458], [#2522], [!2458]) - Added a bare-bones metrics exporter and related configuration. ([!3980]) - Reworked the key management task to function as a reactor, and to read the ntor key lifetime and grace period from the consensus. ([#2548], [!3919], [!4028]) - Added logging and tests for DESTROY and TRUNCATE cell handling. ([!4008]) - Updated the spec to reflect the changes we are making to DESTROY and TRUNCATE handling. ([torspec!490]) ### Directory authority development - Added a note on how votes are computed. ([!3963]) - In `tor-netdoc`, the `encode` feature is now deprecated; the functionality is now available without enabling a cargo feature. Various empty, undocumented features have been removed. ([#2942], [!3972]) - Added a new implementation for parsing signature items, and improved the document hashing logic. ([!3937]) - Completed the vote preamble and authority section enough for consensus calculations. ([!3948]) - Updated docs and derived various traits for many `tor-netdoc` types, in preparation for implementing router descriptor parsing. ([!3959]) - Added new elliptic curve certificates types that can be encoded in router descriptors. ([!3939]) - Implemented encoding for referenced doc digest in rs entries. ([!3989]) - Added new `bandwidth`, `family_cert`, `master_key_ed25519` fields to `RouterDesc`. ([!4005], [!4007], [!4002]) - Implemented most of the remaining structural parts of `NetworkStatus`. ([!3985]) - `CertifiedKey` and `UnrecognizedKey` now derive `Eq` and `PartialEq`. ([!4021]) - Added support for encoding the `w` line in routerstatus. ([!3991]) - Added support for encoding votes' `m` items. ([!3998]) ### RPC development - Assigned appropriate `ClientErrorAction`s to a number of new `std::io::ErrorKind`s. ([!3945]) - The `TorClient` constructors now return `Arc`, which will enable our RPC implementation to hold weak references to it. ([#2469], [!3990]) - Configuration refactoring, in preparation for future RPC-related configuration changes. ([#2533], [!3979], [!4001]) ### Documentation - Clarified documentation for the `raw_entry_id()` API in `tor-keymgr`. ([f60f19db]) - Removed outdated references to the old `RawCellStream` API. ([!4036]) ### Infrastructure - Updated our `build-repro` CI job to use Rust 1.95. ([!3968]) - Temporarily disabled the (currently broken) `cargo-fuzz` test in CI. ([!3984]) - Enabled `RUST_BACKTRACE` for all CI jobs. ([!3999]) ### Cleanups, minor features, and bugfixes - Resolved various internal TODOs that were previously blocked on updating our MSRV. ([!3943]) - Updated a TODO comment to mention the MSRV required to fix it. ([59c89908866e6b55]) - Updated dependencies. ([!3960]) - Updated to the latest list of Tor fallback directories. ([!3964]) - Updated `fslock-guard` to use the `File::lock` API introduced in Rust 1.89, and migrated all our crates to use it instead of `fslock`. ([#2106], [!3954]) - Deduplicated the hex encoding logic of two of our byte-array types. ([!3947]) - Set the optimization level for `num-bigint-dig` to 2 for our `dev` builds, speeding up our former slowest test case by a factor of 20. ([!3973]) - Internal error handling refactoring in the `BeginStream` implementation of the circuit reactor. ([!3975]) - Upgraded our [`rand`] dependency to 0.10. ([!3969], [!3987]) - Worked around a clippy bug wrongly reporting some functions as unreachable. ([!3982]) - Connection failures are no longer all reported as proxy errors. ([#2459], [!3932]) - Replaced a clippy expectation with an `allow`, to resolve a warning. ([!3983]) - In `tor-netdoc`, the `Constructor` macro now enforces non-exhaustiveness. ([!3986]) - Upgraded our [`metrics`] dependency to 0.24.6. ([!3992]) - Fixed bug causing the `fs-mistrust` tests to fail on systems with musl libc. ([!3996]) - Upgraded our [`enumset`] dependency to 1.1.13. ([!4004]) - Removed several unused raw key entry APIs from `tor-keymgr`. ([!3997]) - Fixed a bug where arti failed to check for clock stalls/jumps before performing congestion window updates. ([#2504], [!3967]) - In `tor-proto`, we now determine the stream inbound message queue capacity at runtime, based on what type of flow control we negotiated. ([#2536], [!3981], [!4009]) - Added support for setting socket buffer sizes (`SO_SNDBUF` and `SO_RCVBUF`), and updated `arti` to use 128 KB socket buffers for its proxy sockets. ([#2500], [!3957]) - Removed support for running without the protocol support required by the consensus. ([#1960], [!3995]) - Fixed cancellation safety issue in `get_or_launch(). ([#1716], [!3946]) - When launching a managed PT proxy, we now include the setting for `outbound_proxy` in its environment. ([!4017]) - Fixed a couple of clippy warnings. ([!4019]) - Refactored `TorClient` into a typestate, which will make it easier to verify that we aren't connecting to the network when we aren't bootstrapping, that bootstrap-only functionality is not accidentally allowed on an unboostrapped client, and will enable us to reconfigure additional options on not-yet-running clients. ([!4011]) - We no longer use `futures_codec` as an alias for `asynchronous_codec`. ([#1690], [!4026]) - `fslock-guard` now uses the `windows-sys` crate instead of `winapi`, which is unmaintained. ([!3974]) - `KeystoreEntry::new()` is now available as an experimental api in `tor-keymgr`. ([!3288]) - `fslock-guard` now has custom code for handling file locking on Android, to work around it not being supported yet by the standard library APIs. ([#2544], [!4030]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Aaron Dewes, Andrew Kloet, Boris Nagaev, Neel Chauhan, Nihal, syphyr. Also, our deep thanks to the [Bureau of Democracy, Human Rights, and Labor], and our [other sponsors] for funding the development of Arti! [!2458]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2458 [!3288]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3288 [!3919]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3919 [!3924]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3924 [!3925]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3925 [!3932]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3932 [!3937]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3937 [!3939]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3939 [!3940]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3940 [!3941]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3941 [!3943]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3943 [!3945]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3945 [!3946]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3946 [!3947]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3947 [!3948]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3948 [!3954]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3954 [!3957]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3957 [!3959]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3959 [!3960]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3960 [!3963]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3963 [!3964]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3964 [!3966]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3966 [!3967]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3967 [!3968]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3968 [!3969]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3969 [!3972]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3972 [!3973]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3973 [!3974]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3974 [!3975]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3975 [!3976]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3976 [!3978]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3978 [!3979]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3979 [!3980]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3980 [!3981]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3981 [!3982]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3982 [!3983]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3983 [!3984]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3984 [!3985]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3985 [!3986]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3986 [!3987]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3987 [!3989]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3989 [!3990]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3990 [!3991]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3991 [!3992]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3992 [!3995]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3995 [!3996]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3996 [!3997]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3997 [!3998]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3998 [!3999]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3999 [!4001]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4001 [!4002]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4002 [!4003]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4003 [!4004]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4004 [!4005]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4005 [!4007]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4007 [!4008]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4008 [!4009]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4009 [!4010]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4010 [!4011]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4011 [!4014]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4014 [!4017]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4017 [!4019]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4019 [!4021]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4021 [!4026]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4026 [!4028]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4028 [!4030]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4030 [!4036]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/4036 [#1690]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1690 [#1716]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1716 [#1960]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1960 [#2106]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2106 [#2195]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2195 [#2419]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2419 [#2458]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2458 [#2459]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2459 [#2469]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2469 [#2482]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2482 [#2499]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2499 [#2500]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2500 [#2504]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2504 [#2505]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2505 [#2522]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2522 [#2533]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2533 [#2536]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2536 [#2544]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2544 [#2548]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2548 [#2942]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2942 [#966]: https://gitlab.torproject.org/tpo/core/arti/-/issues/966 [59c89908866e6b55]: https://gitlab.torproject.org/tpo/core/arti/-/commit/59c89908866e6b55eea158aeae05493a3ee424d6 [Bureau of Democracy, Human Rights, and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [`enumset`]: https://crates.io/crates/enumset [`metrics`]: https://crates.io/crates/metrics [`rand`]: https://crates.io/crates/rand [be10d98832cb5ff1]: https://gitlab.torproject.org/tpo/core/arti/-/commit/be10d98832cb5ff160fddd1c4e9533c102dc0a4c [f60f19db]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f60f19dbb928b74b70fd6b1c6fe8f63d580db4f6 [other sponsors]: https://www.torproject.org/about/sponsors/ [torspec!490]: https://gitlab.torproject.org/tpo/core/torspec/-/merge_requests/490 # Arti 2.3.0 — 7 May 2026 Arti 2.3.0 continues development on relay, directory authority, and RPC functionality. It also adds a couple new logging-related features, including the ability to log to syslog. We have also made improvements in memory usage, by moving the GeoIP database out of the heap and optimizing the format it's stored in. Users of the `arti-client` crate should note that in the release following this one, `TorClient` will be explicitly wrapped in an `Arc`, rather than implicitly having Arc-like semantics. Be prepared for this breaking change next release, and feel free to comment in [#2469] if you have any thoughts on this change. As usual, there are also many small changes and improvements which are detailed below. ### Breaking changes * The minimum MacOS version supported by Arti is now 10.14, rather than 10.12. (!3920) ### Breaking changes in lower-level crates * Removed `KeystoreItem::into_erased()` method from `tor-key-forge`. ([!3863]) * Many breaking changes in `tor-netdoc`: * Renamed `ItemEncoder::object()` to `.object_bytes()`. ([!3826]) * Renamed `AuthCertUnverified::verify_self_signed()` to `.verify()`. ([!3826]) * `Microdesc::ed25519_id` is now stored as a `Ed25519IdentityLine`. ([!3797]) * `Microdesc::family_ids` is now stored as a `RelayFamilyIds`. ([!3797]) * `Microdesc::ntor_onion_key` is now stored as a `Curve25519Public`. ([!3797]) * `PortRange`'s fields are now private. ([!3797]) * Removed `types::B64::into_array`; use methods on `Vec` and slice instead. ([!3870]) * `types::Nickname` and `FromStr` error types are now `InvalidNickname`. ([!3886]) * Changed several field types in `DirSource`. ([!3892]) * `netstatus::Preamble.consensus_method` and `.published` are now 1-element tuples. ([!3864]) * Renamed `VoteRepr` relay flags handling marker type to `NoImplicitRepr` ([!3864]) * `doc::netstatus::Preamble` has new `known_flags` field. ([!3864]) * Renamed `ConsensusVoterInfo` to `ConsensusAuthorityEntry`. ([!3892]) * Changed several field types in `ConsensusVoterInfo`. ([!3892]) * `NormalItemArgument` no longer has `FromStr` and `Display` as supertraits. ([!3923]) * Changed `Unknown::as_ref` signature, `.only_known()` may need to be used by some callers. ([!3923]) * In `tor-rpcbase`: * Renamed `Context::release_owned` to `Context::release`. ([!3883]) * `invoke_rpc_method` no longer takes an `Object`. ([!3883]) * `Context::release` returns a `bool` instead of an `Object`. ([!3883]) * In `tor-geoip`: * The legacy geoip database format is enforced more strictly. ([!3900]) * `new_from_legacy_format` takes an extra argument to determine whether to include ASN data. ([!3900]) * In `tor-rtcompat`, if the application fails to install a rustls `CryptoProvider`, `tor-rtcompat` no longer installs one itself. ([!3857]) ### Relay development * `arti-relay` now supports generating and rotating ntor keys. ([!3850], [!3874]) * `arti-relay` now retrieves the signing key certificate from the keystore, instead of regenerating it. ([!3863]) * Added support for handling `CREATE_FAST` cells and launching circuits. ([!3846], [!3869]) * `arti-relay` now logs public keys on startup. Note that this behaviour may be removed in the future. ([!3882]) * Enabled `flowctl-cc` and `counter-galois-onion` features in low-level crates used by `arti-relay`. ([!3898]) ### Directory authority development * Implemented encoding and signing of directory authority key certificates. ([!3826], [!3851]) * Implemented microdescriptor. ([!3797]) * Implemented `ContactInfo` parsing. ([!3866]) * Added `Hostname` and `InternetHost` types to `tor-netdoc`. ([!3886]) * Implemented encoding for `netstatus::Preamble`, added `known_flags`, and cleaned up APIs. ([!3864]) * Added types for router descriptors. ([!3908]) * Added `EmbeddedCert` type to represent a certificate inside a netdoc, which has been verified as having a correct and timely signature. ([!3918], [!3922]) * Implemented parsing and encoding of authority sections in votes and consensuses. ([!3892]) * Enforced that descriptors only have a `sha1` or a `sha2` hash, not both. ([!3917]) * Improved handling of unknown keywords. ([!3923]) * Cleaned up type for directory signature hash algorithm. ([!3923]) ### RPC development * Added APIs for inspecting tunnel paths. ([!3888]) * Added support for [weak references]. ([!3883]) ### Logging development * Arti now supports logging to syslog when the `syslog` feature and the new `logging.syslog` config option are enabled. ([!3817]) * Added `logging.protocol_warnings` option to make protocol violations warnings. ([!3805]) ### Testing * Added onion services to chutney tests. ([!3858]) * Fixed downloading of test data in `tor-netdoc`. ([!3861]) * Fixed timing in `test_rotation_link_key` test. ([!3873]) * Reverted some non-default parameters for C Tor in shadow integration tests. ([!3871]) * Enabled `flowctl-cc` and `counter-galois-onion` in `arti-extra` build. ([!3889]) * Added relay channel handshake tests. ([!3853]) * Added flake8 exceptions for `flake8-type-checking` extension. ([!3749]) ### Documentation * Documented policies around cargo features. ([!3799]) * Begun documenting policy for upstream RUSTSEC issues. ([!3800]) * Updated oniux version on website. ([!3840]) * Adjusted the ordering of some steps in the release process. ([!3842]) * Documented use of `ADDED` instead of `MODIFIED` in semver files. ([!3852]) * Removed outdated references to `derive-adhoc`, which has been named `derive-deftly` for a while now. ([!3896]) * Added documentation about overlapping work in `CONTRIBUTING.md`. ([!3934]) * Documented how to update OSX SDK version. ([!3921]) ### Infrastructure * `maint/cargo-sort` now uses the `$CARGO` env var. ([!3842]) * Added `maint/dependencies-bodge` crate to entice cargo to avoid some broken versions of upstream packages. ([!3838]) * Commit hooks now use `set -x` instead of `echo`. ([!3847]) * Updated CI image versions. ([!3839]) * Updated chutney version. ([!3868]) * Updated the OSX SDK used for reproducible builds, switching to the same pkg file used by Tor Browser. ([!3901]) * Disabled worker spinning and cpu pinning in shadow tests, in order to play more nicely with the shared CI environment. ([!3911]) ### Cleanups, minor features, and bugfixes * Switched default crypto provider to `aws-lc-rs` from `ring`. ([!3857]) * Reduced geoip database memory usage. ([!3895], !3900) * Added new `tor-geoip` tool for converting between geoip database formats. This is currently for internal use, and is expected to be merged into the existing `geoip-db-tool` eventually. ([!3909]) * Updated dependencies. ([!3835], [!3836], [!3837], [!3855], [!3880], [!3893], [!3913], [!3942], [!3928]) * Cleaned up relay channel authentication related code. ([!3802]) * Updated list of `maint/cargo-audit` exceptions. ([!3841]) * `tor-proto`'s dependency on `tor-relay-crypto` is now optional. ([!3848]) * Changed uses of `SystemTime::now` and `Instant::now` to use `SleepProvider` methods in some places. ([!3845]) * Use `derive-deftly` string templating in `tor-netdoc`. ([!3854]) * Allow sending `DATA` cells on closed streams. ([!3824]) * Changed "removing circuit leg" log to be debug instead of warn. ([!3859]) * Switched to new `derive-deftly` `meta_quoted rigorous` in `tor-netdoc`. ([!3856]) * Changed `CircuitClosed` error to `NotConnected` in a case where it may be dropped without explicitly being closed. ([!3825]) * Added `memquota::Account::add_parent()` API and changed `tor-proto` to use it. ([!3829]) * Fixed `tor-netdoc` parsing and encoding macros generating invalid code. ([!3862]) * Fixed incorrect help text for `arti -h`. ([!3860]) * Implemented `NormalItemArgument` for `IpAddr` in `tor-netdoc`. ([!3867]) * Changed `AuthLogDigest` to use separate types for sending and receiving. ([!3844]) * Added tunnel IDs to some log statements. ([!3872], [!3875]) * Removed superfluous `clippy(allow)`s. ([!3904], [!3944]) * Fixed new warnings when compiling with Rust 1.95. ([!3902]) * Added additional validation when creating a `ChanTarget`. ([!3843]) * Changed channel reactor to take identity keys. ([!3877], [!3897]) * Cleaned up base64/base16 related code. ([!3870], [!3908]) * Fixed error type when trying to parse invalid `NormalItemArgument` in `tor-netdoc`. ([!3879]) * Fixed bug in flow control sidechannel mitigation. ([!3884]) * Switched to new `derive-deftly` `meta_quoted rigorous` for key specifiers. ([!3891]) * Cleaned up `tor-netdoc` derive macros. ([!3887]) * Removed dummy suffixes from a couple variable names. ([!3903]) * Changed some comments and variable names. ([!3865]) * Added support for `#[deftly(netdoc(skip))]` in `ItemValueParseable` and `ItemValueEncodable` derives. ([!3890]) * Added `Debug` implementation to `ItemValueParseable` derive. ([!3881]) * Sorted ntor keys by `valid_until` and created new struct to hold them. ([!3899]) * Cleaned up feature flags in `tor-netdoc`, adding new `incomplete` feature for all incomplete parts. ([!3910], [!3915], [!3930]) * Modified handling of `EXTEND2` to reject cells that target the previous hop. ([!3906]) * Added `RsaIdentity::to_bytes` method. ([!3916]) * Made a `derive(Deftly)` unconditional. ([!3929]) * Added `serde(default)` to fields in `RelayIds`. ([!3933]) * Begun refactoring `tor-dirserver`. ([!3931]) * Stabilized experimental `tor-cert` `encode` feature. ([!3926]) * Stabilized experimental `tor-netdoc` `hsdesc-inner-docs` feature. ([!3927]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Andrew Kloet, hjrgrn, and moumenalaoui. Also, our deep thanks to the [Bureau of Democracy, Human Rights, and Labor], and our [other sponsors] for funding the development of Arti! [!3749]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3749 [!3797]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3797 [!3799]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3799 [!3800]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3800 [!3802]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3802 [!3805]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3805 [!3817]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3817 [!3824]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3824 [!3825]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3825 [!3826]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3826 [!3829]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3829 [!3835]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3835 [!3836]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3836 [!3837]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3837 [!3838]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3838 [!3839]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3839 [!3840]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3840 [!3841]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3841 [!3842]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3842 [!3843]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3843 [!3844]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3844 [!3845]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3845 [!3846]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3846 [!3847]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3847 [!3848]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3848 [!3850]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3850 [!3851]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3851 [!3852]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3852 [!3853]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3853 [!3854]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3854 [!3855]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3855 [!3856]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3856 [!3857]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3857 [!3858]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3858 [!3859]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3859 [!3860]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3860 [!3861]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3861 [!3862]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3862 [!3863]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3863 [!3864]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3864 [!3865]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3865 [!3866]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3866 [!3867]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3867 [!3868]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3868 [!3869]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3869 [!3870]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3870 [!3871]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3871 [!3872]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3872 [!3873]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3873 [!3874]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3874 [!3875]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3875 [!3877]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3877 [!3879]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3879 [!3880]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3880 [!3881]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3881 [!3882]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3882 [!3883]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3883 [!3884]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3884 [!3886]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3886 [!3887]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3887 [!3888]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3888 [!3889]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3889 [!3890]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3890 [!3891]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3891 [!3892]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3892 [!3893]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3893 [!3895]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3895 [!3896]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3896 [!3897]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3897 [!3898]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3898 [!3899]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3899 [!3900]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3900 [!3901]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3901 [!3902]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3902 [!3903]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3903 [!3904]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3904 [!3906]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3906 [!3908]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3908 [!3909]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3909 [!3910]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3910 [!3911]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3911 [!3913]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3913 [!3915]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3915 [!3916]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3916 [!3917]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3917 [!3918]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3918 [!3921]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3921 [!3922]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3922 [!3923]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3923 [!3926]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3926 [!3927]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3927 [!3928]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3928 [!3929]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3929 [!3930]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3930 [!3931]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3931 [!3933]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3933 [!3934]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3934 [!3942]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3942 [!3944]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3944 [#2469]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2469 [Bureau of Democracy, Human Rights, and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [other sponsors]: https://www.torproject.org/about/sponsors/ [weak references]: https://gitlab.torproject.org/tpo/core/arti/-/blob/993a8158407dc3c2c1d759c1b0bb4c8554f5a4a1/doc/dev/rpc-book/src/basic-concepts.md#strong-and-weak-object-ids # Arti 2.2.0 — 30 March 2026 Arti 2.2.0 continues our work on relay development, and brings us even closer to a working middle relay. This release also adds some useful client-side features, and includes various bugfixes and cleanups, all listed below. ### Breaking changes ### Security fixes - Fixed a low-severity issue where, if an application embedding arti also included the `weak-table` crate, and that application built `weak-table` with `ahash` enabled, the application would be somewhat less DoS-resistant when running on applications without hardware AES support. ([#2412], [!3801], [TROVE-2026-005]) ### Major features - The `http-connect` feature, which enables arti to run as an HTTP CONNECT proxy, is now stable. ([#2409], [!3811]) - Clients now support outbound HTTP CONNECT proxies. (Previously, they only supported outbound SOCKS proxies.) ([!3789]) ### Breaking changes in lower-level crates - Removed `IoErrorExt` and `BinaryHeapExt` from `tor-basic-utils`. Both of these traits implemented functionality that is now available in the standard library. ([074072ad66bf35e1]) - In `tor-netdoc`, renamed some `*Signed` types to `*Unverified`, to avoid ambiguity. ([9018c73d34ca60c5]) - In `tor-dirclient`, renamed `DirResponse::from_body` to `from_get_body`. ([04e8874058966f45]) - In `tor-keymgr`, replace `KeySpecifier::has_certificate` with usage of the new `CertSpecifier` macro. ([efa1e2540f9c23c5]) - Throughout all crates, all APIs that used to accept or return an `Instant` now accept or return a `web_time::Instant` when built on the `wasm32-unknown-unknown` target. ([!3820]) ### Relay development - Continued development on channel authentication handshakes. Relays can now successfully accept incoming TLS connections, and authenticate to clients and other relays. ([#2388], [!3732], [!3736], [!3745], [!3773], [!3791], [!3795]) - Relay channels now do a better job tracking the actual addresses of their peers. ([#2375], [!3722]) - Continued development on improved directory object parsing and verification, with a focus on signature handling and generation. ([!3742], [!3765]) - Continued development on directory cache operation, including migration to a less complex backend, and database improvements. ([!3664]) - Changed TLS certificate to use RSA2048 subject keys, to work around [a bug in the C tor implementation][tor#41226]. ([#2403], [!3769]) - Improved and refactored key-manager operations for better handling of relay certificates and related keys. ([#2376], [#2377], [!3770], [!3754], [!3785]) - Use our key manager to manage relay certificates. ([#2404], [!3782]) - Switched to a [forked version of `ssh-key`] with workarounds and bugfixes needed to support some legacy key types. ([#2398], [!3783]) - The directory client logic now supports requesting "extra-info" documents. ([!3764]) - Maintain a list of unauthenticated channels from clients and bridges. ([!3790]) - Extended circuit logic to accommodate differences between relays' and clients' views of half-open streams and timeout estimation. ([#2410], [!3794]) - Improved the ergonomics for various relay-visible logs. ([!3776], [!3803], [!3806], [!3807]) - API preparation for handling CREATE2 and CREATE_FAST cells. ([!3809]) - Backend logic for consensus diff generation, based on the [`imara-diff`] crate. ([!3712], [!3815]) - Forward outbound RELAY_EARLY cells correctly. ([#2417], [!3810]) - Use correct memory quota buckets when extending circuits. ([!3821]) ### RPC development - The RPC client library (`arti-rpc-client-core`) now supports non-blocking requests, and integration with application event loops. As with the rest of the RPC client library, this code has APIs wrappers in Rust, C, and Python, and Python integration tests. ([#1856], [!3652], [!3762], [!3771], [!3774]) - The RPC system now supports "superuser" capabilities, which applications can use to change and observe parts of Arti that affect the entire system (and not only the application's own traffic). ([#2285], [!3743]) ### Testing - Python tests are now more robust to [`mypy` issue 20962]. ([!3744]) - Our chutney-based test scripts have been converted to Python, for better integration with the rest of [chutney]. ([!3735], [!3756]) - Fixed a bug in our chutney benchmark tests where we would use the wrong binary. ([!3758]) - Revised testing infrastructure for `keymgr` code. ([!3761]) - Clarifications, cleanups, and renamings in the sub-command integration test suite. ([!3827]) ### Documentation - Removed or softened various warnings about the security limitations of earlier versions of Arti. ([#2000], [#2063], [!3748], [!3812]) - Removed an obsolete version of our roadmap. ([a3bb97e945addd2e]) - Improved internal documentation concerning what it means for a directory request to be "anonymized". ([!3767]) - Our consensus flag documentation now links to the specs. ([!3768]) - Describe the correct configuration file path on Windows. ([#2422], [!3808]) ### Infrastructure - Report better results from failing shadow CI runs. ([!3766]) - Enabled more features in our CI testing builds. This will help us test more experimental features before they stabilize. ([!3772], [!3759]) ### Cleanups, minor features, and bugfixes - Added an internal `MaybeSensitive` for wrapper for objects that are _conditionally_ risky log. ([501ba52b79814425]) - Allow use of now-deprecated `UnboundedReceiver::try_next()` in tests. ([800a47ea1203d87e]) - Increased required versions of various dependencies. ([!3746]) - Arti now builds with a broader range of versions of `libsqlite3-sys`. This should make it easier to embed Arti in environments that require specific versions. ([#1740], [!3706]) - Empty directory responsees are now treated as an error. ([!3650]) - Upgrade to the latest [`polyval`] crate, to improve [CGO] performance. ([#2390], [!3747]) - Added a `RelayDetails::is_flaged_exit()` method to help applications tell whether a relay has the `Exit` flag. ([!3752]) - Improved cross compilation on systems without a C compiler. ([#2366], [!3778]) - Fix compilation warnings on Windows. ([!3780]) - Various typo and grammar fixes. ([!3781], [!3792]) - Fix a bug in certificate expiry time calculation, which would make our unit tests fail if run during the first second of an hour. ([#2407], [!3787]) - Update to the latest GeoIP database. ([!3813]) - Refactored retry_error logic. ([!3784]) - Simplified some of the feature-gating in tor-proto. ([!3796]) - Fixed unusable duration formatting in tor-guardmgr's log messages. ([!3804]) - Arti now builds with fewer warnings and errors on the wasm32-unknown-unknown platform. (This is meant to help people who would like to experiment with wasm ports.) ([!3814], [!3816], [!3818], [!3819]) - Include a compatibility layer for using web_time on the wasm32-unknown-unknown platform. ([#2356], [!3820]) ### Acknowledgments Thanks to everybody who's contributed to this release, including hjrgrn, HydroxideUnlaced, Nihal, and Tobias Stoeckmann. Also, our deep thanks to the [Bureau of Democracy, Human Rights, and Labor], and our [other sponsors] for funding the development of Arti! [!3650]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3650 [!3652]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3652 [!3664]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3664 [!3706]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3706 [!3712]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3712 [!3722]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3722 [!3732]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3732 [!3735]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3735 [!3736]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3736 [!3742]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3742 [!3743]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3743 [!3744]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3744 [!3745]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3745 [!3746]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3746 [!3747]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3747 [!3748]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3748 [!3752]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3752 [!3754]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3754 [!3756]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3756 [!3758]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3758 [!3759]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3759 [!3761]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3761 [!3762]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3762 [!3764]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3764 [!3765]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3765 [!3766]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3766 [!3767]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3767 [!3768]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3768 [!3769]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3769 [!3770]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3770 [!3771]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3771 [!3772]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3772 [!3773]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3773 [!3774]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3774 [!3776]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3776 [!3778]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3778 [!3780]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3780 [!3781]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3781 [!3782]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3782 [!3783]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3783 [!3784]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3784 [!3785]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3785 [!3787]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3787 [!3789]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3789 [!3790]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3790 [!3791]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3791 [!3792]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3792 [!3794]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3794 [!3795]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3795 [!3796]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3796 [!3801]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3801 [!3803]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3803 [!3804]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3804 [!3806]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3806 [!3807]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3807 [!3808]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3808 [!3809]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3809 [!3810]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3810 [!3811]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3811 [!3812]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3812 [!3813]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3813 [!3814]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3814 [!3815]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3815 [!3816]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3816 [!3818]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3818 [!3819]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3819 [!3820]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3820 [!3821]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3821 [!3827]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3827 [#1740]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1740 [#1856]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1856 [#2000]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2000 [#2063]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2063 [#2285]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2285 [#2356]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2356 [#2366]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2366 [#2375]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2375 [#2376]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2376 [#2377]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2377 [#2388]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2388 [#2390]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2390 [#2398]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2398 [#2403]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2403 [#2404]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2404 [#2407]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2407 [#2409]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2409 [#2410]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2410 [#2412]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2412 [#2417]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2417 [#2422]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2422 [04e8874058966f45]: https://gitlab.torproject.org/tpo/core/arti/-/commit/04e8874058966f45a08558dc78b941ab7edc9b6b [074072ad66bf35e1]: https://gitlab.torproject.org/tpo/core/arti/-/commit/074072ad66bf35e170bd3ce467aad6a6097e24be [501ba52b79814425]: https://gitlab.torproject.org/tpo/core/arti/-/commit/501ba52b79814425958176948610f863df3ee0e0 [800a47ea1203d87e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/800a47ea1203d87e739b99b4a786ca9bee5f53a3 [9018c73d34ca60c5]: https://gitlab.torproject.org/tpo/core/arti/-/commit/9018c73d34ca60c5f671eeafc540446864998941 [Bureau of Democracy, Human Rights, and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [CGO]: https://blog.torproject.org/introducing-cgo/ [TROVE-2026-005]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2418 [`imara-diff`]: https://crates.io/crates/imara-diff [`mypy` issue 20962]: https://github.com/python/mypy/issues/20962 [`polyval`]: https://crates.io/crates/polyval [a3bb97e945addd2e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/a3bb97e945addd2e4451e248b3b838e6c5af085c [chutney]: https://gitlab.torproject.org/tpo/core/chutney [efa1e2540f9c23c5]: https://gitlab.torproject.org/tpo/core/arti/-/commit/efa1e2540f9c23c587816a163d478b1bf4172b48 [forked version of `ssh-key`]: https://crates.io/crates/ssh-key-fork-arti [other sponsors]: https://www.torproject.org/about/sponsors/ [tor#41226]: https://gitlab.torproject.org/tpo/core/tor/-/issues/41226 # Arti 2.1.0 — 2 March 2026 Arti 2.1.0 continues work on relay development, and introduces a new RPC backend with non-blocking IO in the `arti-rpc-client-core` library. In addition, this release increases our MSRV (Minimum Supported Rust Version) to 1.89, in accordance with our [MSRV policy]. As usual, there are also various under-the-hood improvements and bug fixes, which are documented below. ### Breaking changes - Arti now requires Rust 1.89 or later. ([!3684]) ### Security fixes - Upgraded our [`bytes`] dependency to 0.11.1 to avoid undefined behavior due to integer overflow in `BytesMut::reserve()`. ([TROVE-2026-001], [RUSTSEC-2026-0007], [!3645]) - Upgraded our [`keccak`] dependency to 0.1.6 to avoid potential undefined behavior caused by incorrect assembly on ARMv8. ([#2354], [!3682]) - Upgraded our [`time`] dependency to 0.3.47 to avoid a cargo-audit warning caused by [RUSTSEC-2026-0009]. ([#2341], [!3658], [!3684]) ### Network updates - Updated to the latest list of Tor fallback directories. ([!3688]) ### Deprecated functionality - In `arti`, the `derive-deftly` feature is deprecated (its `derive-deftly` dependency is now unconditional). ### Breaking changes in lower-level crates - In `arti-client`, `StorageConfigBuilder::cache_dir()` and `StorageConfigBuilder::state_dir()` now take a `CfgPath` instead of an `Into` type. - In `tor-rtcompat`, the `TlsStream` trait now returns certificates as `Cow`, not `Vec`. ([#2331], [!3619]) - In `tor-proto`, `ChannelProvider::get_or_launch()` is no longer `async`. ([!3647]) - In `tor-proto`, `ChanBuilder::new()` was replaced with `ChanBuilder::new_client()` - In `tor-proto`, `ClientSyncView` was replaced by the new `CircHopSyncView`, and `ChannelBuilder`, `VerifiableChannel`, and `FinalizableChannel` were removed. - In `arti-rpc-client-core`, the `llconn` module has been removed. - In `tor-chanmgr`, `ChanMgr::new()` now returns a `Result`. - In `tor-rpc-connect`, `client::Connection` no longer type-erases the streams it returns. - In `tor-relay-crypto` the `KeySpecifier` types now implement `Copy`. - In `tor-hsproxy`, `ProxyRuleListBuilder` and `ProxyConfigBuilder` no longer derive `Eq` and `PartialEq`. ### Relay development - Added a new `RelayClient` object for building circuits for self-reachability testing. ([!3639]) - Internal refactoring to support instructing the backward circuit reactor to send any kind of relay message. ([!3641]) - Refactored the relay channel types to better leverage the type system. ([!3642]) - The circuit reactor now handles `EXTEND2` cells, and is now able to extend circuits. ([#1447], [#2339], [!3648], [!3674]) - The `ChanMgr` now supports building relay channels. ([!3661]) - The circuit reactor is now able to forward cells towards the client. ([#2345], [!3666]) - `AbstractChannelFactory::BuildSpec` now has a `HasAddrs` bound, which will enable our channel selection functions to inspect the requested target addresses in the future. ([!3673], [!3720]) - When a `TRUNCATE` message is received, the circuit reactor now closes the circuit instead of panicking. This is a temporary measure: support for `TRUNCATE` will be added in the future. ([!3675]) - Channels now have a "canonicity" property which specifies whether the channel is [canonical]. This enables the `ChanMgr` to prefer canonical channels when selecting a channel to return. ([!3668]) - Relay responder channels now use their own TLS certificate as part of the channel handshake verification. ([!3665]) - Replaced the circuit-scoped `CircSyncView` with a new, per-hop alternative. This will enable us to reuse this type in the new per-hop stream reactor, for implementing exit support for relays. ([#2351], [!3680]) - The `KeySpecifier` derive-deftly macro now supports generating key certificate specifiers. ([#2360], [!3693]) - New certificate specifier for `KP_relaysign_ed` key. ([c4972741]) - New `tor-cert` API for creating RSA -> Ed25519 cross-certificates. ([!3701]) - Channels now have a `PeerInfo`, which consists of the verified relay identities and the actual peer address used to connect the channel. ([!3687]) - Relays now generate their keys on startup, and have a background task for rotating them before they expire. ([#1605], [!3708], [!3711], [!3713], [!3717]) - Relays now have checks preventing opening channels to themselves. ([#1699], [!3715], [!3726]) - The `ChanBuilder` now also stores the addresses advertised by relays, in order to support building `NETINFO` cells. ([!3716]) - Removed unnecessary `Option`s in `VerifiedChannel`, and improved the related debug messages. ([!3718]) - Relay responder channels now use `CircIdRange::Low` for their circuit IDs. ([#1601], [!3714]) - Implemented the logic for building `CERTS` cells. ([!3723]) - Updated the `AUTHENTICATE` cell building logic to use the SHA256 RSA identity digest instead of the SHA1 one. ([!3725]) - Fixed bug in channel creation, where an empty vector was passed to `export_keying_material()` instead of a vector filled with zeroes. ([!3726]) - Relays now use the `debug_report!` macro to produce better logs on channel creation failure. ([!3728]) ### RPC development - New nonblocking backend for `arti-rpc-client-core` crate. ([#1856], [!3644]) ### Testing - Added an exception for `async-io` in our `downgrade-dependencies` script, to fix an intermittent test failure. ([#1168], [!3660]) - Added more tests for `ChanMgr::get_or_launch()` to ensure that when there are two channel requests with the same identities and different socket addresses, we return the same channel. ([#2344], [!3676]) - New tests for `arti hsc` subcommand. ([!3636]) ### Documentation - The `oniux` usage docs now use `oniux` 0.8.1. ([!3637], [!3655]) - Documented the retriability of `RequestError`s. ([!3649]) - Added missing documentation for a private field, fixing a clippy warning. ([!3640]) - All crates now set `package.metadata.docs.rs.all-features` to `true` in their Cargo.toml. ([#2307], [!3656]) - In `tor-config`, added an example to the `resolve_option_general` docs. ([!3694]) - Updated the protocol support and compatibility based on the current state of Arti. ([#2194], [!3724]) ### Infrastructure - In CI, the `check-editorconfig` job now uses `editorconfig-checker` version 3.6.1. ([!3634]) - New `maint` script for checking if all `publish = true` crates configure what features to document on docs.rs. ([d4d7f9f1]) - Our release process now requires the `semver.md` files to be deleted before unfreezing the tree. ([!3635], [!3683]) - Updated our MSRV policy to only allow bumping the MSRV to a release that is at least 7 months old. ([#2131], [!3689]) - The `cargo-audit` CI jobs are now allowed to fail on MRs with no changes to any of our `Cargo.lock`s. ([#2367], [!3690], [!3704]) - Upgraded our [`criterion`] and [`shellexpand`] dependencies to fix various nightly build failures. ([!3702], [!3709]) - Fixed bug in the Arti deb package post-installation script that would cause installation to fail on systems without a preexisting `_arti` user account. ([#2368], [!3707]) ### Cleanups, minor features, and bugfixes - Upgraded to the latest version of `rlimit`, `getrandom`, `fast-socks5`. ([!3632], [!3633], [!3638]) - Improved the help text of the `-p` and `-d` options of the `arti` binary, and updated the error handling to use standard clap error messages. ([!3628]) - Adjusted the visibility of internal `arti` CLI test helpers. ([!3624]) - Removed an outdated TODO about warning about incoming connections from local addresses. ([#2329], [8dd6708d]) - In `arti`, `CircuitClosed` errors are no longer logged as warnings. ([!3643]) - `arti` now supports augmenting the TOML configuration with path values. ([!3556]) - Added missing feature-gating in the `arti` CLI, to fix compilation when various feature combination are enabled. ([#2347], [!3670], [#2364], [!3696]) - New API for converting a base64-encoded string to an `Ed22519Identity`. ([!3667]) - Added new `ErrorSources` API for iterating over error sources. ([#2338], [!3653], [!3685]) - Added support for configuring an outbound SOCKS5 proxy for connecting to the Tor network. ([#1800], [!3681]) - Upgraded `native-tls` to fix a bug causing TLS handshake failures on MacOS. ([#2117], [!3679]) - Upgraded `native-tls` to fix build failure on iOS. ([#2363], [!3697]) - Suppressed an unused-async warning when building without the `pow` feature. ([!3699]) - Refactored the proxy launcher functions to simplify the implementation and reduce cognitive complexity. ([#2301], [!3686]) - Migrated all our configuration to the new derive-deftly based configuration macro. ([#2279], [!3691], [!3698]) - Refactored the `async-std` and `smol` `IncomingTcpStreams` implementation to use `futures::stream::unfold`. ([#2070], [!3705]) - In `tor-rtcompat`, TLS session resumption is now disabled, as per the tor specification. ([!3710]) - Added missing `#[cfg(unix)]` gating to fix `arti-rpc-client-core` builds on Windows. ([!3729]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Niel Duysters, Nihal, Nuhiat-Arefin, Robert Bartlensky, carti-it, hjrgrn, moumenalaoui, robertb, sjcobb. Also, our deep thanks to the [Bureau of Democracy, Human Rights, and Labor], and our [other sponsors] for funding the development of Arti! [!3556]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3556 [!3619]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3619 [!3624]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3624 [!3628]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3628 [!3632]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3632 [!3633]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3633 [!3634]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3634 [!3635]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3635 [!3636]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3636 [!3637]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3637 [!3638]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3638 [!3639]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3639 [!3640]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3640 [!3641]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3641 [!3642]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3642 [!3643]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3643 [!3644]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3644 [!3645]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3645 [!3647]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3647 [!3648]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3648 [!3649]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3649 [!3653]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3653 [!3655]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3655 [!3656]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3656 [!3658]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3658 [!3660]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3660 [!3661]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3661 [!3665]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3665 [!3666]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3666 [!3667]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3667 [!3668]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3668 [!3670]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3670 [!3673]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3673 [!3674]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3674 [!3675]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3675 [!3676]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3676 [!3679]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3679 [!3680]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3680 [!3681]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3681 [!3682]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3682 [!3683]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3683 [!3684]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3684 [!3685]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3685 [!3686]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3686 [!3687]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3687 [!3688]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3688 [!3689]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3689 [!3690]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3690 [!3691]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3691 [!3693]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3693 [!3694]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3694 [!3696]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3696 [!3697]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3697 [!3698]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3698 [!3699]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3699 [!3701]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3701 [!3702]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3702 [!3704]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3704 [!3705]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3705 [!3707]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3707 [!3708]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3708 [!3709]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3709 [!3710]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3710 [!3711]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3711 [!3713]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3713 [!3714]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3714 [!3715]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3715 [!3716]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3716 [!3717]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3717 [!3718]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3718 [!3720]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3720 [!3723]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3723 [!3724]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3724 [!3725]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3725 [!3726]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3726 [!3728]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3728 [!3729]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3729 [#1168]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1168 [#1447]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1447 [#1601]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1601 [#1605]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1605 [#1699]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1699 [#1800]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1800 [#1856]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1856 [#2070]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2070 [#2117]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2117 [#2131]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2131 [#2194]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2194 [#2279]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2279 [#2301]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2301 [#2307]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2307 [#2329]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2329 [#2331]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2331 [#2338]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2338 [#2339]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2339 [#2341]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2341 [#2344]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2344 [#2345]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2345 [#2347]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2347 [#2351]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2351 [#2354]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2354 [#2360]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2360 [#2363]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2363 [#2364]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2364 [#2367]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2367 [#2368]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2368 [8dd6708d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/8dd6708d9ac2f7ff9899ca44637f29b667521ada [Bureau of Democracy, Human Rights, and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [MSRV policy]: https://gitlab.torproject.org/tpo/core/arti/#minimum-supported-rust-version [RUSTSEC-2026-0007]: https://rustsec.org/advisories/RUSTSEC-2026-0007 [RUSTSEC-2026-0009]: https://rustsec.org/advisories/RUSTSEC-2026-0009 [TROVE-2026-001]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2337 [`bytes`]: https://crates.io/crates/bytes [`criterion`]: https://crates.io/crates/criterion [`keccak`]: https://crates.io/crates/keccak [`shellexpand`]: https://crates.io/crates/shellexpand [`time`]: https://crates.io/crates/time [c4972741]: https://gitlab.torproject.org/tpo/core/arti/-/commit/c497274197d18bbc59ae9aff943eb1c6ce6f49ce [canonical]: https://spec.torproject.org/tor-spec/creating-circuits.html#canonical-connections [d4d7f9f1]: https://gitlab.torproject.org/tpo/core/arti/-/commit/d4d7f9f1c6aa542f24f8abe8fe44f8f74a3ed9e1 [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 2.0.0 — 2 February 2026 Arti 2.0.0 deprecates library functionality in the `arti` crate (which should only be used as a binary), deprecates some legacy features and configuration formats, and adds support for using the `inet-auto` socket type to automatically pick an unused TCP port for the RPC server. As usual, there is also a significant amount of behind-the-scenes work on relay and directory authority functionality. While "2.0" may sound like an exciting release number, it's actually fairly mundane. [Semver](https://semver.org) requires us to bump our major version number when making breaking changes, and we had a couple breaking changes we wanted to make in order to keep our APIs tidy. The only people who should notice significant changes in this release are developers who are building applications using the `arti` crate directly, rather than the recommended `arti-client` crate or other lower-level crates. ### Breaking changes * Removed the long-deprecated `proxy.socks_port` and `proxy.dns_port` configuration options. Use `proxy.socks_listen` and `dns_listen` instead. ([!3622]) * Removed legacy syntax for specifying directory authorities. The current syntax is documented in the [example configuration]. ([!3597]) * All APIs in the `arti` crate except for `main()` are now experimental. They are only available when the crate is built with the `experimental-api` feature. These APIs are no longer covered by semver, and they are likely to be removed or moved into different crates in the future. If you use any of these APIs, please [open an issue] with your usecase, so that we can keep it in mind when choosing how to expose these APIs in other crates. ([!3586]) * Removed the deprecated `memquota` and `dialoguer` cargo features (which did nothing). * Removed the `signal-hook` and `signal-hook-async-std` cargo features, which were aliases for `async-signal`. The `async-signal` feature should be used directly. ### Breaking changes in lower-level crates * In `slotmap_careful`, `HopSlotMap` was removed, as it is deprecated in the upstream `slotmap` crate. ([!3585]) * In `tor-netdoc`, `AuthCertBuilder` and `AuthCert::builder` were deprecated. `AuthCertConstructor` should be used instead. ([!3560]) * In `tor-chanmgr` ([!3563]): * `AbstractChanMgr` now takes a `ChannelConfig` instead of a reference. * `ChanBuilder::new()` now takes an outbound channel type. * In `tor-proto` ([!3563]): * `UnverifiedClientChannel` and `VerifiedClientChannel` are no longer public. * `ClientInitiatorHandshake::connect()` and `RelayInitiatorHandshake::connect()` return a `Box`. * `ChannelProvider::get_or_launch_relay()` was renamed to `get_or_launch`, and its signature is now different. * In `tor-rtcompat` ([!3614]): * The `CertifiedConn` trait requires a new `own_certificate` method. * The `TlsProvider` trait has several new server-related members. ### Directory authority development * Changed constructor for `AuthCert`. ([!3560], [!3571]) * Implemented authority certificate management. ([!3561]) * Implemented `EncodedAuthCert`. ([!3592], [!3595]) * Made `DownloadManager` stateless. ([!3601]) ### Relay development * `ChanMgr` can now launch relay channels. ([!3563]) * Implemented `RelayResponderHandshake`. ([!3596]) * Implemented the generic and modular circuit reactor architecture described in [relay-conflux.md], and reimplemented the work-in-progress relay circuit reactor to use it as its base. In the future, this new architecture will form the basis of the client circuit reactor as well. ([!3612]) * Implemented TLS server support in `tor-rtcompat`. ([!3614]) ### RPC development * Arti now supports `inet-auto` connect points. ([!3606]) ### Testing * Eliminated use of sleep in `tor-dirserver` tests. ([!3582]) * Improved performance of `tor-dirserver` tests. ([!3591]) * Fixed flaky `request_fail_ultimately` test. ([!3598]) * Added integration tests for `arti hsc ctor-migrate` command. ([!3544], [!3623]) ### Documentation * Added link to [oniux webpage](https://arti.torproject.org/related/oniux) to Arti website. ([!3562]) * Documented directory authority key certificates in network status documents. ([!3565]) * Updated outdated reference to rxs in StreamMap docs. ([!3573]) * Documented intended behavior of `inet-auto` connect points. ([!3587]) ### Infrastructure * Added warning for using the `retain` method in the `weak_table` crate, which is buggy. ([!3574]) * Switched to `C.UTF-8` for sorting in `maint/thanks` script. ([!3588]) * Renamed all `maint/` scripts to use kebab-case. ([!3590]) * Bumped chutney version. ([!3604]) * Fixed clippy warning on non-Linux builds. ([!3611]) * Began denying `clippy::unused_async` lint. ([!3613]) ### Cleanups, minor features, and bugfixes * Refactored `IncomingStreamRequestHandler` to support relay streams. ([!3572]) * Fixed `rpc.py` script to work on Windows. ([!3576]) * Upgraded to newer versions of various dependencies. ([!3585], [!3609], [!3610]) * Fixed bug preventing log rate-limiting from working properly. ([!3593]) * Renamed `Version` to `SoftwareVersion` in `tor-netdoc`. ([!3594]) * Refactored `tor-dirserver` database module. ([!3599]) * Improved logging when accepting OR connections in `arti-relay`. ([!3602], [!3603]) * Made compression failures in `tor-dirserver` a bug, rather than a different error type, as they should never occur. ([!3605]) * Made "stream closed without END" a debug message, rather than a warning. ([!3608]) * Updated to the latest list of Tor fallback directories. ([!3615]) * Fixed panic when invalid ports are given to proxy command. ([!3621]) * Refactored `tor-rtcompat` key API. ([!3618]) * Split new `tor-cert-x509` crate out of `tor-cert`. ([!3618]) * Split new `tor-memquota-cost` crate out of `tor-memquota`. ([!3618]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Niel Duysters, carti-it, hjrgrn, and sjcobb! Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!3544]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3544 [!3560]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3560 [!3561]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3561 [!3562]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3562 [!3563]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3563 [!3565]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3565 [!3571]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3571 [!3572]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3572 [!3573]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3573 [!3574]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3574 [!3576]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3576 [!3582]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3582 [!3585]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3585 [!3586]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3586 [!3587]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3587 [!3588]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3588 [!3590]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3590 [!3591]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3591 [!3592]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3592 [!3593]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3593 [!3594]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3594 [!3595]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3595 [!3596]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3596 [!3597]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3597 [!3598]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3598 [!3599]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3599 [!3601]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3601 [!3602]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3602 [!3603]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3603 [!3604]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3604 [!3605]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3605 [!3606]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3606 [!3608]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3608 [!3609]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3609 [!3610]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3610 [!3611]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3611 [!3612]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3612 [!3613]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3613 [!3614]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3614 [!3615]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3615 [!3618]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3618 [!3621]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3621 [!3622]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3622 [!3623]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3623 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [example configuration]: https://gitlab.torproject.org/tpo/core/arti/-/blob/df5fba75c61001b07115776518f95bcb4d51681c/crates/arti/src/arti-example-config.toml#L449-484 [open an issue]: https://gitlab.torproject.org/tpo/core/arti/-/issues/new?type=ISSUE [other sponsors]: https://www.torproject.org/about/sponsors/ [relay-conflux.md]: https://gitlab.torproject.org/tpo/core/arti/-/blob/a63c96bdc62fc088affa565be61c0215830b870e/doc/dev/notes/relay-conflux.md # Arti 1.9.0 — 13 January 2026 Arti 1.9.0 continues some behind-the-scenes work on relay and directory authority development, and adds improved support for running with dynamically assigned ports. For example Arti now accepts `proxy.socks_listen = "auto"` to configure its SOCKS proxy with an operating-system-assigned port, and writes the assigned port to a structured JSON file in Arti's data directory. As usual, there are also various under-the-hood improvements and bug fixes, which are documented below. ### Major features - A value of "auto" can now be provided for Arti's listening port configuration, which allows listening on an operating-system-assigned SOCKS port. For example `proxy.socks_listen = "auto"` or `proxy.dns_listen = "127.0.0.1:auto"`. ([!3548]) - Arti's SOCKS and DNS listening ports are now published to `${ARTI_LOCAL_DATA}/public/port_info.json`. This is useful when using an "auto" port in Arti's configuration. The path to the file used to store these ports can be adjusted with the [`storage.port_info_file` configuration option][port_info_file]. The format of this file is described in [`crates/arti/src/proxy/port_info.rs`][port_info_rs]. ([!3548]) ### Deprecated functionality - Providing a listening port of "0" in Arti's configuration is now deprecated. To use an operating-system-assigned port, a value of "auto" is preferred. For example, `proxy.socks_listen = "127.0.0.1:0"` should be updated to `proxy.socks_listen = "127.0.0.1:auto"`. Note that a standalone value of "0" is still supported and means "disable"; for example `proxy.socks_listen = 0`. ([!3548]) - The `tor_config::Listen::is_localhost_only()` method is now deprecated. The new replacement is `is_loopback_only()`. ([!3469]) - The `tor_config::Listen::localhost_port_legacy()` method is now deprecated. ([!3548]) ### Breaking changes in lower-level crates - The `retry_error::RetryError` error type no longer implements the `Extend` trait. It now has an inherent `extend()` method instead. ([!3506]) - The `tor_config::InvalidListen` type is no longer public. ([!3469]) - The `tor_hsclient::InvalidTarget::{InvalidChanTargetInfo, ImpossibleRelayIds}` enum variants have been removed. ([!3530]) - The `tor_hsservice::EstablishSessionError::{ImpossibleIds,UnsupportedOnionKey}` enum variants have been removed. ([!3530]) - Various changes to types in tor-keymgr, including the removal of `KeyPathError::Unrecognized` and `CTorServicePath`, updates to `KeyMgr::describe()` and `CTorPath`, and the movement of most of `KeyPathError` into a new `ArtiPathError`. ([!3557]) - Various changes to types in tor-netdoc, including to `AuthCert` and `ItemValueParseable`. ([!3555], [!3502]) ### Onion service development - `TorClient` now has an experimental `KeyMgr` accessor, intended for use by Arti's key management CLI. ([!3442]) - Extended the `KeySpecifier` macro to implement `KeyPathInfoExtractor::describe()` for `CTorPath`s, and refactored some of Arti's key manager error handling. ([!3557]) - Refactored and deduplicated code that constructs a `CircTarget` in tor-hsservice and tor-hsclient. ([!3530]) ### Relay development - The relay circuit reactor can now handle incoming data stream requests. ([!3487]) - The `relay.advertise` fields can now accept multiple IP addresses. ([!3538]) - Refactored some message passing in tor-proto to allow `Channel`s to communicate with relay-specific circuit reactors. ([!3536]) - The developer documentation now includes design notes on Arti's relay circuit reactor and how it can support [conflux][conflux] in the future. ([!3533]) - Relays now initialize guard, circuit, and directory managers. These can be used to build circuits and download directory documents. ([!3552]) - Removed the `ARTI_RELAY_SHARED_DATA` configuration variable for arti-relay. ([!3558]) ### Directory authority development - Refactored some network document types and APIs. ([!3502], [!3511], [!3522]) - Experimental support for directory authority certificates has been added to tor-netdoc. ([!3462]) - Added download functionality to tor-dirserver. ([!3434]) - Added a derive-based network document encoder to tor-netdoc. ([!3535]) - Added some changes towards parsing the network status document preamble. ([!3550], [!3554]) - Replaced `tor_netdoc::doc::authcert::AuthCert` with a newer version. ([!3555]) ### RPC development - Arti now builds `arti-rpc-client-core` as a static library, in addition to the existing rust library and dynamic library. ([!3523]) - Fixed a JSON request example in the RPC book. ([!3527]) - When the RPC system encounters a connect file that cannot be parsed or has an unrecognized schema, the connect point is now declined rather than causing the connect attempt to abort. ([!3553]) - Fixed two RPC-related bugs: a spurious debug assertion failure in the RPC server, and an early dropped value that would prevent `get_proxy_info()` from working. ([!3575]) ### Documentation - The semantic versioning policy document now describes Arti's experimental features, namely that breaking API changes may be made without bumping the major or minor version number. ([!3545]) - Updated Arti's website with various small improvements. ([!3559]) - Fixed small typos. ([!3564]) - Fixed source code reference in Arti's example configuration file. ([!3577]) ### Infrastructure - Reduced some logging in the CI environment. ([!3496]) - Tweaked the required success thresholds for [Shadow] tests in the CI environment to reduce CI flakiness. ([!3515]) - Fixed the `maint/extract-md-links` script to work correctly with newer versions of the mistune library. ([!3517]) - Updated comment about the license of `priority-queue`. ([!3509]) - Generated rust documentation is now stored as a CI artifact for 1 week to work around a rustdoc performance issue. ([!3537]) - Arti's website is now automatically deployed to as part of the nightly CI pipeline. ([!3547]) - Removed a "stallout" timeout from onion client [tgen] streams in [Shadow] simulations to mitigate flaky CI tests. ([!3529]) - The "pages" job in the CI environment now always runs, even if other jobs fail. ([!3549]) - The RUSTSEC-2025-0141 advisory, which is only an info-level "unmaintained" notice, is now ignored in the `maint/cargo_audit` script. ([!3568]) ### Cleanups, minor features, and bugfixes - Updated dependencies. ([!3521], [!3525], [!3528]) - Refactored the `tor_config::Listen` type so that we can reuse its logic in the future for Arti relays. ([!3469]) - The `Bug` error type in tor-error can now be given additional context text using `Bug::bug_context()`. ([!3512]) - Changed an info-level "Spawning reactor..." log message to debug-level. ([!3526]) - The `tor_protover::Protocols` type is now inherently interned as an optimization. A `Protocols` is now cheap to clone. ([!3524]) - Removed some `doc(cfg(...))` attributes that are no longer needed. ([!3294], [!3531]) - Fixed a build failure on 32-bit platforms due to a compile-time integer overflow in tor-memquota. ([!3532]) - Fixed a build failure when tor-proto is built with the "relay" feature but not the "hs-service" feature. ([!3534]) - Designed and implemented a new derive-deftly-based approach to specifying configuration options in Arti. Only a few existing options have been updated to use this new approach so far, but it's expected that this will make it simpler to add new configuration options and maintain existing ones. ([!3513], [!3472]) - Added a default ring crypto provider in arti-relay to match arti. This fixed a warning, but should be functionally the same. ([!3539]) - Removed the 'rustls/tls12' feature from the arti crate. This should not cause any behaviour change as this feature is already enabled by tor-rtcompat. ([!3540]) - Reduced the log level of a message containing the keystore filesystem path from info-level to debug-level to match our safe-logging guidelines. ([!3546]) - A `retry_error::RetryError` now records the time that each attempt failed, and when displayed shows the time elapsed since the error occurred. ([!3506]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Benjamin Erhart, Jérôme Charaoui, Neel Chauhan, Nihal, Pier Angelo Vendrame, Yaksh Bariya, hjrgrn, and tla. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!3294]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3294 [!3434]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3434 [!3442]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3442 [!3462]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3462 [!3469]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3469 [!3472]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3472 [!3487]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3487 [!3496]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3496 [!3502]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3502 [!3506]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3506 [!3509]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3509 [!3511]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3511 [!3512]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3512 [!3513]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3513 [!3515]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3515 [!3517]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3517 [!3521]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3521 [!3522]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3522 [!3523]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3523 [!3524]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3524 [!3525]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3525 [!3526]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3526 [!3527]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3527 [!3528]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3528 [!3529]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3529 [!3530]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3530 [!3531]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3531 [!3532]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3532 [!3533]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3533 [!3534]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3534 [!3535]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3535 [!3536]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3536 [!3537]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3537 [!3538]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3538 [!3539]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3539 [!3540]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3540 [!3545]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3545 [!3546]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3546 [!3547]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3547 [!3548]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3548 [!3549]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3549 [!3550]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3550 [!3552]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3552 [!3553]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3553 [!3554]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3554 [!3555]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3555 [!3557]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3557 [!3558]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3558 [!3559]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3559 [!3564]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3564 [!3568]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3568 [!3575]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3575 [!3577]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3577 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Shadow]: https://shadow.github.io [conflux]: https://spec.torproject.org/proposals/329-traffic-splitting.html [other sponsors]: https://www.torproject.org/about/sponsors/ [port_info_file]: https://gitlab.torproject.org/tpo/core/arti/-/blob/1ee7a6d7e95a08228eb0ff9e364ff4ca8c61cf9c/crates/arti/src/arti-example-config.toml#L174 [port_info_rs]: https://gitlab.torproject.org/tpo/core/arti/-/blob/1ee7a6d7e95a08228eb0ff9e364ff4ca8c61cf9c/crates/arti/src/proxy/port_info.rs#L4 [tgen]: https://github.com/shadow/tgen # Arti 1.8.0 — 1 December 2025 Arti 1.8.0 continues work on relay and directory authority development. This release introduces a new, usage-based timeout for strongly isolated circuits, experimental [`tokio-console`] support, a new `arti hsc ctor-migrate` command, and a configuration option for controlling which onion services to launch. As usual, there are also various under-the-hood improvements and bug fixes, which are documented below. ### Breaking changes - In `arti-client`, `TorClient::launch_onion_service()` and `TorClient::launch_onion_service_with_hsid()` now return `None` if the onion service is disabled in the config. ### Security fixes - Added `Host` header validation for non-CONNECT requests to HTTP CONNECT port, to prevent adversarial web pages from probing the version of Arti and its capabilities. ([!3429], [!3468]) ### Major bugfixes - Arti no longer exits with an error if configured with a log file with no directory prefix. ([!3491], [#2240]) - `fs-mistrust` now has consistent behavior with `stat` and `mkdir`, which consider `""` to be an invalid path, and all of its error messages now include the file name that triggered the error. ([!3491], [#2265], [#2266]) ### Major features - Implemented a usage-based timeout for strongly isolated circuits, as specified in [proposal 368]. ([!3430], [#2237]) - New experimental `arti hsc ctor-migrate` command line invocation for migrating C Tor onion service client keys to the Arti keystore. ([!3390], [!3485], [#2213]) ### Breaking changes in lower-level crates - In `tor-proto`, we no longer export `ClientCircSyncView`, and `IncomingStreamRequestFilter` now takes a `&CircSyncView`. `ClientInitiatorHandshake::connect()` now returns an `UnverifiedClientChannel`, and `VerifiedChannel` and `UnverifiedChannel` are no longer `pub`. - In `tor-llcrypto`, `CtByteArray` no longer derives `Deref`. - In `tor-hsservice`, we no longer export `RestrictedDiscoveryConfig::build_unvalidated()`. ([!3503]) - In `tor-hsservice`, `OnionService::launch()` now returns `None` if the service is disabled in the config. - In `tor-circmgr`, the `CircMgrConfig` trait now requires that the implementing type also implements `AsRef`, and the `vanguard_config()` function is no longer conditional upon feature flags. - In `tor-netdoc`, individual relay flags are now variants of a `RelayFlag` enum, rather than constants, and `RelayFlag` has a different API. `RouterStatus` now contains the new `DocRelayFlags` type. The `parse2` entrypoints now take a new `ParseInput`, `parse2::MultiplicitySelector` replaces `ItemSetSelector` etc. ### Onion service development - Individual onion services can now be disabled via the config. ([!3253], [#2133]) ### Relay development - Internal refactoring to support reusing `IncomingStreamRequestFilter` for exit relay streams. ([!3414]) - Various internal refactorings in `tor-proto`, to enable us to reuse implementation-agnostic parts of the client circuit reactor implementation for relays. ([!3408], [!3467], [!3470]) - Refactored the experimental `RelayCirc` API. ([!3410]) - Added an OR port listener task, for listening for incoming connections. ([!3396]) - In `tor-rtcompat`, TCP listening sockets have the same options set regardless of the underlying runtime. Additionally, we set `IPV6_V6ONLY` on Unix platforms to enable binding AF_INET and AF_INET6 sockets to the same port. ([!3457], [#2246]) - Added support for generating the keys and certificates relays need for TLS. ([!3349], [#2205]) - New configuration options for setting the OR port used for listening. ([!3466]) - Extracted the client- and relay-specific parts `UnverifiedChannel` and `VerifiedChannel` in separate modules. ([!3401]) - In `tor-circmgr`, `CircMgrConfig::vanguard_config()` is no longer feature-gated. ([!3498], [#2270]) ### Directory authority development - Added initial groundwork for the directory mirror component of `tor-dirserver`. ([!3301], [!3436], [!3426], [!3460], [!3501], [#2254], [#2255], [#2256]) - Many internal refactorings to reduce code duplication, and to improve the structure of the new netdoc parser. ([!3450], [!3456], [!3455], [!3486], [!3499]) - Overhauled `RelayFlags`, and added support for conditionally retaining unknown info. ([!3454], [!3477], [!3489]) - In `tor-netdoc`, much of the `encode` is now public. ([!3471]) - Improved the ergonomics of the new netdoc parser. ([!3478]) ### Testing - Updated the CLI tests to use use the new `cargo_bin_cmd!` macro, fixing a deprecation warning. ([4ed5695f844aec6bbe05ced9e8efde437bfece27]) - Fixed the flaky `client::circuit::test::bad_extend_crypto` test. ([!3433], [#2232]) - Replaced the deprecated `MockSleepProvider` with `SimpleMockTimeProvider` in a few crates. ([!3424], [#1885]) ### Documentation - Added `perl-Time-Piece` to the list of required dependencies on Red Hat-derived distributions in `CONTRIBUTING.md`. ([66eedd0140cd85bc8abd43d790d1a0093b35d21d]) - Removed security disclaimer about onion service support. ([!3464]) - Improved the documentation of the new netdoc parser. ([!3479]) - Added documentation clarifying the behavior of the `max_concurrent_streams_per_circuit` onion service setting. ([!3492]) - Added `rate_limit_at_intro` to the example onion service config. ([!3493]) - Updated the anonticket URL in the README and CONTRIBUTING.md. ([!3500]) - Moved a no-longer-intended naming convention to the `poc` module. ([!3505]) ### Infrastructure - Rust 1.91 is now our "recent" Rust image in CI. ([!3418], [!3419]) - In CI, bump `shadow` to the latest version. ([!3431]) - Refactored the shadow CI test script to have better output. ([335148a46e68a40c08181ea732a6aa5f6ca113c8]) - In CI, the shadow tests now have a higher success threshold for onion service transfers. ([!3428]) - New `maint` script for checking if all published crates specify an MSRV in their `Cargo.toml`. ([!3405]) - Imported the latest changes from [`rust-maint-common`]. ([!3438]) ### Cleanups, minor features, and bugfixes - Updated dependencies. ([!3417]) - Replaced `copy_interactive` with our new `futures-copy` crate, to avoid spawning extra tasks and reduce lock contention. ([!3416], [#786]) - Added vim `*.swp` files to `.gitignore`. ([!3437]) - Added experimental support for [`tokio-console`]. ([!3441], [!3444], [!3445], [#2236]) - Bumped `pwd-grp` to 1.0.1. ([!3443], [#2136]) - Bumped `derive-deftly` to the latest version. ([!3448], [!3451], [!3494]) - Resolved the clippy lints reported by the beta version of Rust. ([!3449]) - Reduced the high-water mark for writes of `ChannelFrame`. ([!3447], [#2200]) - Renamed `OutPtr` to `OutBoxedPtr` for clarity in `arti-rpc-client-core`. ([!3439], [#1588]) - Added TODO about adding guardrails to prevent launching onion services with a different configuration than the one they were instantiated with. ([!3453], [#2249]) - Added an `InertTorClient` function for creating an `OnionService`. ([!3435], [#2118]) - Updated to the latest list of Tor fallback directories. ([!3459]) - Removed an outdated TODO. ([!3463]) - Added comment to explain why `RetryError` deduplicates the errors it displays. ([!3465], [!3474]) - Arti now displays a warning if the opentelemetry config is set, but the `opentelemetry` feature is not enabled. ([!3458], [#2247]) - Bumped `num-bugint-dig` to 0.8.6. ([!3475], [#2110]) - Improved error reporting in our HTTP CONNECT proxy. ([!3476]) - Fixed an incorrectly gated `match` arm in `tor-circmgr`. ([!3482]) - In `hashx`, the internal `Register::as_u8()` is now gated behind the `compiler` feature, fixing a dead code warning. ([!3483]) - `CtByteArray` no longer derives `Deref`. ([!3432], [#2172]) - Improved opentelemetry instrumentation, to help debug [#2079] and other related issues. ([!3403]) - Arti's HTTP CONNECT proxy now returns a status code derived from the remote END reason. Additionally, the proxy now includes its supported capabilities in the `Tor-Capabilities` response header, to conform with [proposal 365]. ([!3481], [!3473], [#2259]) - Added a missing test host to the shadow CI script. ([!3490]) - Fixed a typo in an onion service client error message. ([!3488]) - INTRODUCE_ACK errors now include the index of the introduction point the error originates from. ([!3495]) - Fixed a typo in a debug log. ([!3504]) - Fixed a number of nightly warnings. ([!3508]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Dimitris Apostolou, hashcatHitman, hjrgrn, Mynacol, Neel Chauhan, nield, Nihal, NoisyCoil. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!3253]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3253 [!3301]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3301 [!3349]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3349 [!3390]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3390 [!3396]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3396 [!3401]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3401 [!3403]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3403 [!3405]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3405 [!3408]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3408 [!3410]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3410 [!3414]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3414 [!3416]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3416 [!3417]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3417 [!3418]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3418 [!3419]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3419 [!3424]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3424 [!3426]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3426 [!3428]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3428 [!3429]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3429 [!3430]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3430 [!3431]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3431 [!3432]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3432 [!3433]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3433 [!3435]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3435 [!3436]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3436 [!3437]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3437 [!3438]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3438 [!3439]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3439 [!3441]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3441 [!3443]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3443 [!3444]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3444 [!3445]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3445 [!3447]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3447 [!3448]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3448 [!3449]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3449 [!3450]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3450 [!3451]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3451 [!3453]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3453 [!3454]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3454 [!3455]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3455 [!3456]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3456 [!3457]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3457 [!3458]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3458 [!3459]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3459 [!3460]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3460 [!3463]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3463 [!3464]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3464 [!3465]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3465 [!3466]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3466 [!3467]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3467 [!3468]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3468 [!3470]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3470 [!3471]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3471 [!3473]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3473 [!3474]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3474 [!3475]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3475 [!3476]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3476 [!3477]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3477 [!3478]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3478 [!3479]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3479 [!3481]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3481 [!3482]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3482 [!3483]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3483 [!3485]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3485 [!3486]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3486 [!3488]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3488 [!3489]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3489 [!3490]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3490 [!3491]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3491 [!3492]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3492 [!3493]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3493 [!3494]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3494 [!3495]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3495 [!3498]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3498 [!3499]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3499 [!3500]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3500 [!3501]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3501 [!3503]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3503 [!3504]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3504 [!3505]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3505 [!3508]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3508 [#1588]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1588 [#1885]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1885 [#2079]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2079 [#2110]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2110 [#2118]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2118 [#2133]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2133 [#2136]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2136 [#2172]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2172 [#2200]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2200 [#2205]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2205 [#2213]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2213 [#2232]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2232 [#2236]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2236 [#2237]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2237 [#2240]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2240 [#2246]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2246 [#2247]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2247 [#2249]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2249 [#2254]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2254 [#2255]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2255 [#2256]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2256 [#2259]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2259 [#2265]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2265 [#2266]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2266 [#2270]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2270 [#786]: https://gitlab.torproject.org/tpo/core/arti/-/issues/786 [335148a46e68a40c08181ea732a6aa5f6ca113c8]: https://gitlab.torproject.org/tpo/core/arti/-/commit/335148a46e68a40c08181ea732a6aa5f6ca113c8 [4ed5695f844aec6bbe05ced9e8efde437bfece27]: https://gitlab.torproject.org/tpo/core/arti/-/commit/4ed5695f844aec6bbe05ced9e8efde437bfece27 [66eedd0140cd85bc8abd43d790d1a0093b35d21d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/66eedd0140cd85bc8abd43d790d1a0093b35d21d [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [`rust-maint-common`]: https://gitlab.torproject.org/tpo/core/rust-maint-common [`tokio-console`]: https://crates.io/crates/tokio-console [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 365]: https://spec.torproject.org/proposals/365-http-connect-ext.html [proposal 368]: https://spec.torproject.org/proposals/368-cdt-rethink.html # Arti 1.7.0 — 30 October 2025 Arti 1.7.0 continues high-level and low-level work on relay development. It also includes new experimental support for running as a `HTTP CONNECT` proxy, and numerous smaller fixes and infrastructure improvements. Arti 1.7.0 increases our MSRV (Minimum Supported Rust Version) to 1.86, in accordance with our [MSRV policy]. ### Breaking changes - Arti now requires Rust 1.86 or later. ([!3382], [!3385]) ### Major features - Improved (and hopefully more usable) output format from the experimental `arti keys check-integrity` command. ([#2151], [!3161]) - Arti now has experimental support for running as a `HTTP CONNECT` proxy. When built with the `http-connect` feature enabled, Arti's SOCKS listeners will also accept `HTTP CONNECT` tunnel requests, with support for [Tor extensions][http-connect.md] as amended by [proposal 365]. ([#2221], [#2225], [!3391], [!3397], [!3398]) - Arti's experimental circuit padding support now allows first-hop padding to treat all the circuits on a channel as a single unit, for improved security and efficiency. ([!3314], [!3302]) ### Deprecated functionality - In `tor-proto`, APIs for specific circuit handshakes are now deprecated. Instead, the caller should use an API that allows the circuit code to select which handshake is appropriate. ([#1990], [!3321]) - In `tor-netdoc`, the old (experimental) public builder pattern is now deprecated. Instead, we have decided to expose document fields as public. ([!3340]) ### Breaking changes in lower-level crates - As part of our parsing refactoring and rewrite, dozens of APIs in `tor-netdoc` have changed types and behaviors. - In `tor-linkspec`, the `HasAddrs` and `DirectChanMethodsHelper` traits are no longer dyn-compatible. - In `tor-linkspec`, `HasAddrs::addrs()` now returns an Iterator, rather than a slice. - In `tor-proto`, the `VerifiedChannel` and `UnverifiedChannel` types are no longer public. ### Onion service development - The `restricted-discovery` feature is no longer experimental. ([!3384]) - Added user-facing documentation for the `arti hss` onion service administration tool. ([#2108], [!3357]) ### Relay development - Began work for storing and manipulating legacy RSA keys and certificates. ([#2197], [!3296], [!3324]) - Continued work on refactoring and development for relay reactor implementation. ([#2212], [!3335], [!3353], [!3355], [!3358], [!3356], [!3348], [!3369], [!3387], [!3395]) - Continued work on relays' version of the channel authentication protocol. ([!3389]) - Continued work on improved infrastructure for parsing and generating Tor network documents. ([!3300], [!3326], [!3325], [!3333], [!3340], [!3343], [!3336], [!3337], [!3351], [!3376], [!3377], [!3378], [!3379], [!3380], [!3381], [!3386]) - Continued work on relay main-loop and front-end code. ([#2217], [!3313], [!3373], [!3374], [!3363], [!3375], [!3394]) - Continued development on directory cache logic. ([#3285]) ### Testing - Improve the `watch_single_file` test to have fewer false positives. ([#1607], [!2503]) - Ignore the unreliable `watch_multiple` test until [#1607] is finally resolved. ([!3364]) ### Documentation - Revise release instructions for clarity, correctness, and ease of use. ([!3315], [!3334], [!3383], [!3399]) ### Infrastructure - Migrate more CI test runners to use Tor Project infrastructure. ([!3320]) - In CI, make sure fuzzing tests are buildable. ([!3312]) - Rearrange CI jobs to increase parallelism and improve runtime. ([!3316], [!3318], [!3338], [!3352], [!3370]) - In CI, limit cargo parallelism based on memory and CPUs. ([!3332]) - In CI, build `arti-bench` with the `quicktest` profile. ([!3347]) - Our `fixup-features` script now produces more nicely indented output. ([#1719], [!3317]) - Fix a shellcheck warning in our `reproducible_build` script. ([!3362]) - Pin more docker image versions in CI, to avoid surprising compatibility issues. ([#2219], [!3366]) - Allow use of opentelemetry tracing with chutney CI tests. ([!3392]) ### Cleanups, minor features, and bugfixes - Choose values for the TLS SNI field randomly. ([#2210], [!3372]) - Fix a compilation issues in several of the fuzzers. ([!3284]) - Update to the latest versions of [`dynasmrt`] and [`opentelemetry`]. ([!3331], [!3330], [!3341]) - Use `FileTooLarge` instead of `EFBIG` in `tor-hsservice`. ([!3218]) - Improve a comment in downgrade_dependencies. ([!3030]) - Updated to the latest list of Tor fallback directories. ([!3328]) - Suppress a comparison-chain warning in `tor-proto`. ([!3342]) - Improve storage overhead for per-circuit hop lists. ([!3354]) - Relax limits for incoming XON/XOFF messages. ([!3360]) - Improved logging to help diagnose bug [#2224]. ([!3153], [!3388]) - Refactor `circ_extensions_from_settings`. ([#2067], [!3344]) - Fix a few new warnings from nightly builds of clippy. ([!3361]) - Note MSRV for `arti-ureq`. ([!3404]) - New `futures-copy` crate to replace our use of `copy_interactive` with a more efficient and flexible approach. ([#786], [!3393]) - Smaller documentation and comment fixes. ([!3346]) ### Acknowledgments Thanks to everybody who's contributed to this release, including 5225225, hashcatHitman, hjrgrn, Neel Chauhan, and Niel Duysters. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2503]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2503 [!3030]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3030 [!3153]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3153 [!3161]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3161 [!3218]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3218 [!3284]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3284 [!3296]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3296 [!3300]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3300 [!3302]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3302 [!3312]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3312 [!3313]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3313 [!3314]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3314 [!3315]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3315 [!3316]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3316 [!3317]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3317 [!3318]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3318 [!3320]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3320 [!3321]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3321 [!3324]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3324 [!3325]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3325 [!3326]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3326 [!3328]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3328 [!3330]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3330 [!3331]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3331 [!3332]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3332 [!3333]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3333 [!3334]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3334 [!3335]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3335 [!3336]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3336 [!3337]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3337 [!3338]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3338 [!3340]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3340 [!3341]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3341 [!3342]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3342 [!3343]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3343 [!3344]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3344 [!3346]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3346 [!3347]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3347 [!3348]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3348 [!3351]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3351 [!3352]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3352 [!3353]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3353 [!3354]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3354 [!3355]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3355 [!3356]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3356 [!3357]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3357 [!3358]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3358 [!3360]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3360 [!3361]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3361 [!3362]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3362 [!3363]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3363 [!3364]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3364 [!3366]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3366 [!3369]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3369 [!3370]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3370 [!3372]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3372 [!3373]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3373 [!3374]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3374 [!3375]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3375 [!3376]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3376 [!3377]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3377 [!3378]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3378 [!3379]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3379 [!3380]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3380 [!3381]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3381 [!3382]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3382 [!3383]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3383 [!3384]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3384 [!3385]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3385 [!3386]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3386 [!3387]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3387 [!3388]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3388 [!3389]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3389 [!3391]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3391 [!3392]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3392 [!3393]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3393 [!3394]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3394 [!3395]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3395 [!3397]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3397 [!3398]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3398 [!3399]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3399 [!3404]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3404 [#1607]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1607 [#1719]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1719 [#1990]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1990 [#2067]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2067 [#2108]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2108 [#2151]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2151 [#2197]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2197 [#2210]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2210 [#2212]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2212 [#2217]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2217 [#2219]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2219 [#2221]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2221 [#2224]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2224 [#2225]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2225 [#3285]: https://gitlab.torproject.org/tpo/core/arti/-/issues/3285 [#786]: https://gitlab.torproject.org/tpo/core/arti/-/issues/786 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [MSRV policy]: https://gitlab.torproject.org/tpo/core/arti/#minimum-supported-rust-version [`dynasmrt`]: https://crates.io/crates/dynasmrt [`opentelemetry`]: https://crates.io/crates/opentelemetry [http-connect.md]: https://spec.torproject.org/http-connect.html [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 365]: https://spec.torproject.org/proposals/365-http-connect-ext.html # Arti 1.6.0 — 6 October 2025 Arti 1.6.0 brings experimental support for [circuit padding][circuit-padding.md], [mitigations for DropMark side channel attacks][prop349], improvements to congestion control, a new `arti keys check-integrity` command, and [experimental support][otel-docs] for exporting debugging information via [OpenTelemetry]. It also includes behind-the-scenes work towards enabling Arti to act as a directory authority, a directory mirror, and a relay. Arti 1.6.0 increases our MSRV (Minimum Supported Rust Version) to 1.85.1, in accordance with our [MSRV policy]. As usual, there are also various under-the-hood improvements and bug fixes, which are documented below. ### Breaking changes * Arti now requires Rust 1.85.1 or later. ([!3240]) ### Security fixes * Arti now requires `tracing-subscriber` v0.3.20, due to upstream security issue [RUSTSEC-2025-0055]. It is unlikely that this would have been exploitable in Arti running with the default configuration, but a detailed analysis was not performed. ([!3221]) ### Major features * Arti now includes experimental circuit padding support, based on the [`maybenot`] library. When the `circ-padding-manual` feature is enabled on the `tor-proto` crate, researchers can now install one or more randomized padding machines on each hop of the circuit to send and receive padding. Once this defense is correctly tuned, it will help resist traffic and protocol fingerprinting attacks. For more information, see the [design document][circuit-padding.md]. ([!3185], [!3225], [!3276], [!3222], [!3228], [!3237], [!3241], [!3260], [!3242], [!3246], [!3252], [!3261], [!3262], [!3271], [!3292], [!3293]) * Arti now has mitigations for DropMark side-channel attacks for flow control, as described in [Proposal 349][prop349]. The flow control feature is experimental, and can be enabled with the `flowctl-cc` feature flag. ([!3266], [!3181]) * Arti now has a `arti keys check-integrity` command, to check the validity of stored keys. ([!3161]) * Arti now has experimental support for exporting debugging information via [OpenTelemetry]. Due to the potentially sensitive nature of this information, we only recommend using this for debugging and development purposes. It can be enabled with the `opentelemetry` feature flag, and [documentation on how to use it][otel-docs] is available. ([!3239]) ### Deprecated functionality * In `tor-netdoc`, deprecated the `dangerous-expose-struct-fields` feature, making fields always pub. ([!3299]) ### Breaking changes in lower-level crates #### `tor-dirmgr` * Moved `Authority`, `AuthorityBuilder`, `DownloadScheduleConfigBuilder`, `DownloadScheduleBuilder`, `DownloadScheduleConfig`, `DirToleranceBuilder`, `NetworkConfigBuilder`, `DownloadSchedule`, `DirTolerance`, `config::NetworkConfig`, and related items to the new `tor-dircommon` crate. ([!3238]) #### `tor-guardmgr` * Moved `FallbackList`, `FallbackDir`, `FallbackListBuilder`, and `FallbackDirBuilder` to the new `tor-dircommon` crate. ([!3245]) #### `tor-hscrypto` * `derive-deftly` is no longer optional, thus no longer exists as a feature. ([!3268]) #### `tor-llcrypto` * Renamed `pk::rsa::PrivateKey` to `pk::rsa::KeyPair`. ([!3236]) * `derive-deftly` is no longer optional, thus no longer exists as a feature. ([!3268]) #### `tor-proto` * Renamed `channel::launch()` to `channel::launch_client()`. ([!3158]) * Added new `FlowCtrlParameters` parameter to `CircParameters::new()`. ([!3249]) * Added new `Arc` parameter to `PendingClientTunnel::new` and `Channel::new_tunnel`. ([!3267]) #### `tor-units` * `BoundedInt32` now checks that `LOWER <= HIGHER` at build time instead of run time. ([!3247]) * Removed unused `Error::Uninhabited` variant. ([!3247]) ### Relay development * Refactored channel handshake code. ([!3182]) * Added support for legacy RSA keys to `tor-key-forge`. ([!3236]) ### Directory authority development * Created new `tor-dircommon` crate for shared implementation of the directory specification. ([!3205]) * Created new `tor-dirserver` crate for implementation of a directory authority and directory mirror servers. ([!3192]) * Added support for [Proposal 330](https://spec.torproject.org/proposals/330-authority-contact.html) for storing `DirPort`s. ([!3244]) ### Congestion control * Fixed bug in congestion control that was causing timeouts when `flowctl-cc` was enabled. ([!3223]) * Added support for flow control consensus params. ([!3249], [!3263]) * Refactored flow control code. ([!3243], [!3273], [!3280]) * Changed default `cc_alg` from none to vegas congestion control. ([!3248]) * Fixed a warning when building without `flowctl-cc`. ([!3272]) ### Testing * Added integration tests for `arti hss ctor-migrate`. ([!3216]) * Fixed `arti keys` integration test to work on case-insensitive filesystems. ([!3209]) * Reduced flakiness of shadow tests. ([!3227]) * Increased chutney test-transfer sizes to 5MB. ([!3047]) * Pinned CI to use `cargo-sort` v2.0.1 due to changes in formatting in v2.0.2. ([!3232]) * Refactored chutney CI scripts. ([!3264]) * Fixed Python lints and made them required to pass in CI. ([!3265]) * Removed `--verbose` from cargo flags in CI. ([!3234]) ### Documentation * Improved `arti hsc` key management documentation. ([!3256]) * Documented `arti hsc --batch` flag. ([!3215]) * Added note to READMEs about bug in `native-tls` on MacOS, which affects our examples but not Arti itself. ([!3297]) * Begun creating security response documentation. ([!3233]) * Improved release documentation. ([!3211], [!3304], [!3306]) * Documented why `resolver` entry is needed in `Cargo.toml`. ([!3202]) * Documented how we prevent invalid relay commands from being used as side-channels. ([#2177], [!3291]) * Fixed documentation for `StreamPrefs::connect_to_onion_services`. ([!3212]) * Updated documentation and TODOs in `tor-hsservice`. ([!3255]) * Fixed `tor-keymgr::KeyMgr::list_keystores` documentation. ([!3278]) * Improved `TorClient::create_onion_service()` documentation. ([!3282]) ### Infrastructure * Removed `maint/check_doc_features` and use of `doc_auto_cfg`, due to improvements landing in Rust that render them unnecessary. ([!3294]) * Added `maint/check_case_sensitive` to check for filenames that differ only by case. ([!3207]) * Added a `flake.nix` file for building Arti in a Nix environment. ([!3275]) ### Cleanups, minor features, and bugfixes * Arti now removes half-streams when they expire. ([!3267]) * Improved error messages from bad netdoc field types. ([!3220]) * Fixed two bugs in `ConfluxSet::next_circ_action()`. ([!3279]) * Made implementations of `PartialEq` in `tor-hscrypto` constant-time. ([!3268]) * Overhauled `tor-netdoc::parse2` and added a significant number of tests. ([!3231], [!3186]) * Migrated from `futures::task::noop_waker()` to `Waker::noop()`. ([!3250]) * Replaced `amplify` with `getset` for generating getters and setters in `tor-dircommon`. ([!3251]) * Replaced `bounded-vec-deque` with simpler wrapper over `VecDeque`. ([!3281]) * Disabled default features for `sysinfo` crate. ([!3290]) * Updated derive-deftly to version 1.3.0. ([!3219]) * Switched to "assert in const" pattern throughout codebase. ([!3217]) * Moved conflux-related code to a new module in `tor-proto`. ([!3229]) * Improved comment in `tor-bytes::SecretBuf::extend_from_slice`. ([!3230]) * Fixed typos in `tor-rtmock` comments. ([!3289]) * Fixed comment about validating stream messages. ([!3298]) * Updated TODOs for `once_cell` removal. ([!2953]) * Fixed clippy lints. ([!3213], [!3295]) ### Acknowledgments Thanks to everybody who's contributed to this release, including 5225225, Aiden McClelland, disha, hashcatHitman, hjrgrn, Niel Duysters, Tobias Pulls, Tobias Stoeckmann, and trinity-1686a. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2953]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2953 [!3047]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3047 [!3158]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3158 [!3161]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3161 [!3181]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3181 [!3182]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3182 [!3185]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3185 [!3186]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3186 [!3192]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3192 [!3202]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3202 [!3205]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3205 [!3207]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3207 [!3209]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3209 [!3211]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3211 [!3212]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3212 [!3213]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3213 [!3215]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3215 [!3216]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3216 [!3217]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3217 [!3219]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3219 [!3220]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3220 [!3221]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3221 [!3222]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3222 [!3223]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3223 [!3225]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3225 [!3227]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3227 [!3228]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3228 [!3229]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3229 [!3230]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3230 [!3231]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3231 [!3232]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3232 [!3233]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3233 [!3234]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3234 [!3236]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3236 [!3237]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3237 [!3238]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3238 [!3239]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3239 [!3240]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3240 [!3241]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3241 [!3242]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3242 [!3243]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3243 [!3244]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3244 [!3245]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3245 [!3246]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3246 [!3247]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3247 [!3248]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3248 [!3249]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3249 [!3250]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3250 [!3251]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3251 [!3252]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3252 [!3255]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3255 [!3256]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3256 [!3260]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3260 [!3261]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3261 [!3262]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3262 [!3263]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3263 [!3264]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3264 [!3265]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3265 [!3266]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3266 [!3267]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3267 [!3268]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3268 [!3271]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3271 [!3272]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3272 [!3273]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3273 [!3275]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3275 [!3276]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3276 [!3278]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3278 [!3279]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3279 [!3280]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3280 [!3281]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3281 [!3282]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3282 [!3289]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3289 [!3290]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3290 [!3291]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3291 [!3292]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3292 [!3293]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3293 [!3294]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3294 [!3295]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3295 [!3297]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3297 [!3298]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3298 [!3299]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3299 [!3304]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3304 [!3306]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3306 [#2177]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2177 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [MSRV policy]: https://gitlab.torproject.org/tpo/core/arti/#minimum-supported-rust-version [OpenTelemetry]: https://opentelemetry.io [RUSTSEC-2025-0055]: https://rustsec.org/advisories/RUSTSEC-2025-0055 [`maybenot`]: https://docs.rs/maybenot/2.2.2/maybenot/ [circuit-padding.md]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/dev/notes/circuit-padding.md [otel-docs]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/dev/OpenTelemetry.md [other sponsors]: https://www.torproject.org/about/sponsors/ [prop349]: https://spec.torproject.org/proposals/349-command-state-validation.html # Arti 1.5.0 — 28 August 2025 Arti 1.5.0 continues development on important client features, including [Counter Galois Onion][cgo] encryption, [Conflux], [flow control and congestion control][flowctl-cc], and onion service [proof of work][prop362]. It also includes significant preliminary work for Arti relay support. Additionally, this release [mitigates][!3141] a [longstanding bug][#2079] that could prevent Arti clients from bootstrapping. Arti 1.5.0 increases our MSRV (Minimum Supported Rust Version) to 1.85, in accordance with our [MSRV policy]. As usual, there are also various under-the-hood improvements and bug fixes, which are documented below. ### Breaking changes - Arti now requires Rust 1.85 or later. ([#2095], [!3128], [!3145]) ### Major bugfixes - We no longer count channel negotiation time against our circuit timeouts. This may help avoid [a bug][#2079] where Arti would think that all of its guards were failing due to a mismatch in expected circuit construction times. ([!3141]) ### Major features (experimental) - `tor-proto` now includes experimental backend support (unused, so far) for [Conflux]-based multi-path tunnels, for improved performance and resiliency. ([!3082]) - Experimental support for [congestion control][flowctl-cc] for improved performance. This is not yet enabled by default, while we perform more testing and resolve [pending issues][#2130]. ([!3113], [!3118], [!3131], [!3197]) - Experimental support for [proof-of-work][prop362] in onion services, for resistance to denial-of-service attacks. ([!3106], [!3132]) - Experimental support for negotiating [Counter Galois Onion][cgo] cryptography with versions of Tor that support it. ([!3133], [prop359]) - Arti now has experimental, incomplete support for the [`smol`] async runtime. It is an improved replacement for [`async-std`], which will soon be deprecated in Arti. We still recommend the [`tokio`] runtime for most users. ([!2986], [!3194]) ### Breaking changes in lower-level crates - Refactor `tor-proto` APIs to focus on _tunnels_ rather than circuits. A tunnel may be either a Conflux multi-path bundle, or a single circuit. A tunnel no longer has a _single_ path, but rather a collection of paths. ([!3082]) - Major API changes to consensus parsing and access APIs and types in `tor-netdoc`. ([!3139], [!3164], [!3172]) - Refactor some client-specific `tor-proto` APIs to have client-related names. ([ebb97da7a209af06]) - Move most functionality from `tor-proto::circuit` and `tor-proto::stream` into `tor-proto::client`. ([1ee26f2168ee2ded], [702e7276898d3f31], [!3193]) - In `tor-cell`, remove the never-implemented `AUTHORIZE` cell type. ([8e9e5a2f6ff2036]) - In `tor-cell`, remove the `ProofOfWorkV1::cap_effort()` method. ([eabd0c0bfe70333]) - In `tor-chanmgr`, the `ChanBuilder::new()` API now takes an optional key-manager argument. ([a187a2fef281d7da]) - In `tor-circmgr`, the `get_or_launch_specific` API has been replaced with tunnel-specific type launcher APIs, and `CircuitBuilder` has been replaced with `TunnelBuilder`. ([8333a2d7c9e48427]) - In `tor-dirclient`, `SourceInfo::from_circuit` has been renamed to `from_tunnel`. ([f89c0b38df232e5c8aa]) - In `tor-hsclient`, `get_or_launch_circuit` has been renamed to `get_or_launch_tunnel`, and the deprecated `get_or_launch_connection` alias has been removed. ([8333a2d7c9e48427]) ### Key manager development - Improved CLI output when describing keys. ([!3116], [!3143]) - Design for a new key integrity checking subcommand. ([!3126]) - Integration testing for `arti keys` subcommands. ([!3166]) ### Relay development - Design work for a relay reactor backend. ([!3146]) - Placeholder sketch implementation for a relay backend in `tor-proto`. ([!3162]) - Major refactoring to channel cell types and handling to prepare for relay channel authentication. ([!3158], [!3173], [!3178], [!3198]) - Revise `tor-proto` code to match correct behaviors with respect to channel negotiation cells. ([!3174], [!3184]) ### Directory authority development - Work on a new netdoc parser implementation for improved ergonomics and macro support. We'll use this to parse and generate vote documents, and eventually more types of object. ([!3135], [!3180]) - Refactor handling of different network-status types and flavors (now collectively called "variants"), for better interaction with future directory authority code. ([!3139], [!3164], [!3172]) ### Testing - Clean up documentation and implementation for time-mocking. ([!3150]) - Add tests for `create_unbootstrapped_async()`. ([#2121], [!3167]) ### Documentation - Describe in-progress changes to our code submission process as we deal with the effects of moving to a new flavor of Gitlab. ([!3121]) - Document why you should use `-p arti` when building arti. ([!3134]) - Several cleanups to website documentation for style and accuracy. ([!3109]) - Several cleanups to README.md for style and accuracy. ([!3115]) - Fix comments in `ChannelCodec::encode`. ([!3155]) - Document that memory tracking does not cover _all_ memory usage. ([#2102], [!3165]) - Internal documentation for `CC_XOFF_CLIENT` behavior. ([!3156]) - Document license rationale for using `ring` rather than `aws-lc` with `rustls`. ([!3170], [!3176]) - Fix a link in Release.md. ([!3190]) - Document how various protocol state machine rules in Arti are enforced. ([prop349], [!3171]) ### Infrastructure - Use a new version of [Chutney] in our CI, to get support for testing onion services with Arti. ([bb3a2c99db37271e]) - Tweak [Shadow] settings to avoid a flood of bug warnings from C Tor. ([9289c00cb5a97943]) - Adjust [Chutney] scripts and settings to bootstrap more cleanly, with fewer warnings. ([!3149]) - New script to generate a checklist for release tasks. ([!3125]) - Replace dependency proxy with pull-through cache for improved docker image rate-limiting in CI. ([!3175]) - Use Rust 1.89 as our "recent" Rust image in CI. ([!3147]) - Update minimum CI artifact lifetime to 1 day. ([#2064], [!3098]) - Use the "quicktest" profile for integration testing. What it costs in build time, it should save in runtime. ([!3157]) - Refactor how our `check_licenses` script handles per-crate exceptions. ([!3195]) - Fixed `minimal-versions` CI pipeline. ([!3327]) ### Cleanups, minor features, and bugfixes - Fix several warnings when compiling for Windows. ([!3114], [!3179]) - Do not enable needless experimental features when building the `obsf4-checker` example. ([a2d06cf94f2d0907]) - Fix a comment format issue that was confusing vim. ([!3136]) - Upgrade our codebase to the [2024 edition] of Rust. ([#2101], [!3137]) - Use several new features available with Rust 1.85. ([#2135], [!3129], [!3138], [!3183]) - Log errors with more report information in circuit reactors. ([#2057], [!3122]) - Use a newer version of [`slab`] to avoid a RUSTSEC warning. ([!3151]) - Refactor tunnel reactor to consolidate calls to `send_unbounded`. ([!3154]) - Remove outdated TODOs in `tor-hsservice`. ([bc5b3130283f0699]) - Fix several new warnings and errors from nightly Rust. ([#2124], [!3148], [!3169]) - Allow our error-handling log macros (`warn_report!`, `info_report!`, etc) to use fields in `tracing` messages. ([#2096], [#2116], [!3142]) - Fix a few python linter warnings. ([!3168], [!3147]) - Change format of redacted onion service IDs from `???xyz.onion` to `[…]xyz.onion`. ([#2126], [!3177]) - Distinguish RPC object identity types through a more sensible system. ([!3191]) - The "quicktest" profile now builds more quickly, but produces less optimized binaries. It still occupies a space between "dev" and "release". ([4b9b53541feb8bb0]) - Add more logs about timeout estimation and connection failures. ([!3152]) ### Examples - New example showing how to use Arti as a custom connector for use with [`hyper`]. ([49fab4945e515dc9]) - Numerous fixes and revisions to other [`hyper`] examples. ([!2941]) ### Acknowledgments Thanks to everybody who's contributed to this release, including hashcatHitman, Jérôme Charaoui, luciole, Neel Chauhan, Niel Duysters, thesw4rm, Omar Gorni, and Tobias Stoeckmann. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2941]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2941 [!2986]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2986 [!3082]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3082 [!3098]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3098 [!3106]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3106 [!3109]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3109 [!3113]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3113 [!3114]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3114 [!3115]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3115 [!3116]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3116 [!3118]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3118 [!3121]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3121 [!3122]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3122 [!3125]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3125 [!3126]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3126 [!3128]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3128 [!3129]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3129 [!3131]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3131 [!3132]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3132 [!3133]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3133 [!3134]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3134 [!3135]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3135 [!3136]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3136 [!3137]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3137 [!3138]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3138 [!3139]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3139 [!3141]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3141 [!3142]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3142 [!3143]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3143 [!3145]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3145 [!3146]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3146 [!3147]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3147 [!3148]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3148 [!3149]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3149 [!3150]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3150 [!3151]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3151 [!3152]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3152 [!3154]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3154 [!3155]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3155 [!3156]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3156 [!3157]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3157 [!3158]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3158 [!3162]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3162 [!3164]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3164 [!3165]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3165 [!3166]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3166 [!3167]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3167 [!3168]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3168 [!3169]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3169 [!3170]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3170 [!3171]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3171 [!3172]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3172 [!3173]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3173 [!3174]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3174 [!3175]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3175 [!3176]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3176 [!3177]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3177 [!3178]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3178 [!3179]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3179 [!3180]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3180 [!3183]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3183 [!3184]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3184 [!3190]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3190 [!3191]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3191 [!3193]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3193 [!3194]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3194 [!3195]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3195 [!3197]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3197 [!3198]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3198 [!3327]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3327 [#2057]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2057 [#2064]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2064 [#2079]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2079 [#2095]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2095 [#2096]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2096 [#2101]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2101 [#2102]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2102 [#2116]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2116 [#2121]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2121 [#2124]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2124 [#2126]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2126 [#2130]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2130 [#2135]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2135 [1ee26f2168ee2ded]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1ee26f2168ee2dede8ab993ef57435334e9efabe [2024 edition]: https://doc.rust-lang.org/edition-guide/rust-2024/index.html [49fab4945e515dc9]: https://gitlab.torproject.org/tpo/core/arti/-/commit/49fab4945e515dc92e30bca3883d2e9606a0d47d [4b9b53541feb8bb0]: https://gitlab.torproject.org/tpo/core/arti/-/commit/4b9b53541feb8bb04f7891055a0d56a6b742fbc6 [702e7276898d3f31]: https://gitlab.torproject.org/tpo/core/arti/-/commit/702e7276898d3f31e22033c5b64fea91703f3701 [8333a2d7c9e48427]: https://gitlab.torproject.org/tpo/core/arti/-/commit/8333a2d7c9e4842753e65d978087e54a8ad43789 [8e9e5a2f6ff2036]: https://gitlab.torproject.org/tpo/core/arti/-/commit/8e9e5a2f6ff20360816896b971408e8bf1b5c7ea [9289c00cb5a97943]: https://gitlab.torproject.org/tpo/core/arti/-/commit/9289c00cb5a97943702544ce4c569250ae475f9d [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Chutney]: https://gitlab.torproject.org/tpo/core/chutney [Conflux]: https://spec.torproject.org/proposals/329-traffic-splitting.html [MSRV policy]: https://gitlab.torproject.org/tpo/core/arti/#minimum-supported-rust-version [Shadow]: https://shadow.github.io [`async-std`]: https://docs.rs/async-std/latest/async_std/ [`hyper`]: https://crates.io/crates/hyper [`slab`]: https://crates.io/crates/slab [`smol`]: https://crates.io/crates/smol [`tokio`]: https://crates.io/crates/tokio [a187a2fef281d7da]: https://gitlab.torproject.org/tpo/core/arti/-/commit/a187a2fef281d7daae2fb6f503168cf48cfc0b99 [a2d06cf94f2d0907]: https://gitlab.torproject.org/tpo/core/arti/-/commit/a2d06cf94f2d09077bb86f1b7b62e7e22c4a34f1 [bb3a2c99db37271e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/bb3a2c99db37271e5f22f80778dd89787162ab9f [bc5b3130283f0699]: https://gitlab.torproject.org/tpo/core/arti/-/commit/bc5b3130283f06996cf9f84adc5dbe5721e13a1c [cgo]: https://eprint.iacr.org/2025/583 [eabd0c0bfe70333]: https://gitlab.torproject.org/tpo/core/arti/-/commit/eabd0c0bfe703337e338403949721ce57c87f32e [ebb97da7a209af06]: https://gitlab.torproject.org/tpo/core/arti/-/commit/ebb97da7a209af06e69a5477b8379a76a776e42e [f89c0b38df232e5c8aa]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f89c0b38df232e5c8aa87195fb075e528e883706 [flowctl-cc]: https://spec.torproject.org/proposals/324-rtt-congestion-control.txt [other sponsors]: https://www.torproject.org/about/sponsors/ [prop349]: https://spec.torproject.org/proposals/349-command-state-validation.html [prop359]: https://spec.torproject.org/proposals/359-cgo-redux.html [prop362]: https://spec.torproject.org/proposals/362-update-pow-control-loop.html # Arti 1.4.6 — 4 August 2025 Arti 1.4.6 continues development on xon-based ([Proposal 324]) flow control, [Conflux], and improved cryptography (CGO,. ([Proposal 359]) Arti 1.4.6 also contains two improvements to help resist two different kinds of denial-of-service attack, relating to Hidden Services, and some other bugfixes. Especially, users who operate `.onion` services are advised to upgrade. (There's significant work ongoing on Arti Relay, but that is currently occurring outside of the Arti mainline so has not landed in in 1.4.6.) ### Breaking changes #### Developer-facing - `tor_memquota::ConfigBuilder::max()` and `ConfigBuilder::low_water()` now take a `impl Into>` instead of a `usize`. This should generally be backwards compatible, but may cause type inference errors. (These types are effectively part of the public API of `arti-client`.) ([!3110]) - In `arti-ureq`, `PreferredRuntime`-using `ConnectorBuilder` constructors are now associated functions on `ConnectorBuilder` rather than (anomalously) `ConnectorBuilder`. (The return types haven't changed.) ([!3101]) ### Security fixes - Replace the Hidden Service (.onion service) Proof of Work control loop. Improves denial of service resistance. ([Proposal 362], [!3093], no TROVE.) - Limit hidden service descriptor size inflation. ([Proposal 360], [torspec!411], [#2046], [!3070], no TROVE.) ### Major bugfixes - Fix spurious 0-length buffer read in `DataReader`. This bug caused some client programs to experience truncated streams, losing data. ([!3080], [#2053]) ### Major features - New experimental `arti hss ctor-migrate` command line invocation for migrating a hidden serivce (`.onion` service) identity key from C Tor to an Arti keystore. ([!3102]) - Enable the memquota (memory use control) system by default. (Part of congestion control work.) ([!3110], [#2030]) ### Breaking changes in lower-level crates - `tor-cell`: `UnparsedRelayMsg::data_len()` now returns a `Result`. ([!3094]) - `tor-hscrypto`: `HsID` no longer implements `LowerHex` or `Display`. ([!3107]) - `tor-keymgr`: `UnrecognizedEntryError::new` no longer exposed; `UnrecognizedEntryId` renamed to `UnrecognizedEntry`; `KeyMgr::list()` and `Keystore::list()` return types changed. ([!3059]) ### Development progress #### Conflux - Add tests for client-side SWITCH handling. ([!3091]) - Preparatory work for replacing the `tor-proto` circuit reactor: Add a `ConfluxSet::remove_unchecked` method. ([!3105], [#1803]) #### Congestion control - Code for handling XON/XOFF messages in `tor-proto` and `tor-cell`. ([!3054], [!3094], [!3099]) - `tor-cell`: Exposed flow-control related types. (Previously these were behind the experimental 'flowctl-cc' feature, which is removed in this release.) #### CGO (Counter Galois Onion - improved crpytography) - Implementation of CGO negotiation and use, in `tor-proto`. Not yet usable. ([Proposal 359], [!3069], [#1947], [#1945]) ### Testing - Update shadow, mostly to get reproducibility fixes. ([!3092], [shadow#3610]) - Pin `cargo-licence` to 0.7.0, and update our allows to match its output. ([!3108], [#2083], [!3111]) ### Cleanups, minor features, and bugfixes #### User-facing - Provide experimental `arti keys-raw remove-by-id` command line function. ([!3059], [!3095]) #### Developer-facing - Re-export `ConfigurationSources` from the `arti_client` crate. ([!3044]) - `safelog`: New `DisplayRedacted`/`DebugRedacted` APIs to help avoid accidentally redacting, corrupting, or exposing, hidden service identities (`.onion` names). ([!3107], [!3071], [#2012], [#2066]) - Fix documentation for macros in `tor_hscrypto::pk`. ([#2050], [!3104]) - Many typo fixes. ([!3090], [!3089]) #### Internal and administrative - Introduce a new internal error type `KeystoreNotConfigured`, for improved clarity and less confusion in keystore error handling. ([!3103]) - Update an internal TODO about `NonZero`. ([!3067], [rust-lang/rust#142966]) - Remove some unnecessary parens in the code. ([!3096]) - Update dependencies. ([!3073], [!3117]) ### Acknowledgments Thanks to everybody who's contributed to this release, including hashcatHitman, hjrgrn, nield, and tcyrus. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!3044]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3044 [!3054]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3054 [!3059]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3059 [!3067]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3067 [!3069]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3069 [!3070]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3070 [!3071]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3071 [!3073]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3073 [!3080]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3080 [!3089]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3089 [!3090]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3090 [!3091]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3091 [!3092]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3092 [!3093]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3093 [!3094]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3094 [!3095]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3095 [!3096]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3096 [!3099]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3099 [!3101]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3101 [!3102]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3102 [!3103]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3103 [!3104]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3104 [!3105]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3105 [!3107]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3107 [!3108]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3108 [!3110]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3110 [!3111]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3111 [!3117]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3117 [#1803]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1803 [#1945]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1945 [#1947]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1947 [#2012]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2012 [#2030]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2030 [#2046]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2046 [#2050]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2050 [#2053]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2053 [#2066]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2066 [#2083]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2083 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Conflux]: https://spec.torproject.org/proposals/329-traffic-splitting.html [Proposal 324]: https://spec.torproject.org/proposals/324-rtt-congestion-control.html [Proposal 359]: https://spec.torproject.org/proposals/359-cgo-redux.html [Proposal 360]: https://spec.torproject.org/proposals/360-hsdesc-len-limit.html [Proposal 362]: https://spec.torproject.org/proposals/362-update-pow-control-loop.html [other sponsors]: https://www.torproject.org/about/sponsors/ [rust-lang/rust#142966]: https://github.com/rust-lang/rust/issues/142966 [shadow#3610]: https://github.com/shadow/shadow/issues/3610 [torspec!411]: https://gitlab.torproject.org/tpo/core/torspec/-/merge_requests/411 # Arti 1.4.5 — 7 July 2025 Arti 1.4.5 continues development on xon-based ([proposal 324]) flow control and [Conflux]. In addition, we have drafted an initial design for the directory cache storage model, which will be needed for the core relay functionality, and for the directory authority implementation. As usual, there are also various under-the-hood improvements and bug fixes, which are documented below. ### Breaking changes - Console logging now goes to stderr instead of stdout. ([#2024], [!3020]) ### Breaking changes in lower-level crates - In `tor-proto`, `CongestionParams::use_fallback_alg()` is no longer public. - In `tor-proto`, `ClientCirc::extend_virtual()` now takes parameters by reference, and a list of Protocol capabilities. - The `once-cell` feature was removed from `fs-mistrust`. - In `tor-netdir`, the `FromInt32Saturating` trait has an extra `from_checked` function. ### Onion service development - Decreased the minimum allowed duration of the `hsdir_interval` to 5 minutes, according to the changes from [torspec!406]. ([!3042]) - New experimental `arti keys list` and `arti keys list-keystores` subcommands for listing the existing keys and configured keystores. ([#2043], [!3023], [!3060]) ### Relay development - Design notes for the storage model of the directory cache. ([!3017]) ### Proposal 324 flow control development - `DataWriter` is now rate-limited. For now, the rate is set very high (`u64::MAX`), but in the future it will be dynamically changed as we receive XON/XOFF signals. ([#1992], [!3014], [!3029], [!3033]) - Added experimental support for XON/XOFF cells, gated behind the `flowctl-cc` feature. ([!3031], [!3061]) - Add a new async notification channel that will be used in the flow control implementation. ([!3066]) ### Conflux development - Updated conflux implementation to validate the congestion control algorithm used by the join point hop. ([!3046]) - Tunnels now have unique identifiers, which are distinct from the identifiers of their underlying circuits. ([!3048], [!3050]) - The conflux implementation now uses the circuit `UniqId` to identify circuits. ([#1999], [!3053]) - Fixed bug causing the circuits in a conflux tunnel to have disjoint stream maps. ([#2011], [!3034]) - Fixed a variety of conflux-related bugs that prevented the handshake from completing successfully. ([!3034]) - Addressed several small conflux-related TODOs and typos. ([!3045], [!3065]) - Removed all uses of `HopNum` outside of `tor-proto`. ([!3075]) - Fixed a bug causing multipath tunnels to send cells in violation of congestion control. ([04754e99b8e5899bdb0a6511b486001905dea503]]) - Fixed an off-by-one error which caused unnecessary leg switching when all circuits in a multipath tunnel had the same, equally "best" RTT. ([712785e00911543030871d6360fc3c6eeb5b33b5]) - Fixed a conflux sequence number accounting bug. ([e675585b9e8ecff1ccf097e3be320631253816d8]) - Added tests for conflux stream management. ([!3034], [!3077]) ### Internal cleanup and refactoring - `NetDir::pick_n_relays` no longer logs an unnecessary warning if there are fewer usable relays than requested. ([!3028]) - Removed `tor-rtcompat`'s `rustls` dependency in favor of `futures-rustls`. ([!2943]) - Refactored `CircParameters` to use a different type for representing the negotiated settings, and to simplify usage. ([#1967], [#1968], [!3021]) - In `tor-proto`, the `CircHop` internals are now private. ([[!3034]]) ### Other user-facing improvements - Experimental support for launching a SOCKS proxy from a set of already bound listeners. ([!3016]) ### Testing - Made the `tor-proto` benchmarks compile on non-x86 architectures too. ([#2029], [!3032]) - `MockExecutor::spawn_blocking` now uses `subthread_spawn` instead of `spawn_identified`. ([#2033], [!3036]) ### Documentation - Removed inaccurate doc comment saying consensus diffs are not supported. ([!3039]) - Clarified the drop behavior of `Blocking::spawn_blocking`. ([!3062]) - Fixed various typos in the README. ([!3078]) ### Infrastructure - CI now uses an updated version of [Chutney] that has native support for Arti nodes. ([!3009]) - CI no longer uses a pinned nightly Rust version. ([#2018], [!3035]) - In the Shadow integration tests, Arti processes now log to file instead of console. ([!3020]) - The Android builds are now reproducible. ([!3055]) ### Cleanups, minor features, and bugfixes - `tor-netdir` no longer uses a pinned version of `typed-index-collections`. ([#1647], [!3037]) - Upgraded to `hickory-proto` version 0.25.2. ([#1962], [!3038]) - Upgraded to `rusqlite` version 0.36.0. ([!3041]) - Removed the `once_cell` dependency from various crates. ([!3051]) - In `tor-netdir`, we now log any unexpected or invalid network parameters. ([!3043]) - Replaced a runtime key length check with a compile-time check in `tor-proto`. ([!3068]) - Updated the `RttEstimator` logic to set all initial estimates to `None` instead of `0`, and to report a minimum/EWMA RTT of `u32::MAX` if there are no measurements. ([#2049], [!3074]) - The `RttEstimator` now has a handle to the `DynTimeProvider` of the circuit, to support mocking the time in tests. ([!3063]) - Improved the log messages about rejecting relays. ([#2006], [!3072]) - Reworked the `tor-proto` `StreamReader` into a `futures::Stream`. ([!3076]) - Fixed various new clippy warnings in Rust 1.88. ([!3081]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Dan Ballard, hashcatHitman, hjrgrn, nield, parazyd, and trinity-1686a. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2943]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2943 [!3009]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3009 [!3014]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3014 [!3016]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3016 [!3017]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3017 [!3020]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3020 [!3021]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3021 [!3023]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3023 [!3028]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3028 [!3029]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3029 [!3031]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3031 [!3032]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3032 [!3033]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3033 [!3034]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3034 [!3035]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3035 [!3036]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3036 [!3037]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3037 [!3038]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3038 [!3039]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3039 [!3041]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3041 [!3042]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3042 [!3043]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3043 [!3045]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3045 [!3046]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3046 [!3048]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3048 [!3050]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3050 [!3051]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3051 [!3053]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3053 [!3055]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3055 [!3060]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3060 [!3061]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3061 [!3062]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3062 [!3063]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3063 [!3065]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3065 [!3066]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3066 [!3068]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3068 [!3072]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3072 [!3074]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3074 [!3075]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3075 [!3076]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3076 [!3077]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3077 [!3078]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3078 [!3081]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3081 [#1647]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1647 [#1962]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1962 [#1967]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1967 [#1968]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1968 [#1992]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1992 [#1999]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1999 [#2006]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2006 [#2011]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2011 [#2018]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2018 [#2024]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2024 [#2029]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2029 [#2033]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2033 [#2043]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2043 [#2049]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2049 [04754e99b8e5899bdb0a6511b486001905dea503]: https://gitlab.torproject.org/tpo/core/arti/-/commit/04754e99b8e5899bdb0a6511b486001905dea503 [712785e00911543030871d6360fc3c6eeb5b33b5]: https://gitlab.torproject.org/tpo/core/arti/-/commit/712785e00911543030871d6360fc3c6eeb5b33b5 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Chutney]: https://gitlab.torproject.org/tpo/core/chutney [Conflux]: https://spec.torproject.org/proposals/329-traffic-splitting.html [e675585b9e8ecff1ccf097e3be320631253816d8]: https://gitlab.torproject.org/tpo/core/arti/-/commit/e675585b9e8ecff1ccf097e3be320631253816d8 [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 324]: https://spec.torproject.org/proposals/324-rtt-congestion-control.html [torspec!406]: https://gitlab.torproject.org/tpo/core/torspec/-/merge_requests/406 # Arti 1.4.4 — 5 June 2025 Arti 1.4.4 continues our development efforts to support multi-legged tunnels in Arti via our Conflux feature. In addition to Conflux, we continue preparing support for our [Counter Galois Onion proposal][cgo] feature. As usual, there are also various under-the-hood improvements and bug fixes, which are documented below. ### Breaking changes * Arti now requires Rust 1.83. ([!2999]) ### Major bugfixes * Fixed `fs-mistrust` builds on non-unix systems. ([!2962]) ### Major features * Arti now supports Circuit Handshake Extensions. ([!2980], [#1945], [prop346]) ### Breaking changes in lower-level crates * `arti-ureq`: We no longer enable the `rustls` feature by default. * `tor-linkspec`, `tor-basic-utils`: Remove deprecated `empty_iterator()` method. ([!3001]) * `tor-proto`: Remove deprecated `ClientCirc` functions. ([!2995]) * `tor-keymgr`: Refactored the `Keystore::list` API. ([!3000], [#1922]) * `tor-circmgr`: Make path module public on "--features=experimental-api". ([!2990], [#1981]) * `tor-circmgr`: `CircRequestExt` and `CircResponseExt` are now separate types. ([!2972]) * `tor-guardmgr`: Vanguard selection APIs now expect a `RelaySelector`. ([!3007]) * `tor-protover`: `ProtoKind` is now backed by an `u8` type. ([!2980]) ### Conflux development * Continued development towards supporting Conflux tunnels in Arti. ([!2946], [!2996], [!3005], [!3002]) ### Counter Galois Onion development * Continued development towards supporting Counter Galois Onion relay cell encryption in Arti. ([!2972], [!2988], [!2993], [!2998], [!3010], [#1969]) ### Onion service development * Arti no longer uses MiddleOnly relays for rendezvous points or introduction points. ([!3007], [#2911]) * Continued progress on service-side Proof-of-Work (PoW) support. ([!2697]) ### Testing * Reverted commit related to Shadow writer shutdown bug. ([!2968]) * Enable `--features=full` for our reproducible builds. ([!2956]) * Fix various new clippy warnings in Rust 1.87. ([!3003]) * `tor-keymgr`: internal refactoring to use structured certificate metadata in the tests. ([!2921], [#1913]) ### Infrastructure * Shadow was bumped to include a fix for an issue around `EPOLLRDHUP`. ([!2968]) * We now only require one successful HS transfer in our Shadow CI. ([!2991]) * We are now using the C Tor package from deb.torproject.org in our Shadow CI. ([!2989]) * `strace` logging has been disabled in our Shadow CI. ([!2989]) * Our Debian package now matches the default limits of file descriptors with systemd. ([!2937]) * Updated the `cargo_sort` maintenance script to work correctly with [`cargo-sort`] 2.0.0. ([!3011], [#2014]) * Arti now uses Rust 1.86 for Reproducible Builds CI target. ([!2992], [#1335]) ### Cleanups, minor features, and bugfixes * Arti no longer uses the ".z" suffix in directory URLs. ([!3013]) * Implement `HasKind` trait for `TorAddrError`. ([!2965]) * `tor-rtcompat`: We no longer bundle an unused copy of the Lets Encrypt root certificate. ([!3006], [#2004]) * `tor-proto`: New `extend()` and `create_firsthop()` methods to pick between ntor and ntor3 handshakes. ([!2967]) * Release documentation was updated to include information on "Upgrade Blocker" issues, removal of information of our old website location, and updated information on `semver.md` files in the repository. ([!2987]) ### Examples * `arti-ureq`: Bump `ureq` dependency to 3.0.11 and remove obsolete early return in `await_input()`. ### Acknowledgments Thanks to everybody who's contributed to this release, including hjrgrn, Lionel Goffaux, Neel Chauhan, Niel Duysters, playbahn, retort-dev, shivam37483, syphyr, Tobias Stoeckmann, and Vijaya Bhaskar. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2697]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2697 [!2921]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2921 [!2937]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2937 [!2946]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2946 [!2956]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2956 [!2962]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2962 [!2965]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2965 [!2967]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2967 [!2968]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2968 [!2972]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2972 [!2980]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2980 [!2987]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2987 [!2988]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2988 [!2989]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2989 [!2990]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2990 [!2991]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2991 [!2992]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2992 [!2993]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2993 [!2995]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2995 [!2996]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2996 [!2998]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2998 [!2999]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2999 [!3000]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3000 [!3001]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3001 [!3002]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3002 [!3003]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3003 [!3005]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3005 [!3006]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3006 [!3007]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3007 [!3010]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3010 [!3011]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3011 [!3013]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/3013 [#1335]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1335 [#1913]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1913 [#1922]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1922 [#1945]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1945 [#1969]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1969 [#1981]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1981 [#2004]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2004 [#2014]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2014 [#2911]: https://gitlab.torproject.org/tpo/core/arti/-/issues/2911 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [`cargo-sort`]: https://crates.io/crates/cargo-sort [cgo]: https://eprint.iacr.org/2025/583 [other sponsors]: https://www.torproject.org/about/sponsors/ [prop346]: https://spec.torproject.org/proposals/346-protovers-again.html # Arti 1.4.3 — 1 May 2025 Arti 1.4.3 adds adds the framework for measuring metrics (which will be used to allow service and relay operators to use Prometheus or similar tools to monitor the health of their services), initial groundwork for the [Counter Galois Onion proposal][cgo], and some of the groundwork for congestion control, in the form of handshake negotiation code. We are also publishing the new `arti-ureq` crate, which allows Arti to be used with the Rust `ureq` library for making HTTP request via Tor. As usual, there are also many under-the-hood improvements and fixes, which are documented in detail below. ### Breaking changes * The `arti hsc` flags `--quiet` and `--force` have been consolidated into a single `--batch` flag. ([!2903]) ### Major bugfixes * Arti now exits by default when it does not support a recommended or required protocol. ([!2929]) ### Major features * Arti now has a initial framework for collecting metrics, which will be used to allow service and relay operators to monitor their services with Prometheus or compatible tools. ([!2918]) * Added initial groundwork for [Counter Galois Onion encryption][cgo]. ([!2940], [!2942]) * Arti now has support for congestion control handshake negotiation. Congestion control is not yet fully supported, but this lays the groundwork. ([!2932]) * Created the `arti-ureq` library to allow using Arti with the Rust HTTP library [ureq](https://crates.io/crates/ureq). Examples are [available in the `examples/ureq-examples` directory](https://gitlab.torproject.org/tpo/core/arti/-/tree/main/examples/ureq-examples?ref_type=heads). ([!2724]) ### Breaking changes in lower-level crates * `tor-cell`: Removed deprecated method `Data::split_from()`. * `tor-cell`: `Data::try_split_from()` now expects a cell format argument. * `tor-cell`: `RelayMsgOuter::encode()` now expects a cell format argument. * `tor-circmgr`, `tor-proto`: Removed `ntor_v3` feature flag. This feature is now always enabled. ([!2907]) * `tor-config`: Added `Listen::single_address_legacy`. * `tor-keymgr`: `Keystore::insert` now uses param `key: &dyn EncodableItem` to obtain a `KeystoreItemType`, instead of `item_type` param. ([!2902]) * `tor-netdir`: Added `protocol_statuses()` method on `NetDirProvider` trait. * `tor-protover`: Renamed `MicroDesc` protocol to `Microdesc` for spec conformance. * `tor-rtcompat`: `BlockOn::reenter_block_on` accepts a non-`Send`, non-`'static` future. * `tor-rtmock`: `MockExecutor::subthread_block_on` accepts a non-`Send`, non-`'static` future. ### Testing * Added test case for `arti::onion_proxy::build_list`. ([!2896]) ### Documentation * Removed references to `rpc_demo.py`, which has been deleted. ([!2913]) * Cleaned up contributing info in README. ([!2889]) * Replaced outdated references to `KeystoreSweeper`. ([!2936]) * Added a policy forbidding forking after `exec`. ([!2925]) * Fixed intra-doc backlinks in `hashx` and `tor-persist` crates. ([!2944]) * Removed incorrect note about `StateDirectory` usage. ([!2952]) * Documented conventions around logging. ([!2966]) * Fixed some typos. ([!2961]) ### Infrastructure * Improved reproducibility of shadow E2E tests. ([!2905], [!2950], [!2958]) * Shadow now captures smaller pcaps. ([!2916]) * Removed `cargo build` step from chutney setup. ([!2947]) ### Cleanups, minor features, and bugfixes * Added Python files to `.gitignore`. ([!2914]) * `tor-keymgr` now validates ephemeral types. ([!2917]) * Removed several outdated TODOs. ([!2900]) * Improved Debian packaging. ([!2927]) * Fixed warnings on Rust 1.86. ([!2920], [!2933]) * Updated dependencies. ([!2924], [!2931], [!2969], [!2970], [!2973], [!2974]) * Refactored `get_hs_client_secret_keys_desc_enc_only` to avoid code duplication. ([!2900]) * Tweaked Conflux APIs. ([!2928]) * `tor-rtmock` now allows non `Send + 'static` futures in for `BlockOn::reenter_block_on`. ([!2934]) * Fixed Android builds. ([!2824]) * Added `ErrorDetail::OnionServiceSetup` to handle previously-unhandled error during onion service setup. ([!2923]) * Stop panicking on non-existent hop number in `send_relay_cell`. ([!2938]) * Started migrating from `once_cell` crate to `std::sync::OnceLock`. ([!2948]) * Cleaned up TODOs related to MSRV. ([!2945]) * Prevent congestion control extension during ntor-v3 extend. ([!2957]) * Optimize for performance in release builds, instead of size. ([!2959]) * Added script to check for wildcard dependencies. ([!2954]) * Added `UnparsedRelayMsg::data_len` to `tor-cell`. ([!2976]) ### Acknowledgments Thanks to everybody who's contributed to this release, including CocytusDEDI, hashcatHitman, hjrgrn, nield, playbahn, syphyr, Vijaya Bhaskar, and Yaksh Bariya. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2724]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2724 [!2824]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2824 [!2889]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2889 [!2896]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2896 [!2900]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2900 [!2902]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2902 [!2903]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2903 [!2905]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2905 [!2907]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2907 [!2913]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2913 [!2914]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2914 [!2916]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2916 [!2917]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2917 [!2918]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2918 [!2920]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2920 [!2923]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2923 [!2924]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2924 [!2925]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2925 [!2927]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2927 [!2928]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2928 [!2929]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2929 [!2931]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2931 [!2932]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2932 [!2933]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2933 [!2934]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2934 [!2936]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2936 [!2938]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2938 [!2940]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2940 [!2942]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2942 [!2944]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2944 [!2945]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2945 [!2947]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2947 [!2948]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2948 [!2950]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2950 [!2952]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2952 [!2954]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2954 [!2957]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2957 [!2958]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2958 [!2959]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2959 [!2961]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2961 [!2966]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2966 [!2969]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2969 [!2970]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2970 [!2973]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2973 [!2974]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2974 [!2976]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2976 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [cgo]: https://eprint.iacr.org/2025/583 [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.4.2 — 31 March 2025 Arti 1.4.2 marks a significant milestone: Arti's RPC subsystem is now stable and ready for use! This release continues development on [Conflux], and also fixes a number of bugs and security issues. Arti 1.4.2 contains many breaking changes in our lower level crates; please see below. ### Breaking changes in lower-level crates - Many APIs now expect `rand` version 0.9. ([!2869]) - The obsolete `tor-congestion` crate is no longer being published. ([#1864], [!2828]) - In `tor-llcrypto`, `curve25519` and `ed25519` types are now wrappers, with slight API changes. ([!2868]) - In `tor-config-path`, `CfgAddrError::ConstructUnixAddress` and `CfgAddrError::NoUnixAddressSupport` are renamed to `ConstructAfUnixAddress` and `NoAfUnixSocketSupport`, respectively. No change to the semantics, just corrected terminology. We have removed the old variants so that any code which actively matches on this variant won't be silently broken. ([#827], [!2841]) - In `tor-general-addr`, `AddrParseError::InvalidUnixAddress` is renamed to `InvalidAfUnixAddress`. No change to the semantics, just corrected terminology. We have removed the old variant so that any code which actively matches on this variant won't be silently broken. ([#827], [!2841]) - In `tor-rpc-connect`, `ConnectError::UnixAddressAccess` is renamed to `AfUnixSocketPathAccess`. No change to the semantics, just corrected terminology. We have removed the old variant so that any code which actively matches on this variant won't be silently broken. ([#827], [!2841]) - In `tor-rpc-connect`, removed `ConnectError::InvalidUnixAddress`. This error was misnamed, had a description which didn't correspond to its name, and was in any case never generated. ([#827], [!2841]) - In `tor-key-forge`, keys can now only be generated with an `EntropicRng`. ([#1898], [!2874]) - In `tor-netdoc`, the following APIs now return a `Result`: `RouterReader::new()`, `MicrodescReader::new()`, `AuthCert::parse_multiple()`. ([!2866]) - In `tor-proto`, the functions for constructing padding parameters are now fallible. ([!2869]) - In `tor-rtcompat`, the `BlockOn` trait was split into `ToplevelBlockOn` and `Blocking`. New rules for `BlockOn::block_on`; when `ToplevelBlockOn` not available, use methods from `Blocking` instead. Documentation explains. ([#1835], [!2810]) ### Security fixes - Upgraded to `ring` version 0.17.13. ([!2847]) - Upgraded to `rand` version 0.9.0. ([#1774], [!2869], [#1902], [!2877], [#1903], [!2880]) - Longer-lived keys are now derived using a `CautiousRng`, which combines inputs from several sources, including `OsRng`, to minimize the likelihood of falling to a vulnerability in any particular one. ([#1898], [!2874]) ### Network updates - Updated to the latest list of Tor fallback directories. ([!2875]) ### Major bugfixes - Arti now imposes a maximum on its fallback estimated timeout, to prevent integer overflow. ([#1693], [!2842]) ### Deprecated functionality - In `tor-rtmock`, `MockSleepProvider` and `MockSleepRuntime` are now deprecated. These have known bugs (e.g. [#1036]) and can make it easy to write flaky tests. They have been documented as deprecated since `tor-rtmock` 0.11.0 in October 2023. Now we formally mark them as `#[deprecated]`. Use `MockExecutor` (and its `SimpleMockTimeProvider`) instead. That's a nontrivial change since the time mocking API is quite different. ([#1885], [!2843]) - The `arti hss onion-name` command is now deprecated in favor of the new `arti hss onion-address` command. ([#1879], [!2840]) - `OnionService::onion_name` and `RunningOnionService::onion_name` are deprecated. Use `OnionService::onion_address` and `RunningOnionService::onion_address` instead. ([#1879], [!2840], [!2859]) - In `tor-general-addr`, `NoUnixAddressSupport` is renamed to `NoAfUnixSocketSupport`. No change to the semantics, just corrected terminology. The old name is still present as a deprecated type alias, so some (but not all) uses of the old name will still work for now. ([#827], [!2841]) - In `tor-rtcompat`, `UnsupportedUnixAddressType` is renamed to `UnsupportedAfUnixAddressType`. No change to the semantics, just corrected terminology. The old name is still present as a deprecated type alias, so some (but not all) uses of the old name will still work for now. ([#827], [!2841]) ### Conflux development - Reworked circuit reactor loop to read from, and write to, all of its configured circuit legs. ([#1863], [!2817], [!2830]) - New control commands for shutting down the circuit reactor and obtaining its (only) circuit. ([#1876], [!2829]) - Encapsulated circuit internals inside a new module, to avoid unnecessarily exposing them inside the circuit reactor. ([!2837]) - The circuit reactor now supports resolving `HopLocation`s to a hop on a particular circuit leg. ([!2839]) - Added constructors for conflux cell types. ([!2858]) - Introduced an additional `CircuitCmd` type in the circuit reactor representing an action to be executed in the context of a circuit. ([!2881]) - Refactored and simplified an internal `ConfluxSet` API. ([!2884]) ### RPC development - The RPC subsystem is now marked as stable. ([#1883], [!2871]) - Added configuration examples. ([#1830], [!2887]) - Arti now warns when RPC is configured but not enabled at compile-time. ([#1830], [!2887]) ### Testing - Overhaul Runtime APIs for sync-async interaction. ([#1835], [!2810]) - Refactor the `tor-keymgr` `key_specifier` tests. ([#1889], [!2849]) - Increased test coverage for `arti-rpc-client-core`. ([!2865], [!2870]) - Added tests for the RPC configuration options. ([#1830], [!2887]) - Replaced stringly-typed metadata with a new `ItemMetadata` type in the `tor-keymgr` tests. ([#1888], [!2848]) - In `tor-keymgr`, add tests for interoperability with `ssh-keygen`-generated tests. ([#1455], [!2873]) ### Documentation - Added missing build dependencies to [CONTRIBUTING.md]. ([!2836]) - Fixed `arti` binary path in example usage. ([!2844]) - Clarified documentation for RPC authentication type "none". ([#1820], [!2872]) - Added style guide for Unix domain sockets terminology. ([#827], [!2841]) - Fixed broken code of conduct link. ([!2882]) - Updated the Tor Browser version from the `download-manager` example. ([!2888]) ### Infrastructure - CI now uses the GitLab Dependency Proxy, which caches images pulled from DockerHub, in order to bypass rate-limiting. ([!2797]) - Various improvements to the release process. ([!2832], [!2834]) - The `cargo-audit` maintenance script now temporarily ignores the [RUSTSEC-2024-0436] advisory regarding the unmaintained `paste` crate. ([!2847]) - Temporarily ignored [RUSTSEC-2025-0014] advisory regarding `humantime` crate deprecation. ([!2852], [#1892], [#1893], [!2857]) - Parallelized the `matrix-check` job in CI. ([#1625], [!2835]) ### Cleanups, minor features, and bugfixes - Removed unnecessary `async` block from circuit reactor. ([!2815]) - Include HsDir RSA identity in onion service client debug logs. ([!2833]) - Arti now uses [`rustls-webpki`] instead of [`x509-signature`] when the `ruslts` feature is enabled. ([#1824], [#1854], [!2816]) - When expiring a consensus, Arti now removes its blob from disk. ([#1655], [!2504], [!2838]) - Removed incorrect deprecation warning from `hsc` subcommand. ([!2845]) - `Circuit::add_hop` is now fallible. ([!2855]) - `TimePeriod` now implements `Display`. ([!2851]) - Removed a TODO about error handling in the `arti hss` subcommand. ([!2846]) - Arti now rejects netdocs that contain BOMs or internal NULs. ([#1739], [!2866]) - New `State::is_fully_reachable` API for checking if an onion service is fully reachable. ([#1890], [!2850]) - `arti hsc key get` now prints a newline after the service discovery key. ([!2856]) - The experimental `arti hsc key get` subcommand now reads onion addresses from stdin. ([#1630], [!2861]) - `TorClient` now stores the state directory as a `StateDirectory` object, instead of as a raw directory and corresponding `Mistrust`. ([!2863]) - Added support for subprotocol version mnemonics. ([#1891], [!2854]) - `maint/cargo_sort` now works correctly when run against forks that are not called `arti`. ([#1868], [!2864]) - The circuit reactor is now more robust against several types of invalid control messages, returning an error over the user-provided channel instead of shutting down. ([!2867]) - Add an explicit type annotation in `ParetoTimeoutEstimator::learning_timeouts`. ([#1915], [!2886]) - Fixed `fs-mistrust` compilation on tvOS. ([!2890]) - The circuit reactor no longer busy-loops when there are no ready streams. ([!2885]) - Upgraded to the latest versions of `strum`, `rustls-webpki`, `getrandom`, `cbindgen`. ([!2894], [!2901]) ### Acknowledgments Thanks to everybody who's contributed to this release, including abdul2801, disha, hjrgrn, Jérôme Charaoui, matt022, playbahn, vcrn, vijayabhaskar_78, yaucp. Also, our deep thanks to the [Bureau of Democracy, Human Rights and Labor] and our [other sponsors] for funding the development of Arti! [!2504]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2504 [!2797]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2797 [!2810]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2810 [!2815]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2815 [!2816]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2816 [!2817]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2817 [!2828]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2828 [!2829]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2829 [!2830]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2830 [!2832]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2832 [!2833]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2833 [!2834]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2834 [!2835]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2835 [!2836]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2836 [!2837]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2837 [!2838]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2838 [!2839]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2839 [!2840]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2840 [!2841]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2841 [!2842]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2842 [!2843]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2843 [!2844]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2844 [!2845]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2845 [!2846]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2846 [!2847]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2847 [!2848]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2848 [!2849]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2849 [!2850]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2850 [!2851]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2851 [!2852]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2852 [!2854]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2854 [!2855]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2855 [!2856]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2856 [!2857]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2857 [!2858]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2858 [!2859]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2859 [!2861]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2861 [!2863]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2863 [!2864]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2864 [!2865]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2865 [!2866]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2866 [!2867]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2867 [!2868]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2868 [!2869]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2869 [!2870]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2870 [!2871]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2871 [!2872]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2872 [!2873]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2873 [!2874]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2874 [!2875]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2875 [!2877]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2877 [!2880]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2880 [!2881]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2881 [!2882]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2882 [!2884]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2884 [!2885]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2885 [!2886]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2886 [!2887]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2887 [!2888]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2888 [!2890]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2890 [!2894]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2894 [!2901]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2901 [#1036]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1036 [#1455]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1455 [#1625]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1625 [#1630]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1630 [#1655]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1655 [#1693]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1693 [#1739]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1739 [#1774]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1774 [#1820]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1820 [#1824]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1824 [#1830]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1830 [#1835]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1835 [#1854]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1854 [#1863]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1863 [#1864]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1864 [#1868]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1868 [#1876]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1876 [#1879]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1879 [#1883]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1883 [#1885]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1885 [#1888]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1888 [#1889]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1889 [#1890]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1890 [#1891]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1891 [#1892]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1892 [#1893]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1893 [#1898]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1898 [#1902]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1902 [#1903]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1903 [#1915]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1915 [#827]: https://gitlab.torproject.org/tpo/core/arti/-/issues/827 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [CONTRIBUTING.md]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/CONTRIBUTING.md [Conflux]: https://spec.torproject.org/proposals/329-traffic-splitting.html [RUSTSEC-2024-0436]: https://rustsec.org/advisories/RUSTSEC-2024-0436 [RUSTSEC-2025-0014]: https://rustsec.org/advisories/RUSTSEC-2025-0014 [`rustls-webpki`]: https://crates.io/crates/rustls-webpki [`x509-signature`]: https://crates.io/crates/x509-signature [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.4.1 — 3 March 2025 Arti 1.4.1 contains significant behind-the-scenes groundwork for [Conflux], a feature that improves performance and reliability by allowing data streams to tunnel over multiple circuits. It also adds client-side support for an [improved representation of family membership][prop321]. ### Major features - Arti now implements the client side of ID-based families (a.k.a. ["Happy Families"][prop321]). When deployed everywhere on the network, this feature will allow us to remove around 80-90% of the data from microdescriptors, and save some administrative complexity. ([#1848], [!2792]) ### Breaking changes in lower-level crates - Removed the deprecated experimental `DataStream::circuit` API. ([!2794]) - Removed the `ClientCirc::channel` API. ([!2783]) - Functions in `tor-netdir` and `tor-relay-selection` related to families now take a new `FamilyRules` argument, to represent relevant network parameters. ([!2792]) ### Conflux development - Major simplification and refactoring in the `tor-proto` crate, to lay the groundwork for [Conflux] in Arti. ([#1839], [!2772], [!2774], [!2783], [!2786], [!2796], [!2800], [!2804]) - Implemented message types that will be used for Conflux. ([#1852], [!2789]) - Added types for identifying hops within a Conflux tunnel. ([!2799], [!2803]) ### Onion service development - Refactored `ReplayLog` code so it can be used to detect replays in both INTRODUCE messages and proof-of-work solutions. ([!2688]) ### Testing - Added thread-management support to our testing mock runtime. ([#1835], [!2793]) ### Documentation - Fixes and cleanups to examples on website. ([!2775]) - Fixed a typo. ([!2795]) - Documentation for experimental features in the `tor-keymgr` README. ([!2806]) ### Network updates - Updated to the latest list of Tor fallback directories. ([!2787]) ### Cleanups, minor features, and bugfixes - Upgraded to the latest versions of [`hickory-proto`], [`derive-deftly`], and several other crates. ([#1847], [!2784], [!2788], [!2809]) - Fixed new clippy warnings that appeared in Rust 1.85. ([!2801]) - Do not emit ANSI color to our stdout log when that log is not being sent to a terminal. ([#1763], [!2802]) - The `DataStream` type now implements `Sync`. ([#1859], [!2808]) ### Acknowledgments Thanks to everybody who's contributed to this release, including kpcyrd and Neel Chauhan. Also, our deep thanks to all of our [sponsors] for funding the development of Arti! [!2688]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2688 [!2772]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2772 [!2774]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2774 [!2775]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2775 [!2783]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2783 [!2784]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2784 [!2786]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2786 [!2787]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2787 [!2788]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2788 [!2789]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2789 [!2792]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2792 [!2793]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2793 [!2794]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2794 [!2795]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2795 [!2796]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2796 [!2799]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2799 [!2800]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2800 [!2801]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2801 [!2802]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2802 [!2803]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2803 [!2804]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2804 [!2806]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2806 [!2808]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2808 [!2809]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2809 [#1763]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1763 [#1835]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1835 [#1839]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1839 [#1847]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1847 [#1848]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1848 [#1852]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1852 [#1859]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1859 [Conflux]: https://spec.torproject.org/proposals/329-traffic-splitting.html [`derive-deftly`]: https://docs.rs/derive-deftly/latest/derive_deftly/ [`hickory-proto`]: https://crates.io/crates/hickory-proto [prop321]: https://spec.torproject.org/proposals/321-happy-families.html [sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.4.0 — 7 February 2025 Arti 1.4.0 offers a new [RPC interface], continues work on the relay implementation, includes an overhaul of the [in-tree documentation](https://tpo.pages.torproject.net/core/arti/). ## Dedication The Arti 1.4.0 release is dedicated to the memory of Jérémy Bobbio (1982-2024), known in our community as Lunar. Lunar was a Tor volunteer, free software hacker, and community organizer. Inside Tor, Lunar will be remembered for leading the efforts around Tor's old Weekly News newsletter, but also for caring deeply about both the organization the people around the organization. Outside of Tor, Lunar worked on highly successful free software projects such as the Debian project and helped build the infrastructure and tooling around the Reproducible Builds project, a project that continues to benefit the broader ecosystem. Lunar will be deeply missed, both in our community and in the many other communities he participated in. See also what other projects are writing about Lunar: - [The Debian Project](https://www.debian.org/News/2024/20241119) - [lunar.anargeek.net](https://lunar.anargeek.net/) - [Linux Weekly News](https://lwn.net/Articles/997775/) - [The Reproducible Builds Project](https://reproducible-builds.org/news/2024/11/14/reproducible-builds-mourns-the-passing-of-lunar/) ## Changes in this release ### Breaking changes - `Runtime` now implies `SpawnBlocking` with `spawn_blocking`. Out-of-tree implementors of `Runtime` will need to change. ([!2678]) ### Major features - Arti's [RPC interface] is now ready for use. Arti RPC is the replacement for C Tor's [control port] with many improvements. (At present the available *functionality*, offered over RPC, is limited.) ### Breaking changes in lower-level crates - `tor-chanmgr`: `AbstractChannel` now has a `reparameterize_kist()` method. ([!2706]) - `tor-key-forge`: `ErasedKey` is now `Box`; `EncodableItem::item_type()` moved to `ItemType`; `ToEncodableCert::Cert` replaced with `::ParsedCert` and `::EncodableCert`; `ToEncodableCert::validate` now takes a `Self::ParsedCert` and returns `Self`; `ToEncodableCert::from_encodableCert` removed. ([!2672]) - `tor-proto`: `StreamOps` trait now has a (defaulted) `new_handle` function; any wrapper implementing `StreamOps` should also wrap it. ([!2706]) - `tor-proto`: stream types are now required to implement `StreamOps`. ([!2706]) - `tor-rtcompat`: in many traits, stream types must now implement `StreamOps`. ([!2706]) - `tor-proto`: `ConversationInHandler` now only has one lifetime parameter; and `::send_message` is now `async`. ([!2747]) - `fs-mistrust`: A few methods now take `&self` rather than `self`. ([!2707]) ### Relay development - Major refactoring of the circuit reactor, to use `select!`, lifting it from async Rust's low-level "poll" to "async fn". ([!2747], [!2733], [#1816], [!2720], [!2760], [#1832], [!2768], [!2765]) - Improved CLI and add config loading. ([!2699], [#1736], [!2709]) - High-level certificate types (implementing `ToEncodableCert`) in `tor-relay-crypto`. ([!2672], [#1777]) - Initial [KIST] support (Linux-only) in `tor-proto`. ([!2706], [#1728], [#1728], [#1729], [#1730]) - Congestion control. ([proposal 324], [!2675], [#534]) - Apply the standard lint block. ([!2708]) ### RPC development - Cookie authentication. ([!2702], [#1529], [!2716]) - Fixed the remaining outstanding TODOs in the RPC code. ([!2740], [!2743], [!2745], [!2737], [!2731]) - Improved names for many type and methods: `MethodNotFound` to `NoSuchMethod` ([!2714], [#1500]); `new_stream_handle` to `new_oneshot_client` ([!2715], [#1664]); make `Params`/`Reply` structs consistent. ([!2729], [#1586], [!2732]) - Implement request cancellation. ([!2722], [#818]) - Fix portability problems on Windows. ([!2761], [#1831], [!2713], [#1798], [!2756], [!2718]) - Move support for weak references behind an experimental feature, and clean up some related comments. ([!2742], [#868], [!2741]) - Improve and write a bunch of RPC documentation. ([!2748], [#1520], [#1527], [#1296]) - Fixes and maintenance on rpc-docs-tool. ([!2736], [#1520], [#1708]) - No longer generate internal errors for expected situations. ([!2730]) - Tolerate nonexistence of a the connect point directory. ([!2735]) - Improve error outputs, including the origin of each failed connect attempt. ([!2766], [#1650], [#1826], [!2744], [#1826]) - `fs-mistrust`: New facilities for file access. ([!2707], [#1746]) - Clarify and fix some issues surrounding relative paths. ([!2712], [#1748], [#1749]) - Tweaked `tor-proto` `StreamCtrl` APIs to better support use with RPC. ([!2755]) - Document stream optimism. ([!2753], [#1583]) - Specify the RPC connection banner format. ([!2700], [#1753]) ### Other development - Update plan for Proof of Work DoS prevention, `service-side-pow.md`. ([!2701]) - Design notes for implementation of [Conflux]. ([!2750]) ### Documentation - Rewrite download manager example. ([!2725], [#1471], [#1386]) - `arti`: Add `restricted-discovery` to the list of experimental features in the crate documentation. ([!2719], [#1808]) - `tor-config`: clarify that `ConfigurationSources::set_mistrust`is unrelated to the paths defined within the configuration file itself, and reference `storage.permissions.dangerously_trust_everyone`. ([!2727]) - Integrate the Docusaurus-based documentation overhaul (aka [`arti-doc-project-2023`]) into `arti.git/web/` and deploy it to . ([!2746], [!2752], [!2754], [!2757]) ### Cleanups, minor features, and bugfixes - Fix `watch_configuration = true`. Previously this caused an infinite loop and was not useable. ([#1794], [!2696]) - `tor-circmgr`: Add trace log on circuit build timeout. ([!2698]) - `tor-proto`: Make `Channel::wait_for_close` non-experimental. ([!2666]) - Fix non-Unix build and test failures. ([!2615], [!2738], [#1809], [!2717]) - Replace an async `Mutex` with a sync one in file watcher. ([!2763]) - Remove confusing `use asynchronous_codec as futures_codec`. ([#1690], [!2769]) - Fix many typos. ([!2751]) ### Testing - `tor-rtmock`: Fix misleading task lists from `MockExecutor` when panicking due to stall and tasks unstick each other in `Drop`. ([!2682]) - `tor-proto`: Fix flaky test `invalid_circ_sendme` by using `MockExecutor` and replacing `sleep()` with `advance_until_stalled()`. ([!2721]) - More uniform handling of some test key data. ([!2764], [#1396]) ### Infrastructure - `maint/matrix-check`: properly find the crate subdir. ([!2762]) - Un-ignore [RUSTSEC-2024-0421] as we no longer use an affected `hickory`. ([!2693], [#1773]) - Update our main CI image (`RECENT_RUST_IMAGE`) to 1.83. ([!2694]) - Better instructions for handling new MPL-licensed dependencies. ([!2726]) - Style guide for this changelog, and small script to help format it. ([!2739], [!2616]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Dimitris Apostolou, hhamud, Neel Chauhan and tidely. Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2615]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2615 [!2616]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2616 [!2666]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2666 [!2672]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2672 [!2675]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2675 [!2678]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2678 [!2682]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2682 [!2693]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2693 [!2694]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2694 [!2696]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2696 [!2698]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2698 [!2699]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2699 [!2700]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2700 [!2701]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2701 [!2702]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2702 [!2706]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2706 [!2707]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2707 [!2708]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2708 [!2709]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2709 [!2712]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2712 [!2713]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2713 [!2714]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2714 [!2715]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2715 [!2716]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2716 [!2717]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2717 [!2718]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2718 [!2719]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2719 [!2720]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2720 [!2721]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2721 [!2722]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2722 [!2725]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2725 [!2726]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2726 [!2727]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2727 [!2729]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2729 [!2730]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2730 [!2731]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2731 [!2732]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2732 [!2733]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2733 [!2735]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2735 [!2736]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2736 [!2737]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2737 [!2738]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2738 [!2739]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2739 [!2740]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2740 [!2741]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2741 [!2742]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2742 [!2743]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2743 [!2744]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2744 [!2745]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2745 [!2746]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2746 [!2747]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2747 [!2748]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2748 [!2750]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2750 [!2751]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2751 [!2752]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2752 [!2753]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2753 [!2754]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2754 [!2755]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2755 [!2756]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2756 [!2757]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2757 [!2760]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2760 [!2761]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2761 [!2762]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2762 [!2763]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2763 [!2764]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2764 [!2765]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2765 [!2766]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2766 [!2768]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2768 [!2769]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2769 [#1296]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1296 [#1386]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1386 [#1396]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1396 [#1471]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1471 [#1500]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1500 [#1520]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1520 [#1527]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1527 [#1529]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1529 [#1583]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1583 [#1586]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1586 [#1650]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1650 [#1664]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1664 [#1690]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1690 [#1708]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1708 [#1728]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1728 [#1729]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1729 [#1730]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1730 [#1736]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1736 [#1746]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1746 [#1748]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1748 [#1749]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1749 [#1753]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1753 [#1773]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1773 [#1777]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1777 [#1794]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1794 [#1798]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1798 [#1808]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1808 [#1809]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1809 [#1816]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1816 [#1826]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1826 [#1831]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1831 [#1832]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1832 [#534]: https://gitlab.torproject.org/tpo/core/arti/-/issues/534 [#818]: https://gitlab.torproject.org/tpo/core/arti/-/issues/818 [#868]: https://gitlab.torproject.org/tpo/core/arti/-/issues/868 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Conflux]: https://spec.torproject.org/proposals/329-traffic-splitting.html [KIST]: https://blog.torproject.org/kist-and-tell-tors-new-traffic-scheduling-feature/ [RPC interface]: https://gitlab.torproject.org/tpo/core/arti/-/tree/main/doc/dev/rpc-book/src [RUSTSEC-2024-0421]: https://rustsec.org/advisories/RUSTSEC-2024-0421.html [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`arti-doc-project-2023`]: https://gitlab.torproject.org/tpo/core/arti-doc-project-2023/ [control port]: https://spec.torproject.org/control-spec/index.html [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 324]: https://spec.torproject.org/proposals/324-rtt-congestion-control.html # Arti 1.3.2 — 7 January 2025 Arti 1.3.2 continues development on RPC, and includes preparatory work for relay support and service-side onion service denial-of-service resistance. ### Breaking changes in lower-level crates - In `tor-rtcompat`, stream types now implement a `StreamOps` trait to provide additional operations. Currently, the only supported operation is `set_tcp_notsent_lowat`, which will be used in our [KIST] implementation. ([#1769], [!2660], [!2673]) - In `tor-key-forge`, the `Error` type no longer implements `HasKind`: the correct behavior for this error depends on higher-level context. ([!2664]) - In `tor-keymgr`, the `EncodeableKey` trait has been replaced with a `EncodeableItem` trait. ([!2635]) - In `tor-keymgr`, the `KeyType::Unknown` variant has been removed. ([!2635]) ### Onion service development - Design for integration of proof-of-work into Arti's service-side onion-service implementation. ([!2663]) ### Relay development - The key-manager code can now store certificates as well as keys. ([#1617], [!2644]) ### Directory authority development - Design for the necessary behaviors and pieces of a directory authority implementation. ([!2635]) ### RPC development - Initial implementation for RPC connect points, which will provide a mechanism for applications to discover where Arti is running, and connect to it securely. This implementation is now working, but not yet fully conformant to its specification. ([!2655], [!2667], [!2676]) ### Documentation - Clarifications to release instructions about communications surrounding releases. ([!2614]) - Update copyright statements to 2025. ([!2658], [!2687]) ### Infrastructure - New "exclude" feature in our `fixup-features` tool, to avoid crates that we don't publish. ([#1766], [!2652]) - Use internally maintained images in our CI instructions, to reduce pulls from dockerhub. ([!2656]) - Pin Python CI tasks to specific tool versions, to avoid surprising breakage. ([!2683]) ### Cleanups, minor features, and bugfixes - Suppress the new [`clippy::needless_lifetimes`] warning; it affects a large amount of code, and isn't a clear readability benefit. ([64cc3f2ed3eea0b7c5cc]) - Resolve new Clippy warnings introduced in Rust 1.83. ([#1765], [!2654]) - Deny the [`clippy::mod_module_files`] lint, for style consistency. ([!2689]) - Consolidate logic for close detection on Channels. ([!2645]) - Label the output of our `cbindgen` script with the version of cbindgen, to help detect incompatibility. ([!2662]) - Remove dependency from `tor-key-forge` onto `tor-hscrypto`. ([#1778], [!2668]) - In `fs-mistrust`, improve environment-variable handling, document stability guarantees. ([!2674], [!2677]) - Miscellaneous typo fixes. ([!2680]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Dimitris Apostolou. Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2614]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2614 [!2635]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2635 [!2644]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2644 [!2645]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2645 [!2652]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2652 [!2654]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2654 [!2655]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2655 [!2656]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2656 [!2658]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2658 [!2660]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2660 [!2662]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2662 [!2663]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2663 [!2664]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2664 [!2667]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2667 [!2668]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2668 [!2673]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2673 [!2674]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2674 [!2676]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2676 [!2677]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2677 [!2680]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2680 [!2683]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2683 [!2687]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2687 [!2689]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2689 [#1617]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1617 [#1765]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1765 [#1766]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1766 [#1769]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1769 [#1778]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1778 [64cc3f2ed3eea0b7c5cc]: https://gitlab.torproject.org/tpo/core/arti/-/commit/64cc3f2ed3eea0b7c5cc89ae07cbdadfdc1646fb [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [KIST]: https://blog.torproject.org/kist-and-tell-tors-new-traffic-scheduling-feature/ [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`clippy::mod_module_files`]: https://rust-lang.github.io/rust-clippy/master/index.html#mod_module_files [`clippy::needless_lifetimes`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_lifetimes [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.3.1 - 2 December 2024 Arti 1.3.1 continues development on onion services, the RPC subsystem, and relay infrastructure. Additionally, this release fixes a major bug in Arti's channel management code, where in some circumstances, canceled pending channel entries were not being cleaned up properly, preventing Arti from building new channels to their target relays. ### Major bugfixes - `ChanMgr::get_or_launch` is now cancellation-safe. ([#1716], [!2646], [!2625]) ### Breaking changes in lower-level crates - Removed the `expand-feature` and the `CfgPath` and `CfgPathError` re-exports from `tor-config`. ([#1717], [!2593]) - In `tor-config-path`, `CfgPath::path` now takes a `CfgPathResolver` argument. ([!2615]) - In `tor-ptmgr`, `PtMgr::new` now takes a `CfgPathResolver` argument. ([!2615]) - Moved the `NetdirProviderShutdown` error from `tor-hsservice` to `tor-netdir`. ([!2609]) - `HsIdParseError` no longer has an `HasKind` implementation. ([!2607]) - When the `keymgr` feature is disabled in `tor-keymgr`, `KeyMgr` no longer exposes `insert` and `remove` APIs. ([#1732], [!2631]) - In `tor-checkable`, `TimeRangeBound` now returns a tuple of `Option` instead of `Bound`. ([#1691], [1659495eb30ae6a17058418b6d00592373cfdf65]) ### Onion service development - The `HasKind` implementation of `ErrorDetail` now returns an `InvalidStreamTarget` error kind for `BadOnionAddress`. ([!2607]) - Began laying the groundwork for service-side proof-of-work support. ([#1751], [!2609], [!2642]) ### Relay development - Relay signing key specifiers now encode a timestamp, which will enable Arti to store more than one `K_relaysign_ed` per relay in the keystore. ([#1692], [!2577]) - Fixed `ChanMgr` reconfiguration bug when using `Reconfigure::CheckAllOrNothing`. ([!2619]) - Added an initial CLI interface to the `arti-relay` binary. ([#1736], [!2630]) - Designed new certificate management APIs for the key manager. ([#1617], [!2565]) - `arti-relay` now uses `tokio` as its async runtime. ([#1744], [!2634]) - `tor-config-path` now uses a `CfgPathResolver` for expanding variables in `CfgPath`, rather than a static hardcoded list. ([#1672], [!2615]) - Channel request cancellation errors are now immediately retriable. ([!2640]) ### RPC development - Added many clarifications and improvements to the RPC connect point spec. ([!2602], [!2623], [!2629]) - New `CfgAddr` type to represent socket addresses in configuration. ([#1528], [!2597]) - New `tor-connect-point` crate providing an initial backend implementation for RPC connect point management. ([#1528], [!2629]) ### Testing - Re-enabled the `test_parse` test in `tor-config-path`. ([cc2aff554c43e6b52bfea8f5378b3ee8dde35645]) - Updated `unix_literal` test to use `USER_HOME` instead of `HOME`. ([!2612]) - Added benchmarks for cell encryption and decryption in `tor-proto`. ([!2608]) ### Documentation - Fixed inaccurate `RecvWindow::take` documentation. ([!2611]) - Updated the README to point to the updated anonticket URL. ([!2622]) - Added documentation describing the life cycle of a cell, and various observations about the circuit and channel reactors. ([#1747], [!2637]) ### Infrastructure - CI job output is now split into collapsible and individually-timed sections. ([!2605]) - The `python3-checks` job no longer unnecessarily installs the `mypy` and `flake8` packages from `apt`. ([!2618]) - Simplified `chutney` installation in CI, in preparation for "cloning" the Arti chutney-related CI into chutney's CI. ([!2600]) - The `cargo-audit` maintenance script now temporarily ignores the [RUSTSEC-2024-0384] advisory regarding the unmaintained `instant` crate. ([!2627]) - Our license-checking code now allows the license used by `unicode-ident`. ([!2647]) ### Cleanups, minor features, and bugfixes - `tor-persist` now has a `Iso8601TimeSlug` API for encoding timestamps as `Slug`s that can appear within filenames. ([38d1e334007143bba5ec4b483f9e04b1f3ea23a1]) - Upgraded `hashbrown` to version 0.15.1. ([#1725], [!2613]) - It is now an error to modify the `cache_trust` configuration at runtime. ([#1721], [!2620]) - Removed exploratory code in comment in `tor-config-path`. ([!2610]) - Upgraded to the latest versions of `thiserror`, `rustls`, `sanitize-filename`, and `tinystr`. ([#1741], [!2626], [!2641], [!2647]) - Removed dead code from `tor-keymgr`. ([!2638]) - Fixed various new clippy warnings. ([!2639]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Lionel Goffaux. Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2565]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2565 [!2577]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2577 [!2593]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2593 [!2597]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2597 [!2600]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2600 [!2602]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2602 [!2605]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2605 [!2607]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2607 [!2608]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2608 [!2609]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2609 [!2610]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2610 [!2611]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2611 [!2612]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2612 [!2613]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2613 [!2615]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2615 [!2618]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2618 [!2619]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2619 [!2620]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2620 [!2622]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2622 [!2623]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2623 [!2625]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2625 [!2626]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2626 [!2627]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2627 [!2629]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2629 [!2630]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2630 [!2631]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2631 [!2634]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2634 [!2637]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2637 [!2638]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2638 [!2639]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2639 [!2640]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2640 [!2641]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2641 [!2642]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2642 [!2646]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2646 [!2647]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2647 [#1528]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1528 [#1617]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1617 [#1672]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1672 [#1691]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1691 [#1692]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1692 [#1716]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1716 [#1717]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1717 [#1721]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1721 [#1725]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1725 [#1732]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1732 [#1736]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1736 [#1741]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1741 [#1744]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1744 [#1747]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1747 [#1751]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1751 [1659495eb30ae6a17058418b6d00592373cfdf65]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1659495eb30ae6a17058418b6d00592373cfdf65 [38d1e334007143bba5ec4b483f9e04b1f3ea23a1]: https://gitlab.torproject.org/tpo/core/arti/-/commit/38d1e334007143bba5ec4b483f9e04b1f3ea23a1 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [RUSTSEC-2024-0384]: https://rustsec.org/advisories/RUSTSEC-2024-0384.html [Zcash Community Grants]: https://zcashcommunitygrants.org/ [cc2aff554c43e6b52bfea8f5378b3ee8dde35645]: https://gitlab.torproject.org/tpo/core/arti/-/commit/cc2aff554c43e6b52bfea8f5378b3ee8dde35645 [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.3.0 - 31 October 2024 Arti 1.3.0 is a significant milestone: we have achieved parity on most major client features with C Tor. The last big security feature needed for Onion Services (resistance to out-of-memory DoS) landed in this release. And, in Arti client 1.3.0, connecting to `.onion` domains is enabled by default. Much other major work is taking place, too! We have continued our work on Arti Relay. The work-in-progress RPC system is significantly more clearly defined and implementation is proceeding. ### Breaking changes * **Reject (managed) pluggable transport on non-localhost address:** If a pluggable transport we spawn tells us it is listening on a non-localhost address, reject that transport, since this is almost certainly a security risk. (The goal is to detect buggy PTs. We aren't aware of any such PTs.) ([!2454], [#1636]) * **API:** Several methods (mostly in `tor-chanmgr` and `tor-proto`) take new memory quota tracking arguments. If memory tracking is not required, you can create a no-op memory quota account with `SpecificAccount::new_noop()` or `Account::new_noop(). * **API:** New API for `tor-socksproto`, which is more robust and avoids many kinds of misuse, including bugs like TROVE-2024-010. The old `.handshake` method still available, but deprecated, and now part of the new `Handshake` trait. ([#1590], [#1627], [#1592], [!2436]) * **API:** Many places where a `SleepProvider` bound was used now also require `CoarseTimeProvider`. In-tree `SleepProvider`s all implement `CoarseTimeProvider`, so for most callers this can be fixed by propagating the bounds. ([!2482]) * **cargo features:** Some cargo features of lower-layer crates are no longer enabled by implication by higher-layer crates. External callers may need to add feature requesgts to `Cargo.toml`s. ([!2498]) ### Major new features * **Support memory quota tracking.** (Feature compiled in by default.) Specifically: Arti can now try to limit the amount of memory it uses for data that might be originated by untrusted parties. This is currently useful as DoS resistance measure for Hidden Services (`.onion` services). To actually enable this, a specific limit must be imposed in the `[system]` section of of the Arti configuration. ([!2459], [!2461], [!2484], [!2493], [!2508], [!2509], [!2518], [!2531], [!2536], [!2537], [!2545], [!2555], [!2560], [!2569], [#1682], [#351]) * **Enabled connecting to `.onion` addresses (Hidden Services) by default,** by making `allow_onion_addrs` default to `true` in the configuration. (This is appropriate now that we have Vanguard support.) ([#1402], [!2506]) ### Bugfixes * Fixed the build of `arti-client` with just the features `experimental-api` and `onion-service-client` enabled. ([!2457], [#1638]) * Fixed the build on FreeBSD. ([!2533], [#1686]) * Fixed the build on NetBSD. ([!2540], [rust-pwd-grp#4], [rust-pwd-grp!25]) * Fixed config file watching (file notifier) on non-Windows platforms without inotify. ([!2547], [#1644], [notify-rs#644]) * Fixed a bug that rendered Arti unable to connect to the Tor network when built with certain library combinations. This could occur when an out-of-tree user of the Arti libraries ends up enabling `time-rs`'s `large-dates` cargo feature, by replacing `simple_asn1` dependency with `der-parser` in `tor-llcrypto`. ([!2462], [#1632], [simple_asn1#34], [simple_asn1!35], [time-rs#683]) * Fixed the logging of backtraces, when an internal error occurs. (Bug first appeared in Arti 1.2.7.) [!2588], [#1713]) * Removed a false claim that we don't support pluggable transports. ([!2507]) * Documented the `vanguards` cargo feature flag. ([!2507]) ### Other user-facing improvements * Warn if we're configured to listen for SOCKS or DNS queries on a non-localhost address, or if we're configured to use an externally-managed pluggable transport with a non-localhost address, These are very questionable configurations, but there may be unusual situations where this is a sensible setup. ([!2454], [#1636]) * Use new "restricted discovery" terminology throughout (for Hidden Services, aka `.onion` services), replacing previous (misleading) "client authorization". ([!2495], [#1476]) * Experimental ability to read private keys from C Tor's on-disk keystore. ([!2481], [!2514]) * Experimental proof-of-work client-side support for Hidden Services (`.onion` services). ([!2486], [!2026]) ### New library and API features * Added `general::SocketAddr` type for unifying IP and AF\_UNIX (and potentially other) sockets. ([!2519], [#1681], [!2553], [!2554], [#1701], [!2592]) * Added type-erased `DynTimeProvider` in `tor-rtcompat`. ([!2460], [!2500]) * Added `SinkTrySend` and `SinkCloseChannel` traits, making the functionality of `mpsc::Sender::try_send` and `::close` available as a trait method and implementable for other types. ([!2468], [!2485], [!2490]) * Added `SometimesUnboundedSink::as_inner` method. ([!2483]) * Guarantee that `Slug`s will never contain colons (`:`), and explain why. ([!2576]) * Moved `tor-config`'s `path` module to a new crate `tor-config-path`. ([!2590]) * Added `default-runtime` feature in `arti`, to simplify building without default features. ([!2551]) ### Relay development * Support multiple channels for a single relay ID. ([!2442], [#1633]) * Improved channel selection code. ([!2477], [#1602], [!2544]) * Much other cleanup and refactoring in `tor-chanmgr`. ([!2523], [!2538], [#1654], [!2566]) * Made `arti-relay` be a binary crate only, for now at least, and abolish the `relay` subcommand of the main `arti` CLI. ([!2525], [#1674], [!2542]) ### RPC system development * Reorganised RPC documentation; soon it will be a mdbook. ([!2581]) * Improved documentation for writing RPC callers, including a new Python tool to build RPC method and type documentation. ([!2479], [!2489] [!2574]) * Finalised specifications for how RPC clients should find the Arti RPC server, how the server should decide where to listen, and how authentication will be done. ([!2439], [!2440], [!2439], [#1521], [!2563], [#1702], [!2582], [#1711]) * Finalised specifications for version compatibility (interworking of newer/older Arti with newer/older RPC clients). ([!2475], [#1634], [!2510], [#1665], [!2511], [#1662], [!2512]) * Improvements to error handling, especially in the client library. ([!2556]) * Improved and clarified objectid/isolation rules in SOCKS interaction. ([!2474], [torspec!292], [proposal 351], [socks-extensions.md]) * Clarified (and weakened) guarantees provided on request cancellation. ([!2564], [#818]) * Changed `release` method to be a method on the object itself. ([!2573], [#1663]) * Other specification fixes/improvements. ([#1678], [!2539]) * Fixed the shared library extension on OSX and Windows. ([!2469]) * Removed the `Echo` testing/demo method. ([!2549], [#1525]) * Started a Python client API, and adopted it for some integration tests. ([!2515], [#1295], [!2567]) * Reduced the dependencies of the client library. ([!2522], [!2524]) * Internal cleanups. ([!2456], [#1587], [!2558]) ### Documentation * Clarified `launch_onion_service_with_hsid()`. ([!2494], [#1626]) * Use new "circuit stem" terminology. ([#1479], [!2410]) * Added missing docs for `keypair_specifier`. ([!2532]) ### Testing * Much better testing for the CircMgr. ([!2444], [!2513]) * Fixed the flaky `circuit::test::accept_valid_sendme` CI test. ([!2501]) * Added more miri tests. ([!2502]) * Avoid writing `_ => panic!()` even in tests. ([!2534]) * Allow more precise testing of conditional compilation which affects the configuration reader. ([!2561]) * Updated to the latest version of Shadow. ([!2585], [shadow!3428], [!2587]) * Include more output from Shadow in CI artifacts. ([!2586]) * Pin the version of Chutney used in Shadow tests to make arti.git CI more hermetic. ([!2596]) ### Cleanups and housekeeping * Updated the list of fallback directories. Clients use these to fetch directory information when they have no cached directory or guard nodes. ([!2589]) * Updated some previous entries in `CHANGELOG.md` to more fully document changes in `tor-circmgr` 0.23.0. * Now we run a typechecker, linter, and autoformatter, on all our Python scripts (and fix the issues identified). ([!2476], [!2578], [!2579], [#1689], [!2584]) * Minor cleanups and reformatting in `tor-key-forge`. ([!2552]) * Commented out (temporarily) ill-shaped `RelaySigningKeySpecifier`. ([!2527]) * Reduced the number of "unused" warnings arising from conditional compilation (eg, cargo features). ([!2431], [!2463], [#1645], [!2551]) * In `Cargo.toml`, avoid updating to a `typed-index-collections` which would break our MSRV by requiring Rust 1.81. ([!2471], [#1647]) * Tidied up the sealing of a pair of traits. ([!2472]) * Use `{u64,usize}::div_ceil` where applicable. ([!2473]) * Now we avoid some warnings about certain elided lifetimes. ([!2478], [!2575]) * Fixed docs-rs cargo feature decorations on certain items. ([!2487]) * Forbid hard tabs (in most files) in tree. ([!2488]) * Fixed `no_default_features = true` typo in many `Cargo.toml`. ([!2498]) * Bumped dependency requirements for `futures-*` `notify`. ([!2499]) * Fixed indentation in a doc comment to address a new clippy lint. ([!2516], [!2520]) * Changed to depend on `slotmap-careful` instead of `slotmap`. ([!2530], [#1531]) * Abolished unneeded use of `python-is-python3` package in CI. ([!2535]) * Reinstated the `tor-proto` circuit hop check in `test_create()`. ([!2546]) * Updated download size numbers (for Project 101 Q3-2024). ([!2571]) * Simplified `tor-config` path handling by using `path` feature of `shellexpand`. ([!2583]) * Work around a bug in `cargo license` by permitting a weird licence string. ([!2591], [cargo-license#78]) * Removed an obsolete TODO. ([!2562]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Morgan, and Neel Chauhan. Also, our welcome to Clara Engler as they join the team! Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2026]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2026 [!2410]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2410 [!2431]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2431 [!2436]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2436 [!2439]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2439 [!2440]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2440 [!2442]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2442 [!2444]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2444 [!2454]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2454 [!2456]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2456 [!2457]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2457 [!2459]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2459 [!2460]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2460 [!2461]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2461 [!2462]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2462 [!2463]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2463 [!2468]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2468 [!2469]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2469 [!2471]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2471 [!2472]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2472 [!2473]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2473 [!2474]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2474 [!2475]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2475 [!2476]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2476 [!2477]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2477 [!2478]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2478 [!2479]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2479 [!2481]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2481 [!2482]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2482 [!2483]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2483 [!2484]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2484 [!2485]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2485 [!2486]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2486 [!2487]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2487 [!2488]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2488 [!2489]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2489 [!2490]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2490 [!2493]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2493 [!2494]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2494 [!2495]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2495 [!2498]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2498 [!2499]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2499 [!2500]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2500 [!2501]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2501 [!2502]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2502 [!2506]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2506 [!2507]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2507 [!2508]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2508 [!2509]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2509 [!2510]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2510 [!2511]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2511 [!2512]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2512 [!2513]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2513 [!2514]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2514 [!2515]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2515 [!2516]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2516 [!2518]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2518 [!2519]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2519 [!2520]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2520 [!2522]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2522 [!2523]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2523 [!2524]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2524 [!2525]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2525 [!2527]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2527 [!2530]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2530 [!2531]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2531 [!2532]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2532 [!2533]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2533 [!2534]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2534 [!2535]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2535 [!2536]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2536 [!2537]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2537 [!2538]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2538 [!2539]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2539 [!2540]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2540 [!2542]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2542 [!2544]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2544 [!2545]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2545 [!2546]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2546 [!2547]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2547 [!2549]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2549 [!2551]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2551 [!2552]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2552 [!2553]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2553 [!2554]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2554 [!2555]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2555 [!2556]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2556 [!2558]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2558 [!2560]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2560 [!2561]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2561 [!2562]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2562 [!2563]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2563 [!2564]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2564 [!2566]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2566 [!2567]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2567 [!2569]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2569 [!2571]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2571 [!2573]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2573 [!2574]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2574 [!2575]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2575 [!2576]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2576 [!2578]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2578 [!2579]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2579 [!2581]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2581 [!2582]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2582 [!2583]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2583 [!2584]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2584 [!2585]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2585 [!2586]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2586 [!2587]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2587 [!2588]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2588 [!2589]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2589 [!2590]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2590 [!2591]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2591 [!2592]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2592 [!2596]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2596 [#1295]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1295 [#1402]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1402 [#1476]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1476 [#1479]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1479 [#1521]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1521 [#1525]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1525 [#1531]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1531 [#1587]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1587 [#1590]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1590 [#1592]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1592 [#1602]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1602 [#1626]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1626 [#1627]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1627 [#1632]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1632 [#1633]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1633 [#1634]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1634 [#1636]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1636 [#1638]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1638 [#1644]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1644 [#1645]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1645 [#1647]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1647 [#1654]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1654 [#1662]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1662 [#1663]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1663 [#1665]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1665 [#1674]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1674 [#1678]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1678 [#1681]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1681 [#1682]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1682 [#1686]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1686 [#1689]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1689 [#1701]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1701 [#1702]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1702 [#1711]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1711 [#1713]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1713 [#351]: https://gitlab.torproject.org/tpo/core/arti/-/issues/351 [#818]: https://gitlab.torproject.org/tpo/core/arti/-/issues/818 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Zcash Community Grants]: https://zcashcommunitygrants.org/ [cargo-license#78]: https://github.com/onur/cargo-license/issues/78 [notify-rs#644]: https://github.com/notify-rs/notify/issues/644 [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 351]: https://spec.torproject.org/proposals/351-socks-auth-extensions.html [rust-pwd-grp!25]: https://gitlab.torproject.org/tpo/core/rust-pwd-grp/-/merge_requests/25 [rust-pwd-grp#4]: https://gitlab.torproject.org/tpo/core/rust-pwd-grp/-/issues/4 [shadow!3428]: https://github.com/shadow/shadow/pull/3428 [simple_asn1!35]: https://github.com/acw/simple_asn1/pull/35 [simple_asn1#34]: https://github.com/acw/simple_asn1/issues/34 [socks-extensions.md]: https://spec.torproject.org/socks-extensions.html [time-rs#683]: https://github.com/time-rs/time/issues/638 [torspec!292]: https://gitlab.torproject.org/tpo/core/torspec/-/merge_requests/292 # Arti 1.2.8 — 1 October 2024 Arti 1.2.8 continues development on onion services, the RPC subsystem, key management, and relay infrastructure. It also includes fixes for two security issues in handling the SOCKS protocol, the most severe of which is rated at "medium" according to our [security policy]. Arti 1.2.8 also increases our MSRV (Minimum Supported Rust Version) to 1.77, in accordance with our [MSRV policy]. ### Breaking changes - Arti now requires Rust 1.77 or later. ([!2421], [!2451]) - The `arti hsc` subcommand is now gated behind the experimental `hsc` feature until it is ready for general use. ([ab41a9d330ed1db]) ### Security fixes - Temporarily reject attempts to send optimistic data before the SOCKS handshake is complete. Previously, we would discard data in this case, which has the potential to cause mis-framing bugs that could enable cross-protocol attacks under some circumstances. This is tracked as TROVE-2024-010. We intend to add full support for optimistic data soon; this is a temporary workaround. ([#1627], [!2443]) - Prevent an infinite loop that could occur in our SOCKS code if a local connection was closed at the wrong time. This is tracked as TROVE-2024-011. ([#1635], [!2447]) ### Breaking changes in lower-level crates - The `tor-bytes` crate now reports `Incomplete` rather than `Truncated` for most reader types. ([#1614], [!2407]) - Removed some deprecated code in `tor-hsservice`. ([7a838da0ff2359f9]) - The "ephemeral keystore" feature in `tor-keymgr` is now marked as experimental, and available behind an `ephemeral-keystore` feature. ([!2426]) - The `tor-rtcompat` crate now supports AF_UNIX sockets, and provides a more generic API for opening and listening for network streams. To this end, several of its APIs have been renamed or refactored, and the `Runtime` trait now depends on more supertraits. ([#1152], [!2437]) - In `tor-rtcompat`, `TcpListener::accept()` no longer exists. Use `NetStreamListener::incoming()` instead. ([168f55df05f4b56f]) - In `arti-client`, the type for `StorageConfig::keystore` has changed. ([5e4e7b69b8cd2791]) - In `tor-circmgr`, the `CircMgr` `reload_persistent_state`, `store_persistent_state`, and `upgrade_to_owned_persistent_state` functions have been removed. ([!2420]) - In `tor-circmgr`, the function `CircMgr::new` now returns a `CircMgr` rather than an `Arc`. ([!2420]) - In `tor-circmgr`, the deprecated `CircMgr::update_network_parameters` function has been removed. ([!2420]) - In `tor-hsservice`, numerous types related to initialization and status have been renamed or refactored. ([!2397], [!2413]) - In `tor-keymgr`, several types have been renamed. ([5e4e7b69b8cd279], [80095da1aa47978]) - In `tor-netdir`, several test-network construction callbacks now take an extra parameter. ([b2b75302ab095bc]) ### Onion service development - Remove the number of cases in which an onion service needs to know its secret identity key `KS_hs_id`. This will help with implementing offline key support. ([#1194], [!2393]) - Add support for adding externally generated keys; this will also help with offline key support. ([#1613], [!2396]) - Report onion service status correctly based on upload results. This includes major refactoring to onion service status reporting, and significant tests. ([#1572], [!2397]) - Remove setting for non-anonymous ("single onion") services. We don't actually support them yet. ([!2413]) - Defer generating service identity keys (`K_hs_id`) until the service is actually launched. This allows tools like `onion-name` to check whether these keys are present. ([!2417]) - The `arti hss onion-name` subcommand now has support for generating identity keys on demand. ([#1621], [!2419]) - Experimental support for launching onion service with user-provided identity keys. ([#1612], [!2402]) - Allow arti to run with onion services only, and SOCKS/DNS ports disabled. ([#1569], [!2423]) - Move onion service client key management functionality into a new `arti hsc key` sub-command, which supports key inspection, rotation, and deletion. The old `arti hsc get-key` subcommand is now deprecated. ([#1475], [!2432], [!2435]) - Support making an `InertTorClient` with an emphemeral key manager. ([#1610], [!2394]) - The "default" keystore has been renamed to "primary". ([!2438]) ### Relay development - Give `TorRelay` an instance of `ChanMgr` to keep track of open channels. ([!2361]) - Continued development on memory-quota support, to prevent memory-based denial-of-service attacks against relays and onion services. ([!2374], [!2404]) - New `tor-key-forge` crate for defining specific key and keypair wrappers, for use with relay keys. ([#1137], [#1619], [!2356], [!2430], [!2433]) - Define a set of high-level error wrappers for use by the `TorRelay` code. ([!2392]) - The channel manager now has (partial) support for receiving and handling incoming channels. ([!2389]) - Initial key generation and management support for relays. ([#1604], [!2411]) - Move Arti's (in-progress) `relay` subcommand to its own module. ([!2455) ### RPC development - Add support throughout the RPC stack for opening data streams and registering them with the RPC system, using the protocol developed in [proposal 351]. ([#1524], [!2373], [!2401], [!2406], [!2409], [!2434], [!2452]) - Update RPC specification draft to match current reality and plans. ([!2386], [!2453]) - Refactor the way that the RPC service handles errors, to ensure that framing errors are never silently tolerated, and other errors are handled uniformly. ([#1591], [!2400]) - Expose a list of object delegation types, to make it possible to generate full documentation of which objects support which methods. ([#1624], [!2418]) - Add a (work-in-progress! unstable! experimental!) Python wrapper for our similarly unstable RPC client library. ([!2446]) ### Testing - Partially fix test nondeterminism in the `reload_cfg::watch_single_file` test. ([#1549], [!2375], [!2391]) - Improve performance for the `reload_cfg::watch_multiple` test. ([#1589], [!2387]) - [Chutney] network integration tests are now run inside the [Shadow] discrete event simulator. ([!2427]) ### Documentation - Typo fixes in our documentation. ([!2403]) - Improved documentation for onion service descriptor publication. ([#1216], [b87b9f44ae05d4f0]) - Clean up documentation for `InertTorClient`. ([!2414]) - Clarify behavior of `ArtiEphemeralKeystore`. ([!2424]) - New example: running an axum router as an onion service. ([!2445]) - Add an example for an onion service's `reject` option to our sample configuration. ([!2458]) ### Infrastructure - Clean-ups to CI jobs that generate debian packages. ([!2368]) - Adjust exceptions for `downgrade-dependencies` script. ([!2398], [!2451], [cf7f25851ac0319f]) ### Cleanups, minor features, and bugfixes - Move Arti's `proxy` subcommand to its own module. ([!2416]) - Clean up needless abstraction, and add smarter abstraction, to make `tor-circmgr` easier to test. ([!2412], [!2420]) - When encountering truncated data, the `tor-bytes` crates now gives a lower-bound estimate for how much more data would be needed in order produce a successful parse. ([!2390]) - The `tor-bytes` crate now tracks whether its inputs are possibly incomplete, and only reports "Truncated" data as a recoverable error on a possibly incomplete data. This helps to prevent a category of bug (which it appears our code doesn't actually have) where we might erroneously keep reading more data without limit. ([#1614], [!2407]) - Fix a bug in our SOCKS handling that would cause us to exceed the bounds of a buffer, causing the SOCKS task to exit with a panic. ([dceeb82f7d115489]) - Upgrade to the latest versions of `float-cmp` and `derive-more`. ([!2450]) - Keystore configuration options have been significantly revised; there is now a `keystore.primary.kind` option to configure the primary keystore. ([!2441]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Adam Joseph, Alexander Hansen Færøy, Anonym, Morgan, Pier Angelo Vendrame, Steven Engler, tidely, and Wesley Aptekar-Cassels. Also, our welcome to Wesley Aptekar-Cassels as they join the team! Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2356]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2356 [!2361]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2361 [!2368]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2368 [!2373]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2373 [!2374]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2374 [!2375]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2375 [!2386]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2386 [!2387]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2387 [!2389]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2389 [!2390]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2390 [!2391]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2391 [!2392]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2392 [!2393]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2393 [!2394]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2394 [!2396]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2396 [!2397]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2397 [!2398]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2398 [!2400]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2400 [!2401]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2401 [!2402]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2402 [!2403]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2403 [!2404]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2404 [!2406]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2406 [!2407]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2407 [!2409]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2409 [!2411]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2411 [!2412]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2412 [!2413]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2413 [!2414]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2414 [!2416]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2416 [!2417]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2417 [!2418]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2418 [!2419]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2419 [!2420]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2420 [!2421]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2421 [!2423]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2423 [!2424]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2424 [!2426]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2426 [!2427]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2427 [!2430]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2430 [!2432]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2432 [!2433]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2433 [!2434]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2434 [!2435]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2435 [!2437]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2437 [!2438]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2438 [!2441]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2441 [!2443]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2443 [!2445]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2445 [!2446]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2446 [!2447]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2447 [!2450]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2450 [!2451]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2451 [!2452]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2452 [!2453]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2453 [!2458]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2458 [#1137]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1137 [#1152]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1152 [#1194]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1194 [#1216]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1216 [#1475]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1475 [#1524]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1524 [#1549]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1549 [#1569]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1569 [#1572]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1572 [#1589]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1589 [#1591]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1591 [#1604]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1604 [#1610]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1610 [#1612]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1612 [#1613]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1613 [#1614]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1614 [#1619]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1619 [#1621]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1621 [#1624]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1624 [#1627]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1627 [#1635]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1635 [168f55df05f4b56f]: https://gitlab.torproject.org/tpo/core/arti/-/commit/168f55df05f4b56fd61423c020ce62e93f1d7a9f [5e4e7b69b8cd2791]: https://gitlab.torproject.org/tpo/core/arti/-/commit/5e4e7b69b8cd2791763559cb0563dc60c8a66ce2 [5e4e7b69b8cd279]: https://gitlab.torproject.org/tpo/core/arti/-/commit/5e4e7b69b8cd2791763559cb0563dc60c8a66ce2 [7a838da0ff2359f9]: https://gitlab.torproject.org/tpo/core/arti/-/commit/7a838da0ff2359f9b1eacbf24d9be9b8b88d5302 [80095da1aa47978]: https://gitlab.torproject.org/tpo/core/arti/-/commit/80095da1aa47978cdba26c2b3d254a99c075cf53 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Chutney]: https://gitlab.torproject.org/tpo/core/chutney [MSRV policy]: https://gitlab.torproject.org/tpo/core/arti/#minimum-supported-rust-version [Shadow]: https://shadow.github.io [Zcash Community Grants]: https://zcashcommunitygrants.org/ [ab41a9d330ed1db]: https://gitlab.torproject.org/tpo/core/arti/-/commit/ab41a9d330ed1dbd506c8de8b5e331908ed78b97 [b2b75302ab095bc]: https://gitlab.torproject.org/tpo/core/arti/-/commit/b2b75302ab095bccdc7ccecb627e4648a3ae9419 [b87b9f44ae05d4f0]: https://gitlab.torproject.org/tpo/core/arti/-/commit/b87b9f44ae05d4f033e8b5e9a45684543ca2f323 [cf7f25851ac0319f]: https://gitlab.torproject.org/tpo/core/arti/-/commit/cf7f25851ac0319fbb784a94050a715883989e0a [dceeb82f7d115489]: https://gitlab.torproject.org/tpo/core/arti/-/commit/dceeb82f7d1154894ab9c7c607d68f8335bb9615 [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 351]: https://spec.torproject.org/proposals/351-socks-auth-extensions.html [security policy]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/SecurityPolicy # Arti 1.2.7 — 3 September 2024 Arti 1.2.7 continues development on onion service client authorization, the RPC subsystem, and relay infrastructure. ### Breaking changes in lower-level crates - In [`tor-hsservice`], `OnionServiceProxyConfigBuilder` no longer derives `Eq` and `PartialEq`, and `DescEncryptionConfig`, `DescEncryptionConfig`, `AuthorizedClientConfig,` and `AuthorizedClientParseError` are removed. ([!2266]) - In [`tor-ptmgr`], `PtClientMethod` is now exported from the top-level. ([5774dd456265ef4cb8771342538a07ba76e5a5d9]) ### RPC development - Expose the OS errno of the FFI error types that have one. ([!2311]) - Fix typos in an FFI comment. ([!2310]) - Always re-encode requests and responses, and preserve unrecognized struct fields. ([#1491], [!2312]) - Expose the object ID for the session object. ([!2318]) - Use `JsonValue` to re-encode responses and requests. ([#1512], [#1511], [!2315]) - Add support for request handles in our FFI code. ([!2317]) - Add an unstable RPC method to list every RPC method. ([!2332]) - Build [`arti-rpc-client-core`] as a C dynamic library. ([!2331]) - Use more sophisticated handling for `ConnectionError`s in `arti-rpcserver`. ([#1517], [!2335]) - New `slotmap-careful` crate to use when we mustn't re-use keys. ([!2298]) - Rename various identifiers in our FFI code. ([!2344]) - Use the new `slotmap-careful` instead of `generational-arena` in `arti-rpcserver`. ([#1282], [!2343]) - Implement RPC method delegation support. ([#1523], [!2342]) - Allow simultaneous calls to `arti_rpc_handle_wait()`. ([#1532], [!2360]) - Add experimental method to list SOCKS proxy addresses. ([#1523], [!2359]) ### Relay development - Add initial support for relay configuration. ([#1534], [!2352]) ### Internal cleanup and refactoring - Major refactoring to the `tor-proto` circuit reactor code, which simplifies the implementation and will enable us to support opportunistic packing for [proposal 340]. Introduce `StreamPollSet` for polling streams in priority order. ([!2285], [#1513], [!2319], [!2334]) - Refactoring in our key management code to prevent accidental misuse of relative key paths. ([#1494], [!2291]) - Refactor `KeyedFuturesUnordered` so that the underlying futures are accessible. ([!2321]) - Allow access to the inner streams of `StreamPollSet`, refactor `StreamMap`. ([#1421], [!2326], [!2333]) - Make `GuardMgr` mandatory throughout our circuit management code. ([#1465], [!2339], [!2347]) - Encapsulate flow-control into a separate object, abstracting away the difference between window-based (legacy) flow control and xon-based ([proposal 324]) flow control. ([!2340], [!2358]) - Introduce a `PeekableStream` trait to get rid of redundant buffering. ([!2345]) ### Onion service development - Implement hidden service restricted discovery mode (previously known as "client authorization"). ([#1292], [!2266], [!2336], [!2316]) - Add support for live-reloading the restricted discovery configuration. ([#1505], [!2329], [!2353], [!2369]) - Provide an MPSC queue with memory quota tracking. ([#351], [!2292]) - Make arrangements in `tor-memquota` for memory tracking to be optional, and gate `MemoryQuotaTracker::new` behind the `memquota` feature. ([!2351]) ### Minor features - Stop requiring the TRANSPORT key in pluggable transport STATUS messages. ([#1488], [!2307]) - In [`fs-mistrust`], add a `CheckedDir::metadata()` function for retrieving file metadata. ([72c3a1a661284844806b34e9ca5e81a43b8d0913], [!2324]) - In [`tor-ptmgr`], make managed pluggable transports optional. ([#1334], [!2354]) - Add an `InertTorClient` for accessing client state. ([#1496], [!2370], [!2314]) - Move `tor_async_utils::oneshot` into a new [`oneshot-fused-workaround`] crate. ([!2371], [!2383]) ### Testing - Make the `hsc` subcommand documentation serve as a test case. ([!2304]) - In the expected output of the CLI tests, match any number of lines in the `-c` help. ([#1509], [!2313]) - Fix broken reference to `apt-install` script in the Shadow integration tests. ([!2309]) - Add a Shadow integration test for restricted discovery mode. ([#1292], [!2272]) - Don't explicitly set `storage.keystore.enabled` in the Shadow CI tests. ([222b0eae48ae88d1a64cf5f0c11e662bf61dda4d]) - Test `cbindgen` correctness in CI. ([#1502], [!2320], [!2322], [!2330]) - Add `LogState` tests in `tor-log-ratelim`. ([!2349]) - Fix `arti_socket_closed` RPC test, which was previously flakey on OSX. ([#1510], [!2348]) - Add an arti obfs4 managed pluggable transport client and a tor obfs4 server to the Shadow CI tests. ([#1538], [!2355]) - Temporarily disable a flaky configuration watcher test. ([!2364]) - Add circuit reactor test for stream handling fairness. ([!2365]) - Rewrite the `hsc` tests using `InertTorClient`. ([#1496], [1d3e59f2e9572a9710de2c2a9c925c5c38a6874c]) - Set the `COLUMNS` env var in the CLI tests. ([#1574], [f1779cfbb3e27b04ba3cca9206170f1e1ea904db]) ### Documentation - Remove obsolete documentation from [`tor-proto`]. ([!2366]) - Discourage use of `tor_rtmock_test_with_*` macros. ([!2372]) ### Infrastructure - Add a few more Tor employees to exclude from our acknowledgments. ([!2306]) - Remove the no-longer-necessary `--cfg docsrs` flag from our rustdoc invocation. ([!2308]) - Fix handling of items ending in `;` in `check_doc_features` maintenance script. ([!2316]) - Use the `via-cargo-install-in-ci` maintenance script to cache `grcov` in the `coverage-aggregated` job. ([!2325]) - Add initial support for building an Arti deb package. ([!2323], [!2367]) - Add script for testing without any features enabled. ([7a9bf49870533cc052b12680336f067f77d87b34]) - Run tests of every crate, with all features disabled. ([!2350]) - Explicitly specify the deployment target of macOS to 10.7 to fix the failing `build-repro-macos` job. ([#1394], [#1507], [!2377], [!2346]) - Rename "Sponsor 101" to "Project 101". ([!2379]) ### Cleanups, minor features, and bugfixes - Make `arti hss onion-name` return a non-zero status if the service doesn't exist. ([!2305]) - Use `std::backtrace` instead of the [`backtrace`] crate. ([!2301]) - Add missing `docsrs` `cfg_attr` to fix a `cargo doc` warning. ([!2337]) - Resolve `unreachable_patterns` warnings from nightly. ([!2338]) - Make `blind_keypair` build without the `hsv3-client` feature. ([#1504], [!2341]) - Move `Qty` to [`tor-basic-utils`] as `ByteQty` and significantly improve it. ([!2363]) - Move `stream_peek` to [`tor-async-utils`]. ([!2362], [!2357]) - Various typo fixes in comments and messages. ([!2380]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Hansen Færøy, ambiso, Dimitris Apostolou, kn0sys, Kunal Mehta, NoisyCoil, opara, Robin Leander Schröder, and Steven Engler. Also, our welcome to Steven Engler as he joins the team! Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2266]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2266 [!2272]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2272 [!2285]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2285 [!2291]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2291 [!2292]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2292 [!2298]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2298 [!2301]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2301 [!2304]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2304 [!2305]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2305 [!2306]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2306 [!2307]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2307 [!2308]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2308 [!2309]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2309 [!2310]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2310 [!2311]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2311 [!2312]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2312 [!2313]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2313 [!2314]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2314 [!2315]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2315 [!2316]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2316 [!2317]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2317 [!2318]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2318 [!2319]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2319 [!2320]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2320 [!2321]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2321 [!2322]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2322 [!2323]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2323 [!2324]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2324 [!2325]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2325 [!2326]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2326 [!2329]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2329 [!2330]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2330 [!2331]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2331 [!2332]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2332 [!2333]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2333 [!2334]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2334 [!2335]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2335 [!2336]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2336 [!2337]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2337 [!2338]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2338 [!2339]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2339 [!2340]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2340 [!2341]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2341 [!2342]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2342 [!2343]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2343 [!2344]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2344 [!2345]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2345 [!2346]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2346 [!2347]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2347 [!2348]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2348 [!2349]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2349 [!2350]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2350 [!2351]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2351 [!2352]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2352 [!2353]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2353 [!2354]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2354 [!2355]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2355 [!2357]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2357 [!2358]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2358 [!2359]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2359 [!2360]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2360 [!2362]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2362 [!2363]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2363 [!2364]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2364 [!2365]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2365 [!2366]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2366 [!2367]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2367 [!2369]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2369 [!2370]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2370 [!2371]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2371 [!2372]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2372 [!2377]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2377 [!2379]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2379 [!2380]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2380 [!2383]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2383 [#1282]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1282 [#1292]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1292 [#1334]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1334 [#1394]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1394 [#1421]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1421 [#1465]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1465 [#1488]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1488 [#1491]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1491 [#1494]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1494 [#1496]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1496 [#1502]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1502 [#1504]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1504 [#1505]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1505 [#1507]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1507 [#1509]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1509 [#1510]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1510 [#1511]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1511 [#1512]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1512 [#1513]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1513 [#1517]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1517 [#1523]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1523 [#1532]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1532 [#1534]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1534 [#1538]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1538 [#1574]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1574 [#351]: https://gitlab.torproject.org/tpo/core/arti/-/issues/351 [1d3e59f2e9572a9710de2c2a9c925c5c38a6874c]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1d3e59f2e9572a9710de2c2a9c925c5c38a6874c [222b0eae48ae88d1a64cf5f0c11e662bf61dda4d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/222b0eae48ae88d1a64cf5f0c11e662bf61dda4d [5774dd456265ef4cb8771342538a07ba76e5a5d9]: https://gitlab.torproject.org/tpo/core/arti/-/commit/5774dd456265ef4cb8771342538a07ba76e5a5d9 [72c3a1a661284844806b34e9ca5e81a43b8d0913]: https://gitlab.torproject.org/tpo/core/arti/-/commit/72c3a1a661284844806b34e9ca5e81a43b8d0913 [7a9bf49870533cc052b12680336f067f77d87b34]: https://gitlab.torproject.org/tpo/core/arti/-/commit/7a9bf49870533cc052b12680336f067f77d87b34 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`arti-rpc-client-core`]: https://tpo.pages.torproject.net/core/doc/rust/arti_rpc_client_core/index.html [`backtrace`]: https://docs.rs/backtrace/latest/backtrace/ [`fs-mistrust`]: https://tpo.pages.torproject.net/core/doc/rust/fs_mistrust/index.html [`oneshot-fused-workaround`]: https://tpo.pages.torproject.net/core/doc/rust/oneshot_fused_workaround/index.html [`tor-async-utils`]: https://tpo.pages.torproject.net/core/doc/rust/tor_async_utils/index.html [`tor-basic-utils`]: https://tpo.pages.torproject.net/core/doc/rust/tor_basic_utils/index.html [`tor-hsservice`]: https://tpo.pages.torproject.net/core/doc/rust/tor_hsservice/index.html [`tor-proto`]: https://tpo.pages.torproject.net/core/doc/rust/tor_proto/index.html [`tor-ptmgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_ptmgr/index.html [f1779cfbb3e27b04ba3cca9206170f1e1ea904db]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f1779cfbb3e27b04ba3cca9206170f1e1ea904db [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 324]: https://spec.torproject.org/proposals/324-rtt-congestion-control.html [proposal 340]: https://spec.torproject.org/proposals/340-packed-and-fragmented.html # Arti 1.2.6 — 1 August 2024 Arti 1.2.6 continues development on onion service client authorization, the RPC subsystem, and relay infrastructure. ### Security fixes - Update `openssl` to avoid undefined behavior in `MemBio::get_buf`. ([RUSTSEC-2024-0357], [TROVE-2024-009], [#1495], [!2276]) ### Major bugfixes - When opening a SQLite directory cache in read-only mode, do not attempt to create it. This bug would sometimes prevent Arti from starting correctly when running multiple processes at once. ([#1497], [!2283]) ### RPC development - Initial work on a [wrapper library][arti-rpc-client-core] for invoking Arti RPC functionality from other processes. ([!2270], [!2277], [!2279]) - Initial work on [FFI support][arti-rpc-client-core-header] for invoking Arti RPC functionality from other languages. ([#737], [!2273]) - Clean up the RPC method dispatch implementation, remove some unneeded functions, and refactor the syntax for declaring error types. ([!2284]) ### Relay development - Infrastructure work for out-of-memory prevention. ([#351], [!2280], [!2281]) ### Onion service development - New `arti hsc` command for managing client state and keys for connecting to onion services. ([#1281], [#1291], [!2212], [!2257]) - Support parsing client restricted discovery (a.k.a. "client authorization") keys from C Tor's `descriptor:x25519:` key format. ([!2246]) - Ensure that `hsc` subcommand can build correctly with unusual combinations of features. ([!2254]) - Remove some unused code for publishing and authentication support. ([!2251]) - Add an `OnionServiceBuilder` API; deprecate `OnionService::new()`. ([#1490], [!2262]) ### Minor features - The obsolete and unused "TAP" keys are now optional when parsing network documents. This is phase one of [our plan][prop350] to eventually remove them entirely. ([!2227], [prop350]) - New `TorClient::wait_for_stop` method, for code that needs to wait until a TorClient instance has definitely shut down. ([#1418], [!2259], [!2278]) - In `tor-netdoc`, expose fields from `AnnotatedRouterDesc` and `RouterAnnotation` when `dangerous-expose-struct-fields is set. ([#1469], [!2213]) ### Testing - Exclude `maint` and `examples` from coverage reports. ([!2256]) - More tests throughout RPC codebase. ([!2264]) - Improvements and clean-ups to circuit reactor tests. ([!2287]) - CLI tests for the `arti hss` and `arti hsc` subcommands. ([#1250], [!2275]) ### Documentation - Clarify meaning of `peer_cert` in `UnverifiedChannel`. ([!2260]) - Improve documentation for mocked time in `tor-rtmock`. ([!2286]) ### Infrastructure - Improvements in release process and utilities for managing the changelog. ([!2240]) - Fix gitlab CI to always use `amd64` architecture images. Previously, it would sometimes choose a docker image for the wrong architecture. ([!2249]) - Split and refactor reproducible-build CI job. ([!2252]) - Improvements to script for detecting crate ownership problems. ([#1485], [!2255]) - Script to make sure that every crate has a valid set of crates.io categories. ([#1481], [!2256]) - Move our commonly used rust maintenance scripts to a separate repository, imported with `git-subtree`. ([#1300], [!2267]) - In gitlab CI, pin the compiler version we use to build cargo-audit and some other tools. ([!2289], [!2290]) ### Cleanups, minor features, and bugfixes - Remove an unused constant from `equix`. ([!2243]) - Suppress and resolve a few warnings about documentation and dead code. ([!2244]) - Fix parsing time-periods from "key slug" identifiers. ([!2248]) - Fix error messages related to filesystem access failures, so that they do not all erroneously claim to be permissions failures. ([#1473], [!2253]) - Return correct error type when trying to extend a circuit via `ntor` to a relay with no known RSA identity. ([!2261]) - Fix a bug in the implementation of `ArtiNativeKeystore::contains()` that caused it to always return false. ([#1492], [!2274]) - Fixes for various new warnings from the nightly version of `clippy`. ([!2288]) - Disallow the error-prone `Path::exists()` function in our code, and use `try_exists()` instead. ([#1493], [!2293]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Clara Engler, Jim Newsome, and trinity-1686a! Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2212]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2212 [!2213]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2213 [!2227]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2227 [!2240]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2240 [!2243]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2243 [!2244]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2244 [!2246]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2246 [!2248]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2248 [!2249]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2249 [!2251]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2251 [!2252]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2252 [!2253]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2253 [!2254]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2254 [!2255]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2255 [!2256]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2256 [!2257]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2257 [!2259]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2259 [!2260]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2260 [!2261]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2261 [!2262]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2262 [!2264]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2264 [!2267]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2267 [!2270]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2270 [!2273]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2273 [!2274]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2274 [!2275]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2275 [!2276]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2276 [!2277]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2277 [!2278]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2278 [!2279]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2279 [!2280]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2280 [!2281]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2281 [!2283]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2283 [!2284]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2284 [!2286]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2286 [!2287]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2287 [!2288]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2288 [!2289]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2289 [!2290]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2290 [!2293]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2293 [#1250]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1250 [#1281]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1281 [#1291]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1291 [#1300]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1300 [#1418]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1418 [#1469]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1469 [#1473]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1473 [#1481]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1481 [#1485]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1485 [#1490]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1490 [#1492]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1492 [#1493]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1493 [#1495]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1495 [#1497]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1497 [#351]: https://gitlab.torproject.org/tpo/core/arti/-/issues/351 [#737]: https://gitlab.torproject.org/tpo/core/arti/-/issues/737 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [RUSTSEC-2024-0357]: https://rustsec.org/advisories/RUSTSEC-2024-0357.html [TROVE-2024-009]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1495 [Zcash Community Grants]: https://zcashcommunitygrants.org/ [arti-rpc-client-core-header]: https://gitlab.torproject.org/tpo/core/arti/-/tree/main/crates/arti-rpc-client-core [arti-rpc-client-core]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/crates/arti-rpc-client-core/arti-rpc-client-core.h?ref_type=heads [other sponsors]: https://www.torproject.org/about/sponsors/ [prop350]: https://spec.torproject.org/proposals/350-remove-tap.html # Arti 1.2.5 — 27 June 2024 ### Breaking - `TorClientBuilder::create_*` now take `&self`. ([!2198]) - Stop publishing the obsolete `arti-hyper` crate. ([!2225], [#1204]) ### Security fixes - Update curve25519-dalek to avoid a low-severity timing vulnerability. ([TROVE-2024-007], [#1468], [!2211]) - With full vanguards, client rendezvous circuits do not reuse the final vanguard as the rendezvous point. ([TROVE-2024-008], [#1474], [!2230]) ### RPC development - New overview document, at the crate root for `tor-rpcbase`. ([!2210]) - Much improvement to method invocation arrangements. ([!2190]) - Change approach to method invocation on data-stream-like objects. ([!2192]) ### Relay development - Add skeleton, including (experimental): arti-relay crate, `relay` cargo feature in `arti-client`, `relay` command line argument to `arti`. ([!2182]) - Add a key material export facility for some of our TLS implementations. ([IETF RFC 5705], [#1432], [!2185]) ### Bugfixes - Tolerate removal of files from Arti's cache directory. Fixes `Bad permissions in cache directory: File or directory ${HOME}/.cache/arti/dir_blobs/... not found`. ([#1466], [!2200]) - Ensure that obsolete files are removed from Arti's cache directory. ([!2200]) ### New features and other improvements - Add `TorClientBuilder::local_resource_timeout` feature, asking Arti to wait (a short while) for a previous instance to exit. ([#1464], [!2198]) - Improve memory usage by disabling built-in X.509 root certificates when building `tor-rtcompat` with openssl. ([!2203], [#1027]) - Improve memory usage by limiting the batch size when reading directory information from the on-disk cache. ([!2202], [#1027]) ### Documentation - Documentation tweaks in `tor_persist::StorageConfig`. ([!2197]) ### Testing - Use a new version of [Shadow]. ([!2195]) - Improvements to the tests to prevent a recurrence of [TROVE-2024-003] / [TROVE-2024-006]. ([!2199]) - Stop build-testing the `gsoc2023/download-manager` example (it uses an obsolete version of `hyper` and the obsolete `arti-hyper` crate). ([!2225], [#1471]) - Fixes to test builds on MacOS. ([#1394], [!2226], [#1472], [!2234]) - Disable test builds on x32 (the not-widely-used Linux x86_64 32-bit hybrid ABI) ([#1480], [!2235], [!2236], [num-bigint#311](https://github.com/rust-num/num-bigint/issues/311)) ### Internal cleanup and refactoring - Improve the path construction logic to try to help avoid future bugs like [TROVE-2024-003] and [TROVE-2024-004]. ([#1459], [!2199], [!2205]) - Refactoring in the circuit reactor, including new `SometimesUnboundedSink`. ([!2172]) - Refactoring in the arti command line utility, pursuant to client support for hidden services with restricted discovery (previously misleadingly known as "client authorisation"). ([!2206]) - Rename the internal type `OptTimestamp` to `AtomicOptTimestamp` in `tor-proto`. ([!2218], [#1412]) - Fix a rustdoc warning. ([!2215]) - Update to new syntax for [`derive-deftly`] 0.12.1. ([!2209]) ### Infrastructure and support - Portability improvement to the script for maintaining links in this changelog. ([!2194], [#1460]) - New script for checking crate ownership on crates.io. ([!2196], [!2201], [!2220], [#1462]) - Try to work around bugs where container systems use images of the wrong architecture. ([!2207], [docker](https://github.com/docker/cli/issues/2590), [podman](https://github.com/containers/podman/issues/22998)) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Gaba, Jim Newsome, juga, pinkforest, and trinity-1686a! Also, our deep thanks to [Zcash Community Grants], the [Bureau of Democracy, Human Rights and Labor], and our [other sponsors] for funding the development of Arti! [!2172]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2172 [!2182]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2182 [!2185]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2185 [!2190]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2190 [!2192]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2192 [!2194]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2194 [!2195]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2195 [!2196]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2196 [!2197]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2197 [!2198]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2198 [!2199]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2199 [!2200]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2200 [!2201]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2201 [!2202]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2202 [!2203]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2203 [!2205]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2205 [!2206]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2206 [!2207]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2207 [!2209]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2209 [!2210]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2210 [!2211]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2211 [!2215]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2215 [!2218]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2218 [!2220]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2220 [!2225]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2225 [!2226]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2226 [!2230]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2230 [!2234]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2234 [!2235]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2235 [!2236]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2236 [#1027]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1027 [#1204]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1204 [#1394]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1394 [#1412]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1412 [#1432]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1432 [#1459]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1459 [#1460]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1460 [#1462]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1462 [#1464]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1464 [#1466]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1466 [#1468]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1468 [#1471]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1471 [#1472]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1472 [#1474]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1474 [#1480]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1480 [Bureau of Democracy, Human Rights and Labor]: https://www.state.gov/bureaus-offices/under-secretary-for-civilian-security-democracy-and-human-rights/bureau-of-democracy-human-rights-and-labor/ [IETF RFC 5705]: https://datatracker.ietf.org/doc/html/rfc5705 [Shadow]: https://shadow.github.io [TROVE-2024-003]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-004]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-006]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-007]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-008]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`derive-deftly`]: https://docs.rs/derive-deftly/latest/derive_deftly/ [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.2.4 — 5 June 2024 Arti 1.2.4 continues development on onion services, and on the RPC subsystem. This release restores the `faravahar` directory authority, which has a new location and keys. We have also fixed two-medium security issues, tracked as [TROVE-2024-005] and [TROVE-2024-006], respectively, and a number of other, smaller bugs. [TROVE-2024-005] affects hidden service circuits using non-default vanguard configurations (where the vanguard mode is set to 'disabled' or 'full'), causing hidden service circuits to be built from circuit stubs that are incompatible with the circuit target, and to have an incorrect length. [TROVE-2024-006] affects hidden services and clients using non-default vanguard configurations, where the vanguard mode is set to 'disabled', or that have the `vanguards` feature compiled out. In some circumstances, this bug can lead to building hidden service circuits that contain the same relay in multiple positions. Both issues make users of this code more vulnerable to traffic analysis when running or accessing onion services. ### Network updates - Restore the `faravahar` directory authority, with new location and keys. ([!2175]) ### Major bugfixes - Ensure that `DataWriter::close()` actually closes its associated stream. Previously, this `close()` method would have no effect until the `DataReader` was also dropped. ([#1368], [!2170]) - Fix a bug where the vanguard circuit stub selection code would fail to ensure that the last two hops of the selected circuit stub are different from the circuit target. ([#1417], [!2167], [!2181]) - Fix a medium-severity issue causing the hidden service circuit pool code to ignore the configured vanguard mode. This is also tracked as [TROVE-2024-005]. ([#1424], [!2168]) - Use `HasRelayIds::has_any_relay_id_from` to check for relay equality when checking if a circuit contains duplicate relays. ([!2181]) - Fix a medium-severity issue, which would, in some circumstances, cause hidden service circuits to be built without applying the necessary same-hop restrictions. This is also tracked as [TROVE-2024-006]. ([#1425], [!2179]) ### Breaking changes in lower-level crates - The `Channel` type in `tor-proto` has been significantly refactored: it is now always wrapped in an explicit `Arc`, it no longer implements `Sink` on its own, and it can no longer be used to send raw cells from outside the `tor-proto` crate. ([!2163]) - `HsCircPool::reconfigure` has been removed - `VanguardConfig` and `VanguardConfigBuilder` are now reexported from the root of the `tor-guardmgr` crate. ([!2146]) - `SshKeyData` is now an opaque type - `SshKeyData::into_public` and `SshKeyData::into_private` have been removed ### Deprecated functionality - The `arti-hyper` example crate is now deprecated and unmaintained. ([!2127]) ### Onion service development - Major refactoring to reduce technical debt in key manager code. ([#1362], [#1367], [!2131], [!2141]) - Address various pending "TODO" items in the vanguard code. ([!2139]) - Adjust terminology for vanguard stub circuits. ([#1339], [!2161]) - Add tests for vanguard configuration, and configuration backend logic as needed to simplify some of the vanguard configuration code. ([!2146]) ### RPC development - Expose methods on TorClient to get and observe the status of the client object. ([#1384], [!2110], [!2130]) - Infrastructure to allow the RPC system to interact with SOCKS streams, provide them with context, and name them as RPC objects. ([!2143]) - Based on difficulties encountered with earlier RPC development, add an improved facility for RPC methods that can be invoked internally without serializing their inputs and outputs. ([#1403], [!2152]) - Enforce consistent style and formatting on RPC method names. ([#823], [!2149]) - Other miscellaneous lower-level improvements to the RPC type system. ([!2124], [!2140], [!2142]) ### Other major features - If the circuit manager has retired all of its circuits, unconditionally retire all the circuits from the hidden service circuit pool. ([!2168]) ### Testing - Improved test layout in `tor-keymgr`. ([#1363], [!2125]) - Automate enforcement of our convention that scripts not be named with their implementation languages. ([!2153]) - Include script needed to generate `keymgr` test data. ([!2121]) - Add tests for vanguard state file serialization. ([!2167]) - Add a [Shadow] CI test involving an onion service that uses full vanguards. ([!2167]) - Add a test that ensures the hidden service circuit pool reads the vanguard mode from the configuration. ([!2168]) - Make the Shadow CI tests fail if any internal errors are reported in the logs. ([!2186]) ### Documentation - New example in arti-client for creating a one-hop circuit. ([!2148]) - Recommend `cargo --locked` in our examples, to encourage people to get audited versions of our dependencies. ([!2157]) - Clean up old changelogs to have a more uniform style, based on our updated `gen_md_links` script. ([!2126], [!2165]) ### Infrastructure - Disable automated Chutney tests in coverage CI. ([#1299], [!2120]) - Improve our `add_warning` script so that it can adjust our warnings during CI. Previously we used a compiler `--cfg` flag for conditional warnings, but unrecognized `cfg` flags now provoke a warning. ([#1395], [!2129]) - Use `add_warning` to maintain the list of lints in our examples. ([!2132]) - Improved scripts to list our crates, and publish our crates, to make accidents less likely while we're trying to release. ([#1390], [!2118], [!2138], [!2158]) - Improve our `gen_md_links` script to provide more uniform output, and generate its results in a more useful format. ([#1388], [!2126], [!2169]) - Ensure that our CI scripts delete unnecessary data on completion. (This helps keep us from running our infrastructure out of disk space and making the other gitlab users sad.) ([!2159]) - Adjust our license-checking code to accommodate license clarifications in `priority-queue` and `tinystr`. ([!2177]) ### Cleanups, minor features, and bugfixes - Resolve several Clippy warnings from the latest version of Rust. ([!2128]) - Clarify control-flow in our (currently convoluted) circuit reactor code. ([!2122]) - Refactor to avoid most use of `cfg(fuzzing)`. ([#1395], [!2134]) - The `DataStream` type now has a method to wait for a connection to complete. ([489aa72d1eee8a56]) - Clarify or resolve several dead-code warnings. ([#1383], [!2151]) - Explicitly enforce maxima on SENDME windows. (Formerly, we did this implicitly.) ([#1383], [!2150]) - Avoid the appearance of an infinite loop in `engage_padding_activities`. ([!2164]) - Refactor the `Channel` type to be more explicitly `Arc`, better documented, and to have less information shared between its front-end and reactor pieces. ([!2163]) - Refactor the `poll_ready` method on `ChannelSender` to have a more conventional interface. ([!2171]) - Replace debug assertions with internal errors in the post-build checks for vanguard circuits, to prevent issues such as [TROVE-2024-003] and [TROVE-2024-004]. ([!2167]) - When building vanguard circuits, ensure the target relay does not occur as one of the last two hops. ([!2186]] - Upgrade to the latest versions of [priority-queue]. ([!2177]) - Validate the properties of the circuits retrieved from the hidden service circuit pool. ([97868349ed695ec8]) - Fix hidden service circuit stubs sometimes being unnecessarily extended when lite vanguards are in use. ([#1458], [!2183]) - Refactor vanguards configuration handling to be less error-prone. ([#1456], [!2183]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Gaba, Jim Newsome, juga, and pinkforest! Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!2110]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2110 [!2118]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2118 [!2120]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2120 [!2121]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2121 [!2122]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2122 [!2124]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2124 [!2125]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2125 [!2126]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2126 [!2127]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2127 [!2128]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2128 [!2129]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2129 [!2130]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2130 [!2131]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2131 [!2132]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2132 [!2134]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2134 [!2138]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2138 [!2139]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2139 [!2140]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2140 [!2141]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2141 [!2142]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2142 [!2143]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2143 [!2146]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2146 [!2148]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2148 [!2149]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2149 [!2150]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2150 [!2151]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2151 [!2152]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2152 [!2153]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2153 [!2157]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2157 [!2158]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2158 [!2159]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2159 [!2161]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2161 [!2163]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2163 [!2164]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2164 [!2165]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2165 [!2167]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2167 [!2168]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2168 [!2169]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2169 [!2170]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2170 [!2171]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2171 [!2175]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2175 [!2177]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2177 [!2179]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2179 [!2181]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2181 [!2183]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2183 [!2186]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2186 [#1299]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1299 [#1339]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1339 [#1362]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1362 [#1363]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1363 [#1367]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1367 [#1368]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1368 [#1383]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1383 [#1384]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1384 [#1388]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1388 [#1390]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1390 [#1395]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1395 [#1403]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1403 [#1417]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1417 [#1424]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1424 [#1425]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1425 [#1456]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1456 [#1458]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1458 [#823]: https://gitlab.torproject.org/tpo/core/arti/-/issues/823 [489aa72d1eee8a56]: https://gitlab.torproject.org/tpo/core/arti/-/commit/489aa72d1eee8a5638493dfb23d06823a201c132 [97868349ed695ec8]: https://gitlab.torproject.org/tpo/core/arti/-/commit/97868349ed695ec87f1a7bee8fd74598156fd60d [Shadow]: https://shadow.github.io [TROVE-2024-003]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-004]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-005]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-006]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [Zcash Community Grants]: https://zcashcommunitygrants.org/ [other sponsors]: https://www.torproject.org/about/sponsors/ [priority-queue]: https://crates.io/crates/priority-queue # Arti 1.2.3 — 15 May 2024 Arti 1.2.3 fixes a high-severity issue affecting onion services and clients connecting to onion services with 'lite' vanguards (the default) enabled: when building anonymizing circuits to or from an onion service the circuit manager code would build the circuits with one hop too few. This makes users of this code more vulnerable to some kinds of traffic analysis when they run or visit onion services. This release also fixes a medium-severity issue affecting 'full' vanguards. With 'full' vanguards enabled, client HsDir circuits, client introduction circuits and service rendezvous-circuits are extended with an extra hop to minimize the linkability of the guard nodes. In some circumstances, the circuit manager would build circuits with one hop too few, making it easier for an adversary to discover the L2 and L3 guards of the affected clients and services. In Arti 1.2.1 and earlier, vanguards were still an experimental feature, or absent, so those versions are classified as "not affected", even though downgrading does not fix the security problem. ### Major bugfixes - Fix a high-severity issue affecting onion service circuits using 'lite' vanguards. Previously, with 'lite' vanguards enabled, any circuit to or from an onion service was one hop too short, making clients and services vulnerable to certain types of traffic analysis. This is also tracked as [TROVE-2024-003]. ([#1409]) - Fix a medium-severity issue affecting onion service circuits using 'full' vanguards. Previously, with 'full' vanguards enabled, *some* circuits to or from an onion service were one hop too short, making linkability attacks more likely to succeed. [TROVE-2024-004]. ([#1400]) [#1400]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1400 [#1409]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1409 [TROVE-2024-003]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [TROVE-2024-004]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE # Arti 1.2.2 — 30 April 2024 Arti 1.2.2 continues improvements on previous releases, by improving onion service security with [Vanguards]. This release also includes an as-yet-unused backend to help resist memory-exhaustion attacks, and numerous other smaller improvements. ### Breaking changes in lower-level crates - Refactor our [`Relay`] code to move low-level information into a [`RelayDetails`] type. ([#504], [!2057], [!2073]) - The internal API for the RPC object system has been greatly revised. ([!2079]) ### Network updates - Update to use the new identity key for the `tor26` directory authority. ([!2080]) ### Major bugfixes - Fix an inadvertent recursion bug when converting ` TorAddrError` to `arti_client::Error`. ([#1379], [3f2dcaca31992018f825]) - Improve reliability of bootstrap status reporting. ([!2107]) ### Onion service development - Arti now supports [Vanguards] for improved security against guard discovery for onion service circuits. By default, we use the `vanguards-lite` algorithm; the `vanguards-full` algorithm can be configured. ([#1272], [#1273], [#1275], [#1340], [#1353], [#1364], [#1366], [!2075], [!2082], [!2083], [!2088], [!2090], [!2093], [!2099], [!2102], [!2104], [!2105], [!2109], [!2111]) - Export `KeyMgrBuilderError` as a public type, to help external code construct its own [`KeyMgr`]. ([!2078]) - Initial implementation for an in-memory ephemeral key store, which will be useful in implementing ephemeral onion services. ([#1358], [!2076]) - Fix a bug that prevented reporting of onion service status updates. ([#1361], [!2086]) - Fix a bug that would cause onion service circuit pools to pre-build fewer circuits than actually desired. ([!2101]) ### RPC development - The RPC object system has been refactored to use `derive-deftly` and an improved system of method invocation. Together, these changes make it easier to write RPC methods, and allow support for RPC methods on generic types. ([#838], [#1380], [!2079], [!2084], [!2103]) ### Other major features - Convert to use [`figment`] instead of [`config-rs`] as our configuration backend, for improved error messages. ([#1267], [#1268], [!2041]) - New `tor-memquota` backend crate to keep track of our memory usage, and to help us react appropriately when we are out of memory. We will use this as part of our DoS-resistance system. ([#1381], [!2091], [!2100]) ### Documentation - Add cross-references to explain limitations of [`NetDir::by_ids`]. ([#1365], [!2081]) - Fix a link to our Code of Conduct. ([!2085]) - Miscellaneous documentation fixes. ([!2087]) - Document some tricky assumptions and requirements in `tor-proto`'s circuit reactor code. ([#1373], [!2089]) - Improve documentation and license presence for our two LGPL-licensed crates. ([#1375], [!2094], [!2106]) ### Testing - Add high-level tests for pluggable transport configuration. ([#1333]) ### Infrastructure - Adjust our license-checking code to accommodate license clarifications in `rustls-webpki` and `option-ext`. ([!2070]) - Fix compilation breakage in our relaymsg fuzzing code. ([#1349], [!2069]) - Add an option to the `fuzz_it_all` script for it to run only against the static corups. ([#1350], [!2071]) ### Cleanups, minor features, and bugfixes - Remove unused dependencies from several crates. ([!2068]) - Expose `BridgesConfig` from `TorClientConfig` so it can be inspected by other modules. ([c5a91130fff6af25]) - Refactor code for scheduling events in onion service code. ([#1259], [!2064]) - Update our code to use [`derive-deftly`], formerly called `derive-adhoc`. ([!2066]) - Refactor `same_relay_ids` to be automatically derived. ([!2072]) - Refactor `StreamMap`'s stream-counting code to be less error-prone. ([#1344], [!2058]) - Add an experimental method to expose the HS circuit pool from `TorClient`. ([!2077]) - Clean up new warnings from the nightly version of Clippy. ([!2096], [!2097]) - Upgrade to rustls version 0.23. ([#1377], [!2095]) - Suppress or resolve some dead-code warnings. ([!2098]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Jim Newsome, Richard Pospesel, trinity-1686a, Wiktor Kwapisiewicz, and VaiTon. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!2041]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2041 [!2057]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2057 [!2058]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2058 [!2064]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2064 [!2066]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2066 [!2068]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2068 [!2069]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2069 [!2070]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2070 [!2071]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2071 [!2072]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2072 [!2073]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2073 [!2075]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2075 [!2076]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2076 [!2077]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2077 [!2078]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2078 [!2079]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2079 [!2080]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2080 [!2081]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2081 [!2082]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2082 [!2083]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2083 [!2084]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2084 [!2085]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2085 [!2086]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2086 [!2087]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2087 [!2088]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2088 [!2089]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2089 [!2090]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2090 [!2091]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2091 [!2093]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2093 [!2094]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2094 [!2095]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2095 [!2096]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2096 [!2097]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2097 [!2098]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2098 [!2099]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2099 [!2100]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2100 [!2101]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2101 [!2102]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2102 [!2103]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2103 [!2104]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2104 [!2105]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2105 [!2106]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2106 [!2107]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2107 [!2109]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2109 [!2111]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2111 [#1259]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1259 [#1267]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1267 [#1268]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1268 [#1272]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1272 [#1273]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1273 [#1275]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1275 [#1333]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1333 [#1340]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1340 [#1344]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1344 [#1349]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1349 [#1350]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1350 [#1353]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1353 [#1358]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1358 [#1361]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1361 [#1364]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1364 [#1365]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1365 [#1366]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1366 [#1373]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1373 [#1375]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1375 [#1377]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1377 [#1379]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1379 [#1380]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1380 [#1381]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1381 [#504]: https://gitlab.torproject.org/tpo/core/arti/-/issues/504 [#838]: https://gitlab.torproject.org/tpo/core/arti/-/issues/838 [3f2dcaca31992018f825]: https://gitlab.torproject.org/tpo/core/arti/-/commit/3f2dcaca31992018f825f616ed98c8055c9acf62 [Vanguards]: https://github.com/mikeperry-tor/vanguards/blob/master/README_TECHNICAL.md [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`KeyMgr`]: https://docs.rs/tor-keymgr/latest/tor_keymgr/struct.KeyMgr.html [`NetDir::by_ids`]: https://docs.rs/tor-netdir/latest/tor_netdir/struct.NetDir.html#method.by_ids [`RelayDetails`]: https://docs.rs/tor-netdir/latest/tor_netdir/struct.RelayDetails.html [`Relay`]: https://docs.rs/tor-netdir/latest/tor_netdir/struct.Relay.html [`config-rs`]: https://docs.rs/config/latest/config/ [`derive-deftly`]: https://docs.rs/derive-deftly/latest/derive_deftly/ [`figment`]: https://docs.rs/figment/latest/figment/ [c5a91130fff6af25]: https://gitlab.torproject.org/tpo/core/arti/-/commit/c5a91130fff6af2527b38ec2c44900eb81c9b1c7 [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.2.1 — 2 April 2024 Arti 1.2.1 continues development on onion services, and adds several important security features. More such improvements are on the way. See [`doc/OnionService.md`] for instructions and caveats about running onion services with Arti today. This release also adds support for [unmanaged pluggable transports][#755], and begins work to improve Tor's relay cell protocol with support for [packed and fragmented messages][prop340]. ### New versioning policy Starting with this version, we are no longer independently tracking breaking and non-breaking version changes for the `arti-client` crate and each of the `tor-*` crates below it. Instead, we will _assume_ that every release of these crates breaks API compatibility with the one before, and update our semantic versioning accordingly. (We will continue not to make gratuitous API compatibility breaks on purpose.) Previously, our efforts to track which changes in these crates were breaking and which were not created a great deal of overhead in our development process, and tended to be somewhat error-prone. This change affects developers only; users should not be affected. This does not affect crates already at version `1.x` or higher, or published utility crates whose names don't start with `tor-` or `arti-`. See [`doc/Semver.md`] for more information on this policy. ([#1005], [!2051]) ### Breaking changes in lower-level crates - Refactored `tor-config` to hide implementation details. This will eventually allow us to migrate from `config-rs` to a configuration provider with better error handling. ([!2040]) - Renamed several types in `tor-ptmgr` to reflect new support for unmanaged pluggable transports. ([d63d966d79f0f988]) - The `tor_circmgr::path` module is now crate-private. ([4c1eb94173521bc5]) - The [`Runtime`] trait now includes functionality for "coarse" time, backed (by default) by the [`coarsetime`] crate. We use these timestamps in cases where we need fast time checking more than precision. Putting them into `Runtime` lets us replace them with mock functions for testing purposes. ([!2050], [!2052]) - The `tor-cell` relay cell API is significantly revised. ([!2034], [!2045], [prop340]) - The `allow_stream_requests()` method in `tor-proto` now takes an extra argument. ([!2047]) ### Onion service development - Reorganize onion service code, to remove an unnecessary (and inconsistently used) internal module, to simplify needless imports, and to generally tidy up the implementation. ([#1212], [!2020]) - Avoid using `futures::oneshot`: our own `tor_basic_utils::oneshot` is safer to use when `select!` may be involved. ([95ed432c13c2c4b2]) - Design work for out-of-memory handling, which is necessary for onion service security. ([!1997]) - Onion services have now support a `max_concurrent_streams_per_circuit` option. ([#1124], [!2047]) - Initial implementation work for onion service [vanguards], which are needed to improve onion service security. This is not yet complete. ([#1272], [#1275], [#1276], [#1277], [#1340], [!2035], [!2038], [!2046], [!2049], [!2053]) ### Other major features - New relay cell decoding API, in order to eventually handle packed and fragmented messages. ([!2034], [!2045], [prop340]) - We now support unmanaged pluggable transports. Previously, Arti only supported _managed_ pluggable transports: that is, ones that it launched itself. Now you can configure Arti to use a pluggable transport running at a known SOCKS port. ([#755], [!2043]) ### Documentation and examples - Improve windows documentation in `fslock-guard` and `test-temp-dir`. ([!2011]) - More documentation for our internal build and release tools. ([!2028]) - Fixed broken links in the documentation for `NetParameters`. ([!2054]) - Fixed the disclaimer about onion services in our configuration file. ([!2055]) ### Testing - More unit tests in `fslock-guard`. ([!2013]) - More tests for `arti_client::address`. ([!2029]) ### Cleanups, minor features, and bugfixes - We've fixed a bug in our arguments parser that previously caused `arti` to panic when run without arguments. ([#1311], [!2021]) - The `tor-checkable` module now uses checked time arithmetic, to avoid overflows or panics when extending tolerances. ([!2031]) - We now enforce Clippy's [`unchecked_duration_subtraction`] lint by default. ([#1304], [!2008]) - Refactor configuration watcher to receive a `Runtime`. Previously it took an entire `TorClient`, unnecessarily. ([!2017]) - We now ban `std::Path::display`, since it is lossy in an easy-to-overlook way. We've given it a `PathExt::display_lossy` implementation to be used instead. ([!2027]) - The `tor-bytes` module now behaves more sensibly (typically panicking) if someone tries to use `write_zeros` to extend a buffer beyond `usize::MAX`. Previously it might truncate its buffer. ([!2033]) - Refactoring and improvements on the `BackoffSchedule` logic. ([#1259], [!2024]) - Moved logic for picking relays into a new `tor-relay-selection` crate, to avoid duplicated code and the risk of missing necessary checks when picking or examining relays. ([#504], [#789], [!2002]) - Clarify implementation of onion service timeout calculation logic, to avoid possible confusion about the `hs_hops` variable. ([#1332], [!2044]) - Simplified logic and API for creating relay encryption layers. ([!2048]) - Various typo fixes in comments and messages. ([!2030], [!2032], [!2036]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Brady Fomegne, Dimitris Apostolou, Jim Newsome, Neel Chauhan, Tobias Stoeckmann, and trinity-1686a. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1997]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1997 [!2002]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2002 [!2008]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2008 [!2011]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2011 [!2013]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2013 [!2017]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2017 [!2020]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2020 [!2021]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2021 [!2024]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2024 [!2027]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2027 [!2028]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2028 [!2029]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2029 [!2030]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2030 [!2031]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2031 [!2032]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2032 [!2033]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2033 [!2034]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2034 [!2035]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2035 [!2036]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2036 [!2038]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2038 [!2040]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2040 [!2043]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2043 [!2044]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2044 [!2045]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2045 [!2046]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2046 [!2047]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2047 [!2048]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2048 [!2049]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2049 [!2050]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2050 [!2051]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2051 [!2052]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2052 [!2053]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2053 [!2054]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2054 [!2055]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2055 [#1005]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1005 [#1124]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1124 [#1212]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1212 [#1259]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1259 [#1272]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1272 [#1275]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1275 [#1276]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1276 [#1277]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1277 [#1304]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1304 [#1311]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1311 [#1332]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1332 [#1340]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1340 [#504]: https://gitlab.torproject.org/tpo/core/arti/-/issues/504 [#755]: https://gitlab.torproject.org/tpo/core/arti/-/issues/755 [#789]: https://gitlab.torproject.org/tpo/core/arti/-/issues/789 [4c1eb94173521bc5]: https://gitlab.torproject.org/tpo/core/arti/-/commit/4c1eb94173521bc5104449327650e20ffe32afa7 [95ed432c13c2c4b2]: https://gitlab.torproject.org/tpo/core/arti/-/commit/95ed432c13c2c4b2d287f7a7a040576627687dbf [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`Runtime`]: https://tpo.pages.torproject.net/core/doc/rust/tor_rtcompat/trait.Runtime.html [`coarsetime`]: https://docs.rs/coarsetime/latest/coarsetime/ [`doc/OnionService.md`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/OnionService.md [`doc/Semver.md`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/Semver.md [`unchecked_duration_subtraction`]: https://rust-lang.github.io/rust-clippy/master/index.html#/unchecked_duration_subtraction [d63d966d79f0f988]: https://gitlab.torproject.org/tpo/core/arti/-/commit/d63d966d79f0f988522c76c729a5189d16275b27 [other sponsors]: https://www.torproject.org/about/sponsors/ [prop340]: https://spec.torproject.org/proposals/340-packed-and-fragmented.html [vanguards]: https://github.com/mikeperry-tor/vanguards/blob/master/README_TECHNICAL.md # Arti 1.2.0 — 4 March 2024 Arti 1.2.0 continues work on support for running onion services. You can now launch an onion service and expect it to run, although you may well encounter bugs. We have fixed a number of bugs and security issues, and have made the `onion-service-service` feature non-experimental. In the next releases, we will focus on implementing the missing security features and on improving stability. Don't rely on this onion service implementation for security yet; there are a number of [missing security features] we will need to develop before we can recommend them for actual use. See [`doc/OnionService.md`] for instructions and caveats. ### Major bugfixes - Empty DATA messages are a way to inject an undetected traffic signal, so we now reject empty DATA messages, and prevent them from being constructed through the [`tor-cell`] API. This is tracked as [TROVE-2024-001]. ([!1981], [#1269]) ### Breaking changes in lower-level crates - In [`tor-circmgr`], `Error::GuardNotUsable`, `Error::CircTimeout`, and `Error::Protocol` now contain the process-unique identifier of the circuit that caused the error. ([!2003]) - In [`tor-hsclient`], remove `HsClientNickname` and the nickname argument from `HsClientDescEncKeypairSpecifier::new`. ([!1998], [#1283]) - In [`tor-hsrproxy`], add a `String` representing the error message to `ProxyConfigError::UnrecognizedTargetType`, `ProxyConfigError::InvalidTargetAddr`, `ProxyConfigError::InvalidPort`. ([!1973], [#1266]) - In [`tor-hsservice`], remove the unimplemented `max_concurrent_streams_per_circuit` configuration option from `OnionServiceConfigBuilder`. We may implement and reinstate it in a future release. ([!1996]) - In [`tor-keymgr`], rename `KeyInfoExtractor` to `KeyPathInfoExtractor`. ([bd85bffd0a388f57]) - In [`tor-keymgr`], rename `{to,from}_component()` to `{to,from}_slug()`. ([1040df929f643a2f]) ### Onion service development - Improve the key manager APIs. ([!1952], [#1115]) - Add more context to [`tor-hsrproxy`] configuration error messages. ([!1973]) - Design an API for vanguards. ([!1970]) - Make the descriptor publisher conform with the specification, by periodically republishing the hidden service descriptor. This fixes a serious reachability bug. ([!1971], [#1241], [#1280]) - Rotate old introduction point relays even if they are not working. ([72c021555e1095f1]) - Expire old on-disk introduction point state. ([!1977], [!1982], [#1198]) - Expose `HsNickname::new`. ([f3720ac2c0f16883]) - Design the client and service configuration, and a CLI subcommand, for hidden service client authorization. ([!1987]) - Improve the ergonomics of our key listing and removal APIs. ([!1988], [#1271]) - Include the `ArtiPath` in key path errors. ([!1960], [#1115]) - Improve circuit error logging by including the process-unique identifier of the circuit in error messages. ([!2003], [#1297]) - Improve status reporting from onion services. ([!1966], [#1083]) - Design an API for bandwidth rate limiting. ([!1965]) - Improve descriptor publisher error reporting. ([!1991]) - Remove the client nickname from onion service client key specifiers. ([!1998], [#1283]) - When reconfiguring an onion service, reject any changes that are inappropriate or would put the service in a bad state. ([!1996], [#1209]) - Remove the keystore directory configuration option, pending design work relating to RPC and multi-user Arti. ([!1995], [#1202]) - Mark `onion-service-service` and every feature it depends on as non-experimental. ([!1993], [#1182]) - Fix a bug that prevented the descriptor publisher from fully processing the results of publish tasks, causing it to republish the descriptor unnecessarily in some circumstances. ([!1983]) ### Other major new features in our Rust APIs - [`tor-persist`] now provides new `state_dir` APIs for instance iteration and expiry needed for onion service state expiry. ([!1968], [#1163]) ### Documentation and examples - Fix the casing of our recognized key paths. ([1a900081e945679e]) - Minor updates to the release process. ([!1959], [!1963]) - Fix typos in the [`tor-guardmgr`] README. ([!1980]) - Reword the [`tor-keymgr`] README for clarity. ([489a2555f28daa6d]) - Update onion service documentation. ([!1994], [#1287]) - Clarify the onion service configuration instructions from `doc/OnionService.md`, remove unsupported "unix:" example. ([!1972], [#1266]) ### Testing - Improve replay log fork test. ([!1974], [!2010], [#1264]) - In the introduction point manager tests, avoid reusing the RNG seed. ([b515baf27f194470]) - Our [Shadow] CI tests now use the latest versions of `shadow` and `tgen`, and no longer pull `libigraph` from bullseye. ([!1958]) - Upgrade docker image for reproducible builds. ([!2016]) - Fix several tests on Windows. ([!2015]) ### Cleanups, minor features, and bugfixes - Allow overriding `cargo` in [`semver-checks`]. ([83c29b0d805f908e]) - Introduce a [`list_crates_publish`] script. ([b03e5d5e11c52faf]) - Fix compilation with musl. ([!1961], [#1264]) - Add `fixup-features` to the main workspace, make various improvements to `fixup-features`, `check_toposort`, `list_crates`. ([!1969], [#1263]) - Use `std::default::Default` instead of [educe]'s `Default` in a number of places in preparation for the upgrade to educe 0.5. ([!1975], [#1257]) - Require the Fast and Stable flags as appropriate. ([!1976], [#1100]) - Refactor and improve error hinting in [`arti`] and [`arti-client`]. ([!1986], [#1165]) - Do not output ANSI escape codes when logging to file. ([!1999], [#1298]) - Upgrade our dependency on [curve25519-dalek] from 4.1.1 to 4.1.2. ([!2000]) - Upgrade to the latest versions of [event-listener], [rusqlite], [async-broadcast], [signature], [config]. ([!2001], [!2004], [!2451]) - Fix `ArtiPath` creation on Windows. ([!2012]) - Fix compilation and warnings on Windows. ([!2014], [!2009]) - Gate `RpcConfig` behind `rpc` feature. ([6c9e70e39ab279aa]]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Jim Newsome, Tobias Stoeckmann, and trinity-1686a. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1952]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1952 [!1958]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1958 [!1959]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1959 [!1960]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1960 [!1961]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1961 [!1963]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1963 [!1965]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1965 [!1966]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1966 [!1968]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1968 [!1969]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1969 [!1970]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1970 [!1971]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1971 [!1972]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1972 [!1973]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1973 [!1974]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1974 [!1975]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1975 [!1976]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1976 [!1977]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1977 [!1980]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1980 [!1981]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1981 [!1982]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1982 [!1983]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1983 [!1986]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1986 [!1987]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1987 [!1988]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1988 [!1991]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1991 [!1993]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1993 [!1994]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1994 [!1995]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1995 [!1996]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1996 [!1998]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1998 [!1999]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1999 [!2000]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2000 [!2001]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2001 [!2003]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2003 [!2004]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2004 [!2009]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2009 [!2010]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2010 [!2012]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2012 [!2014]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2014 [!2015]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2015 [!2016]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2016 [!2451]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/2451 [#1083]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1083 [#1100]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1100 [#1115]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1115 [#1163]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1163 [#1165]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1165 [#1182]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1182 [#1198]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1198 [#1202]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1202 [#1209]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1209 [#1241]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1241 [#1257]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1257 [#1263]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1263 [#1264]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1264 [#1266]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1266 [#1269]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1269 [#1271]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1271 [#1280]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1280 [#1283]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1283 [#1287]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1287 [#1297]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1297 [#1298]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1298 [1040df929f643a2f]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1040df929f643a2fd2a1ccb0400f1dd2f2beac98 [1a900081e945679e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1a900081e945679e80d29797ae00c206f2cd78f1 [489a2555f28daa6d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/489a2555f28daa6d5f523480f434f27292783abd [6c9e70e39ab279aa]: https://gitlab.torproject.org/tpo/core/arti/-/commit/6c9e70e39ab279aa99634d216847627f1cd62f2a [72c021555e1095f1]: https://gitlab.torproject.org/tpo/core/arti/-/commit/72c021555e1095f1be3f658acac5655b54842347 [83c29b0d805f908e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/83c29b0d805f908e98ed1742491f3145f547fb2e [Shadow]: https://shadow.github.io [TROVE-2024-001]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`arti-client`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/index.html [`arti`]: https://tpo.pages.torproject.net/core/doc/rust/arti/index.html [`doc/OnionService.md`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/OnionService.md [`list_crates_publish`]: https://gitlab.torproject.org/tpo/core/arti/-/tree/main/maint/list_crates_publish [`semver-checks`]: https://gitlab.torproject.org/tpo/core/arti/-/tree/main/maint/semver-checks [`tor-cell`]: https://tpo.pages.torproject.net/core/doc/rust/tor_cell/index.html [`tor-circmgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_circmgr/index.html [`tor-guardmgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_guardmgr/index.html [`tor-hsclient`]: https://tpo.pages.torproject.net/core/doc/rust/tor_hsclient/index.html [`tor-hsrproxy`]: https://tpo.pages.torproject.net/core/doc/rust/tor_hsrproxy/index.html [`tor-hsservice`]: https://tpo.pages.torproject.net/core/doc/rust/tor_hsservice/index.html [`tor-keymgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_keymgr/index.html [`tor-persist`]: https://tpo.pages.torproject.net/core/doc/rust/tor_persist/index.html [async-broadcast]: https://crates.io/crates/async-broadcast [b03e5d5e11c52faf]: https://gitlab.torproject.org/tpo/core/arti/-/commit/b03e5d5e11c52faf441294c8c883a2dfbc0d2021 [b515baf27f194470]: https://gitlab.torproject.org/tpo/core/arti/-/commit/b515baf27f1944708285849503dfcd08bb7ac73b [bd85bffd0a388f57]: https://gitlab.torproject.org/tpo/core/arti/-/commit/bd85bffd0a388f579d42c8a0758091232bf901a0 [config]: https://crates.io/crates/config [curve25519-dalek]: https://crates.io/crates/curve25519-dalek [educe]: https://crates.io/crates/educe [event-listener]: https://crates.io/crates/event-listener [f3720ac2c0f16883]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f3720ac2c0f16883abc1597ad828f99022a0e320 [missing security features]: https://gitlab.torproject.org/tpo/core/arti/-/issues/?label_name%5B%5D=Onion%20Services%3A%20Improved%20Security [other sponsors]: https://www.torproject.org/about/sponsors/ [rusqlite]: https://crates.io/crates/rusqlite [signature]: https://crates.io/crates/signature # Arti 1.1.13 — 5 February 2024 Arti 1.1.13 continues work on support for running onion services. You can now launch an onion service and expect it to run. We have fixed a number of bugs. The user experience is still not great, and the onion-service-service feature is still experimental. We have reorganised the on-disk state and key storage, to make it more sensible; we hope (but don't promise!) it's now the final layout. Don't rely on this onion service implementation for security yet; there are a number of [missing security features] we will need to develop before we can recommend them for actual use. See `doc/OnionService.md` for instructions and caveats. ### Breaking changes in lower-level crates - [`tor-hsclient`]\: Replaced `HsClientKeyRole`, `HsClientSecretKeySpecifier` with `HsClientDescEncKeypairSpecifier`. Renamed `HsClientSpecifier` to `HsClientNickname`. ([!1864], [!1931]) - [`tor-hscrypto`]\: `AesOpeKey::encrypt` now takes a `SrvPeriodOffset`; Replaced `TimePeriodOffset` with `SrvPeriodOffset`; Removed `TimePeriod::offset_within_period`. ([!1904], [#1166]) - [`tor-netdir`]\: `hs_dirs_download` parameters changed; `hs_intro_*_lifetime` parameters renamed. ([!1903], [!1904], [#1254]) ### Onion service development - Complete overhaul of the way the hidden service code stores non-key persistent state. Pathnames have changed as a result. ([!1853], [#1183], [!1941]) - Many improvements to keystore, key and `KeySpecifier` handling, including incompatible changes to on-disk key paths. ([!1864], [!1863], [!1883], [#1260], [!1949], [#1074], [!1948]) - Fix "service fails after approx 12 hours" bug. ([#1242], [!1901]) - Fix time period processing bugs including `HSS: "internal error" "current wallclock time not within TP?!"`. ([#1155], [#1166], [#1254], [!1903], [!1904], [!1914]) - Correctly rate-limit descriptor publication. ([!1951]) - Fixes to services shutdown. ([!1875], [!1895], [!1897], [#1236], [!1899], [!1917], [!1921]) - Improve error and corner case handling in descriptor publisher. ([!1861]) - Work on expiring keys: we expire descriptor keys now (although we don't actually properly delete all keys when we need to, yet). ([!1909]) - Only choose Stable relays for introduction points. ([!1884], [#1240], [#1211]) - Better handling of introduction point establishment failures. ([!1889], [!1915]) - Better handling of anomalous situations (including excessive requests) on introduction circuits. ([#1188], [#1189], [!1892], [!1916]) - Tolerate `INTRO_ESTABLISHED` messages with (unknown) extensions. ([!1898]) - Correct and improve various timing and tuning parameters. ([!1911], [!1924]) - Improve status reporting from hidden services. ([!1902]) - Public API of `tor-hsservice` crate overhauled. ([#1227], [#1220], [!1887]) - Mark lower-level hs-service features non-experimental. ([!1908]) - Defend against partial writes of introduction point replay log entries. ([!1920]) - Corrections to error handling, including to handling of introduction point failures, and attempts to launch the same service concurrently. ([!1906], [#1237], [#1225], [#1255]) - Detect and reject configurations with onion services, when onion-service-server support has been compiled out. ([!1885], [#1184]) - Temporarily disable parsing of AF_UNIX socket addresses (which aren't implemented right now anyway). ([!1886]) - Rate limit one log message, downgrade one, and remove another. ([!1871], [!1951]) - Add higher-level documentation to tor-hsservice (and fix a broken docs link). ([!1918], [!1945]) - Hide the `OnionServiceState` type. ([!1946], [#1261]) - Many internal cleanups including much triage of TODO comments in the code. ([!1859], [!1862], [!1861], [!1868], [!1866], [!1863], [!1870], [!1874], [!1872], [!1869], [!1876], [!1867], [!1873], [!1877], [!1878], [!1875], [!1879], [!1882], [!1881], [!1880], [!1894], [!1888], [!1887], [!1896], [!1864], [!1951]) ### Other major new features in our Rust APIs - New `fslock-guard` crate for on-disk lockfiles which can be deleted, and which have a Rust API that returns a guard object. ([fslock!15], [!1900], [!1910]) - `tor-persist` has a `Slug` type which is used for nicknames, key paths, etc., unifying the rules used for different kinds of name. ([!1912], [#1092], [#1193], [!1926], [!1929], [!1922], [!1933], [#1092]). ([!1931], [!1934]) - `tor-persist` has `StateDirectory` for handling persistent state relating to particular instances of a facility (used for hidden services). ([!1853], [#1205], [!1913], [#1163], [!1935]) ### Documentation and examples - New examples using `hyper v1`. ([!1845]) - Fix a broken link. ([!1938]) ### Testing - New `test-temp-dir` crate for convenient handling of temporary files in tests. ([!1925]) ### Cleanups, minor features, and bugfixes - `fs-mistrust`: Expose `CheckedDir::verifier` and provide `CheckedDir::make_secure_dir`. ([!1927], [!1928]) - Instructions for building `arti-extra` in `tests/shadow/README.md`. ([!1891]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Jim Newsome, and ramidzkh. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1845]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1845 [!1853]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1853 [!1859]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1859 [!1861]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1861 [!1862]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1862 [!1863]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1863 [!1864]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1864 [!1866]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1866 [!1867]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1867 [!1868]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1868 [!1869]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1869 [!1870]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1870 [!1871]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1871 [!1872]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1872 [!1873]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1873 [!1874]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1874 [!1875]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1875 [!1876]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1876 [!1877]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1877 [!1878]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1878 [!1879]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1879 [!1880]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1880 [!1881]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1881 [!1882]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1882 [!1883]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1883 [!1884]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1884 [!1885]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1885 [!1886]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1886 [!1887]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1887 [!1888]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1888 [!1889]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1889 [!1891]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1891 [!1892]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1892 [!1894]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1894 [!1895]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1895 [!1896]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1896 [!1897]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1897 [!1898]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1898 [!1899]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1899 [!1900]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1900 [!1901]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1901 [!1902]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1902 [!1903]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1903 [!1904]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1904 [!1906]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1906 [!1908]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1908 [!1909]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1909 [!1910]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1910 [!1911]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1911 [!1912]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1912 [!1913]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1913 [!1914]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1914 [!1915]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1915 [!1916]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1916 [!1917]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1917 [!1918]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1918 [!1920]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1920 [!1921]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1921 [!1922]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1922 [!1924]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1924 [!1925]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1925 [!1926]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1926 [!1927]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1927 [!1928]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1928 [!1929]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1929 [!1931]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1931 [!1933]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1933 [!1934]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1934 [!1935]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1935 [!1938]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1938 [!1941]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1941 [!1945]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1945 [!1946]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1946 [!1948]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1948 [!1949]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1949 [!1951]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1951 [#1074]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1074 [#1092]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1092 [#1155]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1155 [#1163]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1163 [#1166]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1166 [#1183]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1183 [#1184]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1184 [#1188]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1188 [#1189]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1189 [#1193]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1193 [#1205]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1205 [#1211]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1211 [#1220]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1220 [#1225]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1225 [#1227]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1227 [#1236]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1236 [#1237]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1237 [#1240]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1240 [#1242]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1242 [#1254]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1254 [#1255]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1255 [#1260]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1260 [#1261]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1261 [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`tor-hsclient`]: https://tpo.pages.torproject.net/core/doc/rust/tor_hsclient/index.html [`tor-hscrypto`]: https://tpo.pages.torproject.net/core/doc/rust/tor_hscrypto/index.html [`tor-netdir`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdir/index.html [fslock!15]: https://github.com/brunoczim/fslock/pull/15 [missing security features]: https://gitlab.torproject.org/tpo/core/arti/-/issues/?label_name%5B%5D=Onion%20Services%3A%20Improved%20Security [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.1.12 — 9 January 2024 Arti 1.1.12 continues work on support for running onion services. You can now launch an onion service and expect it to run, though the user experience leaves a lot to be desired. Don't rely on this onion service implementation for security yet; there are a number of [missing security features] we will need to develop before we can recommend them for actual use. ### Breaking changes ### Breaking changes in lower-level crates - In `tor_dirmgr`, rename the `cache_path` parameter to `cache_dir` for consistency. ([!1789]) - In `tor-error`, the `ErrorReport` trait is now sealed. ([00903e22bb978295]) - Change the domain name used to tag our extended SSH key types. This will break any keys created using earlier releases, though it is unlikely that anybody actually managed to do so. ([#1108], [!1838]) - In `tor-netdoc`, `HsDescBuilder::auth_clients` now takes an `Option`, to distinguish the case where no clients are allowed from the case where all clients are allowed. ([#1019], [!1840]) ### Onion service development - Fix a set of bugs bug that caused onion services to upload far too many descriptors. ([#1130], [#1142], [!1787], [!1806]) - Improve reporting of descriptor upload failures. ([#1132], [f26b00b3179a7e13], [1990bbdffd87abaa], [!1799]) - Ensure that the list of published introduction points is recorded correctly. ([#1097], [!1805]) - Implement persistence for introduction point information, so that onion services can restart with the same introduction points and behave correctly. ([#967], [!1782]) - Refactor key manager code to prevent the creation of invalid `KeySpecifier`s, and extend the `KeySpecifier` macro to also generate `KeyInfoExtractor` implementations for extracting information out of `&KeyPath`s. ([#1127], [f7772f127e895d96]) - Add lower-level support for deleting expired keys and associated information. ([#1043], [!1784], [!1796]) - Onion services can now be stopped, started, or reconfigured while arti is running. ([#1089], [!1798]) - Implement an API for onion services to report their status. ([#1083], [!1797], [!1808]) - Produce useful, rate-limited log messages on certain kinds of onion service failures. ([!1809]) - Warn on some onion service configurations that are unlikely to be intentional. ([!1822]) - Add documentation for how to run an onion service, in [`doc/OnionService.md`]. This documentation also records areas where the implementation is lacking, and notes areas where the current process has bad usability. ([!1825], [!1826], [!1841]) - Fix a bug that would occur when trying to create an onion service descriptor for a time period that had not yet begun. ([#1155], [!1828]) - Always log the onion service's `.onion` address, when starting with `log_sensitive_information` enabled. ([!1830]) - Ensure that no extra features beyond `onion-service-service` are needed in `arti` to enable onion service support. ([49ece08bafc115ce]) - Use our regular sub-builder pattern for key-manager configuration, so that default option values can be omitted. ([4d7aeeab57577c98]) - Various improvements to descriptor publisher error handling. ([#1129], [!1812], [!1821]) - Record a replay-log of incoming `INTRODUCE2` requests, to prevent replay attacks. ([!1824]) - Add a CLI for learning the `.onion` address for a given onion service. ([#1071], [!1837]) - Refactor the `KeySpecifier` macro and its implementations to improve usability and reduce the API surface. ([#1151], [#1147], [#1126], [!1851]) ### Other major features - Arti now supports the [`ntor_v3`] circuit extension handshake, which enables clients to send circuit parameters to the relays on their paths. ([#1084], [!1766]) ### Documentation - Improve documentation of state and cache directories. ([!1789]) - Improve internal documentation about how we implement the onion service specifications. ([!1795], [!1813]) - Various typo fixes. ([!1852]) ### Testing - Fix an (unreached) bug in test_tmp_dir code. ([!1792]) - Include an onion service in our [Shadow] CI tests. ([!1827]) ### Cleanups, minor features, and bugfixes - Various cleanups enabled by our transition to requiring Rust 1.70. ([!1785]) - Refactor high-level reconfiguration code so that it sends its configuration to each of a set of modules, rather than hardcoding a list of functions to call. ([1ac515c183bf8c1d]) - The `traits` module is now unconditionally present in the `tor-llcrypto` crate. ([!1815]) - In `tor-error`, the `ErrorReport` is now implemented for `dyn StdError`, which allows us to use it with `anyhow::Error`. ([#1157], [!1818]) - Fix a busy-loop that would occur if a channel was due to expire in less than a second, and another race condition when expiring channels. ([!1834]) - In `tor-cell`, `{Any}RelayCell` has been renamed to `{Any}RelayMsgOuter`, in order to prepare for work on [proposal 340]. This name is a placeholder; eventually, there will be a followup renaming. ([#775], [!1839], [!1840]) - Improve the output of `tokio`'s tracing feature when used with our `tor-rtcompat` wrappers. ([!1843]) - Expose a `dir_mgr_config()` accessor from `TorClientConfig`. ([#1175], [!1847]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Dimitris Apostolou, Emil Engler, and Jim Newsome. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1766]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1766 [!1782]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1782 [!1784]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1784 [!1785]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1785 [!1787]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1787 [!1789]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1789 [!1792]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1792 [!1795]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1795 [!1796]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1796 [!1797]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1797 [!1798]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1798 [!1799]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1799 [!1805]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1805 [!1806]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1806 [!1808]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1808 [!1809]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1809 [!1812]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1812 [!1813]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1813 [!1815]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1815 [!1818]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1818 [!1821]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1821 [!1822]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1822 [!1824]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1824 [!1825]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1825 [!1826]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1826 [!1827]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1827 [!1828]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1828 [!1830]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1830 [!1834]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1834 [!1837]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1837 [!1838]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1838 [!1839]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1839 [!1840]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1840 [!1841]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1841 [!1843]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1843 [!1847]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1847 [!1851]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1851 [!1852]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1852 [#1019]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1019 [#1043]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1043 [#1071]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1071 [#1083]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1083 [#1084]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1084 [#1089]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1089 [#1097]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1097 [#1108]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1108 [#1126]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1126 [#1127]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1127 [#1129]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1129 [#1130]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1130 [#1132]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1132 [#1142]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1142 [#1147]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1147 [#1151]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1151 [#1155]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1155 [#1157]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1157 [#1175]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1175 [#775]: https://gitlab.torproject.org/tpo/core/arti/-/issues/775 [#967]: https://gitlab.torproject.org/tpo/core/arti/-/issues/967 [00903e22bb978295]: https://gitlab.torproject.org/tpo/core/arti/-/commit/00903e22bb9782958135a7061dcfb523e4ebc91f [1990bbdffd87abaa]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1990bbdffd87abaa6fa70fc29a9b2d191e35575a [1ac515c183bf8c1d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1ac515c183bf8c1d7e07bccd0fdbd3644041b250 [49ece08bafc115ce]: https://gitlab.torproject.org/tpo/core/arti/-/commit/49ece08bafc115ce99ced38f659ac7f72bab947b [4d7aeeab57577c98]: https://gitlab.torproject.org/tpo/core/arti/-/commit/4d7aeeab57577c98a15aa78ef5cd5de7652f39e8 [Shadow]: https://shadow.github.io [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`doc/OnionService.md`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/OnionService.md [`ntor_v3`]: https://spec.torproject.org/tor-spec/create-created-cells.html#ntor-v3 [f26b00b3179a7e13]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f26b00b3179a7e135960972e8c922d824a62ee0e [f7772f127e895d96]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f7772f127e895d9655346cf69fd2134ac8e225de [missing security features]: https://gitlab.torproject.org/tpo/core/arti/-/issues/?label_name%5B%5D=Onion%20Services%3A%20Improved%20Security [other sponsors]: https://www.torproject.org/about/sponsors/ [proposal 340]: https://spec.torproject.org/proposals/340-packed-and-fragmented.html # Arti 1.1.11 — 4 December 2023 Arti 1.1.11 continues work on support for running onion services. Onion services are now working in our testing, and we expect we'll have something testable by others in our next release. Arti 1.1.11 also increases our MSRV (Minimum Supported Rust Version) to 1.70, in accordance with our [MSRV policy]. ### Breaking changes - Arti now requires Rust 1.70 or later. ([!1773]) ### Breaking changes in lower-level crates - The `LockStatus` type in tor-persist is now `#[must_use]`. ([#1753]) - The `tor-dirclient` crate now exposes `http::Error` from http 1.0. ([c5b386fb1009a1d9]) - The `tor-dirclient` crate's `RequestError` type now includes status text from the directory server, to help diagnose problems. ([!1780]) - We've upgraded to the latest versions of [dalek-cryptography]. This is a breaking change to every internal Arti API that takes a curve25519 or ed25519 key as its input. ([#808], [!1767]) - In `tor-cell`, `HandshakeType` is now used in several places in place of `u16`. ([5d7f70c0fe515aee]) ### Onion service development - Correct our handling of BEGIN and END messages to bring them into conformance with the C Tor implementation and the specification. ([#1077], [!1694], [!1738]) - In our key manager, use macros to define key specifiers, instead of repeating the same boilerplate code. ([#1069], [#1093], [!1710], [!1733]) - Refactoring and refinement on the definitions of onion-service-related errors. ([!1718], [!1724], [!1750], [!1751], [!1779]) - Add a "time-store" mechanism for (as correctly as possible) storing and loading future timestamps, even in the presence of system clock skew. ([!1723], [!1774]) - Implement a replay-log backend to prevent INTRODUCE replay attacks against onion services. ([!1725]) - Improved encoding for key-denotators in the key manager. ([#1063], [#1070], [!1722]) - Allow a single key to have more than one denotator in its path. ([#1112], [!1747]) - Use an order-preserving-encryption back-end to generate monotonically increasing revision counters for onion service descriptors. We do this to ensure a reproducible series of counters without leaking our clock skew. ([#1053], [!1741], [!1744]) - Deprecate key types for INTRODUCE-based authentication: C tor has never implemented this, and we do not plan to implement it without additional specification work. ([#1037], [!1749]) - When establishing an introduction point, send the `intro_dos` extension as appropriate. ([#723], [!1740]) - Added conversion functions and initial persistence support for introduction point keys. ([!1756]) - Start work on introduction point persistence. ([!1755], [!1765]) - Make a `Builder` type for key managers. ([#1114], [!1760]) - Revert to our intended configuration format for onion service proxy rules. ([#1058], [!1771]) - Resolve miscellaneous "TODO" items throughout the onion service code. ([#1066], [!1728], [!1731], [!1732], [!1742]) ### Client features - Backend and API code for the "ntor-v3" circuit-extension handshake. This handshake adds the ability to send additional options from the client to the relay when creating or extending a circuit, and will eventually be used to negotiate protocol features like RTT-based congestion control and UDP-over-Tor support. ([!1720], [!1739]) ### Testing - Simplify the usage of time-simulating mock runtimes. ([ee96e5e454ba5db2]) - Use time-simulating mock runtimes in more circuit-manager tests, to make them more reliable. ([#1090], [!1727]) - Add a `spawn_join` method to mock runtimes, to simplify tests. ([!1746]) - Prototype a "testing temp dir" facitility to ensure that temporary directories used in tests can be persistent if desired, and that they live for long enough. ([!1762]) ### Cleanups, minor features, and bugfixes - Fix various warnings from Clippy. ([!1719]) - Solve a bug that prevented `Conversation::send_message` from working. ([#1085], [!1726]) - Upgrade to version 4 of the `clap` option-parsing library. ([!1735]) - New backend to generate rate limited problem reports without spamming the logs. ([#1076], [!1734], [!1752]) - Correct our decisions about sending Content-Length on HTTP requests. Previously we had sent it unconditionally. ([#1024], [!1671]) - Add directory-listing and file-deletion support to `fs-mistrust::CheckedDir`. ([#1117], [!1759]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Andrew, Jim Newsome, rdbo, Saksham Mittal, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1671]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1671 [!1694]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1694 [!1710]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1710 [!1718]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1718 [!1719]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1719 [!1720]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1720 [!1722]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1722 [!1723]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1723 [!1724]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1724 [!1725]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1725 [!1726]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1726 [!1727]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1727 [!1728]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1728 [!1731]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1731 [!1732]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1732 [!1733]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1733 [!1734]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1734 [!1735]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1735 [!1738]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1738 [!1739]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1739 [!1740]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1740 [!1741]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1741 [!1742]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1742 [!1744]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1744 [!1746]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1746 [!1747]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1747 [!1749]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1749 [!1750]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1750 [!1751]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1751 [!1752]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1752 [!1755]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1755 [!1756]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1756 [!1759]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1759 [!1760]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1760 [!1762]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1762 [!1765]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1765 [!1767]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1767 [!1771]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1771 [!1773]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1773 [!1774]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1774 [!1779]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1779 [!1780]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1780 [#1024]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1024 [#1037]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1037 [#1053]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1053 [#1058]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1058 [#1063]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1063 [#1066]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1066 [#1069]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1069 [#1070]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1070 [#1076]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1076 [#1077]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1077 [#1085]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1085 [#1090]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1090 [#1093]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1093 [#1112]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1112 [#1114]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1114 [#1117]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1117 [#1753]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1753 [#723]: https://gitlab.torproject.org/tpo/core/arti/-/issues/723 [#808]: https://gitlab.torproject.org/tpo/core/arti/-/issues/808 [5d7f70c0fe515aee]: https://gitlab.torproject.org/tpo/core/arti/-/commit/5d7f70c0fe515aee8640f336cc799b70828fd109 [MSRV policy]: https://gitlab.torproject.org/tpo/core/arti/#minimum-supported-rust-version [Zcash Community Grants]: https://zcashcommunitygrants.org/ [c5b386fb1009a1d9]: https://gitlab.torproject.org/tpo/core/arti/-/commit/c5b386fb1009a1d91a830aeb67921c6057b98a1e [dalek-cryptography]: https://github.com/dalek-cryptography/ [ee96e5e454ba5db2]: https://gitlab.torproject.org/tpo/core/arti/-/commit/ee96e5e454ba5db27daaab0f8757732994454f0b [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.1.10 — 31 October 2023 Arti 1.1.10 continues work on support for onion services in Arti. At last, we can (technically) run as an onion service... though not yet in a useful way. (Onion services don't yet recover correctly after a restart, outdated keys are not removed, and we are missing other important security features.) ### Breaking changes in lower-level crates - The [`IoErrorExt`] trait in [`tor-basic-utils`] is now sealed. ([!1654]) - The [`Requestable`] trait in [`tor-dirclient`] is now sealed, and most of its members are now private. ([!1679]) - In [`tor-cell`], stream and circuit IDs are now inherently non-zero. To represent an ID that might be zero on the wire, we now use `Option` or `Option`. ([#1080], [!1697]) - In [`tor-cell`], `CREATE2` handshake types are no longer raw `u16` values. ([!1703]) - In [`tor-cert`], `encode_and_sign` now returns an `Ed25519EncodedCert` rather than a raw `Vec`. ([!1702]) ### Onion service development - The `arti` binary can now be configured to invoke the code that launch onion services, and the code that proxies them to local ports. ([!1644]) - Configuration support for onion services, and for the `rproxy` facility that directs incoming onion service connections to local services. ([!1638], [!1640]) - The introduction points are now exposed by the code that manages them to the code that publishes onion service descriptors. ([!1636], [!1645]) - Implement reconfiguration support in the lower level onion service code. ([!1651]) - Temporarily changed the configuration format for onion service ports to work around [a bug in `config-rs`]. ([21605d2c9e601c3a]) - As-yet-unused code to build a list of authorized clients. ([#1051], [!1642]) - Auto-generate missing keys rather than failing when we are about to publish. ([!1688]) - Log onion service Ids when they are created, so we can test them. ([!1689]) - Move responsibility for generating descriptor signing key certificates into `tor-hsservice` from `tor-netdoc`; refactor accordingly. ([!1702]) - Resolve a number of pending "TODO" items in [`tor-proto`] affecting the onion service implementation. ([!1658]) - Resolve a number of pending "TODO" items in [`tor-dirclient`] affecting the onion service implementation. ([!1675]) - Sort introduction point lists by ntor public key before publication, to avoid leaking information. ([#1039], [!1674]) - Numerous bugfixes, cleanups, and backfills found during testing and integrating the pieces of the onion service implementation. ([!1634], [!1637], [!1659], [!1673], [!1682], [!1684], [!1686], [!1695], [!1711]) ### Client features - Arti can now be configured to listen for connections on multiple arbitrary addresses—not just `localhost`. ([!1613]) ### Key manager - The key manager code now has improved support for generating keypairs, keys with derived data, and other structures needed for onion services. ([!1653]) - The key manager now encodes whether a key is private or public in its file extension. ([!1672]) - The key manager now disallows path components that could lead (under some programming errors) to directory traversal. ([!1661]) - We can now list keys by path and type; this is important so that we can identify disused keys and eventually expire them. ([!1677]) ### Documentation and examples - Correct our example for how to connect to onion services. ([!1653]) - Update download location in `download-manager` example. ([!1691]) ### Infrastructure - Our release scripts and processes are now more robust against several kinds of mistake that have frustrated previous releases, including crates that change only when their dependencies get new versions, accidental inclusion of wildcard dependencies, and dependencies on unpublished crates. ([!1646]) - Clean up use of `after_script` in our CI to behave more sensibly. ([#1061], [!1663]) ### Testing - Even-more-improved support for tests that depend on a simulated view of the passage of time. ([!1639], [!1650]) ### Cleanups, minor features, and bugfixes - Refactored the key derivation code for relay cryptography. ([!1629]) - Work around [a bug in `FusedFuture for oneshot::Receiver`] that made it dangerous to `select!` on a `oneshot::Receiver` to detect if the sender is dropped. ([#1059], [!1656], [futures-rs#2455](https://github.com/rust-lang/futures-rs/issues/2455)) - Fix handling for escape sequences when talking to a pluggable transport. ([!1584]) - Major refactoring and simplifications on the explicit closing of pending incoming streams, to prevent double-close bugs and related panics. ([#1065], [!1678], [!1681]) - Refactor implementation of ISO-8601 time parsing in descriptors. ([#751], [!1693]) - Renamed the function in `tor-hsclient` to launch a circuit to an onion service to be less confusing. The old name remains but is deprecated. ([#1078], [!1700]) - Do not advertise or accept non-required compression encodings when making anonymized requests to an onion service directory: to do so is a fingerprinting vector. ([#1062], [cfe641613e6b6f4f]) - Use the new typed handshake-type codes when building onion service descriptors. ([!1712]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Emil Engler, gil, halcyon, Jani Monoses, Jim Newsome, LowLandMink543, Neel Chauhan, and Trinity Pointard! Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1584]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1584 [!1613]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1613 [!1629]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1629 [!1634]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1634 [!1636]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1636 [!1637]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1637 [!1638]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1638 [!1639]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1639 [!1640]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1640 [!1642]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1642 [!1644]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1644 [!1645]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1645 [!1646]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1646 [!1650]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1650 [!1651]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1651 [!1653]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1653 [!1654]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1654 [!1656]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1656 [!1658]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1658 [!1659]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1659 [!1661]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1661 [!1663]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1663 [!1672]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1672 [!1673]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1673 [!1674]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1674 [!1675]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1675 [!1677]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1677 [!1678]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1678 [!1679]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1679 [!1681]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1681 [!1682]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1682 [!1684]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1684 [!1686]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1686 [!1688]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1688 [!1689]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1689 [!1691]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1691 [!1693]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1693 [!1695]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1695 [!1697]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1697 [!1700]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1700 [!1702]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1702 [!1703]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1703 [!1711]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1711 [!1712]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1712 [#1039]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1039 [#1051]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1051 [#1059]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1059 [#1061]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1061 [#1062]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1062 [#1065]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1065 [#1078]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1078 [#1080]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1080 [#751]: https://gitlab.torproject.org/tpo/core/arti/-/issues/751 [21605d2c9e601c3a]: https://gitlab.torproject.org/tpo/core/arti/-/commit/21605d2c9e601c3a5099bfd8d8c887cbb3b36c0a [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`IoErrorExt`]: https://tpo.pages.torproject.net/core/doc/rust/tor_basic_utils/trait.IoErrorExt.html [`Requestable`]: https://tpo.pages.torproject.net/core/doc/rust/tor_dirclient/request/trait.Requestable.html [`tor-basic-utils`]: https://tpo.pages.torproject.net/core/doc/rust/tor_basic_utils/index.html [`tor-cell`]: https://tpo.pages.torproject.net/core/doc/rust/tor_cell/index.html [`tor-cert`]: https://tpo.pages.torproject.net/core/doc/rust/tor_cert/index.html [`tor-dirclient`]: https://tpo.pages.torproject.net/core/doc/rust/tor_dirclient/index.html [`tor-proto`]: https://tpo.pages.torproject.net/core/doc/rust/tor_proto/index.html [a bug in `FusedFuture for oneshot::Receiver`]: https://github.com/rust-lang/futures-rs/issues/2455 [a bug in `config-rs`]: https://github.com/mehcode/config-rs/issues/464 [cfe641613e6b6f4f]: https://gitlab.torproject.org/tpo/core/arti/-/commit/cfe641613e6b6f4f55de87621eadacf24d22a939 [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.1.9 — 2 October 2023 Arti 1.1.9 continues work on support for onion services in arti. The pieces are now (mostly) connected; the next month of development will see extensive testing, bugfixing, and refinement. ### Breaking changes in lower-level crates - In `tor-hsclient` and `tor-netdoc`'s APIs, secret authentication keys are now handled as `HsClientDescKeypair`, rather than as individual keys. - In `tor-circmgr`, the `NoExit` error now includes a possible country code. - In `tor-ptmgr`, `ClientTransportGaveError` have been renamed to `TransportGaveError`. ### Onion service development - The onion service descriptor publisher is now in conformance with our spec with respect to how it handles time periods. ([!1564]) - The descriptor publisher now runs in parallel, so that a blocked upload doesn't prevent successful uploads from succeeding. ([!1580]) - The descriptor publisher now includes correct retry and timing logic. ([!1592], [!1623]) - The introduction point manager code is now able to integrate with the descriptor publisher. ([!1575], [!1576], [!1577], [!1578], [!1603]) - The descriptor publisher code is now integrated with the key management system. ([#1042], [!1615]) - The introduction point manager is now integrated with the code that accepts user requests via introduction points. ([!1597], [!1598]) - The code responsible for selecting and maintaining introduction points is now more robust in the presence of relay selection failure. ([!1585]) - We now have a `tor-hsrproxy` crate, to handle running an onion service that directs incoming connections to local ports. Users will need this if they want their onion services to run in a separate process and not use Rust. ([01f954d3782df57a], [!1622]) - Added configuration logic for onion services. ([!1557], [!1599], [!1605], [!1611]) - The `downgrade_dependencies` script now honors the `$CARGO` variable. ([!1596]) - We now use a keypair type for `hs_ntor` secret keys. ([#1030], [!1590]) - There is now a set of (not working yet!) APIs to actually launch and run onion services, by invoking the necessary pieces of the backend, and pass requests back to the caller. ([!1604], [!1608], [!1610], [!1616], [!1620], [!1625]) ### Client features - We now have an experimental feature to select exits by country, with geoip support. It is Rust-only, and not yet exposed via a configuration option. ([!1537]) - When contacting an onion service, we now pad our `INTRODUCE2` message payload to a uniform size in order to conceal what kind of data and extensions it contains. ([#1031], [!1602]) ### Documentation and examples - We've merged several example programs from Saksham Mittal's project for this year's [Google Summer of Code]. They include a downloading tool, a relay checker, and obfs4 checker, a tool to lookup DNS over tor, and a program to run a proxy over a pluggable transport. You can find them in `examples/gsoc2023`. ([!1574]) - Documentation fixes around our description of `localhost_port_legacy`. ([!1588]) ### Infrastructure - Our version-bumping script now allows options to be applied to "$CARGO". ([!1573]) - Our CI scripts now use `cargo install --locked` to avoid certain compatibility issues in our tools and their dependencies. ([!1587]) - The `ArtiPath` types recognized by the key manager are now better documented. ([!1586]) ### Testing - New tests for our `tor-ptmgr` string-escaping logic. ([!1579]) - Our runtime mock code now displays more and better information about when and where tasks are sleeping. ([!1591], [!1595]) ### Cleanups, minor features, and bugfixes - Refactoring and API revisions to our experimental backend support for launching pluggable transports in server mode. ([!1581]) - Our low-level cryptographic wrappers now have a type to represent x25519 (Montgomery) keypairs. Several internal APIs have adapted accordingly. ([!1617]) - The key manager system now supports public keys, for cases where the secret key is kept offline. ([!1618]) - The key manager system now supports expanded ed25519 keypairs, so that it can represent blinded onion identity keys. ([!1619]) - Cleanups to encryption logic in `tor-proto`. ([!1627]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Emil Engler and Saksham Mittal! Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1537]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1537 [!1557]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1557 [!1564]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1564 [!1573]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1573 [!1574]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1574 [!1575]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1575 [!1576]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1576 [!1577]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1577 [!1578]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1578 [!1579]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1579 [!1580]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1580 [!1581]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1581 [!1585]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1585 [!1586]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1586 [!1587]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1587 [!1588]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1588 [!1590]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1590 [!1591]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1591 [!1592]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1592 [!1595]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1595 [!1596]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1596 [!1597]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1597 [!1598]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1598 [!1599]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1599 [!1602]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1602 [!1603]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1603 [!1604]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1604 [!1605]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1605 [!1608]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1608 [!1610]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1610 [!1611]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1611 [!1615]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1615 [!1616]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1616 [!1617]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1617 [!1618]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1618 [!1619]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1619 [!1620]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1620 [!1622]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1622 [!1623]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1623 [!1625]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1625 [!1627]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1627 [#1030]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1030 [#1031]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1031 [#1042]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1042 [01f954d3782df57a]: https://gitlab.torproject.org/tpo/core/arti/-/commit/01f954d3782df57a4ac1d2cd1d323584ccaaac76 [Google Summer of Code]: https://summerofcode.withgoogle.com/ [Zcash Community Grants]: https://zcashcommunitygrants.org/ [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.1.8 — 5 September 2023 Arti 1.1.8 continues work on support for onion services in arti. It includes backend support for nearly all of the functionality needed to launch and publish an onion service and accept incoming requests from onion service clients. This functionality is not yet usable, however: we still need to connect it all together, test and debug it, and provide high-level APIs to allow the user to actually turn it on. ### Major bugfixes - Do not allow the user to set `bridges = true` without having configured any bridges. Previously, this configuration was possible, and it caused arti to connect without using any bridges. This is tracked as [TROVE-2023-002]. ([#1000], [!1481]) ### Breaking changes in lower-level crates - In `tor-dirclient`, `Requestable::make_request` now returns `Request`. ([cd6c4674dc560d9c1dc3]) - In `tor-ptclient`, `PtParameters` been split, and `PluggableTransport` has become a trait. ([bbed17ba4a44a4690ad6]) - Additionally, many unstable APIs (marked with the `experimental-api` feature and similar) and APIs in unstable crates (like `tor-hsservice` and `tor-keymgr`) have changed. ### Onion service development - We began laying more groundwork for onion services, with a set of low-level API designs, algorithm designs, and data structures. ([#970], [#971], [#972], [!1452], [!1444], [!1541]) - Fuzzing support and significant speed improvements to the (still unused) [HashX]-based proof-of-work code. ([!1446], [!1462], [!1459], [!1513], [!1524], [!1529], [!1538], [!1539], [!1555]) - Added low-level support in [`tor-proto`] for accepting incoming data streams on a circuit. Onion services will use this to accept `BEGIN` messages. ([#864], [#994], [#998], [#1009], [!1451], [!1474], [!1475], [!1476], [!1477], [!1484], [!1519]) - Keystore directory configuration is now derived from the configured state directory when using `TorClientConfigBuilder::from_directories`. ([#988], [!1498]) - Expose the `KH` circuit-binding material, as needed for the rendezvous handshake. ([#993], [!1472]) - Backend code to establish an introduction point, keep it established, and watch for `INTRODUCE2` messages. ([!1510], [!1511], [!1516], [!1517], [!1522], [!1540]) - Backend code to decode an `INTRODUCE2` message, complete the necessary cryptographic handshakes, open a circuit to the client's chosen rendezvous point, establish a shared virtual hop, and receive `BEGIN` messages. ([#980], [#1013], [!1512], [!1520], [!1521], [!1536], [!1547]) - Taught the `tor-dirclient` crate how to upload onion service descriptors. ([!1505]) - Revise and debug logic for locating items the HsDir ring when publishing. ([#960], [!1494], [!1518]) - Refactor onion service error handling. ([!1515]) - Backend code to select introduction points and keep track of which ones are running correctly. ([!1523], [!1549], [!1550], [!1559]) - Refactor HsDesc parsing code to remove `inner::IntroPointDesc`. ([!1528]) - Initial backend code to regenerate and publish onion service descriptors as needed. ([#977], [!1545]) ### Documentation - Fix documentation about the [`OnionAddressDisabled`] error: it was missing a "not". ([!1467]) - Correct details about upcoming milestones in our [top-level `README.md`]. ([!1471]) ### Infrastructure - New release script to bump the patchlevel of a crate without treating it as a dependency change. ([#945], [!1461]) - New script to make sure that all checked-in `Cargo.lock` files are correct. ([!1468]) - Usability improvements to our coverage script. ([!1485]) - In CI, verify that our scripts are using `/usr/bin/env` to find their interpreters in the proper locations. ([!1489], [!1490]) ### Testing - Improve test coverage for the `tor-cert` crate. ([!1495], [!1496], [!1497]) - Improve test coverage for the `tor-proto` crate. ([!1501]) ### Cleanups, minor features, and smaller bugfixes - Improved error handling when a `[[bridges.transports]]` section does not include any required pluggable transport. ([#880], [!1229]) - Key manager APIs are now less tied to the SSH key format, and no longer require that x25519 keys be stored as ed25519 keys. ([#936], [#965], [!1464], [!1508]) - Downgrade lints for built-in warnings to "warn". Previously two of them (`missing_docs`, `unreachable_pub`) were set to "deny", which had a risk of breaking compilation in the future. ([#951], [!1470]) - Expose the `HopNum` type from `tor-proto`, to help avoid off-by-one errors. ([eee3bb8822dd22a4], [#996], [!1548]) - Deprecate and replace `ClientCirc::start_conversation_last_hop` with a new [`start_conversation`] function that can target any hop. ([#959], [!1469]) - New functions in `tor-proto` to wait for a channel or a circuit to shut down. ([!1473]) - Improved error messages and behaviors when we can't decide where to look for our configuration files. ([!1478], [!1479], [!1480]) - Deprecated and renamed `download` in `tor-dirclent` to `send_request`. ([9a08f04a7698ae23]) - Deprecate [`DropNotifyEofSignallable::is_eof`]. ([f4dfc146948d491c]) - New [`ClientCirc::send_raw_msg`] function for cases where we want to send a message without starting a conversation. ([#1010], [!1525]) - Experimental backend support for launching pluggable transports in server mode, for testing and example code. ([!1504]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Emil Engler, Jim Newsome, Micah Elizabeth Scott, Saksham Mittal, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1229]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1229 [!1444]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1444 [!1446]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1446 [!1451]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1451 [!1452]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1452 [!1459]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1459 [!1461]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1461 [!1462]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1462 [!1464]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1464 [!1467]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1467 [!1468]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1468 [!1469]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1469 [!1470]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1470 [!1471]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1471 [!1472]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1472 [!1473]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1473 [!1474]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1474 [!1475]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1475 [!1476]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1476 [!1477]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1477 [!1478]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1478 [!1479]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1479 [!1480]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1480 [!1481]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1481 [!1484]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1484 [!1485]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1485 [!1489]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1489 [!1490]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1490 [!1494]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1494 [!1495]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1495 [!1496]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1496 [!1497]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1497 [!1498]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1498 [!1501]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1501 [!1504]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1504 [!1505]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1505 [!1508]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1508 [!1510]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1510 [!1511]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1511 [!1512]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1512 [!1513]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1513 [!1515]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1515 [!1516]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1516 [!1517]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1517 [!1518]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1518 [!1519]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1519 [!1520]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1520 [!1521]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1521 [!1522]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1522 [!1523]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1523 [!1524]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1524 [!1525]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1525 [!1528]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1528 [!1529]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1529 [!1536]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1536 [!1538]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1538 [!1539]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1539 [!1540]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1540 [!1541]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1541 [!1545]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1545 [!1547]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1547 [!1548]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1548 [!1549]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1549 [!1550]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1550 [!1555]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1555 [!1559]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1559 [#1000]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1000 [#1009]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1009 [#1010]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1010 [#1013]: https://gitlab.torproject.org/tpo/core/arti/-/issues/1013 [#864]: https://gitlab.torproject.org/tpo/core/arti/-/issues/864 [#880]: https://gitlab.torproject.org/tpo/core/arti/-/issues/880 [#936]: https://gitlab.torproject.org/tpo/core/arti/-/issues/936 [#945]: https://gitlab.torproject.org/tpo/core/arti/-/issues/945 [#951]: https://gitlab.torproject.org/tpo/core/arti/-/issues/951 [#959]: https://gitlab.torproject.org/tpo/core/arti/-/issues/959 [#960]: https://gitlab.torproject.org/tpo/core/arti/-/issues/960 [#965]: https://gitlab.torproject.org/tpo/core/arti/-/issues/965 [#970]: https://gitlab.torproject.org/tpo/core/arti/-/issues/970 [#971]: https://gitlab.torproject.org/tpo/core/arti/-/issues/971 [#972]: https://gitlab.torproject.org/tpo/core/arti/-/issues/972 [#977]: https://gitlab.torproject.org/tpo/core/arti/-/issues/977 [#980]: https://gitlab.torproject.org/tpo/core/arti/-/issues/980 [#988]: https://gitlab.torproject.org/tpo/core/arti/-/issues/988 [#993]: https://gitlab.torproject.org/tpo/core/arti/-/issues/993 [#994]: https://gitlab.torproject.org/tpo/core/arti/-/issues/994 [#996]: https://gitlab.torproject.org/tpo/core/arti/-/issues/996 [#998]: https://gitlab.torproject.org/tpo/core/arti/-/issues/998 [9a08f04a7698ae23]: https://gitlab.torproject.org/tpo/core/arti/-/commit/9a08f04a7698ae237e352c57ebb58456e727fc93 [HashX]: https://lists.torproject.org/pipermail/tor-dev/2020-June/014381.html [TROVE-2023-002]: https://gitlab.torproject.org/tpo/core/team/-/wikis/NetworkTeam/TROVE [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`ClientCirc::send_raw_msg`]: https://tpo.pages.torproject.net/core/doc/rust/tor_proto/circuit/struct.ClientCirc.html#method.send_raw_msg [`DropNotifyEofSignallable::is_eof`]: https://tpo.pages.torproject.net/core/doc/rust/tor_async_utils/trait.DropNotifyEofSignallable.html#method.is_eof [`OnionAddressDisabled`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/enum.ErrorDetail.html#variant.OnionAddressDisabled [`start_conversation`]: https://tpo.pages.torproject.net/core/doc/rust/tor_proto/circuit/struct.ClientCirc.html#method.start_conversation [`tor-proto`]: https://tpo.pages.torproject.net/core/doc/rust/tor_proto/index.html [bbed17ba4a44a4690ad6]: https://gitlab.torproject.org/tpo/core/arti/-/commit/bbed17ba4a44a4690ad68e34844329d6542cc184 [cd6c4674dc560d9c1dc3]: https://gitlab.torproject.org/tpo/core/arti/-/commit/cd6c4674dc560d9c1dc355cac627edac32138f2c [eee3bb8822dd22a4]: https://gitlab.torproject.org/tpo/core/arti/-/commit/eee3bb8822dd22a48b58bfb9a42cb0eaa952138d [f4dfc146948d491c]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f4dfc146948d491c2a8da0e5e6c8c58cabdf44b4 [other sponsors]: https://www.torproject.org/about/sponsors/ [top-level `README.md`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/README.md # Arti 1.1.7 — 1 August 2023 Arti 1.1.7 focuses on maintenance, bugfixing, and cleanups to earlier releases. It also lays groundwork for being able to run as an onion service. ### Major bugfixes - We now build with onion service client support by default. It is still not enabled by default, but you no longer need any special _compile-time_ options in order to be able to use it. ([#948], [!1382]) - Fix an over-strict parsing behavior that had prevented Arti from connecting to onion services whose descriptors were encoded by Stem. ([#952], [!1389]) - We've fixed a bug where we incorrectly marked bridges as having directory information where they did not, and tried to build circuits through them without fetching descriptors. ([#638], [!1408]) - Fix a deadlock in [`TorClient::reconfigure()`]. ([!1432]) ### Breaking changes in lower-level crates - The [`Conversation`] API has been built as a replacement for the old "control message" API on circuits, to better support the needs of onion services. ([#917], [!1367], [!1402]) - The `tor-config` crate no longer exposes `ItemOrBool`, which was not used. ([5b97b0b2ce31b3db]) - The [`RetryError`] type now requires that its members implement `AsRef`. ([36b9d11ecb122e1e]) - The error type of [`tor_hsclient::ConnError::Failed`] has changed. ([36b9d11ecb122e1e]) ### Onion service development - Continued improvements to our key manager infrastructure. ([#903], [#937], [#939], [#954], [!1372], [!1398], [!1399], [!1404], [!1413], [!1421], [!1433]) - Design work and API backend designs for implementing the service side of onion services. ([!1422], [!1429]) - Rust implementations of the [HashX] ASIC-resistant hash function and the related [EquiX] proof-of-work function, for eventual use in protecting onion services from denial-of-service attacks. Note that for now, the license on these crates is "LGPL-3.0-only"; we hope to relicense under "MIT OR Apache-2.0" if the author of the C version of this code approves. ([#889], [!1368]) ### Documentation - Improved documentation for how Arti is validated and released. ([#942], [!1366]) - Improvement to bridge and transport-related documentation. ([#706], [!1370]) - Add documentation to explain how to build an `arti` binary that will not include build path details. ([#957], [!1435]) ### Infrastructure - Our [Shadow] CI tests now include support for onion service clients. ([!1292]) - Our Runtime logic now has much improved support for test cases that need to handle time and waiting, and more consistently generated mock implementations. This has enabled us to clean up various unit tests. ([!1375], [!1378], [!1381]) - Fix a compatibility issue that had been preventing our Chutney CI tests from passing. ([c98894cebc60e223], [!1391], [!1393]) ### Logging improvements - We now ensure that all panics from `arti` are sent to our logs. Formerly, they were only reported on stderr. ([#921], [!1377]) - Our logfile messages now have a configurable granularity, to avoid logging excessive detail that could help with traffic analysis attacks. The default is one second granularity, and can be overridden with the `logging.time_granularity` option. Note that this granularity does not apply to systems like `journald` that have their own ideas about how to record messages. ([#551], [!1376]) - When logging errors, we now check whether the type of the error indicates a bug. If it does, we always escalate the logging severity to "warn" or higher. ([!1379], [!1383], [!1386], [!1390]) - When reporting errors caused by the failure of multiple retry attempts, we take more care to report the source failure causes. ([#958], [!1416]) ### Cleanups, minor features, and smaller bugfixes - Rename some mocking-related functions to avoid accidental infinite-recursion bugs. ([!1365]) - Fix or disable a series of new warnings from Clippy. ([!1369], [!1394], [!1395], [!1396]) - Our (not yet used) GeoIP code now encodes country codes as two _nonzero_ bytes, which enables the [niche optimization]. ([!1384]) - Our (not yet used) GeoIP code now treats zero-values ASNs as indicating an unknown ASN, for compatibility with the format used by the C tor implementation. ([#961], [!1417]) - We now try to avoid using [`Rng::gen_range()`], due to the possibility of panics. We have instead added a `gen_range_checked()` and a `gen_range_infallible()` call. ([#920], [!1385], [!1387]) - The `ChanMgr` API now exposes a function to build unmanaged channels, in order to support external code that wants to build channels that are not managed by or shared with the rest of Arti. ([!1374], [!1403], [!1406]) - The [`NetDir`] API now has optional support for recording the associated country codes of its relays. ([!1364]) - Bridges no longer contain addresses twice. This prevents us from making unnecessary connections. ([!1409]) - In [`fs-mistrust`], we now detect several kinds of errors related to failed user or group lookup. ([cdafa2ce0191f612]) - We have migrated our Unix user info lookups from the no-longer-maintained `users` crate to the new [`pwd-grp`] crate. ([#877], [!1410]) - Add accessors for several bridge-related config builder types. ([!1425], [!1426]) - Refactor handling of initial `CREATE` cells when opening a circuit, to clean up our reactor loop logic a bit. ([!1441]) ### Removed features - We no longer publish the crate `arti-bench` to crates.io. It has no use outside of development. ([!1371]) - We no longer publish our as-yet-unused `tor-events` and `tor-congestion` crates to crates.io. They aren't used in the rest of Arti yet. ([!1371]) - We no longer validate our code with Clippy's `missing_panics_doc` lint, since it has begun to warn about all use of `expect()` in nightly. ([#950], [!1380]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Dimitris Apostolou, Jim Newsome, juga, Kunal Mehta, Micah Elizabeth Scott, Saksham Mittal, sw1tch, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] and our [other sponsors] for funding the development of Arti! [!1292]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1292 [!1364]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1364 [!1365]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1365 [!1366]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1366 [!1367]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1367 [!1368]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1368 [!1369]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1369 [!1370]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1370 [!1371]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1371 [!1372]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1372 [!1374]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1374 [!1375]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1375 [!1376]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1376 [!1377]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1377 [!1378]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1378 [!1379]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1379 [!1380]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1380 [!1381]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1381 [!1382]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1382 [!1383]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1383 [!1384]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1384 [!1385]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1385 [!1386]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1386 [!1387]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1387 [!1389]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1389 [!1390]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1390 [!1391]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1391 [!1393]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1393 [!1394]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1394 [!1395]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1395 [!1396]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1396 [!1398]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1398 [!1399]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1399 [!1402]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1402 [!1403]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1403 [!1404]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1404 [!1406]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1406 [!1408]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1408 [!1409]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1409 [!1410]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1410 [!1413]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1413 [!1416]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1416 [!1417]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1417 [!1421]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1421 [!1422]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1422 [!1425]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1425 [!1426]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1426 [!1429]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1429 [!1432]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1432 [!1433]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1433 [!1435]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1435 [!1441]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1441 [#551]: https://gitlab.torproject.org/tpo/core/arti/-/issues/551 [#638]: https://gitlab.torproject.org/tpo/core/arti/-/issues/638 [#706]: https://gitlab.torproject.org/tpo/core/arti/-/issues/706 [#877]: https://gitlab.torproject.org/tpo/core/arti/-/issues/877 [#889]: https://gitlab.torproject.org/tpo/core/arti/-/issues/889 [#903]: https://gitlab.torproject.org/tpo/core/arti/-/issues/903 [#917]: https://gitlab.torproject.org/tpo/core/arti/-/issues/917 [#920]: https://gitlab.torproject.org/tpo/core/arti/-/issues/920 [#921]: https://gitlab.torproject.org/tpo/core/arti/-/issues/921 [#937]: https://gitlab.torproject.org/tpo/core/arti/-/issues/937 [#939]: https://gitlab.torproject.org/tpo/core/arti/-/issues/939 [#942]: https://gitlab.torproject.org/tpo/core/arti/-/issues/942 [#948]: https://gitlab.torproject.org/tpo/core/arti/-/issues/948 [#950]: https://gitlab.torproject.org/tpo/core/arti/-/issues/950 [#952]: https://gitlab.torproject.org/tpo/core/arti/-/issues/952 [#954]: https://gitlab.torproject.org/tpo/core/arti/-/issues/954 [#957]: https://gitlab.torproject.org/tpo/core/arti/-/issues/957 [#958]: https://gitlab.torproject.org/tpo/core/arti/-/issues/958 [#961]: https://gitlab.torproject.org/tpo/core/arti/-/issues/961 [36b9d11ecb122e1e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/36b9d11ecb122e1ea82a13fa963c35e023f14d3a [5b97b0b2ce31b3db]: https://gitlab.torproject.org/tpo/core/arti/-/commit/5b97b0b2ce31b3dbe1ab9cf0d33109457d1aea47 [EquiX]: https://github.com/tevador/equix/blob/master/devlog.md [HashX]: https://lists.torproject.org/pipermail/tor-dev/2020-June/014381.html [Shadow]: https://shadow.github.io [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`Conversation`]: https://tpo.pages.torproject.net/core/doc/rust/tor_proto/circuit/struct.Conversation.html [`NetDir`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdir/struct.NetDir.html [`RetryError`]: https://tpo.pages.torproject.net/core/doc/rust/retry_error/struct.RetryError.html [`Rng::gen_range()`]: https://docs.rs/rand/latest/rand/trait.Rng.html#method.gen_range [`TorClient::reconfigure()`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/struct.TorClient.html#method.reconfigure [`fs-mistrust`]: https://tpo.pages.torproject.net/core/doc/rust/fs_mistrust/index.html [`pwd-grp`]: https://docs.rs/crate/pwd-grp/latest [`tor_hsclient::ConnError::Failed`]: https://tpo.pages.torproject.net/core/doc/rust/tor_hsclient/enum.ConnError.html#variant.Failed [c98894cebc60e223]: https://gitlab.torproject.org/tpo/core/arti/-/commit/c98894cebc60e223d9067636337b8e737d08ad51 [cdafa2ce0191f612]: https://gitlab.torproject.org/tpo/core/arti/-/commit/cdafa2ce0191f612342252e56dfeee86cf29e68f [niche optimization]: https://internals.rust-lang.org/t/forbidden-niche-values/14237 [other sponsors]: https://www.torproject.org/about/sponsors/ # Arti 1.1.6 — 30 June 2023 Arti 1.1.6 completes the core of the work needed for a client to connect to onion services on the Tor network. This is not yet enabled by default: we do not yet recommend using this feature for security-sensitive purposes, because of some [missing security features][#98]. Instructions for enabling it and trying it out can be found in the [README.md] file. (Note that version 1.1.6 also requires a non-default cargo feature to be enabled: you must build with `--features=arti/onion-service-client`.) Additionally, this version includes an experimental key manager implementation. Currently it's used to store the keys needed for client authentication, but in the future it will store the keys for onion services themselves, and eventually relays. In this release it is still missing some import functionality for interoperability; the interface is likely to change significantly. Work on our RPC subsystem has also continued; we have achieved several prerequisites needed for applications' SOCKS connections to integrate correctly with the RPC subsystem. And as usual, there are a large number of smaller fixes and improvements throughout the codebase. ### Major bugfixes - Downgrade our dependency on x25519-dalek from "2.0.0-rc.2" to "2.0.0-pre.1". The former had a compatibility bug that made it stop working once a newer version of `curve25519-dalek` was released. We hope to [re-upgrade] to a more recent version of this crate in a future release. ([#926], [!1317]) ### Breaking changes in lower-level crates - We have removed an empty `relaycell::restrict` module from the `tor-cell` crate. This module was added in error. This change will break any code that (pointlessly) tried to import it. ([589fefd581e962a7]) ### Onion service development - Implement the core logic of an onion service client. Having fetched a descriptor for an onion service, we now establish a rendezvous circuit, and try to send INTRODUCE1 requests to the service's introduction points, while waiting for a RENDEZVOUS2 message in response on the rendezvous circuit. Once the message is received, we can launch streams to the service over that circuit. ([!1228], [!1230], [!1235], [!1238], [!1240]) - Re-launch and retry onion service connection attempts as appropriate. ([!1246]) - Onion service descriptors now have accessor functions to enable their actual use. ([!1220]) - We can transform the information about relays used in onion service descriptors, and in introduce1 cells, into the format needed to connect to the relay described. ([!1221]) - Generate random rendezvous cookies to identify circuits at a client's rendezvous point. ([!1227]) - Ensure that specific information about onion services, rendezvous points, and introduction points are treated as sensitive or redacted in our error messages. ([!1326], [!1335]) - Reduce the cost of duplicating HsDir rings in our network objects. ([#883], [!1234]) - Refactor and simplify our `hs_ntor` APIs to better reuse state information. ([bb6115103aad177c]) - Return a more informative error type from our time-period manipulation code. ([!1244]) - Remember our introduction point experiences, and try to use known-good ones before ones that have failed recently. ([!1247], [!1295]) - We now adjust the size of our pre-constructed circuit pool dynamically based on past demand for onion-service circuits (or lack thereof). ([686d5cf2093322e4]) - Speed improvements to the algorithm we use to select pre-constructed circuits for onion services, and correctness fixes to those speed improvements. ([1691c353924f89cc], [#918], [!1296], [!1301]) - The `StreamPrefs::connect_to_onion_services` method now can be used to enable or disable onion service connections, and TorClients can handle onion services correctly. ([!1257]) - Provide the extended SOCKS5 error codes as documented in [proposal 304]. ([#736], [!1248], [!1279]) - Drop introduction circuits after they are no longer needed. ([!1299], [!1303]) - Expire long-unused onion service circuits. ([!1287], [!1302]) - Expire long-unused onion service descriptors. ([!1290]) - Provide a higher-level HsDescError to explain what, exactly, has gone wrong with parsing or decrypting an onion service descriptor. ([!1289]) - Respect the maximum onion service descriptor size in the consensus and change the default maximum from 50 KiB to 50 KB per the specification. ([!1323]) - Go through all of our remaining "TODO HS" comments and make sure that they are not issues that should block a release. ([#892], [#928], etc) - We support enabling or disabling onion service connections via a new `allow_onion_addrs` option, and configuring these connections through other parameters. ([!1305]) - Ensure that our directory ring parameters are taken from the consensus parameters, rather than set unconditionally to defaults. ([!1310]) - Enforce upper bounds on the number of introduction points in an onion service descriptor. ([!1332]) - Use correct circuit parameters when creating onion service circuits. ([#935], [!1340]) - Use more accurate timeout predictions for building and using onion service circuits. ([!1342]) ### RPC development - Our RPC engine now supports holds a list of SOCKS connections, so that applications can register their SOCKS connections with their RPC sessions. ([545984b095119ecc]) - `TorClient`s, and similar RPC-visible, can now be exposed with a secure global identifier so applications can refer to them outside of an RPC session. This will allow applications to name a `TorClient` from e.g. within the parameters of a SOCKS connection. ([#863], [!1208]) - Enable `rpc::Object`s to be downcast to (some of) the `&dyn Trait`s that they implement. This is in tension with some of Rust's current limitations, but we need it so that we can downcast a `TorClient` from an `Object` into a type we can use in the SOCKS code for opening a data stream. ([!1225], [!1253]) - Major refactoring to our RPC session initialization code. ([!1254]) ### New crates - New `tor-keymgr` crate to handle persistent cryptographic keys that can be stored to disk. In the future this will be used for all client, service, and relay keys. ([!1223], [!1255], [!1256], [!1263], [!1267], [!1269], [!1278], [!1280], [!1284], [!1319], [!1321], [!1315], [!1321], [!1328], [!1337], etc.) - New `tor-geoip` crate to handle a static in-binary or on-disk IP-to-country lookup table. We will use this in the future to support country restrictions on selected paths through the network. ([!1239], [!1268]) ### Documentation - Clarify behavior of `ClientCirc::send_control_message`. ([#885], [!1219], [58babcb756f6427c]) - Clarify required behavior for `NetDocProvider`. ([!1224]) - More information about how to configure snowflake and other pluggable transports. ([#875], [#879], [!1216], [!1249]) - New examples and documentation for how to implement error reporting. ([!1213]) - Clarify some error cases for onion service descriptor validation. ([!1250], [!1252]) - Improve documentation on the channel and circuit lifecycle. ([!1316], [!1318]) - Clarify descriptions in `NetDir`'s documentation of what we mean by a "usable" Relay. ([a902f320b5b31812]) ### Infrastructure - For now we ignore an "unmaintained crate" warning for the [`users`] crate while we work on [finding a replacement][#877]. ([!1217]) - Our CI now tests each crate individually with its default features. This helps detect bugs where a crate was only working because it had been built with the features required of it by another crate. ([!1250]) - We now supplement our existing system for tracking semver-breaking issues with the [`cargo-semver-checks`] tool. We require version 0.22.1 or later. ([!1339]) ### Cleanups, minor features, and smaller bugfixes - We no longer use the [`arrayref`] crate to convert slice-references into array references. In recent versions of Rust, we can simply use TryFrom and const generics. ([#872], [!1214]) - Our consensus directory objects now expose accessors that list required and recommended protocol versions. ([205b6d176c4a619b]) - The `tor-error` crate now exposes a convenience macro to derive `AsRef` for our specific error types. ([33c90e5b7243c3b3]) - The formerly experimental `send_control_message` API now takes an `AnyRelayMsg` rather than a cell, as does its associated `MsgHandler` API. ([#881], [#887], [!1232], [!1236]) - Backend code to more readily display and redact relay identities. ([#882], [!1233]) - `tor-proto` no longer gives an error when trying to use `SENDME` messages with a relay digest algorithm with an output length of other than 20. ([!1242]) - `tor-llcrypto` now exposes a method to try to look up an element from a slice in constant time. ([25db56777c0042a9]) - Apply two now-universally-available clippy lints to all of our crates. ([!1271]) - Add experimental API to expose a `chanmgr` method from `TorClient`. ([!1275]) - The `ClientCirc::path_ref()` method now returns an `Arc` type, which can be used to find information about a circuit's path without extensive copying. The old `path()` method still exists, but is deprecated. ([#787], [!1286]) - `CircMgr` now exposes its estimates for good timeouts for circuit operations. ([!1281].) - Fix a compilation warning on Windows. ([!1294]) - Make sure DirProviderBuilder is `Send + Sync`, so that TorClientBuilder is always `Send + Sync`. ([#924], [!1307]) - Implement conversion from ed25519 private keys to curve25519 private keys, as part of our eventual compatibility with ssh's key storage format. ([!1297]) - Numerous improvements and fixes to our configuration handling tests. ([!1320], [!1330]) - Refactor some duplicate logic in our circuit-retention code. ([!1322]) - Experimentally expose some of `NetDir`'s information about whether a relay is in the consensus (independent of whether we have full information about it). ([!1325]) ### Removed features - We no longer support ancient (pre-0.3.6) versions of Tor without support for authenticated SENDME messages. ([#914], [!1283]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Andy, Jim Newsome, nate\_d1azzz, pinkforest, Saksham Mittal, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti! [!1208]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1208 [!1213]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1213 [!1214]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1214 [!1216]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1216 [!1217]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1217 [!1219]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1219 [!1220]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1220 [!1221]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1221 [!1223]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1223 [!1224]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1224 [!1225]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1225 [!1227]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1227 [!1228]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1228 [!1230]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1230 [!1232]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1232 [!1233]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1233 [!1234]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1234 [!1235]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1235 [!1236]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1236 [!1238]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1238 [!1239]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1239 [!1240]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1240 [!1242]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1242 [!1244]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1244 [!1246]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1246 [!1247]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1247 [!1248]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1248 [!1249]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1249 [!1250]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1250 [!1252]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1252 [!1253]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1253 [!1254]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1254 [!1255]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1255 [!1256]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1256 [!1257]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1257 [!1263]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1263 [!1267]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1267 [!1268]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1268 [!1269]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1269 [!1271]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1271 [!1275]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1275 [!1278]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1278 [!1279]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1279 [!1280]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1280 [!1281]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1281 [!1283]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1283 [!1284]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1284 [!1286]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1286 [!1287]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1287 [!1289]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1289 [!1290]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1290 [!1294]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1294 [!1295]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1295 [!1296]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1296 [!1297]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1297 [!1299]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1299 [!1301]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1301 [!1302]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1302 [!1303]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1303 [!1305]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1305 [!1307]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1307 [!1310]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1310 [!1315]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1315 [!1316]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1316 [!1317]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1317 [!1318]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1318 [!1319]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1319 [!1320]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1320 [!1321]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1321 [!1322]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1322 [!1323]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1323 [!1325]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1325 [!1326]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1326 [!1328]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1328 [!1330]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1330 [!1332]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1332 [!1335]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1335 [!1337]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1337 [!1339]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1339 [!1340]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1340 [!1342]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1342 [#736]: https://gitlab.torproject.org/tpo/core/arti/-/issues/736 [#787]: https://gitlab.torproject.org/tpo/core/arti/-/issues/787 [#863]: https://gitlab.torproject.org/tpo/core/arti/-/issues/863 [#872]: https://gitlab.torproject.org/tpo/core/arti/-/issues/872 [#875]: https://gitlab.torproject.org/tpo/core/arti/-/issues/875 [#877]: https://gitlab.torproject.org/tpo/core/arti/-/issues/877 [#879]: https://gitlab.torproject.org/tpo/core/arti/-/issues/879 [#881]: https://gitlab.torproject.org/tpo/core/arti/-/issues/881 [#882]: https://gitlab.torproject.org/tpo/core/arti/-/issues/882 [#883]: https://gitlab.torproject.org/tpo/core/arti/-/issues/883 [#885]: https://gitlab.torproject.org/tpo/core/arti/-/issues/885 [#887]: https://gitlab.torproject.org/tpo/core/arti/-/issues/887 [#892]: https://gitlab.torproject.org/tpo/core/arti/-/issues/892 [#914]: https://gitlab.torproject.org/tpo/core/arti/-/issues/914 [#918]: https://gitlab.torproject.org/tpo/core/arti/-/issues/918 [#924]: https://gitlab.torproject.org/tpo/core/arti/-/issues/924 [#926]: https://gitlab.torproject.org/tpo/core/arti/-/issues/926 [#928]: https://gitlab.torproject.org/tpo/core/arti/-/issues/928 [#935]: https://gitlab.torproject.org/tpo/core/arti/-/issues/935 [#98]: https://gitlab.torproject.org/tpo/core/arti/-/issues/98 [1691c353924f89cc]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1691c353924f89cc9026b67578a84959840bb987 [205b6d176c4a619b]: https://gitlab.torproject.org/tpo/core/arti/-/commit/205b6d176c4a619b8665ca4095471aea07be29ca [25db56777c0042a9]: https://gitlab.torproject.org/tpo/core/arti/-/commit/25db56777c0042a93daa7b37fc4a31e27181dc7d [33c90e5b7243c3b3]: https://gitlab.torproject.org/tpo/core/arti/-/commit/33c90e5b7243c3b3526ae73f2fd3ebf76d785b74 [545984b095119ecc]: https://gitlab.torproject.org/tpo/core/arti/-/commit/545984b095119ecc656afe69683e820a8d1a67de [589fefd581e962a7]: https://gitlab.torproject.org/tpo/core/arti/-/commit/589fefd581e962a7f071142bbc047b6e22adea19 [58babcb756f6427c]: https://gitlab.torproject.org/tpo/core/arti/-/commit/58babcb756f6427cc76f2d44a1663f07405563d7 [686d5cf2093322e4]: https://gitlab.torproject.org/tpo/core/arti/-/commit/686d5cf2093322e4408513daf832af6693fa67a9 [README.md]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/README.md [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`arrayref`]: https://docs.rs/arrayref/latest/arrayref/ [`cargo-semver-checks`]: https://crates.io/crates/cargo-semver-checks [`users`]: https://crates.io/crates/users [a902f320b5b31812]: https://gitlab.torproject.org/tpo/core/arti/-/commit/a902f320b5b31812fabc42b95a38b5453f050e7f [bb6115103aad177c]: https://gitlab.torproject.org/tpo/core/arti/-/commit/bb6115103aad177c0b57918b1cb8cf0e8280223e [proposal 304]: https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/proposals/304-socks5-extending-hs-error-codes.txt [re-upgrade]: https://gitlab.torproject.org/tpo/core/arti/-/issues/808 # Arti 1.1.5 — 1 June 2023 Arti 1.1.5 fixes a local-only denial-of-service attack, and continues our work towards support for providing a working RPC mechanism and an onion service client. ### Major bugfixes (service) - Fix a local-only CPU denial-of-service bug. Previously, an attacker with access to our SOCKS port (only open by default on localhost) could cause Arti to loop forever, consuming CPU. This issue was discovered by Jakob Lell. This is also tracked as TROVE-2023-001. ([#861], [!1196]) ### Breaking changes in lower-level crates - In [`tor-netdoc`], the `ParseErrorKind` and `ParseErrorSource` types have been renamed to `NetdocErrorKind` and `NetdocErrorSource` respectively, to better reflect their meaning. ([!1176], [!1179]) - In [`tor-linkspec`] and [`tor-cell`], we have renamed `UnparsedLinkSpec` to `EncodedLinkSpec` to correctly reflect its purpose. ([02785ca6505572bd]) - In [`tor-cell`], the `Extend2` message now takes a list of `EncodedLinkSpec`. ([7ce808b75bb500f2]) - In [`tor-linkspec`], `CircTarget::linkspecs()` now returns an encoded list instead of a `Vec` of unencoded link specifiers. This is needed for passing linkspecs verbatim in the onion service implementation. ([7ce808b75bb500f2]) - `ClientCirc` no longer implements `Clone`. In various crates, functions that used to return `ClientCirc` now return `Arc`. This allows us to be more explicit about how circuits are shared, and to make circuits visible to our RPC code. ([#846], [!1187]) ### Onion service development - Improved API for parsing onion service descriptors. ([#809], [!1152]) - More APIs for deriving onion service keys from one another. ([18cb1671c4135b3d]) - Parse onion service descriptors after receiving them. ([!1153]) - When fetching an onion service descriptor, choose the HS directory server at random. ([!1155]) - Refactoring and improvements to our handling for sets of link specifiers (components of a Tor relay's address) in order to support lists of link specifiers that we receive as part of an INTRODUCE2 message or onion service descriptor. ([#794], [!1177]) - Code to enforce rules about consistency of link specifier lists. ([#855], [!1186]) - Correctly handle onion service descriptor lifetimes, and introduce necessary helper functions to handle overlapping sets of lifetime bounds. ([!1154]) - Additional design and specification about a key management system. ([!1185]) - Finish, refactor, debug, and test the hs-ntor handshake used to negotiate keys with onion services. ([#865], [!1189]) - Export the unencrypted portion of an INTRODUCE1 message as needed to implement the hs-ntor handshake. ([#866], [!1188]) - Add support for adding the "virtual" hop for an onion service rendezvous circuit based on a set of cryptographic material negotiated via the `hs-ntor` handshake. ([#726], [!1191]) ### RPC development - Improved description of our work-in-progress RPC API design. ([!1005]) - Expose an initial TorClient object to our RPC sessions. ([d7ab388faf96f53e]) - Implement object-handle management backend for RPC sessions, so that RPC commands can refer to objects by a capability-style ID that doesn't make objects visible to other sessions. This has required significant design refinement, and will likely need more in the future. ([#820], [#848], [!1160], [!1183], [!1200]) - Add an experimental `StreamCtrl` mechanism to allow code (like the RPC module) that does not own the read or write side of a data stream to nonetheless monitor and control the stream. ([#847], [!1198]) ### Infrastructure - Our license checking code now allows the MPL-2.0 license on an allow-list basis. ([#845], [e5fa42e1c7957db0]) - Our [`fixup-features`] script now works correctly to enforce our rules about the `full` feature (notably, that it must include all features not labelled as experimental or non-additive). ([!1180], [!1182]) - The script that generates our Acknowledgments section now looks at various Git trailers in order to better acknowledge bug reporters. ([!1194]) - Use the latest version of Shadow in our integration tests. ([!1199]) ### Cleanups, minor features, and smaller bugfixes - Improved logging in directory manager code when deciding what to download and when to download it. ([#803], [!1163]) - Downgrade and clarify log messages about directory replacement time. ([#839]) - Revise and downgrade other directory-manager logs. ([#854], [!1172]) - When listing the features that are enabled, list static features correctly. ([!1169]) - Refactor the `check_key` function in `tor-cert` to provide a more reasonable API. ([#759], [!1184]) - Improve or downgrade certain verbose log messages in `tor-guardmgr` and `tor-proto`. ([!1190]) - Throughout our codebase, avoid the use of ed25519 secret keys without an accompanying public key. Instead, store the two as a keypair. (Using ed25519 secret keys alone creates the risk of using them with mismatched public keys, with [catastrophic cryptographic results].) ([#798], [!1192]) ### Network updates - Update to the latest list of Tor fallback directories. ([!1210]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Jakob Lell, Jim Newsome, Saksham Mittal, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti! [!1005]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1005 [!1152]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1152 [!1153]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1153 [!1154]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1154 [!1155]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1155 [!1160]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1160 [!1163]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1163 [!1169]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1169 [!1172]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1172 [!1176]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1176 [!1177]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1177 [!1179]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1179 [!1180]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1180 [!1182]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1182 [!1183]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1183 [!1184]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1184 [!1185]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1185 [!1186]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1186 [!1187]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1187 [!1188]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1188 [!1189]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1189 [!1190]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1190 [!1191]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1191 [!1192]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1192 [!1194]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1194 [!1196]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1196 [!1198]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1198 [!1199]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1199 [!1200]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1200 [!1210]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1210 [#726]: https://gitlab.torproject.org/tpo/core/arti/-/issues/726 [#759]: https://gitlab.torproject.org/tpo/core/arti/-/issues/759 [#794]: https://gitlab.torproject.org/tpo/core/arti/-/issues/794 [#798]: https://gitlab.torproject.org/tpo/core/arti/-/issues/798 [#803]: https://gitlab.torproject.org/tpo/core/arti/-/issues/803 [#809]: https://gitlab.torproject.org/tpo/core/arti/-/issues/809 [#820]: https://gitlab.torproject.org/tpo/core/arti/-/issues/820 [#839]: https://gitlab.torproject.org/tpo/core/arti/-/issues/839 [#845]: https://gitlab.torproject.org/tpo/core/arti/-/issues/845 [#846]: https://gitlab.torproject.org/tpo/core/arti/-/issues/846 [#847]: https://gitlab.torproject.org/tpo/core/arti/-/issues/847 [#848]: https://gitlab.torproject.org/tpo/core/arti/-/issues/848 [#854]: https://gitlab.torproject.org/tpo/core/arti/-/issues/854 [#855]: https://gitlab.torproject.org/tpo/core/arti/-/issues/855 [#861]: https://gitlab.torproject.org/tpo/core/arti/-/issues/861 [#865]: https://gitlab.torproject.org/tpo/core/arti/-/issues/865 [#866]: https://gitlab.torproject.org/tpo/core/arti/-/issues/866 [02785ca6505572bd]: https://gitlab.torproject.org/tpo/core/arti/-/commit/02785ca6505572bdbfaa560178f299e30f7bc7e8 [18cb1671c4135b3d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/18cb1671c4135b3d875dd0a296f5d2ae19c3d0c5 [7ce808b75bb500f2]: https://gitlab.torproject.org/tpo/core/arti/-/commit/7ce808b75bb500f27ce7837d4f76cbf7fc1ee705 [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`fixup-features`]: https://gitlab.torproject.org/tpo/core/arti/-/tree/main/maint/fixup-features [`tor-cell`]: https://tpo.pages.torproject.net/core/doc/rust/tor_cell/index.html [`tor-linkspec`]: https://gitlab.torproject.org/tpo/core/arti/-/tree/main/crates/tor-linkspec [`tor-netdoc`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdoc/index.html [catastrophic cryptographic results]: https://moderncrypto.org/mail-archive/curves/2020/001012.html [d7ab388faf96f53e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/d7ab388faf96f53e7981e8307f51a16e7891627b [e5fa42e1c7957db0]: https://gitlab.torproject.org/tpo/core/arti/-/commit/e5fa42e1c7957db06e051207b450bd88c2427c85 # Arti 1.1.4 — 3 May 2023 Arti 1.1.4 fixes a major bug in the directory downloading code that could cause clients to stay stuck with an old version of the directory. Additionally, this version advances our efforts on onion services: we have implementations for descriptor downloading, and a design for improved key management. For this month and the next, our efforts are divided between onion services and work on a new RPC API (a successor to C Tor's "control port") that will give applications a safe and powerful way to work with Arti without having to write their code in Rust or link Arti as a library (unless they want to). We have an early version of this protocol implemented, but it does not yet expose any useful functionality. Arti 1.1.4 also increases our MSRV (Minimum Supported Rust Version) to Rust 1.65, in accordance with our [MSRV Policy], and renames a few other inconsistently-named APIs. ### Major Bugfixes - Download directories correctly in the case where we start with our cache containing all the microdescriptors from the previous directory. Previously, we had a bug where we only checked whether it was time to fetch a new consensus when we added a new microdescriptor from the network. This bug could lead to Arti running for a while with an expired directory. ([#802], [!1126]) ### Breaking changes - We now require Rust 1.65 or later for all of our crates. This change is required so that we can work correctly with several of our dependencies, including the [`typetag`] crate which we will need for RPC. ([#815], [!1131], [!1137]) - In all crates, rename `*ProtocolFailed` errors to `*ProtocolViolation`. This is a more correct name, but does potentially break API users depending on the old versions. ([#804], [!1121], [!1132]) ### Breaking changes in lower level crates - Convert the DirClient request type for `RouterDesc`s into an enum, and remove its `push()` method. ([!1112]) - Rename `BridgeDescManager` to `BridgeDescMgr` for consistency with other type names. ([#805] (!1122)) - In `tor-async-utils`, rename `SinkExt` to `SinkPrepareExt`, since it is not actually an extension trait on all `Sink`s. ([5cd5e6a3f8431eab]) ### Onion service development - Added and refactored some APIs in `tor-netdir` to better support onion service HSDir rings. ([!1094]) - Clean up APIs for creating encrypted onion service descriptors. ([!1097]) - Support for downloading onion service descriptors on demand. ([!1116], [!1118]) - Design an API and document on-disk behavior for a [key-management subsystem], to be used not only for onion services, but eventually for other kinds of keys. ([#834], [!1147]) ### RPC/Embedding development - New specification for our capabilities-based RPC meta-protocol in [`rpc-meta-draft`]. ([!1078], [!1107], [!1141]) - An incomplete work-in-progress implementation of our new RPC framework, with a capabilities-based JSON-encoded protocol that allows for RPC-visible methods to be implemented on objects throughout our codebase. For now, it is off-by-default, and exposes nothing useful. ([!1092], [!1136], [!1144], [!1148]) ### Documentation - Better explain how to build our documentation. ([!1090]) - Explain that we explicitly support `--document-private-items`. ([!1090]) - Fix incorrect documentation of OSX configuration location. ([!1125]) - Document some second-order effects of our semver conformance. ([!1129]) ### Cleanups, minor features, and minor bugfixes - Improvements to [`TimerangeBound`] API. ([!1105]) - Fix builds with several combinations of features. ([#801], [!1106]) - Code to join an `AsyncRead` and `AsyncWrite` into a single object implementing both traits. ([!1115]) - Expose the `MiddleOnly` flag on router status objects, for tools that want it. ([#833], [!1145], [!1146]) - Only run doctest for `BridgesConfig` when the `pt-client` feature is enabled; otherwise it will fail. ([#843], [!1166]) - Refactoring in and around `RelayId`. ([!1156]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, juga, Neel Chauhan, tranna, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti! [!1078]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1078 [!1090]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1090 [!1092]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1092 [!1094]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1094 [!1097]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1097 [!1105]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1105 [!1106]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1106 [!1107]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1107 [!1112]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1112 [!1115]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1115 [!1116]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1116 [!1118]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1118 [!1121]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1121 [!1125]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1125 [!1126]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1126 [!1129]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1129 [!1131]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1131 [!1132]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1132 [!1136]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1136 [!1137]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1137 [!1141]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1141 [!1144]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1144 [!1145]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1145 [!1146]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1146 [!1147]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1147 [!1148]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1148 [!1156]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1156 [!1166]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1166 [#801]: https://gitlab.torproject.org/tpo/core/arti/-/issues/801 [#802]: https://gitlab.torproject.org/tpo/core/arti/-/issues/802 [#804]: https://gitlab.torproject.org/tpo/core/arti/-/issues/804 [#805]: https://gitlab.torproject.org/tpo/core/arti/-/issues/805 [#815]: https://gitlab.torproject.org/tpo/core/arti/-/issues/815 [#833]: https://gitlab.torproject.org/tpo/core/arti/-/issues/833 [#834]: https://gitlab.torproject.org/tpo/core/arti/-/issues/834 [#843]: https://gitlab.torproject.org/tpo/core/arti/-/issues/843 [5cd5e6a3f8431eab]: https://gitlab.torproject.org/tpo/core/arti/-/commit/5cd5e6a3f8431eab20e43fcdaa4e93d9afc9b729 [MSRV Policy]: https://gitlab.torproject.org/tpo/core/arti/#minimum-supported-rust-version [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`TimerangeBound`]: https://tpo.pages.torproject.net/core/doc/rust/tor_checkable/timed/struct.TimerangeBound.html [`rpc-meta-draft`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/dev/notes/rpc-meta-draft.md [`typetag`]: https://crates.io/crates/typetag [key-management subsystem]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/dev/notes/key-management.md # tor-llcrypto patch release 0.4.4 — 4 April 2023 On 4 April 2023, we put out a patch release (0.4.4) to `tor-llcrypto`, to fix a compatibility issue. We had previously configured the `tor-llcrypto` crate to work with any version of [`x25519-dalek`] version "2.0.0-pre.1" or later, but the recent release of version "2.0.0-rc.2" had a breaking change that stopped `tor-llcrypto` from compiling. The new version of `tor-llcrypto` now properly pins the old version of `x25519-dalek`, to avoid picking up such incompatible pre-releases. We hope that our next release of tor-llcrypto will upgrade to the newer `x25519-dalek` release. Additional resources: [#807] [!1108]. [!1108]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1108 [#807]: https://gitlab.torproject.org/tpo/core/arti/-/issues/807 [`x25519-dalek`]: https://docs.rs/x25519-dalek/latest/x25519_dalek/ # Arti 1.1.3 — 31 March 2023 Arti 1.1.3 continues our work on onion services. We can now parse all of the relevant message types, build circuits as needed to target relays, build and sign onion service descriptors, and deliver onion service requests to our `hsclient` code. We've also solved a few annoying bugs, made our CI more bulletproof against certain programming mistakes, and exposed a few APIs that had been missing before elsewhere in our code. ### Major bugfixes - Prevent a fatal error when finding a usable consensus in a read-only directory store. ([#779], [!1055]) ### Breaking changes in lower level crates - Moved futures-related utilities from `tor-basic-utils` to a new `tor-async-utils` crate. ([!1091]) - When the `expand-paths` Cargo feature is not enabled, we now reject paths in our configuration containing unescaped `$` and `~` strings. Previously we would treat them as literals, which would break when `expand-paths` was provided. ([#790], [!1069]) ### Onion service development - We now have working implementations for all of the message types that Tor uses to implement onion services. These are included in our fuzzing, and are cross-validated against the C Tor implementation. ([!1038], [!1043], [!1045], [!1052]) - Our onion service descriptor parsing code now validates the inner certificates embedded in the descriptors, for parity with C Tor's behavior. ([#744], [!1044]) - Refactor responsibility for HS circuit management out of `CircMgr`. ([!1047]) - Revise APIs and outline implementations for the initial parts of a state manager and client implementation. ([!1034], [!1086]) - Handle requests for `.onion` addresses by routing them to our onion service code. (This code does not yet do anything useful.) ([!1060], [!1071], [!1098]) - Our circuit implementation now has APIs needed to send special-purpose messages and receive replies for them. We'll use this to implement onion service handshakes outside of the `tor-proto` module. ([!1051]) - Implement functionality to pre-construct and launch circuits as needed for onion service directory, introduction, and rendezvous communications. ([#691], [!1065]) - Implement code to construct, encrypt, and sign onion service descriptors. ([#745], [!1070], [!1084]) - More work on usable APIs for HSDir ring. ([!1095]) ### Infrastructure - Add a new `check_env` script to detect whether the environment is set up correctly to build Arti. ([!1030]) - We have the beginnings of a `fixup-features` tool, to make sure that our "full" and "experimental" Cargo features behave in the way we expect, and eventually to enable us to use [`cargo-semver-checks`] on our non-experimental features only. This tool is not yet ready for use; its semantics are subtly wrong. ([#771], [!1059]) - Our CI scripts now rejects merges containing the string "XXXX"; we use this string to indicate places where the code must be fixed before it can be merged. ([#782], [!1067]) ### Testing - More of our tests now specify times using [`humantime`] (rather than as a number of seconds since the Unix epoch). ([!1037]) - Our fuzzers now compile again. ([53e44b58f5fa0cfa], [!1063]) ### Documentation - New example code for building a `BridgeConfig` and launching a TorClient with bridges, without having a config file. ([#791], [!1074]) ### Cleanups, minor features, and minor bugfixes - Our `caret` macro now works correctly for uninhabited enumerations. ([841905948f913f73]) - Defend against possible misuse of [`tor_bytes::Reader::extract_n`]. This wasn't a security hole, but could have become one in the future. ([!1053]) - Do not ask exits to resolve IP addresses: we already know the IP address for an IP address. ([!1057]) - Fix a bunch of new warnings from Rust 1.68. ([!1062]) - Expose builder for [`TransportConfigList`] as part of the public API. ([455a7a710917965f]) - Enforce use of blinded keys in places where they are required. ([!1081]) - Add accessors for the [`Blockage`] type, so other programs can ask what has gone wrong with the connection to the network. ([#800], [!1088]) ### Acknowledgments Thanks to everybody who's contributed to this release, including Alexander Færøy, Dimitris Apostolou, Emil Engler, Saksham Mittal, and Trinity Pointard. Also, our welcome to Gabi Moldovan as she joins the team! Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti! [!1030]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1030 [!1034]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1034 [!1037]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1037 [!1038]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1038 [!1043]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1043 [!1044]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1044 [!1045]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1045 [!1047]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1047 [!1051]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1051 [!1052]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1052 [!1053]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1053 [!1055]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1055 [!1057]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1057 [!1059]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1059 [!1060]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1060 [!1062]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1062 [!1063]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1063 [!1065]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1065 [!1067]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1067 [!1069]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1069 [!1070]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1070 [!1071]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1071 [!1074]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1074 [!1081]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1081 [!1084]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1084 [!1086]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1086 [!1088]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1088 [!1091]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1091 [!1095]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1095 [!1098]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1098 [#691]: https://gitlab.torproject.org/tpo/core/arti/-/issues/691 [#744]: https://gitlab.torproject.org/tpo/core/arti/-/issues/744 [#745]: https://gitlab.torproject.org/tpo/core/arti/-/issues/745 [#771]: https://gitlab.torproject.org/tpo/core/arti/-/issues/771 [#779]: https://gitlab.torproject.org/tpo/core/arti/-/issues/779 [#782]: https://gitlab.torproject.org/tpo/core/arti/-/issues/782 [#790]: https://gitlab.torproject.org/tpo/core/arti/-/issues/790 [#791]: https://gitlab.torproject.org/tpo/core/arti/-/issues/791 [#800]: https://gitlab.torproject.org/tpo/core/arti/-/issues/800 [455a7a710917965f]: https://gitlab.torproject.org/tpo/core/arti/-/commit/455a7a710917965f0b3977d4381752975184def1 [53e44b58f5fa0cfa]: https://gitlab.torproject.org/tpo/core/arti/-/commit/53e44b58f5fa0cfa57073618d18bd71a1632afff [841905948f913f73]: https://gitlab.torproject.org/tpo/core/arti/-/commit/841905948f913f73b3bd9cfeeb11e8b9ab9f06ea [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`Blockage`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/status/struct.Blockage.html [`TransportConfigList`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/config/struct.TransportConfigListBuilder.html [`cargo-semver-checks`]: https://crates.io/crates/cargo-semver-checks [`humantime`]: https://crates.io/crates/humantime [`tor_bytes::Reader::extract_n`]: https://tpo.pages.torproject.net/core/doc/rust/tor_bytes/struct.Reader.html#method.extract_n # Arti 1.1.2 — 28 February 2023 Arti 1.1.2 continues our work on onion services, and builds out more of the necessary infrastructure, focusing on backend support for the onion service directories. We've also done a significant revision on our handling of incoming messages on circuits, to avoid a fair amount of unnecessary copying, and defer message parsing until we're certain that the message type would be acceptable in a given context. Doing this turned up several bugs, which are now fixed too. ### Breaking changes in lower level crates - The APIs for `tor-cell` have changed significantly, to help implement [#525] and prepare for [#690]. This has no downstream implications outside of `tor-proto`. - Our [`IntegerMinutes`] type no longer has an erroneous `days()` accessor. (This accessor did not work correctly, and actually returned a number of minutes!) ([bb2ab7c2a3e0994bb43]) - The [`PartialNetDir::fill_from_previous_netdir()`] function has changed its argument types and semantics. ([f69d7f96ac40dda5]) (Breaking changes in experimental APIs are not noted here.) ### New features - We now have the facility to give a helpful "error hint" in response to a given failure. Right now, we use this to improve the error message given for file-system permission errors, so that it suggests either changing the permissions on a directory, or suppressing the error. ([#578], [#579], [!976], [!994], [!1018]) - When we log an error message from inside our code (at "info" or higher), we now make sure to log a full _error report_, including the cause of the error, its cause, and so on. ([#680], [!997]) - When receiving messages on channels, circuits, and streams, we now defer parsing those messages until we know whether their types are acceptable. This shrinks our attack surface, simplifies our code, and makes our protocol handling less error-prone. ([#525], [!1008], [!1013], [!1017]) - We now copy relay cell bodies much less than previously. ([#7], [ca3b33a1afc58b84]) - We have support for handling link specifier types verbatim, for cases when we need to use them to contact a rendezvous point or introduction point without checking them. ([!1029]) ### Onion service development - We can now parse onion service descriptors, including all encrypted layers, with support for descriptor-based client authentication. ([#744], [!999], [!1015]) - Our network directory code now supports deriving the `HsDir` directory ring, to find out where onion service descriptors should be uploaded and downloaded. ([#687], [!1012]) - We've refactored our implementation of onion service message extensions into a single place, to save on code and avoid type confusion. ([5521df0909ff7afa]) - Our _internal_ onion-service Cargo features have been renamed to start with `hs-*`. We're still using `onion-*` as the prefix for our high-level onion-service features. ([#756], [!1033]) ### Infrastructure - All our shell scripts now work when `bash` is somewhere other than `/bin`. ([!990]) - Our `check_doc_features` script is now a little more reliable. ([!1023]) - Our coverage tools now perform better checks to make sure they have all of their dependencies. ([#776], [!1025]) ### Cleanups, minor features, and bugfixes - The internal data structures in [`tor-netdir`] now use the [`typed_index_collections`] crate to ensure that the indices for one list are not mis-used as indices into another. ([!1004]) - We no longer reject authority certificates that contain an unrecognized keyword. ([#752], [266c61f7213dbec7]) - Our [`tor-netdoc`] parsing code now requires the caller to specify handling for unrecognized keywords explicitly, to avoid future instances of bug [#752]. ([!1006]) - Several internal APIs and patterns in [`tor-netdoc`] have been streamlined. ([#760], [!1016], [!1021]) - Make extension-handling code in for onion service message decoding more generic, since we'll reuse it a lot. ([!1020]) - We now kill off circuits under more circumstances when the other side of the circuit violates the protocol. ([#769], [#773], [!1026]) - We now expire router descriptors as soon as _any_ of their internal expiration times has elapsed. Previously, we expired them when _all_ of their expiration times had elapsed, which is incorrect. ([#772], [!1022]) - We are much more careful than previous about validating the correctness of various message types on half-closed streams. Previously, we had separate implementations for message validation; now, we use a single object to check messages in both cases. ([#744], [!1026]) - We now treat a `RESOLVED` message as closing a half-closed resolve stream. Previously, we left the stream open. ([!1026]) Thanks to everyone who has contributed to this release, including Dimitris Apostolou, Emil Engler, and Shady Katy. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti! [!1004]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1004 [!1006]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1006 [!1008]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1008 [!1012]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1012 [!1013]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1013 [!1015]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1015 [!1016]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1016 [!1017]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1017 [!1018]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1018 [!1020]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1020 [!1021]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1021 [!1022]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1022 [!1023]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1023 [!1025]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1025 [!1026]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1026 [!1029]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1029 [!1033]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/1033 [!976]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/976 [!990]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/990 [!994]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/994 [!997]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/997 [!999]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/999 [#525]: https://gitlab.torproject.org/tpo/core/arti/-/issues/525 [#578]: https://gitlab.torproject.org/tpo/core/arti/-/issues/578 [#579]: https://gitlab.torproject.org/tpo/core/arti/-/issues/579 [#680]: https://gitlab.torproject.org/tpo/core/arti/-/issues/680 [#687]: https://gitlab.torproject.org/tpo/core/arti/-/issues/687 [#690]: https://gitlab.torproject.org/tpo/core/arti/-/issues/690 [#744]: https://gitlab.torproject.org/tpo/core/arti/-/issues/744 [#752]: https://gitlab.torproject.org/tpo/core/arti/-/issues/752 [#756]: https://gitlab.torproject.org/tpo/core/arti/-/issues/756 [#760]: https://gitlab.torproject.org/tpo/core/arti/-/issues/760 [#769]: https://gitlab.torproject.org/tpo/core/arti/-/issues/769 [#772]: https://gitlab.torproject.org/tpo/core/arti/-/issues/772 [#773]: https://gitlab.torproject.org/tpo/core/arti/-/issues/773 [#776]: https://gitlab.torproject.org/tpo/core/arti/-/issues/776 [#7]: https://gitlab.torproject.org/tpo/core/arti/-/issues/7 [266c61f7213dbec7]: https://gitlab.torproject.org/tpo/core/arti/-/commit/266c61f7213dbec7feacac256bd87329837535e2 [5521df0909ff7afa]: https://gitlab.torproject.org/tpo/core/arti/-/commit/5521df0909ff7afa2d78304c9376861dfcf7041a [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`IntegerMinutes`]: https://tpo.pages.torproject.net/core/doc/rust/tor_units/struct.IntegerMinutes.html [`PartialNetDir::fill_from_previous_netdir()`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdir/struct.PartialNetDir.html#method.fill_from_previous_netdir [`tor-netdir`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdir/index.html [`tor-netdoc`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdoc/index.html [`typed_index_collections`]: https://docs.rs/typed-index-collections/latest/typed_index_collections/ [bb2ab7c2a3e0994bb43]: https://gitlab.torproject.org/tpo/core/arti/-/commit/bb2ab7c2a3e0994bb438188511688b5b039cae29 [ca3b33a1afc58b84]: https://gitlab.torproject.org/tpo/core/arti/-/commit/ca3b33a1afc58b84cc7a39ea3845a82f17cee0da [f69d7f96ac40dda5]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f69d7f96ac40dda53a8f4f6c01557195faaeff7c # Arti 1.1.1 — 1 February 2023 After months of work, we have a new release of Arti! Arti 1.1.1 is an incremental release, and cleans up a few issues from previous releases, including a few annoyances and limitations. More significantly, Arti 1.1.1 begins our work on [Onion Services]. This code won't be finished till later this year, but you can read about our process below. ### Breaking changes in lower level crates - Some accessors for the message types in [`tor-cell`] are renamed. ([#608], [!948]) ### New features - When logging an error at severity `info` or higher, we now (sometimes) include a full report of the error's sources. Previously we only logged the highest-level error, which often lacked enough detail to make a full diagnosis. This work will be completed in a subsequent release.([!936]) - When asked via SOCKS to resolve an address that is already an IP address, we now just return the same address, rather than asking the Tor network. ([#714], [!957]) - There is a new release profile, `quicktest`, for development purposes. It should run faster than `debug`, but compile faster than `release`. It is meant for quick integration and acceptance test purposes. ([#639], [!960]) - The `TorClient` object now exposes a [`set_stream_prefs`] API to let callers change their stream settings without cloning a new `TorClient`. ([#718], [!977]) ### Onion service development - There is now an unimplemented draft set of high-level and low-level APIs throughout our codebase that we will need to implement onion services. These not-yet-functional APIs are gated behind the `onion-client` and `onion-service` features. They are not covered by semantic versioning; we will use them to guide our implementation efforts in the coming months. ([#525], [#716], [!959], [!966], [!969], [!970], [!971], [!972], [!974]) - We have implemented the private-key version of the key-blinding algorithm used in onion services. ([#719], [!964]) - We now parse and expose consensus network parameters related to onion services. ([!968]) - Our SOCKS backend now supports returning the extended onion service SOCKS result codes from [proposal 304]. ([#736], [!978]) - The `tor-netdoc` crate now has a (not-yet-used) backend for constructing documents in Tor's metaformat. ([!969], [!984]) - Implement the lower level cryptographic key types (and some of the cryptographic algorithms) used by onion services. ([#684], [#742], [!980]) - Add support for parsing [Shared Random Values] from consensus documents, including the extensions from [proposal 342]. - In `tor-netdir`, implement the algorithms for determining the current time period and constructing the cryptographic parameters for each period's HsDir ring. ([#686], [!987]) ### Network updates - Update to the latest identity key for the directory authority `moria1`. ([!922]) - Retire the directory authority `faravahar`. ([!924], [tor#40688]) ### Testing - Upgrade to a newer version of the [Shadow] simulator, and use it to test Arti with bridges. ([#651], [!915]) - More tests for our safe-logging features. ([!928]) - More tests for error cases in persistent-data manager. ([!930]) - We now have a standard block of `clippy` exceptions that we allow in our test code, and we apply it uniformly. ([!937]) - In our Shadow scripts, use bare paths to find `tor` and `tgen`. ([!949]) ### Documentation - Move internal-facing documentation into a `doc/dev` subdirectory, so that it's easy for downstream users to ignore it. ([#576], [!921]) - Make the summary line style consistent across our `README` files, and make the crate list in [`Architecture.md`] match. ([!951]) - Add more high level documentation to [`Architecture.md`], including a rough crate-dependency diagram, and an object model diagram for our manager types. ([#624], [!963]) ### Example code - Make the `arti-hyper` example code compile and work correctly on OSX. ([#569], [#715], [!958]) ### Cleanups, minor features, and bugfixes - Use Rust 1.60's [conditional dependency] feature to simplify our dependency and feature logic. ([#434], [!920]) - Upgrade to [`shellexpand`] 3.x. ([!927]) - The `unwrap` method on [`Sensitive`] is renamed to `into_inner`; `unwrap` is now deprecated. ([!926]) - Clean up tests to use [`humantime`] more, and to specify fewer times as raw integers. ([#663], [!931], [!941], [!942], [!943]) - We now use a low-level [`CtByteArray`] type to handle the common case of declaring a fixed-length array that should always be compared in constant time. ([!962]) - There is now much more diagnostic logging in the pluggable transport IPC code, and for connection launching. ([#677], [!923]) - We have labeled more data throughout our logs and error messages as "sensitive" for logging purposes. ([#556], [!934], [!986]) - We've migrated all of our base64 parsing to [`base64ct`]. (This work began with [!600] in Arti 0.5.0; now we have migrated even the parsing that doesn't _need_ to be constant-time, under the theory that having only one implementation is probably better.) ([889206cde4ef29d]) - Our scripts now all indirect through `/usr/bin/env`, to support platforms that don't put `bash` in `/bin`. ([!988]) - Clean up various warnings introduced in Rust 1.67. ([#748], [#749], [!992]) - Numerous spelling fixes. Thanks to everyone who has contributed to this release, including Alexander Færøy, coral, Dimitris Apostolou, Emil Engler, Jim Newsome, Michael van Straten, Neel Chauhan, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti 1.1.1! [!600]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/600 [!915]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/915 [!920]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/920 [!921]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/921 [!922]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/922 [!923]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/923 [!924]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/924 [!926]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/926 [!927]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/927 [!928]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/928 [!930]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/930 [!931]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/931 [!934]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/934 [!936]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/936 [!937]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/937 [!941]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/941 [!942]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/942 [!943]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/943 [!948]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/948 [!949]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/949 [!951]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/951 [!957]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/957 [!958]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/958 [!959]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/959 [!960]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/960 [!962]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/962 [!963]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/963 [!964]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/964 [!966]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/966 [!968]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/968 [!969]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/969 [!970]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/970 [!971]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/971 [!972]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/972 [!974]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/974 [!977]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/977 [!978]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/978 [!980]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/980 [!984]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/984 [!986]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/986 [!987]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/987 [!988]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/988 [!992]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/992 [#434]: https://gitlab.torproject.org/tpo/core/arti/-/issues/434 [#525]: https://gitlab.torproject.org/tpo/core/arti/-/issues/525 [#556]: https://gitlab.torproject.org/tpo/core/arti/-/issues/556 [#569]: https://gitlab.torproject.org/tpo/core/arti/-/issues/569 [#576]: https://gitlab.torproject.org/tpo/core/arti/-/issues/576 [#608]: https://gitlab.torproject.org/tpo/core/arti/-/issues/608 [#624]: https://gitlab.torproject.org/tpo/core/arti/-/issues/624 [#639]: https://gitlab.torproject.org/tpo/core/arti/-/issues/639 [#651]: https://gitlab.torproject.org/tpo/core/arti/-/issues/651 [#663]: https://gitlab.torproject.org/tpo/core/arti/-/issues/663 [#677]: https://gitlab.torproject.org/tpo/core/arti/-/issues/677 [#684]: https://gitlab.torproject.org/tpo/core/arti/-/issues/684 [#686]: https://gitlab.torproject.org/tpo/core/arti/-/issues/686 [#714]: https://gitlab.torproject.org/tpo/core/arti/-/issues/714 [#715]: https://gitlab.torproject.org/tpo/core/arti/-/issues/715 [#716]: https://gitlab.torproject.org/tpo/core/arti/-/issues/716 [#718]: https://gitlab.torproject.org/tpo/core/arti/-/issues/718 [#719]: https://gitlab.torproject.org/tpo/core/arti/-/issues/719 [#736]: https://gitlab.torproject.org/tpo/core/arti/-/issues/736 [#742]: https://gitlab.torproject.org/tpo/core/arti/-/issues/742 [#748]: https://gitlab.torproject.org/tpo/core/arti/-/issues/748 [#749]: https://gitlab.torproject.org/tpo/core/arti/-/issues/749 [889206cde4ef29d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/889206cde4ef29d7d10bda546f8ad518eb09c290 [Onion Services]: https://community.torproject.org/onion-services/ [Shadow]: https://shadow.github.io [Shared Random Values]: https://blog.torproject.org/mission-montreal-building-next-generation-onion-services/ [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`Architecture.md`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/doc/dev/Architecture.md [`CtByteArray`]: https://tpo.pages.torproject.net/core/doc/rust/tor_llcrypto/util/ct/struct.CtByteArray.html [`Sensitive`]: https://tpo.pages.torproject.net/core/doc/rust/safelog/struct.Sensitive.html [`base64ct`]: https://docs.rs/base64ct/latest/base64ct/ [`humantime`]: https://crates.io/crates/humantime [`set_stream_prefs`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/struct.TorClient.html#method.set_stream_prefs [`shellexpand`]: https://crates.io/crates/shellexpand [`tor-cell`]: https://tpo.pages.torproject.net/core/doc/rust/tor_cell/index.html [conditional dependency]: https://blog.rust-lang.org/2022/04/07/Rust-1.60.0.html#new-syntax-for-cargo-features [proposal 304]: https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/proposals/304-socks5-extending-hs-error-codes.txt [proposal 342]: https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/proposals/342-decouple-hs-interval.md [tor#40688]: https://gitlab.torproject.org/tpo/core/tor/-/issues/40688 # Arti 1.1.0 — 30 November 2022 Arti 1.1.0 adds support for Tor's anti-censorship features: Bridges (unlisted relays), and Pluggable Transports (external tools to hide what protocol you're using). Use of these features can make Arti more effective at gaining access to Tor, in spite of censorship (or breakage) between you and the wider public internet. These features are still very new, so there are likely to be bugs, and the user experience may not yet be optimal. (In particular, there are a bunch of spurious warnings and error messages in the logs.) Nonetheless, we believe that the quality of these features is good enough to be used. ### Breaking changes - Arti now requires Rust 1.60 or later. This allows us to use a few new features, and to upgrade a few of our dependencies that had grown stale. See ["Minimum Supported Rust Version" in `README.md`] for more information on our MSRV policy. ([#591], [#526], [#613], [#621], [!837]) ### Breaking changes in lower level crates - `SocksHandshake` has been renamed to `SocksProxyHandshake`, to distinguish it from `SocksClientHandshake`. ([b08073c2d43d7be5]) - Numerous changes to the bridge-related APIs introduced in 1.0.1. ([!758], [#600], [!759], [!780]) - API changes to `tor-dirclient::Response`. ([!782]) - Netinfo cell constructors have been renamed. ([!793]) - The guard manager API no long accepts `NetDir` arguments to most of its methods; instead, it expects to be given a `NetDirProvider`. ([95a95076a77f4447]) - Move the responsibility for creating a GuardMgr to the `arti-client` crate. ([!850]) - Numerous other changes to lower-level APIs. ### New features - Arti can now connect to bridges when compiled with the `bridge-client` feature. (This is on by default in the `arti` binary.) As part of this feature, we have had to implement: - Configuration logic for bridges ([#599], [!744], [!745], [!767], [!781], [!780], [!783], [!826], [!874], [!877], [!881]) - Data structures to keep track of relays based on possibly non-overlapping sets of keys ([!747], [!774], [!797], [!806]) - Improved functionality for parsing router descriptors and integrating them with our list of bridges ([!755]) - Large-scale refactoring of the channel-manager internals to handle bridges and relays while treating them as distinct. ([!773]) - Code to download, store, and cache bridge descriptors. ([!782], [!795], [!810], [!820], [!827], [!828], [!831], [!834], [!845], [!851],) - Allow the guard manager to treat bridges as a kind of guard, and to treat bridge-lists and network directories as two kinds of a "universe" of possible guards. ([!785], [!808], [!815], [!832], [!840]) - Support code to integrate directory management code with guard management code. ([!847], [!852]) - More careful logging about changes in guard status. ([!869]) - Logic to retire circuits when the bridge configuration changes. ([#650], [!880]) - Arti can now connect via pluggable transports when compiled with the `pt-client` feature. (This is on by default in the `arti` binary.) This has required us to implement: - Configuration logic for pluggable transports ([!823]) - The client side of the SOCKS protocol ([!746]) - An abstraction mechanism to allow the `ChanMgr` code to delegate channel construction to caller-provided code. ([!769], [!771], [!887], [!888]) - Integrating the SOCKS client code into the `ChanMgr` code. ([!776]) - Launching pluggable transports and communicating with them using Tor's pluggable transport IPC protocol. ([#394], [!779], [!813]) - Code to keep track of which pluggable transports are needed, and launch them on demand. ([!886], [!893]) - Support code to integrate the pluggable transport manager with `arti-client`. ([#659]) - A "reactor" task to monitor PT status and launch pluggable transports as needed. ([!901], [!903]) - Paths in the configuration can now be configured using `${PROGRAM_DIR}`, which means "the directory containing the current executable". ([#586], [!760]) - Some objects can now be marked as "Redactable". A "Redactable" object is one that can be displayed in the logs with some of its contents suppressed. For example, whereas a full IP might be "192.0.2.7", and a completely removed IP would be logged as "`[scrubbed]`", a redacted IP might be displayed as "192.x.x.x". ([#648], [!882]) ### Testing - We now use the [Shadow] discrete event simulator to test Arti against a simulated Tor network in our CI tests. ([#174], [!634]) - Fuzzing for SOCKS client implementations. ([dc55272602cbc9ff]) - Fuzzing for more types of cells. ([c41305d1100d9685]) - Fuzzing for pluggable transport IPC. ([!814]) - CI testing for more combinations of features. ([#303], [!775]) - CI testing for more targets. ([#585], [!844]) - Better reproducible builds, even on environments with small /dev/shm configured. ([#614], [!818]) ### Cleanups, minor features, and bugfixes - We now use the [`hostname-validator`] crate to check hostnames for correctness. ([!739]) - Now that we require a more recent Rust, we no longer need to duplicate all of our README.md files explicitly in our crate-level documentation. ([#603], [!768]) - A few small refactorings to avoid copying. ([!790], [!791]) - Refactor guard-manager code to make it harder to become confused about which sample a guard came from. ([19fdf196d89e670f]) - More robust conversion to `u16` at some places in `tor-cell`, to avoid future integer overflows. ([!803]) - Refactor our "flag event" to make it easier to (eventually) use in other crates. ([!804]) - Significant refactoring of our file-change watching code. ([#562], [!819]) - Upgrade to [`clap` v3] for our command-line option parsing. ([#616], [!830]) - Fix documentation for starting Tor Browser with Arti on Windows. ([!849]) - Allow empty lines at the end of a router descriptor. ([!857]) - Improve some error messages while parsing directory documents. ([#640], [!859]) - Internal refactoring in `ChanMgr` to better match current design. ([#606], [!864]) - Improve display output for describing relays as channel targets, to provide a more useful summary, and avoid displaying too much information about guards. ([#647], [!868]) - Better error reporting for some kinds of router descriptor parsing failures. ([!870]) - Numerous typo and comment fixes. Thanks to everyone who has contributed to this release, including Alexander Færøy, arnabanimesh, breezykermo, Dimitris Apostolou, EliTheCoder, Emil Engler, Gabriel de Perthuis, Jim Newsome, Reylaba, and Trinity Pointard. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti 1.1.0! [!634]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/634 [!739]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/739 [!744]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/744 [!745]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/745 [!746]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/746 [!747]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/747 [!755]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/755 [!758]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/758 [!759]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/759 [!760]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/760 [!767]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/767 [!768]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/768 [!769]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/769 [!771]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/771 [!773]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/773 [!774]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/774 [!775]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/775 [!776]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/776 [!779]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/779 [!780]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/780 [!781]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/781 [!782]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/782 [!783]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/783 [!785]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/785 [!790]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/790 [!791]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/791 [!793]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/793 [!795]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/795 [!797]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/797 [!803]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/803 [!804]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/804 [!806]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/806 [!808]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/808 [!810]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/810 [!813]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/813 [!814]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/814 [!815]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/815 [!818]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/818 [!819]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/819 [!820]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/820 [!823]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/823 [!826]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/826 [!827]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/827 [!828]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/828 [!830]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/830 [!831]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/831 [!832]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/832 [!834]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/834 [!837]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/837 [!840]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/840 [!844]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/844 [!845]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/845 [!847]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/847 [!849]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/849 [!850]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/850 [!851]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/851 [!852]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/852 [!857]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/857 [!859]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/859 [!864]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/864 [!868]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/868 [!869]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/869 [!870]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/870 [!874]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/874 [!877]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/877 [!880]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/880 [!881]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/881 [!882]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/882 [!886]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/886 [!887]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/887 [!888]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/888 [!893]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/893 [!901]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/901 [!903]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/903 ["Minimum Supported Rust Version" in `README.md`]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/README.md#minimum-supported-rust-version [#174]: https://gitlab.torproject.org/tpo/core/arti/-/issues/174 [#303]: https://gitlab.torproject.org/tpo/core/arti/-/issues/303 [#394]: https://gitlab.torproject.org/tpo/core/arti/-/issues/394 [#526]: https://gitlab.torproject.org/tpo/core/arti/-/issues/526 [#562]: https://gitlab.torproject.org/tpo/core/arti/-/issues/562 [#585]: https://gitlab.torproject.org/tpo/core/arti/-/issues/585 [#586]: https://gitlab.torproject.org/tpo/core/arti/-/issues/586 [#591]: https://gitlab.torproject.org/tpo/core/arti/-/issues/591 [#599]: https://gitlab.torproject.org/tpo/core/arti/-/issues/599 [#600]: https://gitlab.torproject.org/tpo/core/arti/-/issues/600 [#603]: https://gitlab.torproject.org/tpo/core/arti/-/issues/603 [#606]: https://gitlab.torproject.org/tpo/core/arti/-/issues/606 [#613]: https://gitlab.torproject.org/tpo/core/arti/-/issues/613 [#614]: https://gitlab.torproject.org/tpo/core/arti/-/issues/614 [#616]: https://gitlab.torproject.org/tpo/core/arti/-/issues/616 [#621]: https://gitlab.torproject.org/tpo/core/arti/-/issues/621 [#640]: https://gitlab.torproject.org/tpo/core/arti/-/issues/640 [#647]: https://gitlab.torproject.org/tpo/core/arti/-/issues/647 [#648]: https://gitlab.torproject.org/tpo/core/arti/-/issues/648 [#650]: https://gitlab.torproject.org/tpo/core/arti/-/issues/650 [#659]: https://gitlab.torproject.org/tpo/core/arti/-/issues/659 [19fdf196d89e670f]: https://gitlab.torproject.org/tpo/core/arti/-/commit/19fdf196d89e670f3487caa756a8194076f9226b [95a95076a77f4447]: https://gitlab.torproject.org/tpo/core/arti/-/commit/95a95076a77f44478736464a6249bee345713ecc [Shadow]: https://shadow.github.io [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`clap` v3]: https://docs.rs/clap/3.2.23/clap/index.html [`hostname-validator`]: https://crates.io/crates/hostname-validator [b08073c2d43d7be5]: https://gitlab.torproject.org/tpo/core/arti/-/commit/b08073c2d43d7be58db62d6c6a51721dc6f797f1 [c41305d1100d9685]: https://gitlab.torproject.org/tpo/core/arti/-/commit/c41305d1100d96854707eef988380e01ad2a5782 [dc55272602cbc9ff]: https://gitlab.torproject.org/tpo/core/arti/-/commit/dc55272602cbc9ff3b792a9e4231533d4a12e007 # Arti 1.0.1 — 3 October 2022 Arti 1.0.1 fixes a few bugs in our previous releases. This is a fairly small release: Members of our team have spent a lot of September at a company meeting, on our vacations, and/or recovering from COVID-19. The feature work we have managed to get done is largely behind-the-scenes preparation for our anti-censorship release, which we now hope is coming in early November. ### Breaking changes - The `Schedule::sleep()*` functions in `tor-rtcompat` now return a `Result`. This change was part of the fix for part of [#572]. ### New features - Optionally expose an accessor to get the [`CircuitBuilder`] from a [`CircMgr`]. If you don't mind voiding your semver guarantees, you can enable this accessor with the `experimental-api` feature, and use it to build circuits using paths of your own creation. ([!738]) - We now apply our "safe logging" feature to the console as well, to avoid exposing sensitive information in our console log. ([#553], [!742]) ### Major bugfixes - Fixed a busy loop that could occur when dropping an Arti client, that would cause Arti to busy-loop and use too much CPU. ([#572], [!725]) - Fixed compilation when building with [`async-std`]. ([!723]) ### Documentation - Our high-level documentation has significantly tidied and revised for clarity and completeness. ([!717]) - We've updated our documentation for [how to use Arti with Tor Browser]. ([!719]) ### Infrastructure - Our reproducible builds now use Rust 1.63, and the code to make them has been cleaned up a bit. ([!716]) ### Cleanups, minor features, and minor bugfixes - Fix a test failure that would occur on some platforms depending on their inlining decisions. ([#570], [!727]) - Better listing of platforms that don't have [`getresuid()`], so that we can compile there without breaking. ([!728]) - Preliminary back-end support for encoding and decoding some messages in the onion service protocol. ([!714], [!735], [!736]) - Fixes for various newly implemented [Clippy] warnings. ([!729], [!749]) - The [`RouterDesc`] type now implements `Clone` and `Debug`. ([571e7f9556adf12d]) - Preliminary internal API designs for most of the logic needed to implement Tor's anti-censorship features. These APIs are unstable, and mostly not implemented yet, but they give us something to fill in. ([#543], [#558], [!740], [!743], [!748]) Thanks to everyone who has contributed to this release, including Alexander Færøy, Trinity Pointard, and Yuan Lyu. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti 1.0.0! [!714]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/714 [!716]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/716 [!717]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/717 [!719]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/719 [!723]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/723 [!725]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/725 [!727]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/727 [!728]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/728 [!729]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/729 [!735]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/735 [!736]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/736 [!738]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/738 [!740]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/740 [!742]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/742 [!743]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/743 [!748]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/748 [!749]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/749 [#543]: https://gitlab.torproject.org/tpo/core/arti/-/issues/543 [#553]: https://gitlab.torproject.org/tpo/core/arti/-/issues/553 [#558]: https://gitlab.torproject.org/tpo/core/arti/-/issues/558 [#570]: https://gitlab.torproject.org/tpo/core/arti/-/issues/570 [#572]: https://gitlab.torproject.org/tpo/core/arti/-/issues/572 [571e7f9556adf12d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/571e7f9556adf12de8c8189ddbfc78c78a534a74 [Clippy]: https://github.com/rust-lang/rust-clippy [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`CircMgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_circmgr/struct.CircMgr.html [`CircuitBuilder`]: https://tpo.pages.torproject.net/core/doc/rust/tor_circmgr/build/struct.CircuitBuilder.html [`RouterDesc`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdoc/doc/routerdesc/struct.RouterDesc.html [`async-std`]: https://docs.rs/async-std/latest/async_std/ [`getresuid()`]: https://man7.org/linux/man-pages/man2/getresgid.2.html [how to use Arti with Tor Browser]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/crates/arti/README.md#using-arti-with-tor-browser # Arti 1.0.0 — 1 September 2022 Arti 1.0.0 adds a final set of security features, clears up some portability bugs, and addresses numerous other issues. With this release, we are now ready to declare Arti *stable*: we are relatively confident that Arti has the security features that it needs for usage via the `arti` command-line proxy, or embedding via the `arti-client` API. In our next releases, we will focus on adding anti-censorship features similar to C tor, including support for connecting via bridges and pluggable transports. ### Breaking changes - Most of the APIs in the [`arti`] crate—the one providing our binary—are now hidden behind an `experimental-api` feature, to mark that they are unstable and unsupported. If you need to embed `arti` in your application, please use the [`arti-client`] crate instead. ([#530], [!664]) - The `default_config_file` function has been replaced with `default_config_files`, since we now have both a default directory and a default file. ([!682]) ### Breaking changes in lower-level crates - New `params()` method in the [`NetDirProvider`] trait, to expose the latest parameters even when we don't have a complete directory. ([#528], [!658]) - Large refactoring on the traits that represent a relay's set of identities, to better support more identity types in the future, and to make sure we can support bridges with unknown Ed25519 identities when we implement them. ([#428], [!662]) - Require that our `TcpStream` types implement `Send`. ([!675]) ### New features - Arti now implements Tor's channel padding feature, to make [netflow logs] less useful for traffic analysis. ([#62], [!657]) - Use [`zeroize`] more consistently across our code base. This tool clears various sensitive objects before they get dropped, for defense-in-depth against memory exposure. ([#254], [!655]) - Provide a "process hardening" feature (on by default) that uses [`secmem_proc`] to prevent low-privileged processes from inspecting our memory or our monitoring our execution. This is another defense-in-depth mechanism. ([#364], [!672]) - Arti now rejects attempts to run as root. You can override this with with `application.allow_running_as_root`. ([#523], [!688]) - Arti now rejects attempts to run in a setuid environment: this is not something we support. ([#523], [!689], [!691]) - We now support having an `arti.d` directory full of `.toml` configuration files, to be read in sorted order. ([#271], [#474], [#544], [!682], [!697]) - On Unix-like platforms, we now reload our configuration file when we receive a `HUP` signal. ([#316], [!702]) ### Major bugfixes - Numerous fixes to our [`fs-mistrust`] crate for Android and iOS, including some that prevented it from building or working correctly. ([!667]) - The [`fs-mistrust`] crate now handles Windows prefixes correctly. Previously, it would try to read `C:`, and fail. ([!698]) ### Infrastructure - The `check_licenses` tool now works with the latest version of `cargo-license`. ([!674]) - Our continuous integration configuration now has support for building and testing Arti on Windows. ([#450], [!705]) ### Documentation - Our documentation is now much more careful about listing which Cargo features are required for any optional items. ([#541], [!681], [!706]) - Better documentation about our API stability and overall design. ([#522], [#531]) - Better documentation on the `DONE` stream-close condition. ([!677]) ### Cleanups, minor features, and minor bugfixes - The `dns_port` and `socks_port` options have been renamed to `dns_listen` and `socks_listen`. They now support multiple addresses. Backward compatibility with the old options is retained. ([#502], [!602]) - Renamed `.inc` files to end with `.rs`, to help analysis tools. ([#381], [!645]) - Backend support for some cell types that we'll need down the road when we implement onion services. ([!651], [!648]) - Switch to the once-again-maintained main branch of [`shellexpand`]. ([!661]) - Use less storage on disk for descriptors, by expiring them more aggressively. ([#527], [!669]) - Backend support for RTT estimation, as needed for congestion-based flow-control. ([!525]) - Running as a DNS proxy can now be disabled at compile-time, by turning off the `dns-proxy` feature. ([#532]) - When a circuit fails for a reason that was not the fault of the Tor network, we no longer count it against our total number of permitted circuit failures. ([#517], [!676]) - Tests for older configuration file formats. ([!684]) - Our default log messages have been cleaned up a bit, to make them more useful. ([!692], [0f133de6b90e799d], [e8fcf2b0383f49a6]) - We use [`safelog`] in more places, to avoid logging information that could be useful if the logs were stolen or accidentally leaked. ([!687], [!693]) - Fix a race condition that could prevent us from noticing multiple configuration changes in rapid succession. ([#544], [a7bb3a73b4dfb0e8]) - Better errors on invalid escapes in our configuration files. (In toml, you can't say `"C:\Users"`; you have to escape it as `"C:\\Users"`. We now try to explain this.) ([#549], [!695]) - Improve reliability of a `fs-mistrust` test. ([!699]) - Various tests have been adjusted to work on Windows, or disabled on Windows because they were checking for Unix-only features. ([#450], [#557], [!696], [!701]) - When displaying filenames in logs or error messages, we try to replace the user's home directory with `${HOME}` or `%UserProfile%` as appropriate, to reduce the frequency with which the username appears in the logs. ([#555], [!700]) ### Testing - Lengthen a timeout in a `tor-rtcompat` test, to make it more reliable. ([#515], [!644]) ### Acknowledgments Thanks to everyone who has contributed to this release, including Alexander Færøy, Arturo Marquez, Dimitris Apostolou, Emptycup, FAMASoon, Trinity Pointard, and Yuan Lyu. Also, our deep thanks to [Zcash Community Grants] for funding the development of Arti 1.0.0! [!525]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/525 [!602]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/602 [!644]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/644 [!645]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/645 [!648]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/648 [!651]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/651 [!655]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/655 [!657]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/657 [!658]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/658 [!661]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/661 [!662]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/662 [!664]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/664 [!667]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/667 [!669]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/669 [!672]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/672 [!674]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/674 [!675]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/675 [!676]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/676 [!677]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/677 [!681]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/681 [!682]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/682 [!684]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/684 [!687]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/687 [!688]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/688 [!689]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/689 [!691]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/691 [!692]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/692 [!693]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/693 [!695]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/695 [!696]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/696 [!697]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/697 [!698]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/698 [!699]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/699 [!700]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/700 [!701]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/701 [!702]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/702 [!705]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/705 [!706]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/706 [#254]: https://gitlab.torproject.org/tpo/core/arti/-/issues/254 [#271]: https://gitlab.torproject.org/tpo/core/arti/-/issues/271 [#316]: https://gitlab.torproject.org/tpo/core/arti/-/issues/316 [#364]: https://gitlab.torproject.org/tpo/core/arti/-/issues/364 [#381]: https://gitlab.torproject.org/tpo/core/arti/-/issues/381 [#428]: https://gitlab.torproject.org/tpo/core/arti/-/issues/428 [#450]: https://gitlab.torproject.org/tpo/core/arti/-/issues/450 [#474]: https://gitlab.torproject.org/tpo/core/arti/-/issues/474 [#502]: https://gitlab.torproject.org/tpo/core/arti/-/issues/502 [#515]: https://gitlab.torproject.org/tpo/core/arti/-/issues/515 [#517]: https://gitlab.torproject.org/tpo/core/arti/-/issues/517 [#522]: https://gitlab.torproject.org/tpo/core/arti/-/issues/522 [#523]: https://gitlab.torproject.org/tpo/core/arti/-/issues/523 [#527]: https://gitlab.torproject.org/tpo/core/arti/-/issues/527 [#528]: https://gitlab.torproject.org/tpo/core/arti/-/issues/528 [#530]: https://gitlab.torproject.org/tpo/core/arti/-/issues/530 [#531]: https://gitlab.torproject.org/tpo/core/arti/-/issues/531 [#532]: https://gitlab.torproject.org/tpo/core/arti/-/issues/532 [#541]: https://gitlab.torproject.org/tpo/core/arti/-/issues/541 [#544]: https://gitlab.torproject.org/tpo/core/arti/-/issues/544 [#549]: https://gitlab.torproject.org/tpo/core/arti/-/issues/549 [#555]: https://gitlab.torproject.org/tpo/core/arti/-/issues/555 [#557]: https://gitlab.torproject.org/tpo/core/arti/-/issues/557 [#62]: https://gitlab.torproject.org/tpo/core/arti/-/issues/62 [0f133de6b90e799d]: https://gitlab.torproject.org/tpo/core/arti/-/commit/0f133de6b90e799d37fdcd9dc75f9f94acb6bb6c [Zcash Community Grants]: https://zcashcommunitygrants.org/ [`NetDirProvider`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdir/trait.NetDirProvider.html [`arti-client`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/index.html [`arti`]: https://tpo.pages.torproject.net/core/doc/rust/arti/index.html [`fs-mistrust`]: https://tpo.pages.torproject.net/core/doc/rust/fs_mistrust/index.html [`safelog`]: https://tpo.pages.torproject.net/core/doc/rust/safelog/index.html [`secmem_proc`]: https://crates.io/crates/secmem-proc [`shellexpand`]: https://crates.io/crates/shellexpand [`zeroize`]: https://docs.rs/zeroize/latest/zeroize/ [a7bb3a73b4dfb0e8]: https://gitlab.torproject.org/tpo/core/arti/-/commit/a7bb3a73b4dfb0e8e0f36994de3d31389d4997b9 [e8fcf2b0383f49a6]: https://gitlab.torproject.org/tpo/core/arti/-/commit/e8fcf2b0383f49a6d927cb094fdc00f766e82580 [netflow logs]: https://en.wikipedia.org/wiki/NetFlow # Arti 0.6.0 — 1 August 2022 Arti 0.6.0 fixes bugs, cleans up some messy internals, improves error messages, and adds more preparation for future work in netflow padding. (These notes summarize changes in all crates since Arti 0.5.0.) ### Breaking changes - The `download_tolerance` configuration section has been renamed to `directory_tolerance`: It's not about tolerances at download time, but rather about how expired or premature a directory can be. The related `DirSkewTolerance` has also been renamed. ([#503], [!638]) - Several methods related to managing the [`Mistrust`] file-permissions object have been removed or changed, thanks to refactoring elsewhere. ([#483], [#640]) ### Breaking changes in lower level crates These changes should not break any code that only depends on the [`arti_client`] APIs, but they will affect programs that use APIs from lower-level crates to interact more closely with the Tor protocols. - The `Error` types in all crates have been refactored to include far more accurate information about errors and their context. This does not break the [`arti_client`] API, but it will affect anybody using lower-level crates. ([#323], [!614], [!616], [!619], [!620], [!625], [!628], [!638]) - The [`Writeable`] trait used to encode data, and related methods, are now fallible. Previously they had no way to report errors. ([#513], [!623], [!640]) - The [`tor-cert`] APIs have been tweaked to support more compact internal representations and more idiomatic usage. ([#512], [!641], [!643]) - The [`NetDirProvider`] API, and related APIs in [`tor-dirmgr`], have been changed to support returning network directories with varying timeliness requirements. ([#528], [!642]) - The [`fs-mistrust`] API no longer supports certain operations related to unix groups, when built on iOS. ([!652]) ### New features - The internal [`tor-cert`] API now supports generating Tor-compatible certificates. ([#511], [!611]) - Improved API support for circuit handshakes that include external encrypted data, such as [`ntor-v3`] and [`hs-ntor`]. ([!618]) ### Major bugfixes - Fix a bug that prevented Arti from storing consensus files on Windows. Previously, we had generated filenames containing a colon, which Windows treats as a reserved character. ([#516], [!627]) - Fix compilation on iOS. Our dependency on the [`rust-users`] crate had broken our ability to work correctly there. ([#519], [!652]) ### Infrastructure - Our license checker now tolerates complicated licenses with nested boolean expressions, by explicitly allow-listing the ones we like. ([!635]) ### Cleanups, minor features, and minor bugfixes - Upgrade to a newer version of [`base64ct`], and remove some work-around logic required for the older versions. ([!608]) - Various typo fixes. ([!609], [!610], [!650]) - Upgrade to a pre-release version of [`x25519-dalek`] to avoid a hard dependency on an outdated version of [`zeroize`], so we can follow the latest version of the [`rsa`] crate. ([#448], [!612]) - Our client-global "dormant mode" flag is now published via a [`postage::watch`], which makes it easier to observe for changes. ([!632]) - Preliminary (unused) support for some onion-service-related cells. ([!626]) - The [`fs-mistrust`] crate can now use environment variables to be told to disable itself. This has allowed for simplifications elsewhere in our configuration logic. ([#483], [!630]) - Clean up an incorrect `--help` message. ([!633]) ### Testing - More tests for [`arti-hyper`]. ([!615]) - More tests for our undderlying base-64 implementation. ([!613]) ### Acknowledgments Thanks to everyone who has contributed to this release, including Arturo Marquez, Dimitris Apostolou, `feelingnothing`, Jim Newsome, Richard Pospesel, `spongechameleon`, Trinity Pointard, and Yuan Lyu. [!608]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/608 [!609]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/609 [!610]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/610 [!611]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/611 [!612]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/612 [!613]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/613 [!614]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/614 [!615]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/615 [!616]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/616 [!618]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/618 [!619]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/619 [!620]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/620 [!623]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/623 [!625]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/625 [!626]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/626 [!627]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/627 [!628]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/628 [!630]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/630 [!632]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/632 [!633]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/633 [!635]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/635 [!638]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/638 [!640]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/640 [!641]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/641 [!642]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/642 [!643]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/643 [!650]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/650 [!652]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/652 [#323]: https://gitlab.torproject.org/tpo/core/arti/-/issues/323 [#448]: https://gitlab.torproject.org/tpo/core/arti/-/issues/448 [#483]: https://gitlab.torproject.org/tpo/core/arti/-/issues/483 [#503]: https://gitlab.torproject.org/tpo/core/arti/-/issues/503 [#511]: https://gitlab.torproject.org/tpo/core/arti/-/issues/511 [#512]: https://gitlab.torproject.org/tpo/core/arti/-/issues/512 [#513]: https://gitlab.torproject.org/tpo/core/arti/-/issues/513 [#516]: https://gitlab.torproject.org/tpo/core/arti/-/issues/516 [#519]: https://gitlab.torproject.org/tpo/core/arti/-/issues/519 [#528]: https://gitlab.torproject.org/tpo/core/arti/-/issues/528 [#640]: https://gitlab.torproject.org/tpo/core/arti/-/issues/640 [`Mistrust`]: https://tpo.pages.torproject.net/core/doc/rust/fs_mistrust/struct.Mistrust.html [`NetDirProvider`]: https://tpo.pages.torproject.net/core/doc/rust/tor_netdir/trait.NetDirProvider.html [`Writeable`]: https://tpo.pages.torproject.net/core/doc/rust/tor_bytes/trait.Writeable.html [`arti-hyper`]: https://tpo.pages.torproject.net/core/doc/rust/arti_hyper/index.html [`arti_client`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/index.html [`base64ct`]: https://docs.rs/base64ct/latest/base64ct/ [`fs-mistrust`]: https://tpo.pages.torproject.net/core/doc/rust/fs_mistrust/index.html [`hs-ntor`]: https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/rend-spec-v3.txt#L1876 [`ntor-v3`]: https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/proposals/332-ntor-v3-with-extra-data.md [`postage::watch`]: https://docs.rs/postage/latest/postage/watch/index.html [`rsa`]: https://docs.rs/rsa/latest/rsa/ [`rust-users`]: https://docs.rs/users/latest/users/ [`tor-cert`]: https://tpo.pages.torproject.net/core/doc/rust/tor_cert/index.html [`tor-dirmgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_dirmgr/index.html [`x25519-dalek`]: https://docs.rs/x25519-dalek/latest/x25519_dalek/ [`zeroize`]: https://docs.rs/zeroize/latest/zeroize/ # tor-dirmgr patch release 0.5.1 — 14 July 2022 On 14 July 2022, we put out a patch release (0.5.1) to `tor-dirmgr`, to fix a bug that prevented Arti from storing consensus files on Windows. Previously, we had generated filenames containing a colon, which Windows treats as a reserved character. Thanks to "@feelingnothing" for the bug report and the fix. # Arti 0.5.0 — 24 Jun 2022 Arti 0.5.0 adds more cryptographic acceleration, a useful set of toplevel build features, reachable-address filtering, detection for failed directory downloads, and numerous cleanups. Note that for the first time, we did _not_ have breaking changes in the `arti-client` crate, so its version is staying at 0.4.1. ### Breaking changes - The `NetDirProvider` trait now requires `Send` and `Sync`. ([2223398eb1670c15]) - The traits that make up `Runtime` now also require `Send` and `Sync`. ([3ba3b26842254cfd]) - The "journald" option for LoggingConfig now takes `Option>`. ([!582]) - (Various smaller breaking changes in lower-level crates.) ### New features - We can now (optionally) use OpenSSL as our cryptography backend, for its better performance. To enable this, build with the `accel-openssl` feature. ([#441], [#442], [#493], [!550]) - We can now (optionally) use the assembly implementation of SHA1 in our cryptography backend, for its better performance. To enable this, build with the `accel-sha1-asm` feature. ([#441], [!590]) - Our top-level crates (`arti` and `arti-client`) now have a `full` feature that enables _most_ of their optional features—but not those that are unstable, those that are testing-only, those that select a particular implementation or build flag, or those whose licenses may be incompatible with some downstream licenses. ([#499], [!584]) - We now notice when we get stuck when trying to bootstrap a directory, and report the problem as part of our blockage-detection API. ([#468], [!587]) - We support a `reachable_addrs` feature that allows the user to tell Arti that only some addresses and/or ports are reachable over the local network. ([#491], [#93], [!583]) - Our configuration logic now handles "no such value" options (like using "0" to mean "no port") more consistently, warns about unrecognized options, and includes tests to be sure that the "default configuration" file really lists all of the defaults. ([#457], [#480], [#488], [!582], [!589], [!594]) ### Infrastructure - Our shell scripts are now more robust to a few different runtime environments. ([!539], [!541]) - Our license-checking code is more accurate and careful. ([#462], [!559]) - The PRNG logic in our unit tests now uses reproducible seeds, so that we can better diagnose issues related to sometimes-failing tests. ([!561]) ### Cleanups, minor features, and minor bugfixes - The `fs-mistrust` crate now handles environments where `getgrouplist()` doesn't include the current GID. ([#487], [!548]) - `dns_port` now de-duplicates requests based on transaction ID. ([#441], [!535]) - `dns_port` returns more accurate errors in several cases. ([!564]) - More unit tests in various places. ([!551], [!562]) - We avoid initializing a `DataStream` if it would immediately be closed. ([!556]) - We return a more useful error message for incorrect file permissions. ([!554]) - The directory manager code now uses a refactored timing backend that knows how to respect dormant mode. ([#497], [!571]) - Fix an unreliable test related to guard filtering. ([#491], [89f9e1decb7872d6]) - We now use a constant-time implementation of base-64 decoding. ([#154], [!600]) - We now make sure that at least _some_ log messages can get reported before the logging is configured. In particular, unknown configuration settings now generate warning messages on stderr when `arti` starts up. ([!589]) - Many of our lower-level `Error` types have been refactored to give more accurate, useful, and best-practices-conformant messages. ([#323], [!598], [!601], [!604]) ### Acknowledgments Thanks to everybody who has contributed to this release, including 0x4ndy, Alex Xu, Arturo Marquez, Dimitris Apostolou, Michael McCune, Neel Chauhan, Orhun Parmaksız, Steven Murdoch, and Trinity Pointard. [!535]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/535 [!539]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/539 [!541]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/541 [!548]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/548 [!550]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/550 [!551]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/551 [!554]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/554 [!556]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/556 [!559]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/559 [!561]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/561 [!562]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/562 [!564]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/564 [!571]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/571 [!582]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/582 [!583]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/583 [!584]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/584 [!587]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/587 [!589]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/589 [!590]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/590 [!594]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/594 [!598]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/598 [!600]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/600 [!601]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/601 [!604]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/604 [#154]: https://gitlab.torproject.org/tpo/core/arti/-/issues/154 [#323]: https://gitlab.torproject.org/tpo/core/arti/-/issues/323 [#441]: https://gitlab.torproject.org/tpo/core/arti/-/issues/441 [#442]: https://gitlab.torproject.org/tpo/core/arti/-/issues/442 [#457]: https://gitlab.torproject.org/tpo/core/arti/-/issues/457 [#462]: https://gitlab.torproject.org/tpo/core/arti/-/issues/462 [#468]: https://gitlab.torproject.org/tpo/core/arti/-/issues/468 [#480]: https://gitlab.torproject.org/tpo/core/arti/-/issues/480 [#487]: https://gitlab.torproject.org/tpo/core/arti/-/issues/487 [#488]: https://gitlab.torproject.org/tpo/core/arti/-/issues/488 [#491]: https://gitlab.torproject.org/tpo/core/arti/-/issues/491 [#493]: https://gitlab.torproject.org/tpo/core/arti/-/issues/493 [#497]: https://gitlab.torproject.org/tpo/core/arti/-/issues/497 [#499]: https://gitlab.torproject.org/tpo/core/arti/-/issues/499 [#93]: https://gitlab.torproject.org/tpo/core/arti/-/issues/93 [2223398eb1670c15]: https://gitlab.torproject.org/tpo/core/arti/-/commit/2223398eb1670c159151bc9aae5fed346b88c904 [3ba3b26842254cfd]: https://gitlab.torproject.org/tpo/core/arti/-/commit/3ba3b26842254cfd9033ea37b44b746895bcbd02 [89f9e1decb7872d6]: https://gitlab.torproject.org/tpo/core/arti/-/commit/89f9e1decb7872d688d126fe41ab28b6bd0504a0 # Arti 0.4.0 — 27 May 2022 Arti 0.4.0 wraps up our changes to the configuration logic, detects several kinds of unsafe filesystem configuration, and has a refactored directory manager to help us tolerate far more kinds of broken networks and invalid documents. There are significant breaking changes in this release; please see below. ### Breaking changes - We've merged the last (we hope) of our breaking configuration changes. - Configuration and command-line loading is now handled consistently via the option-agnostic `tor-config` crate. ([!495], [!498]) - We follow a uniform pattern where configuration objects are constructed from associated Builder types, and these Builders support [`serde`] traits, and everything provides a consistent API. ([!499], [!505], [!507]) - The `arti-config` crate no longer exists: its functionality has been divided among `arti`, `arti-client`, and `tor-config`. ([!508]) - The [`TorClientConfig`] object no longer implements `TryInto`. - The configuration logic now supports extensible configurations, where applications can add their own sections and keys without interfering with Arti, and unrecognized keys can still produce warnings. ([#459], [#417]) - The [`Runtime`] trait now also requires that `Debug` be implemented. ([!496]) - (Various smaller breaking changes in lower-level crates.) ### New features - Arti now checks file permissions before starting up, and rejects configuration files, state files, and cache files if they can be modified by untrusted users. You can disable this feature with the `ARTI_FS_DISABLE_PERMISSION_CHECKS` environment variable. ([#315], [#465], [!468], [!483], [!504], [!515]) - Arti now tolerates a much wider array of broken networks and installations when trying to bootstrap a working connection to the Tor network. This includes improved handling for skewed clocks, untimely documents, and invalid consensus documents. ([#412], [#466], [#467], [!500], [!501], [!511]) ### Major bugfixes - Arti no longer exits or gets stuck when it has received a consensus with invalid signatures, or a consensus claiming to be signed with certificates that don't exist. ([#412], [#439], [!511]) ### Infrastructure - Clean up more effectively in chutney-based test scripts. ([ee9730cab4e4b21e]) - Nightly [coverage reports] are now generated and exported to gitlab pages. ([!489]) - We no longer include a dependency on [`cargo-husky`]: If you want to have [git hooks] in your local repository, you'll need to install your own. (See [CONTRIBUTING.md] for instructions.) ([!494]) - Our shell scripts are more uniform in their behaviour. ([!533]) ### Documentation and Examples - Better documentation for Cargo features. ([#445], [!496]) - Better explanation of what platforms and dependencies we support, and what "support" means anyway. ([#379], [!513]) - An advanced example of using the stream isolation feature for trickier behavior. ([#414], [!524]) ### Cleanups, minor features, and minor bugfixes - Use [`tinystr`] to hold relay nicknames; this should save a bit of memory. ([!405]) - Refactor the [`DirMgr`] crate's bootstrapping implementation to reduce amount of mutable state, reduce complexity, and reduce the amount of code that has to modify a running directory. ([!488]) - We only check the formatting of our backtraces on our target platforms, to better tolerate operating systems where Rust's backtraces don't correctly include function details. ([#455], [!512]) - [`DirMgr`] is now better at remembering the origin of a piece of directory information. ([ef2640acfaf9f873]) - Used a new [`Sink::prepare_send_from`] helper to simplify the implementation of Channel reactors. ([!514]) - The SOCKS code now sends correct error messages under more circumstances. ([#258], [!531]) ### Acknowledgments Thanks to everybody who has contributed to this release, including Alex Xu, Dimitris Apostolou, Jim Newsome, Michael Mccune, and Trinity Pointard. [!405]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/405 [!468]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/468 [!483]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/483 [!488]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/488 [!489]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/489 [!494]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/494 [!495]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/495 [!496]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/496 [!498]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/498 [!499]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/499 [!500]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/500 [!501]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/501 [!504]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/504 [!505]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/505 [!507]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/507 [!508]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/508 [!511]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/511 [!512]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/512 [!513]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/513 [!514]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/514 [!515]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/515 [!524]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/524 [!531]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/531 [!533]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/533 [#258]: https://gitlab.torproject.org/tpo/core/arti/-/issues/258 [#315]: https://gitlab.torproject.org/tpo/core/arti/-/issues/315 [#379]: https://gitlab.torproject.org/tpo/core/arti/-/issues/379 [#412]: https://gitlab.torproject.org/tpo/core/arti/-/issues/412 [#414]: https://gitlab.torproject.org/tpo/core/arti/-/issues/414 [#417]: https://gitlab.torproject.org/tpo/core/arti/-/issues/417 [#439]: https://gitlab.torproject.org/tpo/core/arti/-/issues/439 [#445]: https://gitlab.torproject.org/tpo/core/arti/-/issues/445 [#455]: https://gitlab.torproject.org/tpo/core/arti/-/issues/455 [#459]: https://gitlab.torproject.org/tpo/core/arti/-/issues/459 [#465]: https://gitlab.torproject.org/tpo/core/arti/-/issues/465 [#466]: https://gitlab.torproject.org/tpo/core/arti/-/issues/466 [#467]: https://gitlab.torproject.org/tpo/core/arti/-/issues/467 [CONTRIBUTING.md]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/CONTRIBUTING.md [`DirMgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_dirmgr/struct.DirMgr.html [`Runtime`]: https://tpo.pages.torproject.net/core/doc/rust/tor_rtcompat/trait.Runtime.html [`Sink::prepare_send_from`]: https://tpo.pages.torproject.net/core/doc/rust/tor_basic_utils/futures/trait.SinkExt.html#tymethod.prepare_send_from [`TorClientConfig`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/config/struct.TorClientConfig.html [`cargo-husky`]: https://github.com/rhysd/cargo-husky [`serde`]: https://serde.rs/ [`tinystr`]: https://docs.rs/tinystr/latest/tinystr/ [coverage reports]: https://tpo.pages.torproject.net/core/arti/coverage/ [ee9730cab4e4b21e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/ee9730cab4e4b21ec40d05becd4c9f54a92d7c29 [ef2640acfaf9f873]: https://gitlab.torproject.org/tpo/core/arti/-/commit/ef2640acfaf9f873ca3de5253aae93b5032e659a [git hooks]: https://gitlab.torproject.org/tpo/core/arti/-/tree/main/maint # Arti 0.3.0 — 6 May 2022 Arti 0.3.0 includes several new features, including an improved configuration builder API, improved detection and tolerance of numerous network failure types, and several important bugfixes. There are significant breaking changes in this release; please see below. ### Breaking changes Here are the main breaking changes visible from the arti-client crate. Numerous other lower-level crates have breaking changes not noted here. - We now require Rust 1.56 or later. This change enables us to use more recent versions of several of our dependencies, including a significantly faster `aes`. ([!472]) - Some unused accessors have been removed from `tor-socksproto`. ([3103549cba603173]) - Our configuration logic and APIs have been significantly revised. Major changes are described below. We expect that we're mostly done with breaking changes in this area, though we expect a few minor API breaks here in the next release. - Lists of objects, and contained configuration objects, are now constructed using a uniform pattern. - All of our config _builder_ types are now `Deserialize`; our configuration types themselves are not. - Various types are now more consistently constructed, which breaks some of the APIs. - Paths can now be given as "literal" paths, which will not be expanded. - Several options have been renamed for consistency. - For background see [#451], [!447], [!462], [!471], [!473], [!474], [!475], [!477], [!478], [!481], and [!487]. ### New features - Arti now tracks clock skew reports from the guard relays and fallback directories that we contact, and uses this information to infer whether our clock is actually skewed, and whether this skew is the likely cause of a failure to bootstrap. ([!450], [!455]) - We now remove obsolete files from our state directory. ([#282]) - More objects from `tor-dirmgr` are now exposed when the `experimental-api` feature is enabled. ([!463]) - Arti now has a feature to avoid logging certain sensitive information to persistent logs at level `info` or higher. When safe logging is enabled (which it is, by default), the string `[scrubbed]` is printed in these contexts, rather than the sensitive information. At present, only target addresses are considered sensitive, though we aim to protect more information moving forward. This feature can be disabled with the configuration option `storage.log_sensitive_information`. ([#189], [!485]) ### Major bugfixes - Our circuit-build logic is now much more careful about which errors are retriable, and how long to wait between attempts. ([#421], [!443]) - We resolved a race condition that could cause internal errors to be reported erroneously during circuit construction. ([#427]) - We no longer interpret a successful circuit as meaning that a guard is working _as a directory_. Even if it can build circuits, it may be unable to answer directory requests to our satisfaction. ([b3e06b93b6a34922]) ### Infrastructure - Our CI infrastructure now correctly detects (and reports!) failures from cargo-audit. ([!452]) ### Cleanups, minor features, and minor bugfixes - We report more accurate and useful messages on failure to build a circuit. ([f7810d42eb953bf5]) - Avoid dropping information when reloading guards. ([#429]) - Arti now treats expired or not-yet-valid directory objects as an error condition, since they indicate that the directory cache (or the client) likely has a skewed clock. ([#431]) - We now back off on attempts to build preemptive circuits, if we find that those attempts are failing. ([#437], [!456]) - As part of the configuration refactoring, we've extended the amount of our configuration builders that are auto-generated. ([!462]) - Improve handling of some integer overflows. ([!466]) - More unit tests throughout the code. ### Acknowledgments Thanks to everybody who has contributed to this release, including Christian Grigis, Dimitris Apostolou, Samanta Navarro, and Trinity Pointard. [!443]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/443 [!447]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/447 [!450]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/450 [!452]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/452 [!455]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/455 [!456]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/456 [!462]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/462 [!463]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/463 [!466]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/466 [!471]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/471 [!472]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/472 [!473]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/473 [!474]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/474 [!475]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/475 [!477]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/477 [!478]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/478 [!481]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/481 [!485]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/485 [!487]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/487 [#189]: https://gitlab.torproject.org/tpo/core/arti/-/issues/189 [#282]: https://gitlab.torproject.org/tpo/core/arti/-/issues/282 [#421]: https://gitlab.torproject.org/tpo/core/arti/-/issues/421 [#427]: https://gitlab.torproject.org/tpo/core/arti/-/issues/427 [#429]: https://gitlab.torproject.org/tpo/core/arti/-/issues/429 [#431]: https://gitlab.torproject.org/tpo/core/arti/-/issues/431 [#437]: https://gitlab.torproject.org/tpo/core/arti/-/issues/437 [#451]: https://gitlab.torproject.org/tpo/core/arti/-/issues/451 [3103549cba603173]: https://gitlab.torproject.org/tpo/core/arti/-/commit/3103549cba603173a5dc0aefa8f9c201d3d1a6e5 [b3e06b93b6a34922]: https://gitlab.torproject.org/tpo/core/arti/-/commit/b3e06b93b6a34922cd8d07f13aa8f265ae7e8af3 [f7810d42eb953bf5]: https://gitlab.torproject.org/tpo/core/arti/-/commit/f7810d42eb953bf57d9d777fc823087211350452 # Arti 0.2.0 — 1 Apr 2022 Arti 0.2.0 makes a large number of changes to Arti's code and infrastructure for better configurability, lower memory usage, support for running as a basic DNS resolver, improved stream isolation, better behavior under network failures, and API support for a "dormant mode" to suspend background activities. ### Breaking changes Here are the main breaking changes visible from the arti-client crate. Numerous other lower-level crates have breaking changes not noted here. - Significant refactoring to our configuration handling logic and APIs. The goals here are: - To have the `ConfigBuilder` objects be the primary configuration objects, and simplify the handling of configuration at the `TorClient` and `arti` APIs. - To remove `arti-config` entirely, and fold its contents into `arti` or `arti-client` as appropriate. - To remove unnecessary ad-hoc accessor functions until they prove to be needed. This change is not done in this release; we expect to have more breakage in this area in our next release as well. ([#314], [#371], [#372], [#374], [#396], [#418], [!391], [!401], [!417], [!421], [!423], [!425], [!427]) - The [`Runtime`] trait now includes (and requires) UDP support. (Part of [!390]'s support for DNS.) - Stream isolation support is completely revised; see notes on isolation below. ### New features - Experimental feature to allow the [`DirMgr`] to be replaced by a user-provided [`DirProvider`]. ([#267], [!318], [!347]) - Arti now tolerates IPv6-only environments, by using a basic form of the [RFC 8305] "happy eyeballs" algorithm to try connections to relays' IPv4 and IPv6 addresses in parallel. ([!382]) - New experimental APIs for modifying consensus objects. ([!318], [!402]) - The `arti` crate now exists as a library, to better expose features like its top-level configuration logic. ([!403]) - Arti now supports a `dns_port` to relay A, AAAA, and PTR requests over the Tor network, like the C tor implementation's DnsPort. ([!390], [!408], [!409]) - Arti has a new full-featured [stream isolation API] that supports more complicated isolation rules, including user-supplied rules. ([#150], [#414], [!377], [!418], [!420], [!429], [!434]) - Channel and Circuit objects now remember the peers that they used when they were constructed, and allow queries of this information as part of their API. ([#415]) - The logic for retrying failed guards has been revised to use the same decorrelated-jitter algorithm as directory requests, per [proposal 336]. ([cb103e04cf4d9853], part of. ([#407], [!426]) - When all our guards have failed, we no longer retry them all aggressively, but rather assume that our net connection is down and wait a while. ([eed1f06662366511], part of. ([#407], [!426]) - When running as a directory client, we now remember more information about the source of each request, so we can avoid caches that have failed. ([87a3f6b58a5e75f7]) - Experimental feature to install a "filter" for modifying incoming directory objects. Used for testing, to observe client behavior when the directory is in an inconsistent or non-working state. ([#397], [!431]) - Arti now has initial support for a "Dormant Mode" where periodic events are suspended. Later, even more background tasks will be shut down. ([#90], [!429], [!436]) - Fallback directory caches are now handled with logic similar to guards, so we can avoid ones that aren't working, and simplify our logic for path construction. As a fringe benefit, this unification means that we can now use our guards as directory caches even when we don't have an up-to-date consensus. ([#220], [#406], [!433]) ### Infrastructure - We have a new [`arti-testing`] crate (not published on crates.io) to perform various kinds of stress-testing on our implementation. It can simulate several kinds of failure and overload conditions; we've been using it to improve Arti's behavior when the network is broken or misbehaving. See also [#329]. ([#397], [!378], [!392], [!442]) - The [`arti-bench`] tool now constructs streams in parallel and supports isolated circuits, so we can stress-test the performance of a simulated busy client. ([#380], [!384]) - Reproducible build scripts now use Rust 1.59 and Alpine 3.15. ([#376], [!380]) - Improved messages from reproducible build script. ([#378], [!383]) - Scripts to launch chutney are now refactored and de-duplicated. ([!396]) ### Documentation and Examples - Better documentation for default configuration paths. ([!386]) - Instructions for using Tor Browser with Arti on Windows. ([!388]) - Better instructions for building Arti on Windows. ([!389], [!393]) - Improved documentation for stress-testing Arti. ([!407]) ### Cleanups, minor features, and minor bugfixes - Use [`derive_more`] and [`educe`] (and simple built-in `derive`) in many places to simplify our code. ([!374], [!375]) - Use a [forked version of `shellexpand`] to provide correct behavior on Windows. ([!274], [!373]) - Avoid unnecessary `Arc::clone()`s in `arti-client` experimental APIs. ([#369], [!379]) - New [`tor-basic-utils`] crates for small pieces of low-level functionality. - Small performance improvements to parsing and allocating directory objects, to improve start-up and download times. ([#377], [!381]) - Use significantly less memory (on the order of a few megabytes less per running client) to store directory objects. ([#384], [#385], [#386], [#387], [#388], [!389], [!398], [!415]) - Avoid allocating a backtrace object for each channel-creation attempt. ([#383], [!394]) - Always send an "If-Modified-Since" header on consensus requests, since we wouldn't want a consensus that was far too old. ([#403], [!412]) - Actually use the configuration for preemptive circuit construction. Previously, we missed a place where we needed to copy it. ([!417]) - Backend support for collecting clock skew information; not yet used. ([#405], [!410]) - Major refactoring for periodic events, to support an initial version of "dormant mode." ([!429]) - Remove most uses of `SystemTime::now`, in favor of calling the equivalent function on [`SleepProvider`]. ([#306], [!365]) - Several bugs in the logic for retrying directory downloads have been fixed, and several parameters have been tuned, to lead to better behavior under certain network failure conditions. ([!439]) ### Acknowledgments Thanks to everybody who has contributed to this release, including Christian Grigis, Dimitris Apostolou, Lennart Kloock, Michael, solanav, Steven Murdoch, and Trinity Pointard. [!274]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/274 [!318]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/318 [!347]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/347 [!365]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/365 [!373]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/373 [!374]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/374 [!375]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/375 [!377]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/377 [!378]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/378 [!379]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/379 [!380]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/380 [!381]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/381 [!382]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/382 [!383]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/383 [!384]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/384 [!386]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/386 [!388]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/388 [!389]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/389 [!390]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/390 [!391]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/391 [!392]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/392 [!393]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/393 [!394]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/394 [!396]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/396 [!398]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/398 [!401]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/401 [!402]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/402 [!403]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/403 [!407]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/407 [!408]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/408 [!409]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/409 [!410]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/410 [!412]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/412 [!415]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/415 [!417]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/417 [!418]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/418 [!420]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/420 [!421]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/421 [!423]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/423 [!425]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/425 [!426]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/426 [!427]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/427 [!429]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/429 [!431]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/431 [!433]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/433 [!434]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/434 [!436]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/436 [!439]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/439 [!442]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/442 [#150]: https://gitlab.torproject.org/tpo/core/arti/-/issues/150 [#220]: https://gitlab.torproject.org/tpo/core/arti/-/issues/220 [#267]: https://gitlab.torproject.org/tpo/core/arti/-/issues/267 [#306]: https://gitlab.torproject.org/tpo/core/arti/-/issues/306 [#314]: https://gitlab.torproject.org/tpo/core/arti/-/issues/314 [#329]: https://gitlab.torproject.org/tpo/core/arti/-/issues/329 [#369]: https://gitlab.torproject.org/tpo/core/arti/-/issues/369 [#371]: https://gitlab.torproject.org/tpo/core/arti/-/issues/371 [#372]: https://gitlab.torproject.org/tpo/core/arti/-/issues/372 [#374]: https://gitlab.torproject.org/tpo/core/arti/-/issues/374 [#376]: https://gitlab.torproject.org/tpo/core/arti/-/issues/376 [#377]: https://gitlab.torproject.org/tpo/core/arti/-/issues/377 [#378]: https://gitlab.torproject.org/tpo/core/arti/-/issues/378 [#380]: https://gitlab.torproject.org/tpo/core/arti/-/issues/380 [#383]: https://gitlab.torproject.org/tpo/core/arti/-/issues/383 [#384]: https://gitlab.torproject.org/tpo/core/arti/-/issues/384 [#385]: https://gitlab.torproject.org/tpo/core/arti/-/issues/385 [#386]: https://gitlab.torproject.org/tpo/core/arti/-/issues/386 [#387]: https://gitlab.torproject.org/tpo/core/arti/-/issues/387 [#388]: https://gitlab.torproject.org/tpo/core/arti/-/issues/388 [#396]: https://gitlab.torproject.org/tpo/core/arti/-/issues/396 [#397]: https://gitlab.torproject.org/tpo/core/arti/-/issues/397 [#403]: https://gitlab.torproject.org/tpo/core/arti/-/issues/403 [#405]: https://gitlab.torproject.org/tpo/core/arti/-/issues/405 [#406]: https://gitlab.torproject.org/tpo/core/arti/-/issues/406 [#407]: https://gitlab.torproject.org/tpo/core/arti/-/issues/407 [#414]: https://gitlab.torproject.org/tpo/core/arti/-/issues/414 [#415]: https://gitlab.torproject.org/tpo/core/arti/-/issues/415 [#418]: https://gitlab.torproject.org/tpo/core/arti/-/issues/418 [#90]: https://gitlab.torproject.org/tpo/core/arti/-/issues/90 [87a3f6b58a5e75f7]: https://gitlab.torproject.org/tpo/core/arti/-/commit/87a3f6b58a5e75f7060a6797b8e1b33175fd5329 [RFC 8305]: https://datatracker.ietf.org/doc/html/rfc8305 [`DirMgr`]: https://tpo.pages.torproject.net/core/doc/rust/tor_dirmgr/struct.DirMgr.html [`DirProvider`]: https://tpo.pages.torproject.net/core/doc/rust/tor_dirmgr/trait.DirProvider.html [`Runtime`]: https://tpo.pages.torproject.net/core/doc/rust/tor_rtcompat/trait.Runtime.html [`SleepProvider`]: https://tpo.pages.torproject.net/core/doc/rust/tor_rtcompat/trait.SleepProvider.html [`arti-bench`]: https://tpo.pages.torproject.net/core/doc/rust/arti_bench/index.html [`arti-testing`]: https://tpo.pages.torproject.net/core/doc/rust/arti_testing/index.html [`derive_more`]: https://docs.rs/derive_more/latest/derive_more/index.html [`educe`]: https://docs.rs/educe/latest/educe/ [`tor-basic-utils`]: https://tpo.pages.torproject.net/core/doc/rust/tor_basic_utils/index.html [cb103e04cf4d9853]: https://gitlab.torproject.org/tpo/core/arti/-/commit/cb103e04cf4d985333a6949f0fd646258dcedcd2 [eed1f06662366511]: https://gitlab.torproject.org/tpo/core/arti/-/commit/eed1f06662366511fe5fd15ac0ab0cb69497f2cf [forked version of `shellexpand`]: https://crates.io/crates/shellexpand-fork [proposal 336]: https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/proposals/336-randomize-guard-retries.md [stream isolation API]: https://tpo.pages.torproject.net/core/doc/rust/tor_circmgr/isolation/index.html # Arti 0.1.0 — 1 Mar 2022 Arti 0.1.0 marks another important step towards stability, and the completion of our 0.1.0 milestone. With this milestone, we now consider Arti ready for experimental embedding within other applications. Additionally with this release, we're now ready to declare the `arti_client` API more or less stable and supported. (We're not committing to never break it again in the future, but we'll try not to do so without pretty good reasons.) The 1.0.0 release, scheduled for this September, will represent an even stronger API commitment. ### Breaking changes - Our top-level `Error` type is now a mostly-opaque wrapper around an inner hidden `ErrorDetail` type. (You can access `ErrorDetail` by enabling a feature, but it breaks your semver guarantees.) To distinguish among different kinds of `Error`s, we provide a supported (and hopefully stable) `ErrorKind` API that developers can use. ([!262], [!291], [!325], [#322], [#348]) - The interface to construct a `TorClient` instance has been completely replaced. The new API should be stable, and prevent the need for additional breaking changes in the future. ([#350], [!364], [#326]) - Many smaller changes, too numerous to list. (Starting _after_ this release, we will try be much more careful about breaking changes, and note them specifically here.) - We no longer recommend the `static` feature flag; instead use `static-native-tls` or `static-sqlite` as appropriate. ([#302]) ### New features - The Arti client can now watch its configuration files to see if they change, and reconfigure itself when they do. This is controlled by a `watch_configuration` option, and is off-by-default. ([#270], [!280]) - Unused channels now expire after enough time has passed. (This is mostly not needed on the client side, since relays also expire unused channels.) ([#41], [!273]) - You can now create an unbootstrapped TorClient object, so that you can observe its bootstrapping progress and/or bootstrap it at a later time. ([#293], [!298]) - You can configure an unbootstrapped TorClient object to automatically bootstrap itself the first time it's used. ([!322]) - Arti now returns a webpage with an error message if you try to use its SOCKS proxy as an HTTP proxy. ([!348]) - We now provide an [arti-hyper] crate for using Arti with the [hyper] HTTP library. This is also good example code for showing how to integrate Arti with other tools. ([!342], [!355]] ### Major bugfixes - Fixed a number of problems in the circuit Reactor implementation that could result in cell reordering, leading to relays closing our circuits because of protocol violations. ([!264], [!282]) - Fixed bugs that could cause strange behavior on shutdown or failure during circuit construction. ([#210], [#365], [!363], [!366], [!368]) ### Infrastructure - Numerous CI improvements. - Numerous coverage-testing improvements. - We renamed our shell and python scripts to remove their ".sh" and ".py" suffixes, so that we can more freely change their implementations in the future (if needed). ([#309]) - The `DirMgr` crate now uses an abstract `Store` trait to make it easier for us to implement new storage backends in the future. ([!345], [!317]) ### Documentation and Examples - Provide better sample code for `TorClient::connect`. ([!303]) - Provide an example for how to make a [lazy-initialized] `TorClient` object. ([#278], [!322]) - Provide an example for how to [override the default TCP-connect] implementation. ([!341], [!356]) ### Cleanups, minor features, and minor bugfixes - Stop using `:` as a path character; it's reserved on Windows. ([!277]) - Avoid returning junk data from over-long directory downloads. ([!271]) - Implement Debug and Display for many more types. - We no longer `deny(clippy::all)`; instead we only use `warn(clippy::all)` to prevent future clippy versions from breaking completely on our code. ([#338]) - As part of our `Error` refactoring and implementation of `ErrorKind`, we improved the Error objects in many individual crates for better accuracy and specificity. - Fix a bug that caused us to flush our persistent state to disk too aggressively. ([#320], [!321]) - The `arti` proxy now starts listening on its SOCKS port immediately, rather than waiting for bootstrapping to complete. ([!333]) ### Acknowledgments Thanks to everybody who has contributed to this release, including Daniel Schischkin, Dimitris Apostolou, Michael Prantl, tharvik, Trinity Pointard, and Yuan Lyu. [!262]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/262 [!264]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/264 [!271]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/271 [!273]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/273 [!277]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/277 [!280]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/280 [!282]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/282 [!291]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/291 [!298]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/298 [!303]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/303 [!317]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/317 [!321]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/321 [!322]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/322 [!325]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/325 [!333]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/333 [!341]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/341 [!342]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/342 [!345]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/345 [!348]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/348 [!355]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/355 [!356]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/356 [!363]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/363 [!364]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/364 [!366]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/366 [!368]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/368 [#210]: https://gitlab.torproject.org/tpo/core/arti/-/issues/210 [#270]: https://gitlab.torproject.org/tpo/core/arti/-/issues/270 [#278]: https://gitlab.torproject.org/tpo/core/arti/-/issues/278 [#293]: https://gitlab.torproject.org/tpo/core/arti/-/issues/293 [#302]: https://gitlab.torproject.org/tpo/core/arti/-/issues/302 [#309]: https://gitlab.torproject.org/tpo/core/arti/-/issues/309 [#320]: https://gitlab.torproject.org/tpo/core/arti/-/issues/320 [#322]: https://gitlab.torproject.org/tpo/core/arti/-/issues/322 [#326]: https://gitlab.torproject.org/tpo/core/arti/-/issues/326 [#338]: https://gitlab.torproject.org/tpo/core/arti/-/issues/338 [#348]: https://gitlab.torproject.org/tpo/core/arti/-/issues/348 [#350]: https://gitlab.torproject.org/tpo/core/arti/-/issues/350 [#365]: https://gitlab.torproject.org/tpo/core/arti/-/issues/365 [#41]: https://gitlab.torproject.org/tpo/core/arti/-/issues/41 [arti-hyper]: https://tpo.pages.torproject.net/core/doc/rust/arti_hyper/index.html [hyper]: https://crates.io/crates/hyper [lazy-initialized]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/crates/arti-client/examples/lazy-init.rs [override the default TCP-connect]: https://gitlab.torproject.org/tpo/core/arti/-/blob/main/crates/arti-client/examples/hook-tcp.rs # Arti 0.0.4 — 31 Jan 2022 This release adds support for bootstrap reporting and `rustls`, improves several APIs, fixes a few bugs, and adds numerous smaller features for future-proofing and correctness. It breaks compatibility with previous releases, as is expected before release 0.1.0 (scheduled March 2022). ### New features - Add backends for exposing changes in bootstrap status, either to be queried by a function or read as a stream of events. These APIs will become more useful once there is a way to actually get an un-bootstrapped `TorClient`. ([#96]) - `TorClient` now has a `clone_with_prefs` method to make a new client with a different set of default stream preferences. ([7ff16fc252c0121f6607], [#290]]) - Add a feature for telling a `TorClient` that every stream should be isolated on its own circuit. Please use this sparingly; it can be inefficient. ([!252]) - Convenience types for overriding parts of the behavior of an asynchronous `Runtime`. ([!251]) - Optional support for `rustls` in place of `native_tls`. This is off by default; to turn it on, use the `rustls` feature, and construct your client using one of the `Runtime`s with `Rustls` in its name. ([!260], [#86]) ### Breaking changes - Significant refactoring of exports and constructor functions in the `arti-client` crate. ([!235]) - Change the persistence format used for guard information, to make it more future-proof. ([#176]) - Functions and types that used to refer to "Connections" now refer to "Streams" for consistency. ([!256]) - The types exported by the `tor-rtcompat` crate, and the functions used to create them, have been renamed for consistency. ([!263]) - The `Runtime` API has changed slightly, to avoid a conflict with newer versions of `async_executors`. ([bf8fa66d36298561cc86]) ### Major bugfixes - Require authenticated SENDMEs when the relay supports them, and not otherwise. ([#294]) - Fix the default location for the cache files. (Previously, they were put into the state directory.) ([#297]) ### Infrastructure - Numerous improvements to coverage tooling. ([#248], [!221], [!269], [!253]) - Improvements to `arti-bench` reliability and usefulness. ([#292]) - Our CI now runs `shellcheck` on our shell scripts. ([#275]) ### Documentation - Build instructions for iOS. ([#132]) - Adopt a MSRV policy. ([#283]) - More information about troubleshooting the build process. ([#277]) ### Cleanups, minor features, and minor bugfixes - The `max_file_limit` setting is now configurable. ([#299]) - Fix an unreliable test. ([#276]) - Fix a test that would always fail when run after January 27. ([!268]) - Avoid possible incomplete reads and writes in Tor channel handshake. ([1d5a480f79e7d878ff], [!249]]) - Refactor some types to expose `Arc<>` less often. ([!236]) - Too many others to list! ### Acknowledgments Thanks to everybody who has contributed to this release, including Arturo Marquez, Daniel Eades, Daniel Schischkin, Jani Monoses, Neel Chauhan, and Trinity Pointard. [!221]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/221 [!235]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/235 [!236]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/236 [!249]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/249 [!251]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/251 [!252]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/252 [!253]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/253 [!256]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/256 [!260]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/260 [!263]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/263 [!268]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/268 [!269]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/269 [#132]: https://gitlab.torproject.org/tpo/core/arti/-/issues/132 [#176]: https://gitlab.torproject.org/tpo/core/arti/-/issues/176 [#248]: https://gitlab.torproject.org/tpo/core/arti/-/issues/248 [#275]: https://gitlab.torproject.org/tpo/core/arti/-/issues/275 [#276]: https://gitlab.torproject.org/tpo/core/arti/-/issues/276 [#277]: https://gitlab.torproject.org/tpo/core/arti/-/issues/277 [#283]: https://gitlab.torproject.org/tpo/core/arti/-/issues/283 [#290]: https://gitlab.torproject.org/tpo/core/arti/-/issues/290 [#292]: https://gitlab.torproject.org/tpo/core/arti/-/issues/292 [#294]: https://gitlab.torproject.org/tpo/core/arti/-/issues/294 [#297]: https://gitlab.torproject.org/tpo/core/arti/-/issues/297 [#299]: https://gitlab.torproject.org/tpo/core/arti/-/issues/299 [#86]: https://gitlab.torproject.org/tpo/core/arti/-/issues/86 [#96]: https://gitlab.torproject.org/tpo/core/arti/-/issues/96 [1d5a480f79e7d878ff]: https://gitlab.torproject.org/tpo/core/arti/-/commit/1d5a480f79e7d878ff291e6e8fc5225e17328919 [7ff16fc252c0121f6607]: https://gitlab.torproject.org/tpo/core/arti/-/commit/7ff16fc252c0121f660709a0dda9639eb7131d34 [bf8fa66d36298561cc86]: https://gitlab.torproject.org/tpo/core/arti/-/commit/bf8fa66d36298561cc868706f748049cec23f5eb # Arti 0.0.3 — 11 Jan 2022 This release adds support for preemptive circuit construction, refactors Arti's configuration code and behavior, and adds numerous smaller features needed for a correct Tor client implementation. It breaks compatibility with previous releases, as is expected before release 0.1.0 (scheduled March 2022). ### New features - Arti now builds preemptive circuits in order to anticipate the user's predicted needs. This change matches Tor's behavior more closely, and should reduce latency for stream creation. ([!154]) - The configuration for a [`TorClient`] object can be changed while the client is running. ([!181]) - Guard selection now obeys family restrictions concerning exit nodes. ([!139]) - Better support for overriding the [`TcpProvider`] on an Arti client and having this change affect the [`TlsProvider`]. This helps with testing support, with cases where TCP streams must be constructed specially, etc. ([!166]) - We no longer consider a directory to be "complete" until we have microdescriptors for all of our primary guards. ([!220]) ### Breaking changes - Configuration files have been reorganized, and we have an all-new API for creating configuration objects. ([!135], [!137]) - A few unused types and functions have been removed. ([214c251e] etc) - `CircMgr` now returns `ClientCirc` directly, not wrapped in an `Arc`. (ClientCirc instances are already cheap to clone.) ([!224]) - `TorClient` now has separate `connect` and `connect_with_prefs` methods. ([!229]) - Various other API refactorings and revisions. (Please remember that we plan to break backward compatibility with _every_ release between now and 0.1.0 in early March.) ### Major bugfixes - We fixed a bug in handling stream-level SENDMEs that would sometimes result in an Arti client sending too much data, causing the exit relay to close the circuit. ([!194]) ### Infrastructure - We now have an experimental benchmarking tool to compare Arti's performance with Tor's, when running over a chutney network. So far, we seem competitive, but we'll probably find cases where we underperform. ([!195]) - Our coverage tool now post-processes grcov's output to produce per-crate results. ([!163]) - Our integration test scripts are more robust to cases where the user has already configured a `CHUTNEY_PATH`. ([!168]) - We have lowered the required dependency versions in our Cargo.toml files so that each one is the lowest version that actually works with our code. ([!227]) ### Cleanups, minor features, and minor bugfixes - We store fewer needless fields from Tor directory documents. ([!151], [!165]) - We've gone through and converted _every_ XXXX comment in our code (which indicated a must-fix issue) into a ticket, or a `TODO`. ([#231]) - Our SOCKS code is much more careful about sending error messages if an error occurs before the SOCKS connection succeeds. ([!189]) - We no longer build non-directory circuits when the consensus is super-old. ([!90]) - We no longer consider timeouts to indicate that our circuits are all timing out unless we have seen _some_ recent incoming network traffic. ([!207]) - You can now configure logging to files, with support for rotating the files hourly or daily. You can have separate filters for each logging target. ([!222]) - Too many others to list! ### Acknowledgments Thanks to everybody who has contributed to this release, including dagon, Daniel Eades, Muhammad Falak R Wani, Neel Chauhan, Trinity Pointard, and Yuan Lyu! [!135]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/135 [!137]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/137 [!139]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/139 [!151]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/151 [!154]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/154 [!163]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/163 [!165]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/165 [!166]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/166 [!168]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/168 [!181]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/181 [!189]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/189 [!194]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/194 [!195]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/195 [!207]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/207 [!220]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/220 [!222]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/222 [!224]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/224 [!227]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/227 [!229]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/229 [!90]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/90 [#231]: https://gitlab.torproject.org/tpo/core/arti/-/issues/231 [214c251e]: https://gitlab.torproject.org/tpo/core/arti/-/commit/214c251e41a7583397cc5939b9447b89752ee323 [`TcpProvider`]: https://tpo.pages.torproject.net/core/doc/rust/tor_rtcompat/trait.TcpProvider.html [`TlsProvider`]: https://tpo.pages.torproject.net/core/doc/rust/tor_rtcompat/trait.TlsProvider.html [`TorClient`]: https://tpo.pages.torproject.net/core/doc/rust/arti_client/struct.TorClient.html # Arti 0.0.2 — 30 Nov 2021 This release tries to move us towards a more permanent API, and sets the stage for future work in performance evaluation and event reporting. It breaks compatibility with previous releases, as is expected before release 0.1.0 (scheduled March 2022). ### New features - Warn if guard restrictions are too strict. ([#242]) - Optimistic data is now supported on streams, and used by default on directory requests. ([#23]) - Initial cut at a typed event framework. Not yet used, but will eventually take the role of Tor's "controller event" system. ([#230]) - Large rewrite of configuration handling system, with more ergonomic builders for top-level configurations. ([#84]) ### Breaking changes - The `${APP_*}` path variables have been renamed to `${ARTI_*}`. ([efdd3275]) - The configuration file format has been substantially revised. ([#84]) - Most code that clients don't need is now behind a cargo feature. ([#124]) - Revised APIs in many other high-level crates. ### Documentation - Many other improvements and rewrites. ### Infrastructure - Update our `cargo-husky` scripts to better match our CI. ([!62]) - Use grcov, not tarpaulin. ([!136]) ### Cleanups, minor features, and bugfixes - Huge refactoring of the `tor-proto` crate to conform more closely to the reactor architecture, and reduce the need for locks. ([#205], [#217]) - By default, `cargo build --release` now chooses a more aggressive set of optimization flags. ([!124]) - Too many smaller fixes to list. ### Acknowledgments Thanks to everybody who's contributed to this release, including dagon, Daniel Eades, Dimitris Apostolou, Neel Chauhan, S0AndS0, Trinity Pointard, and Yuan Lyu! [!124]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/124 [!136]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/136 [!62]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/62 [#124]: https://gitlab.torproject.org/tpo/core/arti/-/issues/124 [#205]: https://gitlab.torproject.org/tpo/core/arti/-/issues/205 [#217]: https://gitlab.torproject.org/tpo/core/arti/-/issues/217 [#230]: https://gitlab.torproject.org/tpo/core/arti/-/issues/230 [#23]: https://gitlab.torproject.org/tpo/core/arti/-/issues/23 [#242]: https://gitlab.torproject.org/tpo/core/arti/-/issues/242 [#84]: https://gitlab.torproject.org/tpo/core/arti/-/issues/84 [efdd3275]: https://gitlab.torproject.org/tpo/core/arti/-/commit/efdd327569990cd9e4d7678bae2ac406baf7b1d5 # Arti 0.0.1 — 29 Oct 2021 This release attempts to be "free of known privacy holes". That isn't to say that there are no remaining bugs, but rather that we've implemented the missing features that we think are essential for basic privacy. ### New features - Guard relay support... ([#58]) - ...with "Lightweight" path bias detection. ([#185]) - Circuit isolation API. ([#73], [!104]) - Circuit build timeout inference. ([#57]) - Persistent state on disk. ([#59]) - Allow multiple Arti instances to share directories. ([#194]) - Support for EnforceDistinctSubnets. ([#43]) - Configurable logging ([!68]) to journald. ([!73]) - Rejecting attempts to connect to internal addresses. ([#85]) - Support for Tor `RESOLVE` and `RESOLVE_PTR` [socks extensions]. ([#33]) - And too many others to list. ### Breaking changes - Switched from `log` to `tracing`. ([#74]) - Renamed `arti-tor-client` to `arti-client`. ([#130]) - Stopped exposing `anyhow` errors. ([#165]) - CLI now uses `clap`, and uses subcommands. ([!109]) - Too many others to list. ### Documentation - New top-level documentation for `arti-client`, with examples. ([!111]) - Many other improvements and rewrites. ### Infrastructure - Reproducible builds for Linux ([!69]), Windows ([!70]), and OSX. ([!86]) - Support for static binaries. ([!69]) - Simple integration tests, using [chutney]. ([!88]) ### Cleanups, minor features, and bugfixes - Too many to list. ### Acknowledgments Thanks to everybody who's contributed to this release, including Ben Armstead, Daniel Eades, Dimitris Apostolou, Eugene Lomov, Felipe Lema, Jani Monoses, Lennart Kloock, Neel Chauhan, S0AndS0, Smitty, Trinity Pointard, Yuan Lyu, dagger, and rls! [!104]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/104 [!109]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/109 [!111]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/111 [!68]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/68 [!69]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/69 [!70]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/70 [!73]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/73 [!86]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/86 [!88]: https://gitlab.torproject.org/tpo/core/arti/-/merge_requests/88 [#130]: https://gitlab.torproject.org/tpo/core/arti/-/issues/130 [#165]: https://gitlab.torproject.org/tpo/core/arti/-/issues/165 [#185]: https://gitlab.torproject.org/tpo/core/arti/-/issues/185 [#194]: https://gitlab.torproject.org/tpo/core/arti/-/issues/194 [#33]: https://gitlab.torproject.org/tpo/core/arti/-/issues/33 [#43]: https://gitlab.torproject.org/tpo/core/arti/-/issues/43 [#57]: https://gitlab.torproject.org/tpo/core/arti/-/issues/57 [#58]: https://gitlab.torproject.org/tpo/core/arti/-/issues/58 [#59]: https://gitlab.torproject.org/tpo/core/arti/-/issues/59 [#73]: https://gitlab.torproject.org/tpo/core/arti/-/issues/73 [#74]: https://gitlab.torproject.org/tpo/core/arti/-/issues/74 [#85]: https://gitlab.torproject.org/tpo/core/arti/-/issues/85 [chutney]: https://gitlab.torproject.org/tpo/core/chutney [socks extensions]: https://gitlab.torproject.org/tpo/core/torspec/-/blob/main/socks-extensions.txt # Arti 0.0.0 Initial release, to reserve our crate names on crates.io.