Verify a release
Alongside the binary tarballs, each release ships SHA256SUMS (the manifest) and SHA256SUMS.sig (its Ed25519 signature). All artifacts, plus the signing key, are attached to each GitHub release; /public/ indexes the releases and the machine-readable manifest.
Already running magus? Use the built-in verifier:
magus self update --dry-run
The trust chain runs through your already-trusted binary. Nothing else to do.
First install: verify by hand. Do not verify a fresh magus with itself: a tampered build carries the attacker's key and self-reports success. Use OpenSSL with the key served from this HTTPS page.
-
Save the key. Either download magus-release.pem, or copy the PEM block below into
magus-release.pem. -
Verify the manifest signature (requires OpenSSL 3.0+):
openssl pkeyutl -verify -pubin -inkey magus-release.pem \ -rawin -in SHA256SUMS -sigfile SHA256SUMS.sig # Signature Verified Successfully -
Only if the signature verifies, check the artifact hash:
sha256sum --ignore-missing -c SHA256SUMS # macOS: shasum -a 256 --ignore-missing -c SHA256SUMS--ignore-missingskips manifest entries for artifacts you did not download, so the output stays limited to the file you fetched, without piping throughgrep, which would replace the command's exit status withgrep's and let a failed check report success.
Order matters. Checking a hash against an unverified manifest proves nothing. The whole procedure in one picture: each merged cell consumes everything beside it, and the tarball deliberately skips the first step, because nothing signs the tarball directly:
Have OpenSSL 3.0+ with Ed25519 support on PATH | |||
magus-release.pem: the key, from this HTTPS page |
verify the signatureopenssl pkeyutl -verify |
check the hashsha256sum -c |
a release you can trust |
SHA256SUMS: the manifest, from the release | |||
SHA256SUMS.sig: its signature, from the release | |||
magus-<os>-<arch>.tar.gz: the artifact you downloaded | |||
Release signing key (Ed25519)
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA/7uPpvNidN79EoiAk8ajIsJTK8VFAW9JWrSVXey2Z3k=
-----END PUBLIC KEY-----
Raw base64 (32 bytes):
/7uPpvNidN79EoiAk8ajIsJTK8VFAW9JWrSVXey2Z3k=
The key is embedded in every magus binary via //go:embed, so magus self update trusts it transitively. A planned rotation first ships a release signed by the current key that embeds the replacement key; later releases can use the replacement. Older binaries cannot be remotely revoked if the current key is compromised. The maintainer procedure is in the contributing guide.