Verify Downloads
All Hugin releases are signed with Ed25519. Verify authenticity before running.
Why verify?
SHA256 checksums only verify that a download wasn't corrupted in transit. They don't prove the download came from us â an attacker who compromises the release page can replace both the binary and its checksum.
Ed25519 signatures prove authenticity. The signing key never leaves our CI. Even if the release page is compromised, the attacker can't produce valid signatures.
Using the Hugin CLI
The fastest way to verify a download:
hugin verify hugin-cli-linux-x86_64.tar.gzThis checks <file>.sig against the public key embedded in the binary. You can also specify a custom signature path:
hugin verify myfile.tar.gz --sig /path/to/myfile.tar.gz.sigManual verification
If you don't want to trust the Hugin binary itself (bootstrapping problem), you can verify with standard tools.
With Python
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
import base64
# Public key (from https://hugin.nu/signing-key)
pub_hex = "a61ff9262c4509a7879ddaa5a8d86345ef805f6ddced28b097bf58dae270618b"
pub_key = Ed25519PublicKey.from_public_bytes(bytes.fromhex(pub_hex))
# Read file and signature
with open("hugin-cli-linux-x86_64.tar.gz", "rb") as f:
data = f.read()
with open("hugin-cli-linux-x86_64.tar.gz.sig") as f:
sig_line = f.read().strip()
sig_b64 = sig_line.removeprefix("hugin-sig-ed25519:")
signature = base64.b64decode(sig_b64)
pub_key.verify(signature, data)
print("Signature valid.")With OpenSSL (3.0+)
# Extract raw signature from .sig file
SIG_B64=$(cut -d: -f2 hugin-cli-linux-x86_64.tar.gz.sig)
echo "$SIG_B64" | base64 -d > /tmp/sig.raw
# Create public key in PEM format
echo "MCowBQYDK2VwAyEAph/5JixFCaeHndqlqNhjRe+AX23c7Siwl79Y2uJwYYs=" | \
base64 -d | openssl pkey -inform DER -pubin -outform PEM -out /tmp/release.pub
# Verify
openssl pkeyutl -verify -pubin -inkey /tmp/release.pub \
-rawin -in hugin-cli-linux-x86_64.tar.gz -sigfile /tmp/sig.rawSigning key
Ed25519 public key used to sign all Hugin releases:
Hex: a61ff9262c4509a7879ddaa5a8d86345ef805f6ddced28b097bf58dae270618bBase64: ph/5JixFCaeHndqlqNhjRe+AX23c7Siwl79Y2uJwYYs=Machine-readable: GET /signing-key
This key is separate from the license signing key. It is also embedded in the Hugin binary for offline verification.
Signature format
Each release artifact has a .sig sidecar file containing:
hugin-sig-ed25519:<base64(64-byte-Ed25519-signature)>The signed message is the raw file bytes. One line, no metadata. The hugin-sig-ed25519: prefix makes the format self-describing and grep-able.