Method and reference values
What the scanner sends, how each row on the result sheet is scored, and why the weights are what they are. Every rule on this page matches the scanner's code exactly. As of October 2026.
The highest score a public site can reach today is 92, not 100. Full marks on the certificate need an ML-DSA or SLH-DSA certificate, and no public CA issues those for the web yet. A site that already uses ML-KEM, offers only TLS 1.3, and keeps SSH off the internet scores 92 (grade A). The last 8 points can only be earned once PQC certificates exist, expected from 2027.
Reference values
The "Reference value" column on the result sheet shows what full marks require. A result below the reference gets the flag L; a result below 50 gets the flag ! (critical).
| Check | Reference value | Weight |
|---|---|---|
| PQ key exchange (TLS 1.3) | A standard ML-KEM group, e.g. X25519MLKEM768 | 100 |
| Certificate | An ML-DSA or SLH-DSA key | 60 |
| SSH | Closed to the internet, or mlkem768x25519 + an ed25519 host key with no RSA | 50 |
| TLS versions | TLS 1.3 only | 40 |
Scope
SecScan checks a host from outside, the way any browser or SSH client on the internet sees it. Checks are read-only: the scanner only sends protocol opening messages (TLS ClientHello, SSH banner) and reads the server's first reply. No login, no application data, and no attack attempts.
- A target is a domain or IP with an optional port (
host:port, default 443). Up to 4 targets per check. - Domains are resolved and the first address (IPv4 if there is one) is checked. Private, loopback and link-local addresses are refused, so the scanner cannot be used to reach internal networks.
- Only check systems you own or have permission to test.
How each probe works
TLS versions
For each version (1.0, 1.1, 1.2, 1.3) the scanner sends one ClientHello offering only that version. The version counts as enabled if the server answers with a ServerHello for the same version. The messages are built by hand, byte by byte, so the result does not depend on which TLS versions the scanning machine's library supports.
Post-quantum key exchange (TLS 1.3)
Each group is tested on its own. A TLS 1.3 ClientHello offers exactly one group in supported_groups
with an empty key_share. A server that supports the group must answer with a HelloRetryRequest naming it
(RFC 8446 §4.1.4); a server that doesn't answers with an alert. This way the scanner never needs its own ML-KEM implementation.
| Group | Codepoint | Kind |
|---|---|---|
X25519MLKEM768 | 0x11EC | Hybrid, standard (RFC 10024) |
SecP256r1MLKEM768 | 0x11EB | Hybrid, standard (RFC 10024) |
SecP384r1MLKEM1024 | 0x11ED | Hybrid, standard (RFC 10024) |
MLKEM768, MLKEM1024 | 0x0201, 0x0202 | Pure ML-KEM |
X25519Kyber768Draft00 | 0x6399 | Kyber draft, obsolete |
X25519 | 0x001D | Classical, for comparison |
Certificate
The scanner makes an ordinary TLS handshake and reads the leaf certificate: public key type and size, signature algorithm, and expiry date. A second handshake validates the chain and host name against the system trust store. ML-DSA-44/65/87 and SLH-DSA OIDs are recognised as post-quantum certificates.
SSH
Ports 22 and 2222 are opened, the banner is read, and the scanner reads the server's KEXINIT message. That message is sent unencrypted before authentication and lists the key exchange and host key algorithms the server supports. The connection closes before any login.
How the score is calculated
Each check produces a score from 0 to 100. The composite score is the weighted average of the selected checks,
rounded: score = Σ(weight × check score) / Σ weight. Checks that weren't selected don't count.
PQ key exchange
| Condition | Score |
|---|---|
| Accepts at least one standard ML-KEM group (hybrid or pure) | 100 |
Accepts only X25519Kyber768Draft00 | 50 |
| No PQ group, or TLS does not respond | 0 |
Certificate
| Leaf certificate key | Score |
|---|---|
| ML-DSA or SLH-DSA | 100 |
| Classical and still classically strong: RSA ≥ 2048 bits, ECDSA ≥ 256 bits, Ed25519/Ed448 | 65 |
| RSA < 2048 bits, ECDSA < 256 bits, DSA, or an unknown algorithm | 20 |
| Untrusted chain | −30 |
| Expired or invalid | 0 |
Every classical key gets the same score. Shor's algorithm breaks RSA and ECC alike, and growing an RSA key to 3072 or 4096 bits adds no meaningful quantum resistance. Scoring big RSA keys higher would push migration in the wrong direction.
TLS versions
| Condition | Points (of 40) |
|---|---|
| TLS 1.3 enabled | +25 |
| TLS 1.3 enabled and TLS 1.2 disabled | +15 |
| TLS 1.0 or 1.1 still enabled (RFC 8996) | −10 |
Score = points ÷ 40 × 100. For example: TLS 1.3 only = 100; TLS 1.2 + 1.3 = 62; no TLS 1.3 = 0.
SSH
| Condition | Score |
|---|---|
| Ports 22 and 2222 closed | 100 |
| Port open but KEXINIT unreadable | 50 |
Supports PQ KEX (mlkem768x25519-sha256 or sntrup761x25519-sha512) | +25 points |
Offers an ssh-ed25519 host key | +15 points |
| No RSA host key | +10 points |
For an open port, score = points ÷ 50 × 100.
Grades and PQC status
| Grade | Score |
|---|---|
| A | 90–100 |
| B | 80–89 |
| C | 65–79 |
| D | 50–64 |
| E | 0–49 |
- PQC-ready: key exchange and certificate both score 100.
- Partly ready: key exchange is PQ, the certificate is still classical. This is the best a public site can reach today.
- Not ready: key exchange is not PQ yet.
Why these weights
- Key exchange (100) carries the largest weight because traffic recorded today can be opened once a quantum computer exists. Site owners can also fix it today with a software update.
- Certificate (60) protects the server's identity. Old signatures can't be forged after the fact, so the threat only becomes real once a quantum computer exists. Site owners can't do much about it until CAs issue PQC certificates.
- SSH (50) is the administration door. An SSH port open to the internet widens the attack surface, so keeping it closed scores highest.
- TLS versions (40) are a prerequisite: PQ key exchange only exists in TLS 1.3, and a TLS 1.2 that's still enabled lets clients fall back to classical key exchange.
The threat itself is explained in Understanding your result.
Limits
- Only one IP address per target is checked. Hosts with several IPs or a load balancer may give different results per node.
- Sites behind a CDN or reverse proxy are scored on the edge, not the origin server.
- Only the public surface is checked: HTTPS and SSH. VPNs, internal networks, application tokens (JWT), stored data, HSMs and firmware signing are invisible from outside and need their own cryptographic inventory (CBOM).
- Only the leaf certificate is scored; intermediate and root CAs are not.
- Firewalls or rate limits can block probes and make a feature look disabled.
- A result is a snapshot of the moment it was taken.
Sources
- NIST FIPS 203: ML-KEM (2024)
- NIST FIPS 204: ML-DSA (2024)
- NIST FIPS 205: SLH-DSA (2024)
- NIST IR 8547 (draft): Transition to Post-Quantum Cryptography Standards (2024)
- NIST SP 800-227: Recommendations for KEMs (2025)
- NIST selects HQC (March 2025)
- RFC 10024: hybrid ML-KEM for TLS 1.3 (August 2026)
- RFC 8446 §4.1.4: HelloRetryRequest
- RFC 8996: deprecating TLS 1.0 and 1.1
- BSSN: Post-Quantum Cryptography Migration Guide v1.0 (December 2025, in Indonesian)
- BSSN: Indonesian list of cryptographic algorithms (in Indonesian)
- OMB M-26-15: Execution of the Migration to Post-Quantum Cryptography (June 2026)
- Gidney: RSA-2048 with fewer than a million qubits (2025)
- Webster et al. (Iceberg Quantum): RSA-2048 with fewer than 100,000 qubits (2026)
- Babbush et al. (Google Quantum AI): ECC-256 with fewer than 500,000 qubits (2026)
- Global Risk Institute: Quantum Threat Timeline Report 2025
- Let's Encrypt: post-quantum certificate plans (2026)
- Cloudflare Radar: post-quantum adoption
- OpenSSL 3.5 release notes (2025)
- OpenSSH release notes