03 How it works

How Quantsiv Works

Four steps, from scanning your code to a standard record (a CycloneDX 1.6 CBOM).

1. Discover

Quantsiv looks for cryptography in your source code. Scans run in your CI by default, so your code stays in your environment, and Quantsiv receives the CBOM and the finding details only if you choose to upload them. You can also have Quantsiv scan a public repository on its own servers; private repositories are not scanned there.

2. Analyze

Each finding is checked against quantum-vulnerable algorithms and ranked by its retention period.

3. Rank

For each finding, Quantsiv explains the priority and the standard to migrate to.

4. Document

Quantsiv generates a CycloneDX 1.6 CBOM, a SARIF file that works with code-analysis tools, and a report with the findings ranked by priority. An AI agent uses this information to suggest quantum-safe alternatives and help plan the changes. Quantsiv compares each build's results with the latest main-branch build, flagging regressions.

Example finding

Output*

example/billing-service branch main commit 1e94656 Scan complete Illustrative preview

Cryptographic inventory

Assets found
10
Quantum-vulnerable
9
Quantum-safe
1
Files scanned
8

Severity

  • Critical 4
  • High 5

Exposure

  • Harvest Now, Decrypt Later 4
  • Signature forgery 4
  • Use not classified 1

Findings

6 more assets
  • criticalECDH-256, key agreement web/src/card-vault.ts:3
  • highECDSA-256, certificate key certs/api.crt:1
  • highECDSA-256, key generation services/ledger/sign.go:12
  • highECDSA, signature services/ledger/sign.go:17
  • highRSA-3072, use not classified scripts/make-release-key.sh:3
  • safeX25519MLKEM768, hybrid key exchange deploy/nginx.conf:6

Finding: RSA-OAEP encryption

