diff options
| author | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-06 01:53:03 +0000 |
|---|---|---|
| committer | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-06 01:53:03 +0000 |
| commit | ef9f06d43fc6577c15df2256abbb25b20d4227b8 (patch) | |
| tree | 7e9132aa871fdc01cb95268d2f5ea3bb11853ddf /docs/release-verification.md | |
| parent | be63e83d79e7e00e6b8ca889a70e6a19886aa1d8 (diff) | |
| parent | ceae3d076b5ad11ee84729ae43f14e9312896646 (diff) | |
Bring main onto the line this project actually ships (incl. the 1.2.23 compactblock port)
Closes #6, #7, #8, #11, #35, #34, #29, #28, #27, and #16
See merge request !16
Diffstat (limited to 'docs/release-verification.md')
| -rw-r--r-- | docs/release-verification.md | 94 |
1 files changed, 67 insertions, 27 deletions
diff --git a/docs/release-verification.md b/docs/release-verification.md index ecacd5f..b8eaf5e 100644 --- a/docs/release-verification.md +++ b/docs/release-verification.md | |||
| @@ -3,60 +3,100 @@ | |||
| 3 | Bitflash releases publish binaries and a `SHA256SUMS` file. The checksum file | 3 | Bitflash releases publish binaries and a `SHA256SUMS` file. The checksum file |
| 4 | proves that the file you downloaded matches the file the release page names. | 4 | proves that the file you downloaded matches the file the release page names. |
| 5 | A detached signature, `SHA256SUMS.asc`, proves that the checksum file itself was | 5 | A detached signature, `SHA256SUMS.asc`, proves that the checksum file itself was |
| 6 | signed by a trusted release key. | 6 | signed by the Bitflash release key. |
| 7 | 7 | ||
| 8 | That gives users two separate checks: | 8 | That gives users two separate checks: |
| 9 | 9 | ||
| 10 | 1. `gpg --verify SHA256SUMS.asc SHA256SUMS` checks who signed the checksums. | 10 | 1. `gpg --verify SHA256SUMS.asc SHA256SUMS` — who signed the checksums. |
| 11 | 2. `sha256sum -c SHA256SUMS` checks the binaries against those checksums. | 11 | 2. `sha256sum -c SHA256SUMS` — the binaries against those checksums. |
| 12 | 12 | ||
| 13 | ## User Check | 13 | But the first check is only worth something if you require a **specific** key. |
| 14 | A good signature by *some* key proves nothing; anyone can make one. | ||
| 14 | 15 | ||
| 15 | From a shell with `curl` or `wget` and `sha256sum`: | 16 | ## The release signing key |
| 17 | |||
| 18 | ```text | ||
| 19 | fingerprint 910A 2B4C CA87 9E81 FB4B 2AEA 1D4A 53D3 B78A A4B8 | ||
| 20 | uid Bitflash Releases (bitflash.network release signing) | ||
| 21 | <releases@bitflash.network> | ||
| 22 | ``` | ||
| 23 | |||
| 24 | The public key is published at | ||
| 25 | `https://releases.bitflash.network/bitflash-release-key.asc` and embedded in | ||
| 26 | `scripts/verify-release.sh`, so the tool's trust anchor lives in this | ||
| 27 | repository rather than on the server it verifies. | ||
| 28 | |||
| 29 | ## User check | ||
| 30 | |||
| 31 | From a shell with `curl` or `wget`, `sha256sum` and `gpg`: | ||
| 16 | 32 | ||
| 17 | ```bash | 33 | ```bash |
| 18 | scripts/verify-release.sh latest | 34 | scripts/verify-release.sh latest |
| 19 | ``` | 35 | ``` |
| 20 | 36 | ||
| 21 | For a specific release: | 37 | The public release host should expose latest-file aliases for convenience: |
| 22 | 38 | ||
| 23 | ```bash | 39 | ```text |
| 24 | scripts/verify-release.sh v1.2.13 | 40 | https://releases.bitflash.network/SHA256SUMS |
| 41 | https://releases.bitflash.network/SHA256SUMS.asc | ||
| 25 | ``` | 42 | ``` |
| 26 | 43 | ||
| 27 | For release audits, require the signature: | 44 | Those aliases must point at the current versioned directory. They do not replace |
| 45 | signature verification; they only make the common manual path shorter. | ||
| 46 | |||
| 47 | For a specific release: | ||
| 28 | 48 | ||
| 29 | ```bash | 49 | ```bash |
| 30 | scripts/verify-release.sh v1.2.13 --require-signature | 50 | scripts/verify-release.sh v1.2.15 |
| 31 | ``` | 51 | ``` |
| 32 | 52 | ||
| 33 | Older releases may not have `SHA256SUMS.asc`. In that case the script warns and | 53 | The script downloads the release, imports the pinned key into a throwaway |
| 34 | still checks file integrity. New release audits should use `--require-signature`. | 54 | keyring, and **refuses anything that is not a valid signature by the key above** |
| 35 | 55 | before checking the hashes. Releases from before signing was introduced ship | |
| 36 | ## Maintainer Flow | 56 | only `SHA256SUMS`; without `--require-signature` those are checked for integrity |
| 57 | and reported as unsigned. | ||
| 37 | 58 | ||
| 38 | After building release assets in the repository root: | 59 | By hand, if you would rather not run the script: |
| 39 | 60 | ||
| 40 | ```bash | 61 | ```bash |
| 41 | scripts/make-release-checksums.sh --sign --local-user RELEASE_KEY_ID | 62 | curl -O https://releases.bitflash.network/bitflash-release-key.asc |
| 63 | gpg --import bitflash-release-key.asc | ||
| 64 | gpg --verify SHA256SUMS.asc SHA256SUMS # must name the fingerprint above | ||
| 65 | sha256sum -c SHA256SUMS | ||
| 42 | ``` | 66 | ``` |
| 43 | 67 | ||
| 44 | Upload all built assets plus: | 68 | ## Maintainer flow |
| 45 | 69 | ||
| 46 | ```text | 70 | The signing key lives on a dedicated location, not in the build tree. After |
| 47 | SHA256SUMS | 71 | building the release assets in the repository root, write and sign the |
| 48 | SHA256SUMS.asc | 72 | checksums: |
| 73 | |||
| 74 | ```bash | ||
| 75 | sha256sum Bitflash-*.zip Bitflash-*.AppImage bitflash-node-* > SHA256SUMS | ||
| 76 | gpg --armor --detach-sign --output SHA256SUMS.asc SHA256SUMS | ||
| 49 | ``` | 77 | ``` |
| 50 | 78 | ||
| 51 | Keep the private signing key offline or on a dedicated release machine. Publish | 79 | Publish, alongside the assets, `SHA256SUMS` and `SHA256SUMS.asc`, and update |
| 52 | the public key fingerprint in the release notes and keep using the same key for | 80 | `latest.txt` on the releases host to the new tag. Keep using the same key; if it |
| 53 | future releases unless there is a clearly announced rotation. | 81 | is ever rotated, announce the new fingerprint clearly and update the embedded |
| 82 | key in `verify-release.sh`. | ||
| 83 | |||
| 84 | For Windows releases with managed Tor built in, run `make windows-tor`. It | ||
| 85 | creates `Bitflash-*-windows-with-tor.zip` by downloading the Tor Expert Bundle, | ||
| 86 | checking the pinned SHA256 in `scripts/package-windows-tor.sh`, optionally | ||
| 87 | verifying the Tor Project `.asc` signature, and placing `tor/tor.exe` next to | ||
| 88 | `Bitflash.exe`. For release builds, run `TOR_VERIFY_GPG=required make | ||
| 89 | windows-tor` so the signature check is mandatory. Include that zip in | ||
| 90 | `SHA256SUMS` like any other release asset. | ||
| 54 | 91 | ||
| 55 | ## Why This Matters | 92 | ## Why this matters |
| 56 | 93 | ||
| 57 | `SHA256SUMS` alone protects against a broken download, but not against someone | 94 | `SHA256SUMS` alone protects against a broken download, but not against someone |
| 58 | replacing both a binary and the checksum file. Signing `SHA256SUMS` means an | 95 | replacing both a binary and the checksum file. Signing `SHA256SUMS`, and |
| 59 | attacker must also have the release signing key to make the replacement verify. | 96 | requiring a pinned key, means an attacker must also hold the release signing key |
| 97 | to make the replacement verify. Serving from bitflash.network makes this the | ||
| 98 | guarantee that matters: without a pinned key, "trust the site" is the only | ||
| 99 | thing standing behind a download. | ||
| 60 | 100 | ||
| 61 | This is not reproducible builds yet. It is the smaller, immediate step that | 101 | This is not reproducible builds yet. It is the smaller, immediate step that |
| 62 | makes every release asset auditable by users before they run it. | 102 | makes every release asset auditable before anyone runs it. |