Tool · free

SBOM checker for BSI TR-03183-2

Drop a CycloneDX or SPDX SBOM. You see for each field of the TR how many components carry it and which lack it. The check runs in your browser; the file never leaves your machine.

At a glance
Field list from
BSI TR-03183-2 v2.1.0
Sections
4 (format), 5.2 (data fields)
Formats
CycloneDX, SPDX
Upload
none
Cost
free, no sign-up

Your file stays in your browser. Nothing is uploaded and nothing is stored.

Or paste the text

Checked: format and data fields under sections 4 and 5.2 of TR-03183-2 v2.1.0. Not checked: schema validity, depth of the dependency resolution (5.1) and licence identifiers (6.1). The result is a field check. It makes no statement of conformity.

What is checked

18 fields and where they sit in CycloneDX and SPDX

The check reads each field where the TR places it in its Tables 8 to 11. A value in another place, such as the hash on the component instead of on the deployable, does not count, and the result names where it was found. Required fields (5.2.1, 5.2.2) always apply. The TR asks for the additional fields (5.2.3, 5.2.4) whenever the value exists.

The SBOM itself

Field and requirementCycloneDX 1.6SPDX 3.0.1
SBOM creator5.2.1E-mail address, a URL if there is nonemetadata.manufacturer.url | metadata.manufacturer.contact[].emailCreationInfo.createdBy → Person | Organization, externalIdentifiers email | urlScheme
Timestamp5.2.1Time of compilation, UTC recommendedmetadata.timestampCreationInfo.created
SBOM URI5.2.3URI of this SBOMserialNumberspdxId of the software_Sbom (rootElement of the SpdxDocument)

Required fields per component

Field and requirementCycloneDX 1.6SPDX 3.0.1
Component creator5.2.2E-mail address, a URL if there is nonecomponents[].manufacturer.url | .manufacturer.contact[].emailsoftware_Package.originatedBy → Person | Organization, externalIdentifiers email | other
Name5.2.2Name given by the creator, else the filenamecomponents[].namesoftware_Package.name
Version5.2.2Creator's version, else the file's modification date (RFC 3339)components[].versionsoftware_Package.software_packageVersion
Filename5.2.2Actual filename, without pathproperties[] "bsi:component:filename"software_File.name, linked by hasDistributionArtifact
Dependencies5.2.2All direct dependencies and contained componentsdependencies[].ref + dependsOn[] (empty too) | nested components[]Relationship contains | dependsOn
Completeness5.2.2A clear statement whether the list is completecompositions[].aggregate (complete | incomplete | unknown)Relationship.completeness
Distribution licence5.2.2Licence under which a licensee may use the componentlicenses[] with acknowledgement "concluded"Relationship hasConcludedLicense → LicenseExpression
Hash value5.2.2SHA-512 of the deployable fileexternalReferences[type "distribution"].hashes[] SHA-512software_File.verifiedUsing → Hash sha512
Executable5.2.2executable or non-executable"bsi:component:executable"software_additionalPurpose "executable"
Archive5.2.2archive or no archive"bsi:component:archive"software_additionalPurpose "archive"
Structured5.2.2structured or unstructured; mixed counts as structured"bsi:component:structured"software_additionalPurpose "container" | "firmware"

Additional fields per component

Field and requirementCycloneDX 1.6SPDX 3.0.1
Source code URI5.2.4Source of the version used, else the repositoryexternalReferences[type "source-distribution"].urlsoftware_SoftwareArtifact (primaryPurpose source), externalRef sourceArtifact, generates → Package
URI of the deployable5.2.4Points directly at the downloadable fileexternalReferences[type "distribution"].urlsoftware_File, externalRef binaryArtifact
Other identifiers5.2.4CPE, purl or SWID for lookupscpe | purl | swid.tagIdexternalIdentifiers cpe22 | cpe23 | swid | packageURL
Original licence5.2.4Licence assigned by the creatorlicenses[] with acknowledgement "declared"Relationship hasDeclaredLicense → LicenseExpression

In CycloneDX each row applies to components[] and equally to the primary component under metadata.component. The values of the three properties and the property names come from the BSI taxonomy for CycloneDX. In SPDX 3, filename, hash and the three properties sit on the deployed file (software_File), not on the package.

