# QNSQY Release Signing and Verification

How QNSQY releases are signed, and how anyone (auditors, customers, journalists) can check them. The install scripts `install.sh` and `install.ps1` point here.

**Last updated:** 2026-10-15
**Applies to:** the Standard edition downloads, QNSQY 7.2.45 and later. The Approved Mode and CNSA 2.0 editions are not released; the CNSA 2.0 edition will ship as an offline install kit with its own SHA-512 checksums signed with ML-DSA-87.

---

## What we publish with each release

| File | What it is |
|------|------------|
| `qnsqy_<version>-1_amd64.deb`, `qnsqy-<version>-1....x86_64.rpm` | Linux packages (x86-64) |
| `qnsqy-setup-<version>.exe` | Windows installer (x64) |
| `qnsqy-<version>-x86_64.exe` | Windows portable program (x64) |
| `qnsqy-<version>.cdx.json` | Software bill of materials (CycloneDX) of the release |
| `checksums.txt` | SHA-256 of each file above |
| `checksums.txt.sig` | ML-DSA-87 signature over `checksums.txt` |

Packages are served from `https://cdn.quantumsequrity.com/` (`linux/` and `windows/`), each folder set with a signed `checksums.txt` whose names match the files there. The website copy, `https://quantumsequrity.com/downloads/checksums.txt`, also lists the SBOM.

## Verification layers

1. **TLS** on every download.
2. **SHA-256** (NIST FIPS 180-4): each file is compared with its line in `checksums.txt`.
3. **ML-DSA-87 signature** (NIST FIPS 204, security category 5) over `checksums.txt`. `qnsqy verify-release` checks it with the release public key that is compiled into the program, so the key cannot be swapped by changing a file on disk. The Linux install script checks the SHA-256 of the package, then runs this check with the program from the downloaded package, before it installs anything. Any failure stops the install.
4. **apt and dnf repositories** (`https://cdn.quantumsequrity.com/repo/`): the repository metadata is signed with the QNSQY repository GPG key, so `apt` and `dnf` check it on every install and update.
5. **Sigstore** (cosign, keyless): the website's list for the current release, 7.2.45 (`https://quantumsequrity.com/downloads/checksums.txt`), is also signed with a short-lived certificate tied to our public GitHub build workflow (repository `quantumsequrity/qnsqy`, workflow `sign-release.yml`), and the signature is recorded in the public Rekor transparency log. It is a separate signature that does not use the ML-DSA-87 key. The signature files are `checksums.txt.cosign.sig` and `checksums.txt.cosign.pem`; the commands are on the download page. The list in the `linux/` and `windows/` folders of the download server (the same file in both) has its own Sigstore signature, made the same way: `checksums.txt.cosign.sig` and `checksums.txt.cosign.pem` in each folder. To check it, run the download page's `cosign verify-blob` command on the three files from `https://cdn.quantumsequrity.com/linux/` (or `windows/`). This signing is done separately, after a release is published, and has not happened for every release (7.2.44 has none). If these files belong to an earlier release, cosign reports a failure; the SHA-256 and ML-DSA-87 checks still apply.

Not in place yet, stated plainly:

- **Windows code signing.** The Windows installer and program are not Authenticode-signed. SmartScreen may warn on first run. Check the SHA-256 and, after installing, the ML-DSA-87 signature as shown below. A code-signing certificate is planned.
- **Reproducible builds.** Two builds of the same version are not yet guaranteed to be byte-identical. This is on the roadmap.

We use ML-DSA-87, not Ed25519, for the release signature so that a release can still be checked after a cryptographically relevant quantum computer exists.

## Public keys

Release signing key (ML-DSA-87, FIPS 204, security category 5), BLAKE3 fingerprint of the raw public key:

```
50af23b47dca8d74b054d09095a773751267e856324eb688e820daa1a1d241ff
```

`qnsqy verify-release` prints the first 16 hex characters of this fingerprint before its verdict.

Repository key (GPG, Ed25519), for apt and dnf:

```
QNSQY Package Repository <security@quantumsequrity.com>
C8BE B5E1 75D4 493B 6067  8BB8 E76B B1B3 9C41 D8B6   (expires 2030-06-09)
```

If the release key ever changes, the fingerprint here changes with the release that introduces it, and older programs refuse the new signature (they fail closed).

## How to verify a release yourself

### Linux

```bash
# 1. Download the checksum list, its signature and your package from the same place
curl -fsSLO https://cdn.quantumsequrity.com/linux/checksums.txt
curl -fsSLO https://cdn.quantumsequrity.com/linux/checksums.txt.sig
curl -fsSLO https://cdn.quantumsequrity.com/linux/qnsqy_7.2.45-1_amd64.deb   # or qnsqy-7.2.45-1.x86_64.rpm

# 2. SHA-256 (FIPS 180-4)
sha256sum -c checksums.txt --ignore-missing

# 3. ML-DSA-87 signature (with an installed qnsqy)
qnsqy verify-release checksums.txt checksums.txt.sig
# Using embedded release public key (BLAKE3 fingerprint: 50af23b47dca8d74)
#   Release signature VALID: checksums.txt (... bytes)
#   Algorithm: ML-DSA-87 (NIST FIPS 204, level 5)
# RELEASE_SIGNATURE_OK
```

If you do not have `qnsqy` yet, the install script runs step 3 for you before installing.

The website also publishes a signed list at `https://quantumsequrity.com/downloads/checksums.txt` that adds the software bill of materials. In the 7.2.45 list the .rpm appears under its build name (`qnsqy-7.2.45-1.20261014171645.g588cc7cb.x86_64.rpm`); it is the same file as `qnsqy-7.2.45-1.x86_64.rpm` (same SHA-256), so compare that line by hand, or use the list above.

### Windows (PowerShell)

```powershell
# 1. Download
Invoke-WebRequest https://cdn.quantumsequrity.com/linux/checksums.txt     -OutFile checksums.txt
Invoke-WebRequest https://cdn.quantumsequrity.com/linux/checksums.txt.sig -OutFile checksums.txt.sig
Invoke-WebRequest https://cdn.quantumsequrity.com/windows/qnsqy-setup-7.2.45.exe -OutFile qnsqy-setup-7.2.45.exe

# 2. SHA-256: compare with the matching line in checksums.txt
Get-FileHash .\qnsqy-setup-7.2.45.exe -Algorithm SHA256
Select-String -Path checksums.txt -Pattern 'qnsqy-setup-7.2.45.exe'

# 3. ML-DSA-87, after installing
qnsqy verify-release checksums.txt checksums.txt.sig
```

## Key custody

The release signing private key is held by Quantum Sequrity and used only to sign releases. We do not publish where or how it is stored. If you find evidence that it has been misused or compromised, write to `security@quantumsequrity.com` at once.

## Reporting tampering

If a file you downloaded does not match `checksums.txt`, or the signature check fails, even once during a cache refresh, email `security@quantumsequrity.com` with the time and what you saw. We would rather check ten false alarms than miss a real one.

## Standards referenced

- NIST FIPS 180-4 (SHA-256)
- NIST FIPS 204 (ML-DSA)
- CycloneDX 1.6 (software bill of materials)

## Changes

- **2026-10-16:** The 7.2.45 list is signed with Sigstore; Sigstore moved from "not in place yet" to the verification layers.
- **2026-10-15:** Rewritten for 7.2.45. Corrected statements that were not accurate, and updated the file list, the examples and the repository key.
- **2026-04-25:** First publication.
