CBOM JSON response

JSON structure

Inside a component, fields that have no value are omitted entirely; they are never returned as null, "" or []. Treat an absent key as "not known", not as "empty". The top-level components array is always present and is [] when no cryptographic assets were found.

"cbom_info": {
"final_verdict": { //scan-level summary; advisory only
"verdict": "<string>", //"No Cryptography Found" | "Risk Cryptography Found" | "Cryptography Found"
"verdict_explanation": ["<string>"], //one entry, equal to "verdict"
"blocked": <bool>, //true when "Block on Cryptographic Risk" is met; always false with the default (None)
"severity": "INFO", //always "INFO"
"total_asset_count": <int>, //number of entries in "components"
"asset_counts": { //assets per type; all keys always present, zeros included
"algorithm": <int>,
"certificate": <int>,
"protocol": <int>,
"related_crypto_material": <int>,
"library": <int>
},
"risk_summary": {

Type-specific properties

Each component carries one *_properties object inside crypto_properties, selected by asset_type:

asset_type

Object

Fields

algorithm

algorithm_properties

primitive, algorithm_family, parameter_set_identifier, elliptic_curve, mode, padding, execution_environment, implementation_platform, certification_level[], crypto_functions[], classical_security_level, nist_quantum_security_level, reference_primitive, category, key_lengths[], min_key_length, output_size, usage, performance, conditions[], known_weaknesses[], disallowed_for[]

certificate

certificate_properties

subject_name, issuer_name, serial_number, certificate_format, certificate_extension, description, not_valid_before, not_valid_after, public_key_length, signature_algorithm_ref, public_key_ref, public_key_algorithm_ref, signature_algorithm_details, public_key_algorithm_details, fingerprint, certificate_state[], certificate_extensions[], related_cryptographic_assets[] (plus lifecycle dates when imported)

protocol

protocol_properties

type, version, cipher_suites[] {name, algorithms[], identifiers[], tls_groups[], tls_signature_schemes[]}, crypto_ref_array[], ikev2_transform_types, related_cryptographic_assets[], usage, performance, conditions[], known_weaknesses[]

related_crypto_material

related_crypto_material_properties

type, id, state, algorithm_ref, size, format, value, secured_by {mechanism, algorithm_ref}, fingerprint, related_cryptographic_assets[], key_lengths[], min_key_length (plus lifecycle dates when imported)

library

(none)

Library details are at the crypto_properties level: vendor, library_type, library_supports[], notes[], detection_kind

For related crypto material, algorithm_ref holds the name of the algorithm the key or secret belongs to (for example Ed25519).

For certificates, signature_algorithm_details and public_key_algorithm_details are full algorithm objects, each with its own risk block. A certificate takes the weaker of its two algorithms' risk on each axis, so these objects explain why it was graded as it was. public_key_algorithm_details.detected_key_length is the key length measured from the certificate itself.

For libraries, detection_kind tells how the library was found: declared-dependency (named in a package manifest) or link-flag (only linked in a build script, so no version or package identity is available).

Field notes

Risk

  • crypto_properties.risk.overall is what the UI shows as Overall Risk: safe, unknown or unsafe. Unknown assets are not counted as unsafe. An asset is unknown when there is not enough information to grade it on one of the two axes (classical, quantum).

  • When a level is unknown, the matching safe value is false. Read it as "not confirmed safe", not as "found unsafe".

  • quantum.is_pqc names a mechanism and is distinct from the quantum-safe level: AES-256 is quantum-safe without being a post-quantum algorithm.

  • quantum.recommended_replacement is an array, because there can be more than one successor. RSA, for example, needs ML-KEM (FIPS 203) for key establishment and ML-DSA (FIPS 204) for signatures; applies_to says which use each entry covers. If you need a single answer, read the first element.

Evidence

evidences[].line is the line where the asset was found and match is the matching text.

Certificates extracted from binary files are byte-offset findings, not line-based ones. Their entries carry line: 0 by design, and the location is given in the match string:

  • pe_attribute_certificate_table@0x<offset>: a certificate from the Windows PE attribute certificate table.

  • pe_embedded_pem@0x<offset>: a PEM block embedded in the file.

Verdict

verdict is evaluated in this order:

1. No Cryptography Found: total_asset_count is 0.

2. Risk Cryptography Found: risk_summary.overall.unsafe is greater than 0 and the workflow's CBOM Module > Block on Cryptographic Risk is set to Unsafe. blocked is then true.

3. Cryptography Found: all other cases, including unsafe assets under the default threshold None, which neither reports a risk nor blocks.

Note: No Cryptography Found is returned both when an analyzed file yields no cryptographic assets and when the file type is not covered by CBOM analysis. The verdict does not distinguish between these two cases. "Verification Failed" is no longer returned. If CBOM cannot read its input, cbom_info carries err_code and err_details. If CBOM is disabled in the workflow, cbom_info is {}.


Examples

A private key file (default threshold None)

"cbom_info": {
"final_verdict": {
"verdict": "Cryptography Found",
"verdict_explanation": ["Cryptography Found"],
"blocked": false,
"severity": "INFO",
"total_asset_count": 1,
"asset_counts": { "algorithm": 0, "certificate": 0, "protocol": 0, "related_crypto_material": 1, "library": 0 },
"risk_summary": {
"overall": { "safe": 0, "unsafe": 1, "unknown": 0 },
"classical": { "counts": { "acceptable": 1, "deprecated": 0, "disallowed": 0, "unknown": 0 } },
"quantum": { "counts": { "quantum-safe": 0, "quantum-weakened": 0, "quantum-vulnerable": 1, "unknown": 0 } }
}
},
"components": [
{
"uid": "crypto/key/key_ed25519_private.key@sha256:<hash>",
"bom_ref": "crypto/key/key_ed25519_private.key@sha256:<hash>",


With the threshold set to Unsafe, the same file returns "Risk Cryptography Found" and "blocked": true.

A library declared in a Maven pom.xml (one component shown)

{
"uid": "crypto/library/Tink@<hash>",
"bom_ref": "crypto/library/Tink@<hash>",
"name": "Tink",
"type": "cryptographic-asset",
"asset_type": "library",
"crypto_properties": {
"asset_type": "library",
"description": "Misuse-resistant cryptography library with opinionated key management.",
"vendor": "Google",
"library_type": "crypto-toolkit",
"detection_kind": "declared-dependency",
"library_supports": ["AES-GCM", "AES-SIV", "ChaCha20-Poly1305", "ECDSA", "Ed25519", "HKDF"],
"notes": ["Exposes intents (AEAD, signing) rather than raw primitives, which removes most parameter-choice mistakes"],
"risk": {
"overall": "unknown",
"classical": { "level": "acceptable", "strength": "strong", "safe": true },
"quantum": {