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.gz

This 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.sig

Manual 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.raw

Signing key

Ed25519 public key used to sign all Hugin releases:

Hex:    a61ff9262c4509a7879ddaa5a8d86345ef805f6ddced28b097bf58dae270618b
Base64: 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.