From 561691aa900d8c0ba6130a0ead45efb096a78ac7 Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Mon, 7 Sep 2026 19:37:40 -0700 Subject: [PATCH 1/4] feat(assets): vendor the canonical branded DIG icon Adds the byte-pinned dig.ico (10 frames), the Windows .rc referencing it at ordinal 1, and the sha256 drift gate script. Refs #2917. --- assets/dig.ico | Bin 0 -> 50443 bytes assets/dig.rc | 18 ++++++++++++++++++ scripts/check-icon.sh | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 assets/dig.ico create mode 100644 assets/dig.rc create mode 100644 scripts/check-icon.sh diff --git a/assets/dig.ico b/assets/dig.ico new file mode 100644 index 0000000000000000000000000000000000000000..e10b838a2d0384d7c08fe3f1b783ab3ff3aaf28b GIT binary patch literal 50443 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 + exit 1 +fi + +actual="$(sha256sum "$ICON" | cut -d' ' -f1)" + +if [[ "$actual" != "$EXPECTED_SHA256" ]]; then + echo "FAIL: $ICON has drifted from the canonical DIG icon." >&2 + echo " expected sha256: $EXPECTED_SHA256" >&2 + echo " actual sha256: $actual" >&2 + echo "Restore the canonical bytes; do not re-save or re-export the icon." >&2 + exit 1 +fi + +echo "OK: $ICON matches the canonical DIG icon ($EXPECTED_SHA256)." From a2999ef50d7f1d5bb563f0e2852304c347e0b7b3 Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Mon, 7 Sep 2026 19:52:10 -0700 Subject: [PATCH 2/4] feat(icon): embed the branded DIG icon in dig-node, dign and dig-wallet Adds a Windows build-dependency on embed-resource 3.x to dig-node-service and dig-wallet and compiles assets/dig.rc into a linked resource. dig-node-service uses embed_resource::compile_for scoped to ["dig-node", "dign"] so the fake_beacon_cli test fixture stays unbranded; dig-wallet has a single bin so the unscoped compile() is used. The pre-existing GET /version git-sha build.rs logic in dig-node-service is untouched, only extended. Also adds the icon-asset CI job (sha256 pin) to ci.yml. Refs #2917. --- .github/workflows/ci.yml | 15 ++++++++++++++ crates/dig-node-service/Cargo.toml | 6 ++++++ crates/dig-node-service/build.rs | 32 ++++++++++++++++++++++++++++++ crates/dig-wallet/Cargo.toml | 6 ++++++ crates/dig-wallet/build.rs | 28 ++++++++++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 crates/dig-wallet/build.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a14e129..221b651e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -158,3 +158,18 @@ jobs: cat coverage-summary.txt 2>/dev/null || echo 'no coverage output' echo '```' } >> "$GITHUB_STEP_SUMMARY" + + # The vendored branded icon is byte-pinned; see scripts/check-icon.sh for why + # drift is made loud rather than impossible. Cheap and dependency-free, so it + # runs as its own job and reports independently of the compile gates. + icon: + name: icon asset (sha256 pin) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + # Invoked through `bash` rather than relying on the file mode: a checkout + # that loses the executable bit would otherwise fail this gate for a + # reason that has nothing to do with the icon. + - run: bash scripts/check-icon.sh diff --git a/crates/dig-node-service/Cargo.toml b/crates/dig-node-service/Cargo.toml index 3666c163..f048c1c9 100644 --- a/crates/dig-node-service/Cargo.toml +++ b/crates/dig-node-service/Cargo.toml @@ -297,6 +297,12 @@ libc = "0.2" [target.'cfg(windows)'.dependencies] windows-service = "0.7" +# Compiles the branded DIG icon (`../../assets/dig.rc`) into a Windows resource that +# `build.rs` links into `dig-node`/`dign` (dig_ecosystem#2917). Not a `dig-*`/`chia-*` +# crate, so no cross-repo version lockstep applies here. +[target.'cfg(windows)'.build-dependencies] +embed-resource = "3" + # The install-root owner-SID probe (#565 LPE) reads the directory owner through the Win32 security # API (`GetNamedSecurityInfoW` → owner SID → `ConvertSidToStringSidW`) instead of spawning a # PowerShell owner query — a bare-name spawn from the (attacker-writable) install root is itself the diff --git a/crates/dig-node-service/build.rs b/crates/dig-node-service/build.rs index 6b15f9c3..6c930da5 100644 --- a/crates/dig-node-service/build.rs +++ b/crates/dig-node-service/build.rs @@ -6,6 +6,10 @@ //! is emitted as a compile-time env var (`DIG_NODE_GIT_SHA`). When the build //! happens outside a git checkout (e.g. a packaged source tarball), the SHA is //! recorded as `"unknown"` rather than failing the build. +//! +//! On Windows this also embeds the branded DIG application icon +//! (`../../assets/dig.rc`, dig_ecosystem#2917) into the `dig-node` and `dign` +//! binaries only -- see `embed_icon` below for why `fake_beacon_cli` is excluded. use std::process::Command; @@ -15,6 +19,34 @@ fn main() { // Rerun if the checked-out commit moves, so the embedded SHA stays accurate. println!("cargo:rerun-if-changed=.git/HEAD"); println!("cargo:rerun-if-changed=.git/refs"); + + #[cfg(windows)] + embed_icon(); +} + +/// Compile the branded DIG icon into `dig-node` and `dign` only. +/// +/// `embed_resource::compile` (unscoped) emits `cargo:rustc-link-arg-bins`, which +/// reaches EVERY bin this crate produces -- including `fake_beacon_cli`, a test +/// fixture that stands in for the real (separate-repo) `dig-updater` beacon CLI +/// and must never carry the DIG brand. `compile_for` scopes the link line to the +/// two shipped binary names instead, so `fake_beacon_cli` stays icon-less. +/// +/// `.manifest_required()`/`.expect(..)` is deliberate: an environment that cannot +/// compile a resource must fail the build loudly rather than silently ship an +/// unbranded `dig-node`/`dign`. +#[cfg(windows)] +fn embed_icon() { + embed_resource::compile_for( + "../../assets/dig.rc", + &["dig-node", "dign"], + embed_resource::NONE, + ) + .manifest_required() + .expect("failed to compile assets/dig.rc — no usable Windows resource compiler?"); + + println!("cargo:rerun-if-changed=../../assets/dig.rc"); + println!("cargo:rerun-if-changed=../../assets/dig.ico"); } /// The short git SHA of HEAD, or `None` outside a git checkout / without git. diff --git a/crates/dig-wallet/Cargo.toml b/crates/dig-wallet/Cargo.toml index 922debf4..a791b4ca 100644 --- a/crates/dig-wallet/Cargo.toml +++ b/crates/dig-wallet/Cargo.toml @@ -13,6 +13,12 @@ path = "src/lib.rs" name = "dig-wallet" path = "src/main.rs" +# Compiles the branded DIG icon (`../../assets/dig.rc`) into a Windows resource that +# `build.rs` links into the `dig-wallet` binary (dig_ecosystem#2917). Not a `dig-*`/ +# `chia-*` crate, so no cross-repo version lockstep applies here. +[target.'cfg(windows)'.build-dependencies] +embed-resource = "3" + [dependencies] # Store-format libs from the digstore repo (git deps, pinned to the same rev as the # node — bump together). digstore-chain: BIP-39 seed + HD wallet scan + DIG-CAT + diff --git a/crates/dig-wallet/build.rs b/crates/dig-wallet/build.rs new file mode 100644 index 00000000..d26e88d6 --- /dev/null +++ b/crates/dig-wallet/build.rs @@ -0,0 +1,28 @@ +//! Build script: on Windows, embed the branded DIG application icon +//! (`../../assets/dig.rc`, dig_ecosystem#2917) into the `dig-wallet` binary. +//! +//! This crate has a single bin (`dig-wallet`), so the unscoped +//! `embed_resource::compile` -- which links to every bin the crate produces -- +//! is safe to use here (contrast `dig-node-service`, which must exclude its +//! `fake_beacon_cli` test fixture and therefore uses `compile_for` instead). +//! +//! `.manifest_required()`/`.expect(..)` is deliberate: an environment that +//! cannot compile a resource must fail the build loudly rather than silently +//! ship an unbranded binary. +//! +//! No-op on non-Windows. + +fn main() { + #[cfg(windows)] + embed_icon(); +} + +#[cfg(windows)] +fn embed_icon() { + embed_resource::compile("../../assets/dig.rc", embed_resource::NONE) + .manifest_required() + .expect("failed to compile assets/dig.rc — no usable Windows resource compiler?"); + + println!("cargo:rerun-if-changed=../../assets/dig.rc"); + println!("cargo:rerun-if-changed=../../assets/dig.ico"); +} From 3f9ca0e05993147e4b01457735dd418d64531217 Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Mon, 7 Sep 2026 20:07:53 -0700 Subject: [PATCH 3/4] chore(deps): update Cargo.lock for embed-resource --locked builds (build .deb, Clippy, Test + coverage) failed CI because the lockfile was not regenerated when embed-resource was added as a Windows build-dependency (dig_ecosystem#2917); the lockfile is cross-platform and not gated by cfg(windows). Only embed-resource and its own deps (toml, vswhom, vswhom-sys, winreg) are added -- diffed against origin/develop, nothing existing moved. --- Cargo.lock | 91 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0a7478c6..20cd91cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,7 +139,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -150,7 +150,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1948,7 +1948,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -3072,6 +3072,7 @@ dependencies = [ "digstore-core 0.29.0", "digstore-crypto", "digstore-stage", + "embed-resource", "futures-util", "getrandom 0.2.17", "hex", @@ -3398,6 +3399,7 @@ dependencies = [ "dig-options 0.5.0", "digstore-chain", "digstore-core 0.29.0", + "embed-resource", "futures-core", "getrandom 0.2.17", "hex", @@ -3752,7 +3754,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3838,6 +3840,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.5+spec-1.1.0", + "vswhom", + "winreg", +] + [[package]] name = "embedded-io" version = "0.4.0" @@ -3900,7 +3916,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4536,7 +4552,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.6.5", "system-configuration", "tokio", "tower-service", @@ -4787,7 +4803,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5169,7 +5185,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5780,7 +5796,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.3", "rustls", - "socket2 0.5.10", + "socket2 0.6.5", "thiserror 2.0.20", "tokio", "tracing", @@ -5818,9 +5834,9 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.5", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6570,7 +6586,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.12.1", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7020,7 +7036,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -7282,7 +7298,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix 1.1.4", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7545,6 +7561,21 @@ dependencies = [ "winnow 0.7.15", ] +[[package]] +name = "toml" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12c0ba9680044b4ce98d391a62094047eada0d64860b80166c39f4a6b5640785" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -7959,6 +7990,26 @@ version = "0.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -8416,7 +8467,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -8815,6 +8866,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if 1.0.4", + "windows-sys 0.59.0", +] + [[package]] name = "wit-bindgen" version = "0.57.1" From 6c1a3287d1ee6ddd5790f0a551cfb5e6c4d236bb Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Mon, 7 Sep 2026 23:26:53 -0700 Subject: [PATCH 4/4] fix(build): keep the cfg(windows) dependency table intact The `[target.'cfg(windows)'.build-dependencies]` header for embed-resource was inserted in the MIDDLE of the existing `[target.'cfg(windows)'.dependencies]` table. In TOML a table header ends the preceding table, so every entry below it -- windows-sys among them -- silently stopped being a runtime dependency and became a build dependency, and the lib failed to compile with nine copies of `cannot find module or crate windows_sys` on the windows-x64 msi job. Moving the block to the end of the file leaves the runtime table whole. Cargo.lock is unchanged by this move (same package, same version, different section), which is why no lockfile review would have caught the defect. Refs #2917 --- crates/dig-node-service/Cargo.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/dig-node-service/Cargo.toml b/crates/dig-node-service/Cargo.toml index f048c1c9..399ba83a 100644 --- a/crates/dig-node-service/Cargo.toml +++ b/crates/dig-node-service/Cargo.toml @@ -297,12 +297,6 @@ libc = "0.2" [target.'cfg(windows)'.dependencies] windows-service = "0.7" -# Compiles the branded DIG icon (`../../assets/dig.rc`) into a Windows resource that -# `build.rs` links into `dig-node`/`dign` (dig_ecosystem#2917). Not a `dig-*`/`chia-*` -# crate, so no cross-repo version lockstep applies here. -[target.'cfg(windows)'.build-dependencies] -embed-resource = "3" - # The install-root owner-SID probe (#565 LPE) reads the directory owner through the Win32 security # API (`GetNamedSecurityInfoW` → owner SID → `ConvertSidToStringSidW`) instead of spawning a # PowerShell owner query — a bare-name spawn from the (attacker-writable) install root is itself the @@ -399,3 +393,9 @@ async-trait = "0.1" # into a mock `dig.getContent` window, so the node's RPC tier verifies-then-fails-closed and records # the failed entry. `base64` matches dig-node-core's version. base64 = "0.22" + +# Compiles the branded DIG icon (`../../assets/dig.rc`) into a Windows resource that +# `build.rs` links into `dig-node`/`dign` (dig_ecosystem#2917). Not a `dig-*`/`chia-*` +# crate, so no cross-repo version lockstep applies here. +[target.'cfg(windows)'.build-dependencies] +embed-resource = "3"