Crypto-View
Documentation

Documentation

100 rules across 4 languages, plus formats that carry cryptography in any language. The tables below are generated from the engine's rule catalogue, so they cannot claim support that is not implemented.

Supported languages

Supported languages

Detection is lexical: regular expressions over the file text, with comments masked. A parser would be more precise on well-formed input and would fail entirely on a template or an unknown dialect. Each finding carries a confidence value indicating how specific the match was.

Java

Java

File types: .java

Library or format What is detected Rules
BouncyCastle BouncyCastle provider in use. RSA through the BouncyCastle low-level API. Elliptic-curve cryptography through BouncyCastle. Edwards-curve signatures through BouncyCastle. Symmetric cipher through BouncyCastle. Digest through BouncyCastle. Post-quantum algorithm through BouncyCastle. 7
HTTP authentication HTTP Digest authentication. 1
JCA/JCE Classical key pair generated through the JCA. Key pair algorithm chosen at runtime. Classical public-key cipher through the JCA. Classical signature algorithm through the JCA. Classical key agreement through the JCA. Classical key material handled through the JCA. Hash algorithm through the JCA. Message authentication code through the JCA. Key store holding classical key material. TLS context created in code. Named elliptic curve requested. Non-cryptographic randomness near key material. Random number generation. Password hashing or key derivation. 14
JGSS / Kerberos Kerberos or SPNEGO authentication. 1
NTLM NTLM authentication. 1
Python

Python

File types: .py, .pyi

Library or format What is detected Rules
bcrypt / argon2 / passlib Password hashing or key derivation. 1
hashlib Broken hash function. Hash function in use. 2
hmac Keyed hash in use. 1
liboqs / pqcrypto Post-quantum algorithm in use. 1
paramiko SSH key handled by paramiko. 1
pyca/cryptography RSA key generated with pyca/cryptography. Elliptic-curve key generated with pyca/cryptography. ECDH key agreement. X25519 key agreement. Ed25519 signing key. Finite-field Diffie-Hellman. DSA signing key. RSA-OAEP encryption padding. PKCS#1 v1.5 padding. AES block cipher. Withdrawn symmetric cipher. 11
PyCryptodome RSA through PyCryptodome. Elliptic curves through PyCryptodome. Signature scheme through PyCryptodome. 3
PyJWT JWT signed with a classical algorithm. 1
pyOpenSSL Key generated through pyOpenSSL. 1
secrets / os Random number generation. 1
ssl TLS protocol version pinned in code. 1
JavaScript and TypeScript

JavaScript and TypeScript

File types: .js, .mjs, .cjs, .jsx, .ts, .tsx

Library or format What is detected Rules
@noble Noble cryptography library in use. 1
@noble/ciphers / crypto-js Symmetric cipher library in use. 1
@noble/hashes / oslo Hash library in use. 1
@signpdf / node-signpdf Document signing. 1
bcrypt / argon2 / scrypt Password hashing or key derivation. 1
bip32 / bip39 / ecpair Cryptocurrency key derivation in use. 1
bitcoinjs-lib / secp256k1 secp256k1 signatures. 1
elliptic Elliptic-curve library in use. 1
jose JOSE library in use. 1
jsonwebtoken / jose JWT signed with a classical algorithm. 1
noble-post-quantum / liboqs Post-quantum algorithm in use. 1
Node crypto Classical key pair generated with Node crypto. Key pair algorithm chosen at runtime. Signing or verification with a classical key. Diffie-Hellman key agreement. Withdrawn symmetric cipher. One-shot signing or public-key encryption. Keyed hash in use. Symmetric cipher in use. 8
Node crypto / WebCrypto Hash function in use. Random number generation. 2
node-forge Cryptography through node-forge. node-forge in use. 2
otplib / speakeasy Time-based one-time passwords. 1
tweetnacl NaCl primitives in use. 1
WebCrypto Classical key generated with WebCrypto. 1
Go

Go

File types: .go

Library or format What is detected Rules
crypto/aes AES block cipher. 1
crypto/des, crypto/rc4 Withdrawn symmetric cipher. 1
crypto/dsa DSA in the Go standard library. 1
crypto/ecdh Key agreement in Go. 1
crypto/ecdsa ECDSA in the Go standard library. 1
crypto/ed25519 Ed25519 in the Go standard library. 1
crypto/hmac Keyed hash in use. 1
crypto/md5, crypto/sha1 Broken hash function. 1
crypto/mlkem, crypto/mldsa Post-quantum algorithm in use. 1
crypto/rand Random number generation. 1
crypto/rsa RSA in the Go standard library. 1
crypto/sha256, crypto/sha512 Hash function in use. 1
crypto/tls TLS configuration in code. 1
crypto/x509 X.509 certificate handling. 1
golang.org/x/crypto Password hashing or key derivation. 1
golang.org/x/crypto/openpgp OpenPGP in use. 1
golang.org/x/crypto/ssh SSH implementation in use. 1
Formats and configuration

Formats and configuration

File types: any readable text file

Library or format What is detected Rules
JOSE JOSE algorithm declared in configuration. 1
manifest Cryptographic library in the dependency manifest. 1
nginx / Apache TLS versions pinned in configuration. 1
nginx / Apache / HAProxy TLS cipher suites pinned in configuration. 1
OpenSSH SSH public key. SSH algorithms pinned in configuration. 2
PEM Private key committed to the repository. X.509 certificate. Public key file. 3
Classification

Quantum posture

Shor's algorithm solves factoring and discrete logarithms in polynomial time, breaking every public-key algorithm in wide use. Grover's algorithm halves the effective strength of a symmetric key. The first requires a replacement, the second a parameter change.

