PQSecScan PQC by MiraeStudio.id

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

CheckReference valueWeight
PQ key exchange (TLS 1.3)A standard ML-KEM group, e.g. X25519MLKEM768100
CertificateAn ML-DSA or SLH-DSA key60
SSHClosed to the internet, or mlkem768x25519 + an ed25519 host key with no RSA50
TLS versionsTLS 1.3 only40

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.

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.

GroupCodepointKind
X25519MLKEM7680x11ECHybrid, standard (RFC 10024)
SecP256r1MLKEM7680x11EBHybrid, standard (RFC 10024)
SecP384r1MLKEM10240x11EDHybrid, standard (RFC 10024)
MLKEM768, MLKEM10240x0201, 0x0202Pure ML-KEM
X25519Kyber768Draft000x6399Kyber draft, obsolete
X255190x001DClassical, 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

ConditionScore
Accepts at least one standard ML-KEM group (hybrid or pure)100
Accepts only X25519Kyber768Draft0050
No PQ group, or TLS does not respond0

Certificate

Leaf certificate keyScore
ML-DSA or SLH-DSA100
Classical and still classically strong: RSA ≥ 2048 bits, ECDSA ≥ 256 bits, Ed25519/Ed44865
RSA < 2048 bits, ECDSA < 256 bits, DSA, or an unknown algorithm20
Untrusted chain−30
Expired or invalid0

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

ConditionPoints (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

ConditionScore
Ports 22 and 2222 closed100
Port open but KEXINIT unreadable50
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

GradeScore
A90–100
B80–89
C65–79
D50–64
E0–49

Why these weights

The threat itself is explained in Understanding your result.

Limits

Sources

  1. NIST FIPS 203: ML-KEM (2024)
  2. NIST FIPS 204: ML-DSA (2024)
  3. NIST FIPS 205: SLH-DSA (2024)
  4. NIST IR 8547 (draft): Transition to Post-Quantum Cryptography Standards (2024)
  5. NIST SP 800-227: Recommendations for KEMs (2025)
  6. NIST selects HQC (March 2025)
  7. RFC 10024: hybrid ML-KEM for TLS 1.3 (August 2026)
  8. RFC 8446 §4.1.4: HelloRetryRequest
  9. RFC 8996: deprecating TLS 1.0 and 1.1
  10. BSSN: Post-Quantum Cryptography Migration Guide v1.0 (December 2025, in Indonesian)
  11. BSSN: Indonesian list of cryptographic algorithms (in Indonesian)
  12. OMB M-26-15: Execution of the Migration to Post-Quantum Cryptography (June 2026)
  13. Gidney: RSA-2048 with fewer than a million qubits (2025)
  14. Webster et al. (Iceberg Quantum): RSA-2048 with fewer than 100,000 qubits (2026)
  15. Babbush et al. (Google Quantum AI): ECC-256 with fewer than 500,000 qubits (2026)
  16. Global Risk Institute: Quantum Threat Timeline Report 2025
  17. Let's Encrypt: post-quantum certificate plans (2026)
  18. Cloudflare Radar: post-quantum adoption
  19. OpenSSL 3.5 release notes (2025)
  20. OpenSSH release notes