Where SBOMs fall short

Three public SBOMs, checked on 07.11.2026

Components carrying the field, of all checked. None of the three files was written for the TR, and it shows. All three name every component. Creator, filename, hash on the deployable, completeness, distribution licence and the BSI properties are missing in all three.

FieldSTM32CubeF4 1.28.3SBOM by ST · CycloneDX 1.5Dropwizard 1.3.15CycloneDX project example · 1.2Alpine Linux 3.20.3generated by us with syft · 1.6
Creator0/750/1680/93
Name75/75168/16893/93
Version75/75168/16816/93
Filename0/740/1680/92
Dependencies1/75167/16810/93
Completeness0/750/1680/93
Distribution licence0/750/1680/93
SHA-512 of the deployable0/740/1680/92
Executable0/740/1680/92
Archive0/740/1680/92
Structured0/740/1680/92
URI of the deployable0/74115/16814/92
CPE, purl or SWID1/75168/16815/93
  • ST

    All 75 components carry name and version. Only the primary component lists dependencies. 74 carry a licence, but without the concluded or declared marker that CycloneDX 1.6 introduced.

  • Dropwizard

    167 components carry a SHA-512, but on the component itself. The TR expects it on the distribution reference, the file that is shipped. 115 give a download URL, all 168 a purl.

  • Alpine

    The newest format of the three, and still only one entry in six has a version: 77 of the 93 entries are single files without one. No component carries the three BSI properties.

One component in each is logical (TR 3.2.2): in ST the primary component STM32CubeF4, in Alpine the operating-system entry alpine 3.20.3. The check counts it only against the smaller field set, so the fields that describe a file read 74 or 92 instead of 75 or 93. Sources: the SBOM STMicroelectronics publishes for STM32CubeF4 v1.28.3, SBOM/dropwizard-1.3.15/bom.json from CycloneDX/bom-examples, Alpine minirootfs 3.20.3 from alpinelinux.org scanned with syft 1.45.1 to CycloneDX 1.6.

Adding missing fields

One component with every field of the TR

lwIP 2.2.1 as the project ships it as a zip, in CycloneDX 1.6. The SHA-512 is that of the file at the distribution URL, measured on 07.11.2026. Drop it into the check above as part of an SBOM with a primary component and a graph: the check counts every field of this component as present.

components[] · one entry
{
  "bom-ref": "lwip",
  "type": "library",
  "name": "lwip",
  "version": "2.2.1",
  "manufacturer": {
    "name": "lwIP project",
    "url": ["https://savannah.nongnu.org/projects/lwip/"]
  },
  "licenses": [
    { "license": { "id": "BSD-3-Clause", "acknowledgement": "concluded" } },
    { "license": { "id": "BSD-3-Clause", "acknowledgement": "declared" } }
  ],
  "purl": "pkg:generic/lwip@2.2.1",
  "externalReferences": [
    {
      "type": "distribution",
      "url": "https://download.savannah.nongnu.org/releases/lwip/lwip-2.2.1.zip",
      "hashes": [{ "alg": "SHA-512", "content": "feb37ce0dd452c1d0252311045e0e402944574b630c89855678435c0113b25359533ae503e747027cc0e2a0b32db0202f725367178c09ae6e6b351773c8998c3" }]
    },
    {
      "type": "source-distribution",
      "url": "https://git.savannah.nongnu.org/cgit/lwip.git/tag/?h=STABLE-2_2_1_RELEASE"
    }
  ],
  "properties": [
    { "name": "bsi:component:filename", "value": "lwip-2.2.1.zip" },
    { "name": "bsi:component:executable", "value": "non-executable" },
    { "name": "bsi:component:archive", "value": "archive" },
    { "name": "bsi:component:structured", "value": "structured" }
  ]
}
Dependencies and completeness
"dependencies": [
  { "ref": "firmware", "dependsOn": ["lwip"] },
  { "ref": "lwip", "dependsOn": [] }
],
"compositions": [
  { "aggregate": "complete", "dependencies": ["firmware", "lwip"] }
]
  1. 01Creator missingThe three SBOMs above use supplier or publisher instead; syft puts the package maintainer and e-mail into publisher. The TR reads manufacturer with url or contact.email, for the SBOM itself under metadata.manufacturer.
  2. 02Filename and the three properties missingNone of the three SBOMs above carries any of them, and syft does not set them. They are added as properties named bsi:component:filename, :executable, :archive and :structured, with exactly the values from the TR.
  3. 03Hash in the wrong placeA SHA-512 under components[].hashes describes the component. The TR wants it under externalReferences of type distribution, for the file that is shipped.
  4. 04Licence without concluded or declaredacknowledgement does not exist before CycloneDX 1.6. From 1.6 the licence is listed twice: concluded for the distribution licence, declared for the original licence. Mostly it is the same one. Where the licensee had to choose, say between GPL and commercial, the distribution licence is only the one chosen (TR 8.1.13).
  5. 05Completeness missingOne entry under compositions with aggregate complete, incomplete or unknown and the bom-refs it covers. Components without dependencies of their own still appear in the graph with an empty dependsOn.

