Skip to content

chore(deps): move off a yanked chacha20 and fail on the next one (R18) - #51

Merged
haiquang9994 merged 2 commits into
masterfrom
chore/r18-move-off-a-yanked-chacha20
Aug 29, 2026
Merged

chore(deps): move off a yanked chacha20 and fail on the next one (R18)#51
haiquang9994 merged 2 commits into
masterfrom
chore/r18-move-off-a-yanked-chacha20

Conversation

@haiquang9994

Copy link
Copy Markdown
Collaborator

cargo update -p chacha20 moves 0.10.1 → 0.10.2 and touches two lines of Cargo.lock.
hickory does not move: the yanked version had a sibling inside the same ^0.10 that
rand 0.10 already accepts.

Why it was yanked was established rather than assumed, and did not need the network.
chacha20's own CHANGELOG for 0.10.2 (2026-08-27): "Fixed: Use of SSE4.1 intrinsic in
SSE2 backend of RNG and legacy (64-bit counter) variants"
. Both versions are still in the
local registry cache, so it is checkable rather than quoted: 0.10.1's
src/backends/sse2.rs calls _mm_extract_epi32 at :54 and :133 — an SSE4.1
intrinsic — and 0.10.2's calls none.

So it is a crash, not a wrong answer, which is why RustSec carries no advisory for it.
Backend selection is runtime CPUID over avx512, avx2 and sse2, and nothing in that
dispatch tests SSE4.1. On x86-64, SSE2 is baseline and SSE4.1 is not, so a CPU with
neither AVX2 nor SSE4.1 picks the SSE2 backend and executes an instruction it does not
have: SIGILL.

It reaches this workspace through hickory-protorand 0.10 → chacha20, which is
where DNS message ids come from — so mixengined's DNS server would abort on a pre-2008
x86-64. No CI runner is that old, which is exactly why nothing was ever seen and why the
yank was the only evidence there was.

yanked is now "deny", R9's ratchet for R9's reason. This makes the build depend on
somebody else's action
, which the duplicate check does not: a new duplicate needs a
change here, a yank needs only an upstream author, so master can go red on a day nobody
touched it. That is accepted rather than overlooked, argued at the setting, and the repair
is one line. Watched failing first: the new level against the old lock exits 1 naming
chacha20.

CI: all 10 jobs green on the first run, lint included.

The key is out of the working tree, verified before it was moved. The half of
the suggestion aimed at release/publish.sh does not apply: that script signs
nothing, it dispatches publish-index.yml, which is the only thing that signs and
which verifies its own signature against the committed public key on every run.

So what sat in the tree was the backup rather than the thing that signs, which
is the worse fact. The .gitignore comment saying the key belongs in Actions
secrets 'and nowhere else' is corrected — that reading is how a machine ends up
holding the only backup in a directory git clean sweeps.
cargo update -p chacha20 moves 0.10.1 to 0.10.2 and touches two lines of
Cargo.lock. hickory does not move: the yanked version had a sibling inside the
same ^0.10 that rand 0.10 already accepts.

Why it was yanked was established rather than assumed, and did not need the
network. chacha20's own CHANGELOG for 0.10.2 says the SSE2 backend used an
SSE4.1 intrinsic in the RNG and legacy variants, and both versions are still in
the local registry cache, so it is checkable: 0.10.1's src/backends/sse2.rs calls
_mm_extract_epi32 at :54 and :133, an SSE4.1 intrinsic, and 0.10.2's calls none.

That makes it a crash rather than a wrong answer, which is why RustSec carries no
advisory. Backend selection is runtime CPUID over avx512, avx2 and sse2, and
nothing in it tests SSE4.1; on x86-64 SSE2 is baseline and SSE4.1 is not, so a
CPU with neither AVX2 nor SSE4.1 picks the SSE2 backend and executes an
instruction it does not have. It reaches this workspace through hickory-proto ->
rand 0.10 -> chacha20, which is where DNS message ids come from, so mixengined's
DNS server would abort on a pre-2008 x86-64. No CI runner is that old, which is
why the yank was the only evidence there was.

yanked is now deny rather than warn, R9's ratchet for R9's reason. This makes the
build depend on somebody else's action, which the duplicate check does not: a
yank needs only an upstream author, so master can go red on a day nobody touched
it. Accepted rather than overlooked, argued at the setting, and the repair is one
line. Watched failing first: the new level against the old lock exits 1 naming
chacha20.
@haiquang9994
haiquang9994 merged commit d1cdf97 into master Aug 29, 2026
10 checks passed
@haiquang9994
haiquang9994 deleted the chore/r18-move-off-a-yanked-chacha20 branch August 29, 2026 10:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant