Skip to content

Release Signing

Every Dwaar release binary is cryptographically signed using cosign.

The public releases on GitHub are signed keylessly by the release.yml GitHub Actions workflow via Sigstore. This is the default path and it requires no public key to verify — the signing certificate and transparency-log proof are embedded in the .bundle. Verification only checks that the bundle was signed by Dwaar’s release workflow identity and chains back to Fulcio.

A separate enterprise / BYOS path exists for organizations that run their own release pipeline with a KMS- or file-backed cosign key. That path verifies the bundle against a public key you pin via DWAAR_COSIGN_PUBKEY / DWAAR_COSIGN_PUBKEY_URL. It is opt-in and does not apply to the binaries published at github.com/permanu/Dwaar.

GitHub Actions OIDC token (release.yml workflow identity)
Fulcio exchanges it for a short-lived signing certificate
cosign sign-blob --bundle <artifact>.bundle <artifact>
Verifier checks the bundle's cert identity + Fulcio chain (no key needed)

The certificate’s Subject Alternative Name (SAN) is the workflow URI https://github.com/permanu/Dwaar/.github/workflows/release.yml@refs/tags/<tag>, and verification confirms it chains back to Fulcio with the expected OIDC issuer.

Trust chain (enterprise / BYOS — key-pinned)

Section titled “Trust chain (enterprise / BYOS — key-pinned)”
Your KMS/local/env cosign key
cosign sign-blob --key <key> --bundle <artifact>.bundle <artifact>
Verifier checks the bundle against your configured public key

For each platform binary (e.g. dwaar-linux-amd64) the following files are attached to the GitHub Release:

FileContents
dwaar-<os>-<arch>The binary
dwaar-<os>-<arch>.sha256SHA256 checksum
dwaar-<os>-<arch>.bundleSelf-contained cosign bundle (cert + signature + log proof) — this is all you need to verify
dwaar-<os>-<arch>.sigOptional detached signature (not published by every release; redundant with the bundle)
dwaar-<os>-<arch>.certOptional short-lived signing certificate, PEM (not published by every release; redundant with the bundle)
SHASUMS.txtAggregated SHA256 for all binaries
Terminal window
curl -fsSL https://dwaar.dev/install.sh | sh

By default the installer:

  1. Always verifies the SHA-256 checksum.
  2. Verifies the keyless cosign signature if cosign is installed — no key or extra configuration required. A self-contained .bundle is all that is needed.
  3. If cosign is not installed, prints a prominent warning and continues, relying on the SHA-256 check for integrity. (This is best-effort, Caddy-style verification — it never blocks a normal install on a missing tool.)

To require keyless verification instead of warning, simply install cosign first (brew install cosign, or download the binary — see below).

For the enterprise / BYOS key-pinned path, set exactly one public-key source. In this mode cosign is mandatory and keyless fallback is refused:

Terminal window
DWAAR_COSIGN_PUBKEY=/path/to/dwaar-release.pub sh install.sh
# or
DWAAR_COSIGN_PUBKEY_URL=https://example.com/dwaar.pub sh install.sh

The installer never fetches a mutable key URL unless you explicitly set one.

Default (keyless). Download the binary and its .bundle sibling — no key needed:

Terminal window
cosign verify-blob dwaar-linux-amd64 \
--bundle dwaar-linux-amd64.bundle \
--certificate-identity-regexp "^https://github\.com/permanu/Dwaar/\.github/workflows/release\.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"

Older releases that published split .sig / .cert instead of a bundle verify the same way:

Terminal window
cosign verify-blob dwaar-linux-amd64 \
--certificate dwaar-linux-amd64.cert \
--signature dwaar-linux-amd64.sig \
--certificate-identity-regexp "^https://github\.com/permanu/Dwaar/\.github/workflows/release\.yml@.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"

Enterprise / BYOS (key-pinned). Download the binary, .bundle, and your pinned public key, then run:

Terminal window
cosign verify-blob dwaar-linux-amd64 \
--bundle dwaar-linux-amd64.bundle \
--key dwaar-release.pub

Replace dwaar-linux-amd64 with your platform artifact name (dwaar-linux-arm64, dwaar-darwin-arm64).

A successful verification prints:

Verified OK
Terminal window
# macOS
brew install cosign
# Linux (direct download)
curl -Lo cosign https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64
chmod +x cosign && sudo mv cosign /usr/local/bin/

See the cosign releases page for all platforms.

The --certificate-identity-regexp you verify against is:

^https://github\.com/permanu/Dwaar/\.github/workflows/release\.yml@.*

This anchors to the permanu/Dwaar repository and the release.yml workflow file. The @.* suffix matches any git ref (tag, branch) so the same command works for any release version.

To additionally pin to a specific tag:

Terminal window
--certificate-identity "https://github.com/permanu/Dwaar/.github/workflows/release.yml@refs/tags/v0.3.8"

dwaar self-update uses the same trust policy as the installer. By default it verifies the keyless cosign bundle against the release workflow identity (no key needed). If you have configured DWAAR_COSIGN_PUBKEY / DWAAR_COSIGN_PUBKEY_URL, it verifies against that pinned key instead and refuses keyless fallback. Unlike the installer, self-update requires cosign and refuses to swap the binary if verification fails or cosign is missing.