For guidance on choosing between formats, see Format Comparison.
Interim JSON Format
The default output format containing detailed cryptographic asset information optimized for the SCANOSS ecosystem. The interim report is the primary findings artifact. It contains finding metadata such asfinding_id, but it does not currently embed the finding-centric reachability slices produced by --export-callgraph.
Format Specification
Version 1.1 introduced therulesarray field (replacing singlerulefield) to support per-line deduplication. Version 1.2 addedsourceanddependency_infofor dependency scanning attribution. Version 1.3 addsfinding_idfor cross-referencing with the callgraph export. Dependency-backedfile_pathvalues are dependency-root-relative; the package identity stays independency_info. Reachability slices such ascall_chainsare emitted by the dedicated call graph export, not by the interim report. See Dependency Scanning for details.
Field Descriptions
Call Graph Export
When--export-callgraph is enabled, Crypto Finder also writes a separate finding-centric call graph JSON file. This export contains the reachability slices and value-flow details associated with findings from the interim report.
Schema note: call graph export version6.4is the current customer-facing reachability contract. Version6.4addsmethod_role,role_provenance, andparameter_roles— contracts-KB-derived method/parameter role classification (factory/config/output/operationonmethod_role; per-parameteroperation-determining/metadata-contributing/nonewith acontributes: {property, derivation}block onparameter_roles).method_role/role_provenanceappear oncrypto_entry_points;parameter_rolesappears oncrypto_entry_pointsand on the supporting-call declaration, index-aligned withparameter_types— never on call-site parameter literals. As of6.4, these fields are populated on the live (--export-callgraph) and graph-fragment export paths and carried through the stitched/served path (role-bearingcrypto_entry_pointsare merged into the served output byfunction_key, enriching an existing reachability entry or appending arole: operationcatalog entry with no reachable finding). Version6.3added the optional per-findingforward_callsblock — the finding anchor’s forward call closure (deduped nodes withdepth/crypto_relevant/supporting_category, plus traversed edges whoseentry_callcarries the call-site argument data-flow), emitted only when the stitch runs withStitchOptions.ForwardClosure; caps (depth/nodes/edges) are surfaced viamax_depthand an explicittruncatedflag, never silently. Version6.0removed the legacyentry_point_indexprojection and madecrypto_entry_points[]canonical. Version4.3added Java runtime provenance inscan_metadatafor JDK-aware platform signature enrichment.
- Each top-level record stays keyed by
finding_id, which is the join key back to the interim report. call_chainsis the primary value-flow structure. Each chain is ordered from the first reachable caller to the function that contains the matched crypto call.- Each chain node contains a fully qualified
function_name, a normalizedfile_path,start_line, optionaldependency_info, and optionalentry_call. entry_calldescribes how execution entered the current node from the previous step. Itsfile_pathandlinerefer to the call site in the previous node’s source file.- The last node in each chain carries
crypto_call, which is the matched crypto-relevant call for the finding. entry_call.parameters[]andcrypto_call.parameters[]both use the same parameter model:parameter_index(always0-based), best-efforttype,argument_expression,resolved_value,variable_namefor simple identifiers only, and recursivesource_nodes.- For Java scans,
scan_metadatamay also includejava_requested_jdk_major,java_runtime_version,java_platform_signatures_used,java_platform_signature_source, andjava_platform_signature_unavailable_reasonto show which JDK major was requested and whether JDK platform signatures contributed to type enrichment. source_nodescan span multiple wrapper hops. A localPARAMETERnode may contain nested upstream provenance such asPARAMETER -> PARAMETER -> VALUE, and propagated nested nodes keeplocation.file_pathpluslocation.linewhen known.- Method-call provenance is preserved as
CALL_RESULTnodes. When the parser can resolve the invoked method, the node also exportscall_target, and any traceable receiver value is nested under thatCALL_RESULTviasource_nodes(for exampleCALL_RESULT -> PARAMETER alg -> VALUE SignatureAlgorithm.HS256). - Findings missing a containing function or crypto-call match are still exported with
finding_locationandunresolved_reason. crypto_entry_points[]is the stitch/API index. Each entry carriesfunction_key, canonical/display symbols, aliases, andreachable_findings[]/reachable_supporting_calls[].supporting_calls[]carries config/lifecycle/context crypto-adjacent calls, such as builder options or parameter setup. These calls are not findings and do not inflatefinding_graphs[].- Constructor joins remain canonical (
<init>), while display fields and aliases expose IBM-style names such ascom.acme.Factory.Factory. entry_point_indexis not emitted by schema6.0. Consumers should migrate tocrypto_entry_points[].
Example Output
Example Output
Single Rule Detection:Use Cases
- Integration with SCANOSS platform
- Custom analysis pipelines
- Detailed cryptographic asset tracking
- Security auditing and compliance
Graph Fragment Export
When--export-graph-fragment <file> is enabled, Crypto Finder writes a
reusable structural graph fragment for the scanned component: its call
graph plus rules-versioned crypto annotations. Unlike the finding-centric call
graph export (above), a fragment is designed to be composed with other fragments
across a dependency tree to answer “what crypto is transitively reachable from
artifact X?” The pure model and the stitcher that composes fragments live in the
public package github.com/scanoss/crypto-finder/pkg/graphfrag, so downstream
consumers can use one contract instead of reimplementing schema knowledge.
Current schema version: graph-fragment-1.3.
As of graph-fragment-1.3, a fragment is self-contained enough to reconstruct
the two artifacts a live --scan-dependencies run would produce — see
Rendered artifacts below.
Structure
Per-call data flow: entry_call (1.2+)
Every internal_edges[] and external_calls[] entry may carry an entry_call
describing the call-site argument data-flow for that edge — the same model the
finding-centric call graph export uses (see Call Graph Export above):
entry_call.parameters[] each have parameter_index, best-effort type,
argument_expression, resolved_value, variable_name (simple identifiers
only), and recursive source_nodes provenance. Carrying it on the edge is
what lets the stitcher rebuild full per-frame value flow when composing chains
across components, so a stitched chain matches a live run frame-for-frame.
Crypto annotation fields (1.2+)
Agraph-fragment-1.2+ crypto_annotations[] entry carries enough to
reconstruct a full findings.json entry for the matched crypto call:
Rendered artifacts: ToCallgraphExport / ToFindingsEnvelope
Because a 1.3 fragment carries per-call data flow, full crypto-annotation,
supporting-call, and entrypoint metadata, pkg/graphfrag can render a stitched
Result into the same two artifacts a live --scan-dependencies run produces:
Result.ToCallgraphExport(root, meta)— renders the stitched result into a schema-6.0 callgraph, equivalent to a live--scan-dependencies --export-callgraphrun. Dep-component findings getmodule@version/-prefixedfinding_ids, matching live output.ToFindingsEnvelope(root, deps, fragments, meta)— reconstructs the findings.json v1.3 envelope (asset metadata). Itsfinding_ids are computed with the same inputs asToCallgraphExport, so the two agree: consumers join assets (envelope) to call chains (callgraph) byfinding_id.
pkg/graphfrag/equiv is a semantic diff tool that asserts a stitched callgraph
equals a live one minus the chains intentionally dropped by resolution
suppression (see below) — the equivalence guarantee these renderers rely on.
Edge resolution metadata (v1.1+)
Everyinternal_edges[] and external_calls[] entry carries resolution
metadata describing how confidently the edge was resolved. This lets a
consumer distinguish exact typed calls from over-broad name/arity dispatch
guesses, and refuse to present the latter as typed reachability proof.
resolution values:
exact— the receiver’s static type was known and the method resolved to a unique declared target on that type (or an overload set on that exact type).interface_dispatch— the target was found by expanding an interface/abstract method to concrete implementations matching name + arity within a namespace root. Trustworthy only when exactly one implementation is present in the dependency closure; otherwise it is an ambiguous guess.name_only— the target was guessed by method name + arity (plus namespace heuristics) with no receiver-type anchor (e.g. fluent-chain fallback).
method_name + arity + the call-site line let a consumer group sibling
candidates of one call site so ambiguity can be detected across edges that
span the component boundary. The reference consumer (pkg/graphfrag’s stitcher)
applies a tiered, fail-closed policy: traverse exact edges and
interface_dispatch edges with exactly one implementation in the dependency
closure; drop ambiguous interface dispatch (>1 impl) and name_only edges,
recording them rather than emitting a chain. This is what prevents a DRBG’s
generate() from name-colliding with BCrypt.generate#3 (or
provider.get(...) fanning out to unrelated get(...) methods) from being
reported as reachable crypto.
Fragments exported by older versions (without resolution) decode as
unresolved and are treated as untrusted (fail-closed): under-report, never a
false positive.
Example
decryptPrivateKeyInfo has one exact edge to the real
InputDecryptorProvider.get and one over-broad interface_dispatch edge to
an unrelated get#1 from the same call site (line: 90). A stitcher that sees
more than one implementation for that call site drops the ambiguous group.
CycloneDX Format
CycloneDX 1.6-compatible Cryptography Bill of Materials (CBOM) format for standardised reporting.Features
- Schema Validation: Output is validated against the CycloneDX 1.6 specification.
- Standardised Components: Cryptographic assets are mapped to CycloneDX-defined component types.
- Rich Metadata: Includes algorithm properties, evidence, and provenance information.
Supported Asset Types
Example Output
Converting Formats
Use theconvert command to transform interim JSON to CycloneDX:
Integration
CycloneDX CBOM output can be consumed by tools including:- Dependency-Track (OWASP)
- Software Bill of Materials (SBOM) aggregators
- Security scanning platforms
- Compliance reporting tools
- Supply chain risk management systems