critical Harvest Now, Decrypt Later src/billing_export.py:10
Business context
Customer records must stay secret for 25 years (declared in the repository's quantsiv.yml)
Why it ranks here
Protects data that must stay confidential for 25 years.
The risk
RSA-based public-key cryptography is vulnerable to sufficiently capable quantum computers. Data intercepted today may become decryptable in the future if the relevant encryption or key-establishment mechanisms are compromised.
Move to
Replace RSA encryption/key transport with ML-KEM (FIPS 203) plus an AEAD.
Authority
EO 14412 (22 Jun 2026): post-quantum key establishment on high-value assets and high-impact systems by 31 Dec 2030. NIST IR 8547 (ipd): 112-bit RSA/ECC/DH deprecated after 2030, all quantum-vulnerable public-key algorithms disallowed after 2035.

Quantsiv AI: migration analysis

Analysis complete In your CI, on the model you choose Simulated output

The current implementation uses RSA-OAEP to protect exported customer records with a 25-year confidentiality requirement.

Not a drop-in swap. Here RSA-OAEP wraps the AES key that encrypts each export. ML-KEM does not encrypt a chosen key: it establishes a shared secret, and the data key is derived from it. AES-256-GCM keeps encrypting the records.

Recommended migration
  1. Review the existing RSA-OAEP encryption and key-management flow.
  2. Evaluate ML-KEM (FIPS 203) for post-quantum key establishment, including hybrid approaches where appropriate.
  3. Use an authenticated symmetric encryption scheme such as AES-GCM for payload encryption.
  4. Identify affected dependencies, integrations, certificates, and compatibility requirements.
  5. Prioritise the migration based on confidentiality lifetime and cryptographic exposure.
  6. Validate the updated implementation and run regression checks.
Priority
Critical, 25-year confidentiality
Affected
src/billing_export.py and the partner's decryption code, outside this repository
Standards
FIPS 203 (ML-KEM-768) for key establishment; AES-256-GCM for the records
Compatibility
The export format changes, and the partner needs an ML-KEM key pair. Exports already sent stay as they were.
Draft change
--- a/src/billing_export.py
+++ b/src/billing_export.py
@@ -4,10 +4,11 @@
 from cryptography.hazmat.primitives import hashes
 from cryptography.hazmat.primitives.ciphers.aead import AESGCM
-from cryptography.hazmat.primitives.asymmetric import padding
+from cryptography.hazmat.primitives.kdf.hkdf import HKDF
 
 def seal_export(records, partner_key, export_id):
-    data_key = AESGCM.generate_key(bit_length=256)
-    wrapped_key = partner_key.encrypt(data_key, padding.OAEP(mgf=padding.MGF1(hashes.SHA256()), algorithm=hashes.SHA256(), label=None))
+    # Key establishment: ML-KEM-768 (FIPS 203); the records stay encrypted with AES-256-GCM
+    kem_ciphertext, shared_secret = partner_key.encapsulate()
+    data_key = HKDF(algorithm=hashes.SHA256(), length=32, salt=None, info=b"billing-export v2").derive(shared_secret)
     nonce = os.urandom(12)
     body = AESGCM(data_key).encrypt(nonce, json.dumps(records).encode(), export_id.encode())
-    return {"wrapped_key": wrapped_key, "nonce": nonce, "body": body}
+    return {"kem_ciphertext": kem_ciphertext, "nonce": nonce, "body": body}

Validation

Checks on the draft change
  • target is a post-quantum alternative: ML-KEM-768
  • rescanned: RSA is gone
  • nothing quantum-vulnerable added
  • policy passes

Real output of Quantsiv's checks for the draft above. Your own tests run too when you set a check command; this sample sets none. A person reviews the change, and nothing is committed.

On every later build

A later pull request adds an RSA key. The change check compares it with the latest main-branch build:

gate
fail
new asset
RSA-2048 at src/partner_upload.py:6, high

Finding: TLS key exchange groups

critical Harvest Now, Decrypt Later deploy/nginx.conf:6
Found
ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1; X25519MLKEM768 is recorded as quantum-safe; X25519 and ECDH-256 (P-256) are not.
Business context
Customer records must stay secret for 25 years (declared in the repository's quantsiv.yml)
Why it ranks here
Protects data that must stay confidential for 25 years.
The risk
A client that cannot use the hybrid group falls back to a classical one. Traffic on those connections can be recorded today and decrypted later.
Move to
Migrate key establishment to ML-KEM (FIPS 203), deployed as a hybrid with X25519 (e.g. X25519MLKEM768 in TLS) during the transition.

Quantsiv AI: migration analysis

Analysis complete In your CI, on the model you choose Simulated output

The server already offers the hybrid group first, so the work is in the clients that cannot use it. A configuration file gets guidance, not a code change.

Recommended migration
  1. Find the clients that still negotiate X25519 or P-256, from the server's TLS logs.
  2. Upgrade or retire those clients, starting with the ones that carry customer records.
  3. Remove the classical groups from ssl_ecdh_curve once traffic allows.
  4. Probe the endpoint again to confirm that the hybrid group is negotiated.
Priority
Critical, 25-year confidentiality
Affected
deploy/nginx.conf and the clients of api.example.com
Standards
FIPS 203 (ML-KEM-768) in the hybrid X25519MLKEM768 group
Compatibility
Clients that support no remaining group cannot connect once the fallbacks are removed.

Validation

Checks on the guidance
  • target is a post-quantum alternative: X25519MLKEM768
  • no other classical algorithm named

Real output of Quantsiv's checks for the guidance above. Changes to configuration, keys, certificates and token formats get guidance, never a diff.

On every later build

A later pull request adds an RSA key. The change check compares it with the latest main-branch build:

gate
fail
new asset
RSA-2048 at src/partner_upload.py:6, high

Finding: JWT signing

high Signature forgery src/auth/session_tokens.py:6
Business context
Signatures must stay trusted for 10 years (declared in the repository's quantsiv.yml)
Why it ranks here
Signatures must stay trusted for 10 years; deadline 31 Dec 2031.
The risk
A quantum computer could derive the signing key from its public key and issue tokens that every service accepts. Nothing has to be recorded first: the public key is public by design.
Move to
Migrate to ML-DSA (FIPS 204) or SLH-DSA (FIPS 205). Prioritise long-lived signing keys: code/firmware signing, CA and token-issuer keys.
Authority
EO 14412 (22 Jun 2026): post-quantum digital signatures on high-value assets and high-impact systems by 31 Dec 2031. NIST IR 8547 (ipd): disallowed after 2035.

Quantsiv AI: migration analysis

Analysis complete In your CI, on the model you choose Simulated output

These session tokens are signed with RS256, and other services verify them. Changing the algorithm changes the token format, so the agent gives guidance instead of a code change.

Recommended migration
  1. List every service and library that verifies these tokens.
  2. Confirm that each one can verify ML-DSA (FIPS 204) signatures before the issuer changes.
  3. Issue tokens with a new ML-DSA key, and accept both algorithms during the switch.
  4. Retire the RS256 key once no verifier depends on it.
Priority
High, signature deadline 31 Dec 2031
Affected
src/auth/session_tokens.py and every service that verifies the tokens
Standards
FIPS 204 (ML-DSA)
Compatibility
Tokens grow: an ML-DSA-65 signature is 3,309 bytes (FIPS 204), more than ten times an RS256 signature with a 2048-bit key. Check cookie and header size limits.

Validation

Checks on the guidance
  • target is a post-quantum alternative: ML-DSA-65
  • no other classical algorithm named

Real output of Quantsiv's checks for the guidance above. Changes to configuration, keys, certificates and token formats get guidance, never a diff.

On every later build

A later pull request adds an RSA key. The change check compares it with the latest main-branch build:

gate
fail
new asset
RSA-2048 at src/partner_upload.py:6, high

* Real Quantsiv results from a demo repository

Get in Touch

Get updates on post-quantum migration deadlines, standards, and Quantsiv releases.