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
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
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
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
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
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
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 |
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
The score starts at 100 and subtracts a weighted penalty per rule:
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.
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.
| Field | What 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 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.
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.
| Command | What it does |
|---|---|
crypto-view | Scan the current directory and print the findings. |
crypto-view PATH | Scan somewhere else. |
--json FILE | Write the CycloneDX 1.7 CBOM. - writes it to stdout, and nothing else is printed. |
--fail-on LEVEL | Exit 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. |
--all | Print every finding rather than the first 60. |
--quiet | One summary line, for a script. |
--explain RULE | Print one rule from the catalogue in full, with its patterns. |
--define TERM | The 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-color | No 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.
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:
Suppressed findings are counted and reported in the summary, so the total is never silently reduced.
Limits
Crypto-View reads source files. It does not:
- see cryptography inside a compiled dependency, a container image or a binary — a library in a manifest is recorded as inventory, not as a finding about your code;
- know which algorithm a runtime-configured call actually selects, which is why those findings say "not determinable" rather than guessing;
- observe what a running system negotiates on the wire, which is a different measurement needing a different tool;
- judge whether a use is acceptable. A 1024-bit RSA key in a test fixture and the same key in production are the same finding and very different problems. That context is yours.
An empty result describes the scan's coverage, not the system.