Release signing
The keys that sign our releases.
Every Dainamiq release is a digest file signed twice: once with ML-DSA-87 (FIPS 204, post-quantum) and once with OpenPGP Ed25519. Both signatures are made offline. Check them against the fingerprints on this page before you run the image.
Keyring
Fingerprints and status.
The machine-readable keyring is /keys/keys.toml. A key is never removed: when one is rotated it is marked retired with the date it stopped signing, and releases it signed before then still verify.
No keys are published yet.
The signing keys and the verifier are published here together, with the first signed release.
Verify a release
Three steps, on your own machine.
You need OpenSSL 3.5 or later (for ML-DSA), GnuPG, and a POSIX shell. Nothing touches your own GnuPG keyring.
1. Download
For release <tag>, fetch the digest file and its two signatures from /releases/dainamiq-kme/<tag>/, the keyring and every key file it lists into one directory, and the verifier verify.sh. The verifier is published here with the first key.
TAG=v0.1.0 R=https://dainamiq.com/releases/dainamiq-kme/$TAG F=dainamiq-kme-$TAG.digest curl -fO $R/$F -fO $R/$F.mldsa87.sig -fO $R/$F.asc curl -fO https://dainamiq.com/keys/verify.sh mkdir keys && curl -f -o keys/keys.toml https://dainamiq.com/keys/keys.toml # then each file named in keys/keys.toml: curl -f -o keys/<file> https://dainamiq.com/keys/<file>
2. Verify
verify.sh checks that the digest file is well formed, that the ML-DSA-87 signature verifies under the key named on its mldsa87-key line, and that the OpenPGP signature verifies under a listed key. It prints one ok/FAIL line per check and exits 0 only when every check passes.
sh verify.sh $F --keys keys
Or check the two signatures by hand:
openssl pkeyutl -verify -rawin -pubin -inkey keys/mldsa87-<…>.pem \ -in $F -sigfile $F.mldsa87.sig export GNUPGHOME=$(mktemp -d) gpg --import keys/openpgp-<…>.asc gpg --verify $F.asc $F
3. Compare fingerprints
A signature only means something if the key is ours. The ML-DSA-87 key id is the SHA-256 of the key’s DER SubjectPublicKeyInfo; the OpenPGP key id is its primary-key fingerprint. Both must match a row in the table above, and the mldsa87-key line of the digest file must match the ML-DSA-87 key you verified with.
openssl pkey -pubin -in keys/mldsa87-<…>.pem -outform DER | openssl dgst -sha256 gpg --show-keys --with-fingerprint keys/openpgp-<…>.asc
The digest line of a verified digest file is the image digest. Pull by it (image@sha256:…) and you run exactly the signed image.