State Contains What it means
Quantum-vulnerable RSA, DH, DSA, ECDSA, ECDH, EdDSA, X25519, X448, ECIES, ElGamal, secp256k1 A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. A larger key does not help: it moves the cost by a polynomial factor against an attack that is already polynomial.
Reduced margin AES-128, AES-192, SHA-224, SHA-256, SHA3-256 A quantum computer weakens this but does not break it. Increasing the key or digest size restores the margin.
Quantum-safe ML-KEM, ML-DSA, SLH-DSA, HQC, LMS, XMSS, AES-256, SHA-384, SHA-512, SHA-3, ChaCha20-Poly1305, HMAC No known quantum attack changes how strong this is. Findings in this state are recorded so the inventory shows completed work, and they never reduce the score.
Already broken MD5, SHA-1, DES, 3DES, RC4, Blowfish, PKCS#1 v1.5 encryption This is already unsafe today, with no quantum computer involved. Describing these as a quantum problem would be misleading: they need fixing now.
Not determinable getInstance(variable), generateKeyPair(kind) The algorithm is selected while the program runs, so it cannot be judged from the source alone. Somebody has to check the configuration.

HNDL is set for key establishment only. A signature can be forged once the key falls, which is serious, but forging it later does not reveal anything recorded earlier. Key agreement and public-key encryption do carry that exposure, which is why they are ranked above signatures of the same severity.

Readiness score

Readiness score

The score starts at 100 and subtracts a weighted penalty per rule:

score = 100 − min(100, Σ per-rule deduction) per-rule deduction = min(cap, first + (occurrences − 1) × each) × 1.25 if the rule involves key establishment first each cap critical 12.0 1.50 24.0 high 6.0 0.75 15.0 medium 3.0 0.35 8.0 low 1.0 0.10 3.0 info 0.0 0.00 0.0

Repetition is capped so that a codebase which centralises its cryptography does not score worse than one that scatters the same calls everywhere. Dependency-manifest findings and quantum-safe findings deduct nothing.

The score is not a compliance grade. It compares a repository against itself over time. It does not compare organisations, and no supervisor recognises it.

Output format

CBOM output

Output is CycloneDX 1.7 — ECMA-424, second edition, October 2025. Every document is validated against the official 1.7 JSON schema in the test suite.

Specification: cyclonedx.org/docs/1.7/json · release notes: CycloneDX v1.7.

FieldWhat Crypto-View puts there
specVersion 1.7, with $schema pointing at the official 1.7 schema URL.
metadata.component The scanned repository, with an externalReferences entry of type vcs carrying the exact commit URL. The branch, commit, subject and author date are namespaced properties.
components[] One cryptographic-asset per distinct algorithm, curve and key size, with cryptoProperties.assetType of algorithm, certificate, protocol or related-crypto-material.
algorithmFamily New in 1.7: a value from the standardised registry of 93 families, so RSAES-OAEP is a defined identifier rather than free text.
ellipticCurve New in 1.7: a value from the registry of 246 namespaced curve names, such as secg/secp256r1. This deprecates 1.6's free-text curve, which is still emitted alongside it so a 1.6 consumer reads something useful.
nistQuantumSecurityLevel The NIST post-quantum category, 1 to 5, or 0 where none is met. This is the field carrying the actual claim, rather than a custom property.
evidence.occurrences[] Every place the algorithm was found: file path, line number, the rule id and the CWE.
properties[] What the specification has no field for, namespaced under qcomply: — the posture, the HNDL flag, the rule id, the confidence and the plain-language explanation. No specification field is bent to fit.

bom-ref values are derived from the asset itself rather than a counter, so two scans of the same commit produce identical references and the documents can be diffed.

Command line

Command-line tool

A single self-contained Python file. Needs Python 3.9 or newer and nothing else. It reads the filesystem and writes to stdout, and never contacts a network service.

curl -fsSL https://cryptoview.qcomply.tech/install.sh | sh

Installs to ~/.local/bin, or /usr/local/bin when run as root. Set CRYPTO_VIEW_INSTALL_DIR to change that. The installer verifies a published SHA-256 before installing; you can also download crypto-view.pyz and run it with python3 crypto-view.pyz.

CommandWhat it does
crypto-viewScan the current directory and print the findings.
crypto-view PATHScan somewhere else.
--json FILEWrite the CycloneDX 1.7 CBOM. - writes it to stdout, and nothing else is printed.
--fail-on LEVELExit 1 when a finding at or above critical, high, medium or low is present. This is what makes a build fail.
--include GLOB
--exclude GLOB
Narrow the walk. Repeatable.
--allPrint every finding rather than the first 60.
--quietOne summary line, for a script.
--explain RULEPrint one rule from the catalogue in full, with its patterns.
--define TERMThe one-sentence explanation of a term — the same text this site shows on hover.
--list-rules
--languages
The catalogue, and the supported languages and libraries.
--no-colorNo ANSI colour. Also honoured: NO_COLOR, and a non-terminal stdout.

Exit codes: 0 the scan completed, 1 findings met the --fail-on threshold, 2 the scan could not run.

Suppression

Suppressing a finding

A reviewed and accepted finding can be suppressed with a comment on the line or the line above, in the language's own comment syntax:

// crypto-view: ignore[java.cipher] legacy partner interop, tracked in SEC-4127 Cipher.getInstance("RSA/ECB/PKCS1Padding");

Suppressed findings are counted and reported in the summary, so the total is never silently reduced.

Limits

Limits

Crypto-View reads source files. It does not:

An empty result describes the scan's coverage, not the system.