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.