Repository navigation
Adapt to chacha20 - #1642
Adapt to chacha20#1642
Conversation
|
I opened #1643. This PR is useful as a draft but won't be merged in its current form (likely we'll want the MSRV/edition bump first as its own PR). I'm not certain on the timeline yet; the main blocker is the |
0fbb567 to
e41e428
Compare
|
@dhardy I've rebased and the new tests failed as expected (the default ChaCha12 in chacha20 is the IETF variant). I tried to change to the "Legacy" variant, but chacha20 only exports ChaCha20Legacy, not the 12 round variant that we will need here. The ChaCha20Legacy type is just an alias, so I tried to use the underlying type directly to make a 12 round variant ( @tarcieri It seems that I might stuck here until someone either exports |
It's an oversight, we should export it. Could you create a PR? It also may be worth to add aliases for the legacy variants as well. |
|
@hpenne I'm confused, why do you need a |
|
@tarcieri When I add the "legacy" feature to the chacha20 crate dependency in the rand cargo.toml, the chacha20 crate fails to build: Seems to work fine when i build run tests in chacha20 itself. Odd. |
|
@hpenne all of the RNG types now have a 64-bit counter as of the latest prerelease. Also looks like you found a bug. Perhaps it was being hidden by feature unification? Strange. |
|
@hpenne oh, you're using an out-of-date version! Please upgrade to v0.10.0-rc.1 |
…sions that are no longer needed.
@tarcieri That was embarrassing. Works much better with the correct version. All tests pass now. The only strangeness that I am left with is that if I do not enable the "legacy" feature (the only enabled feature is "rng"), chacha20 fails to build with: I'm not able to reproduce this when I build chacha20 locally from master, so perhaps I've done something wrong or you have already fixed this on master. I'll look closer tomorrow. |
|
@hpenne aah that was RustCrypto/stream-ciphers#454 which has been fixed I can cut an |
dhardy
left a comment
There was a problem hiding this comment.
Sorry, I did not think to appraise you of the chacha20 changes. I think we have all the pieces to make a rand pre-release now.
| rng.set_stream(i); | ||
| rng.set_stream(u64::from(i)); |
There was a problem hiding this comment.
Yes. I used to need to convert to u128 with the old chacha20. I had to change u64 when I rebased but failed to notice that I could simply remove the conversion. Will fix.
| rand_chacha = { path = "rand_chacha", version = "0.9.0", default-features = false, optional = true } | ||
| chacha20 = { version = "=0.10.0-rc.1", default-features = false, features = ["rng", "legacy"], optional = true } |
There was a problem hiding this comment.
We can depend on the "legacy" feature for now, but add a TODO comment to remove it on the next version.
|
|
||
| ## [0.10.0 — Unreleased] | ||
| ### Changes | ||
| - The dependency on `rand_chacha` has been replaced with a dependency on `chacha20`. This changes the implementation behind `StdRng`, but the output remains the same. There may be some API breakage when using the ChaCha-types directly as these are now the ones in `chacha20` instead of `rand_chacha`. |
…:from in rayon-monte-carlo.rs. Added a ToDo in Cargo.toml to remove the "legacy" feature of chacha20.
| # ToDo: Remove the "legacy" feature from chacha20 when this is not longer necessary | ||
| chacha20 = { version = "=0.10.0-rc.1", default-features = false, features = ["rng", "legacy"], optional = true } |
There was a problem hiding this comment.
I've released an rc.2 with the feature-related bugfix:
| # ToDo: Remove the "legacy" feature from chacha20 when this is not longer necessary | |
| chacha20 = { version = "=0.10.0-rc.1", default-features = false, features = ["rng", "legacy"], optional = true } | |
| # ToDo: Remove the "legacy" feature from chacha20 when this is not longer necessary | |
| chacha20 = { version = "=0.10.0-rc.2", default-features = false, features = ["rng"], optional = true } |
There was a problem hiding this comment.
Done. I removed the ToDo-comment as well, now that the "legacy" feature is no longer necessary.
Bumps rand from 0.9.4 to 0.10.1. Changelog Sourced from rand's changelog. [0.10.1] — 2026-02-11 This release includes a fix for a soundness bug; see #1763. Changes Document panic behavior of make_rng and add #[track_caller] (#1761) Deprecate feature log (#1763) #1761: rust-random/rand#1761 #1763: rust-random/rand#1763 [0.10.0] - 2026-02-08 Changes The dependency on rand_chacha has been replaced with a dependency on chacha20. This changes the implementation behind StdRng, but the output remains the same. There may be some API breakage when using the ChaCha-types directly as these are now the ones in chacha20 instead of rand_chacha (#1642). Rename fns IndexedRandom::choose_multiple -> sample, choose_multiple_array -> sample_array, choose_multiple_weighted -> sample_weighted, struct SliceChooseIter -> IndexedSamples and fns IteratorRandom::choose_multiple -> sample, choose_multiple_fill -> sample_fill (#1632) Use Edition 2024 and MSRV 1.85 (#1653) Let Fill be implemented for element types, not sliceable types (#1652) Fix OsError::raw_os_error on UEFI targets by returning Option<usize> (#1665) Replace fn TryRngCore::read_adapter(..) -> RngReadAdapter with simpler struct RngReader (#1669) Remove fns SeedableRng::from_os_rng, try_from_os_rng (#1674) Remove Clone support for StdRng, ReseedingRng (#1677) Use postcard instead of bincode to test the serde feature (#1693) Avoid excessive allocation in IteratorRandom::sample when amount is much larger than iterator size (#1695) Rename os_rng -> sys_rng, OsRng -> SysRng, OsError -> SysError (#1697) Rename Rng -> RngExt as upstream rand_core has renamed RngCore -> Rng (#1717) Additions Add fns IndexedRandom::choose_iter, choose_weighted_iter (#1632) Pub export Xoshiro128PlusPlus, Xoshiro256PlusPlus prngs (#1649) Pub export ChaCha8Rng, ChaCha12Rng, ChaCha20Rng behind chacha feature (#1659) Fn rand::make_rng() -> R where R: SeedableRng (#1734) Removals Removed ReseedingRng (#1722) Removed unused feature "nightly" (#1732) Removed feature small_rng (#1732) #1632: rust-random/rand#1632 #1642: rust-random/rand#1642 #1649: rust-random/rand#1649 #1652: rust-random/rand#1652 #1653: rust-random/rand#1653 #1659: rust-random/rand#1659 #1665: rust-random/rand#1665 #1669: rust-random/rand#1669 #1674: rust-random/rand#1674 #1677: rust-random/rand#1677 #1693: rust-random/rand#1693 #1695: rust-random/rand#1695 #1697: rust-random/rand#1697 ... (truncated) Commits 27ff4cb Prepare v0.10.1: deprecate feature log (#1763) 98d0638 make_rng: document panic and add #[track_caller] (#1761) 54e5eaa Fix doc error (#1758) 1ce4c08 Bump itoa from 1.0.17 to 1.0.18 in the all-deps group (#1756) ccb734b docs: fix typo in doc comment (#1754) 357eb7d Bump libc from 0.2.182 to 0.2.183 in the all-deps group (#1753) 5e77fe5 Fix trait references in documentation (#1752) da89185 Bump the all-deps group with 3 updates (#1751) 50516ff Bump the all-deps group with 2 updates (#1749) fd71de9 Bump the all-deps group with 2 updates (#1747) Additional commits viewable in compare view
##### [v0.10.3](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0103--2026-09-20) ##### Fixes - Fix `WeightedIndex` panic when the sum of float weights is infinite; return `Error::Overflow` instead ([#1808]) - Fix spurious `Error::NonFinite` from `Uniform::new_inclusive` on large finite float ranges such as `0.0..=f64::MAX` ([#1821]) - Fix possible panic due to sampling a deserialized `Uniform<char>` ([#1831]) ##### Changes - Report exact remaining lengths from `WeightedIndex::weights()` and reduce overhead when reading weights ([#1838]) [#1808]: rust-random/rand#1808 [#1821]: rust-random/rand#1821 [#1831]: rust-random/rand#1831 [#1838]: rust-random/rand#1838 ##### [v0.10.2](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0102--2026-07-02) ##### Fixes - Fix possible memory safety violation due to deserialization of `UniformChar` from bad source ([#1790]) ##### Changes - Document required output order of fn `partial_shuffle` and apply `#[must_use]` ([#1769]) - Avoid usage of `unsafe` in contexts where non-local memory corruption could invalidate contract ([#1791]) [#1769]: rust-random/rand#1769 [#1790]: rust-random/rand#1790 [#1791]: rust-random/rand#1791 ##### [v0.10.1](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0101--2026-02-11) This release includes a fix for a soundness bug; see [#1763]. ##### Changes - Document panic behavior of `make_rng` and add `#[track_caller]` ([#1761]) - Deprecate feature `log` ([#1763]) [#1761]: rust-random/rand#1761 [#1763]: rust-random/rand#1763 ##### [v0.10.0](https://github.com/rust-random/rand/blob/HEAD/CHANGELOG.md#0100---2026-02-08) ##### Changes - The dependency on `rand_chacha` has been replaced with a dependency on `chacha20`. This changes the implementation behind `StdRng`, but the output remains the same. There may be some API breakage when using the ChaCha-types directly as these are now the ones in `chacha20` instead of `rand_chacha` ([#1642]). - Rename fns `IndexedRandom::choose_multiple` -> `sample`, `choose_multiple_array` -> `sample_array`, `choose_multiple_weighted` -> `sample_weighted`, struct `SliceChooseIter` -> `IndexedSamples` and fns `IteratorRandom::choose_multiple` -> `sample`, `choose_multiple_fill` -> `sample_fill` ([#1632]) - Use Edition 2024 and MSRV 1.85 ([#1653]) - Let `Fill` be implemented for element types, not sliceable types ([#1652]) - Fix `OsError::raw_os_error` on UEFI targets by returning `Option<usize>` ([#1665]) - Replace fn `TryRngCore::read_adapter(..) -> RngReadAdapter` with simpler struct `RngReader` ([#1669]) - Remove fns `SeedableRng::from_os_rng`, `try_from_os_rng` ([#1674]) - Remove `Clone` support for `StdRng`, `ReseedingRng` ([#1677]) - Use `postcard` instead of `bincode` to test the serde feature ([#1693]) - Avoid excessive allocation in `IteratorRandom::sample` when `amount` is much larger than iterator size ([#1695]) - Rename `os_rng` -> `sys_rng`, `OsRng` -> `SysRng`, `OsError` -> `SysError` ([#1697]) - Rename `Rng` -> `RngExt` as upstream `rand_core` has renamed `RngCore` -> `Rng` ([#1717]) ##### Additions - Add fns `IndexedRandom::choose_iter`, `choose_weighted_iter` ([#1632]) - Pub export `Xoshiro128PlusPlus`, `Xoshiro256PlusPlus` prngs ([#1649]) - Pub export `ChaCha8Rng`, `ChaCha12Rng`, `ChaCha20Rng` behind `chacha` feature ([#1659]) - Fn `rand::make_rng() -> R where R: SeedableRng` ([#1734]) ##### Removals - Removed `ReseedingRng` ([#1722]) - Removed unused feature "nightly" ([#1732]) - Removed feature `small_rng` ([#1732]) [#1632]: rust-random/rand#1632 [#1642]: rust-random/rand#1642 [#1649]: rust-random/rand#1649 [#1652]: rust-random/rand#1652 [#1653]: rust-random/rand#1653 [#1659]: rust-random/rand#1659 [#1665]: rust-random/rand#1665 [#1669]: rust-random/rand#1669 [#1674]: rust-random/rand#1674 [#1677]: rust-random/rand#1677 [#1693]: rust-random/rand#1693 [#1695]: rust-random/rand#1695 [#1697]: rust-random/rand#1697 [#1717]: rust-random/rand#1717 [#1722]: rust-random/rand#1722 [#1732]: rust-random/rand#1732 [#1734]: rust-random/rand#1734 ##### [v0.9.5](https://github.com/rust-random/rand/releases/tag/0.9.5) #### What's Changed - rand v0.9.5: backport [#1790](rust-random/rand#1790) by [@dhardy](https://github.com/dhardy) in [#1803](rust-random/rand#1803) **Full Changelog**: <rust-random/rand@0.9.4...0.9.5> ##### [v0.9.4](https://github.com/rust-random/rand/releases/tag/0.9.4) ##### Fixes - Fix doc build ([#1766]) [#1766]: rust-random/rand#1766 **Full Changelog**: <rust-random/rand@0.9.3...0.9.4> ##### [v0.9.3](rust-random/rand@0.9.2...0.9.3)
CHANGELOG.mdentrySummary
Replaced the dependency on
rand_chachawith one onchacha20. Added some tests tostd.rsto ensure that the output ofStdRngdid not change.Fixes #934.
Motivation
Reduces total code size and the total amount of unsafe code.
Details
Changes to config.toml and some replacement of
rand_chacha::withchacha20::.Added three new unit tests to std.rs. These were based on tests of IETF test vectors from
rand_chacha, but the actualexpectedvalues had to be replaced, as the IETF test vectors are for ChaCha20 whileranduses ChaCha12. Theexpectedvalues were generated by usingrand_chacha(beforechacha20was used) to verify that the algorithm change did not affect the output.