Not every component needs everything

Three kinds of component, three field sets

The TR does not ask every component for every field. The check assigns each component a kind and counts only the fields that apply to that kind. The result says how many components of each kind it found.

  • Fully describedTR 5.2.2

    all 11 required fields and the 4 additional ones

    The normal case: an executable file, an archive, a library.

  • LogicalTR 3.2.2

    creator, name, version, dependencies, completeness, licences, identifiers

    Groups files under a product name, such as an operating system or an application. In CycloneDX recognised by type application, framework, operating-system, platform, container or device with no file, download or hash, in SPDX 3 by such a software_primaryPurpose with no deployed file.

  • ReferencedTR 3.2.5

    creator, name, version

    Described in another SBOM that is referenced. Recognised by an externalReference of type bom.

A fourth kind, the merely identified component (3.2.4), looks like a fully described one in the file. The check therefore counts it against every required field. If such entries lack filename, hash, dependencies, licences or the three properties, that is not a fault as long as the component lies outside the scope of delivery (5.1).

Questions

Frequently asked questions

01Is my SBOM uploaded?

No. The check runs as a program in your browser. The file is not sent to us or anyone else and is not stored.

02Is this a conformity check?

No. It shows which data fields from sections 4 and 5.2 of the TR your SBOM carries. It does not check the depth of the dependency resolution (5.1), the licence identifiers (6.1) or schema validity. The TR itself is a BSI guideline without force of law.

03Which formats work?

CycloneDX as JSON or XML in any version and SPDX as JSON in version 2.3 or 3.0.1. For new SBOMs the TR requires CycloneDX 1.6 or later or SPDX 3.0.1 or later; older versions are still checked and shown with that note.

04Why does SPDX 2.3 say “own mapping”?

The TR maps its fields only to CycloneDX 1.6 and SPDX 3.0.1. For SPDX 2.3 we use the obvious fields, such as originator, packageFileName and checksums. The executable, archive and structured properties do not exist there.

05Which version of TR-03183-2 applies?

Version 2.1.0 of 20.08.2025. The previous version 2.0.0 could be used for six more months (section 7); that period ended in February 2026. An SBOM that matched the version valid when it was delivered still meets the TR under section 7.

06Does the CRA require these fields?

From 11.12.2027 the CRA requires an SBOM in a commonly used, machine-readable format covering at the very least the top-level dependencies (Annex I Part II point 1). It does not name the TR. The Commission may set format and elements by implementing act (Art. 13(24)).

07What separates the distribution licence from the original licence?

The original licence is the one the component's creator assigned. The distribution licence is the one under which a licensee may use the component from this SBOM (TR 3.2.8). In CycloneDX 1.6 they are licenses with acknowledgement declared and concluded. Values such as NOASSERTION or NONE do not count as a licence.

08Why does my SHA-256 not count?

The TR asks for a SHA-512 of the deployable file (5.2.2). Only a value of 128 hexadecimal characters is counted.

09What do I do about missing fields?

Most fields can be added in the tool that generates the SBOM, even though default output rarely carries them today: creator, filename and the three properties as bsi:component properties, the SHA-512 on the distribution reference. If whole components are missing, only an SBOM from the build or from the shipped image helps.

What is really in the image?

The SBOM says what the supplier declares. The firmware check reads the components from the firmware itself and matches them against known vulnerabilities.