diff --git a/schema/2.0/cyclonedx-2.0.schema.json b/schema/2.0/cyclonedx-2.0.schema.json index 8e757386..759661ea 100644 --- a/schema/2.0/cyclonedx-2.0.schema.json +++ b/schema/2.0/cyclonedx-2.0.schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", "type": "object", - "title": "CycloneDX Transparency Expression Language", + "title": "CycloneDX Transparency Exchange Language", "$comment" : "OWASP CycloneDX is an Ecma International standard (ECMA-424) developed in collaboration between the OWASP Foundation and Ecma Technical Committee 54 (TC54). The standard is published under a royalty-free patent policy. This JSON schema is the reference implementation and is licensed under the Apache License 2.0.", "required": [ "specFormat", @@ -50,9 +50,8 @@ "metadata": { "$ref": "model/cyclonedx-metadata-2.0.schema.json#/$defs/metadata" }, - "components": { - "$ref": "model/cyclonedx-component-2.0.schema.json#/$defs/components", - "description": "A collection of components. When a metadata component is present, this array represents the inventory of components associated with that subject, forming a bill of materials. When the metadata component is omitted, the array provides component data for interchange purposes without establishing a compositional relationship." + "inventories": { + "$ref": "model/cyclonedx-component-2.0.schema.json#/$defs/inventories" }, "dependencies": { "$ref": "model/cyclonedx-dependency-2.0.schema.json#/$defs/dependencies" @@ -87,9 +86,6 @@ "blueprints": { "$ref": "model/cyclonedx-blueprint-2.0.schema.json#/$defs/blueprints" }, - "profiles": { - "$ref": "model/cyclonedx-profile-2.0.schema.json#/$defs/profiles" - }, "citations": { "$ref": "model/cyclonedx-citation-2.0.schema.json#/$defs/citations" }, diff --git a/schema/2.0/cyclonedx-api-2.0.schema.json b/schema/2.0/cyclonedx-api-2.0.schema.json index af577578..43987b19 100644 --- a/schema/2.0/cyclonedx-api-2.0.schema.json +++ b/schema/2.0/cyclonedx-api-2.0.schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://cyclonedx.org/schema/2.0/cyclonedx-api-2.0.schema.json", "type": "object", - "title": "CycloneDX Transparency Expression Language: API", + "title": "CycloneDX Transparency Exchange Language: API", "$comment" : "OWASP CycloneDX is an Ecma International standard (ECMA-424) developed in collaboration between the OWASP Foundation and Ecma Technical Committee 54 (TC54). The standard is published under a royalty-free patent policy. This JSON schema is the reference implementation and is licensed under the Apache License 2.0.", "$defs": { diff --git a/schema/2.0/model/cyclonedx-annotation-2.0.schema.json b/schema/2.0/model/cyclonedx-annotation-2.0.schema.json index 2866b987..6e01de0a 100644 --- a/schema/2.0/model/cyclonedx-annotation-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-annotation-2.0.schema.json @@ -89,7 +89,7 @@ }, "component": { "description": "The tool or component that created the annotation", - "$ref": "cyclonedx-component-2.0.schema.json#/$defs/component" + "$ref": "cyclonedx-component-2.0.schema.json#/$defs/componentEntry" } } }, diff --git a/schema/2.0/model/cyclonedx-blueprint-2.0.schema.json b/schema/2.0/model/cyclonedx-blueprint-2.0.schema.json index 28a4937b..940f35e6 100644 --- a/schema/2.0/model/cyclonedx-blueprint-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-blueprint-2.0.schema.json @@ -817,7 +817,7 @@ "dataProfiles": { "type": "array", "title": "Data Profiles", - "description": "Data profiles that govern the dataset. Each entry is either an inline profile object or a reference using bom-link or bom-ref to a previously declared profile, typically declared in the root profiles catalogue.", + "description": "Data profiles that govern the dataset. Each entry is either an inline profile object or a reference using bom-link or bom-ref to a previously declared profile, typically declared in the definitions.", "uniqueItems": true, "items": { "$ref": "cyclonedx-data-2.0.schema.json#/$defs/dataProfileChoice" diff --git a/schema/2.0/model/cyclonedx-certification-2.0.schema.json b/schema/2.0/model/cyclonedx-certification-2.0.schema.json index 05c08f0e..ddc6ab9a 100644 --- a/schema/2.0/model/cyclonedx-certification-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-certification-2.0.schema.json @@ -7,6 +7,7 @@ "$defs": { "certifications": { "type": "array", + "uniqueItems": true, "title": "Certifications", "description": "Certifications held by or applicable to the subject.", "items": { "$ref": "#/$defs/certification" } @@ -97,6 +98,31 @@ "$ref": "cyclonedx-common-2.0.schema.json#/$defs/properties" } } + }, + "certificationReference": { + "type": "object", + "title": "Certification Reference", + "description": "A reference to a certification defined elsewhere, such as in the definitions or in another document via BOM-Link. A reference includes the referenced certification exactly as defined: every position that references the same certification includes an identical certification.", + "required": [ + "ref" + ], + "additionalProperties": false, + "properties": { + "ref": { + "title": "Reference", + "description": "Reference using bom-link or bom-ref to the certification.", + "anyOf": [ + { + "title": "Ref", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refLinkType" + }, + { + "title": "BOM-Link Element", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/bomLinkElementType" + } + ] + } + } } } } diff --git a/schema/2.0/model/cyclonedx-citation-2.0.schema.json b/schema/2.0/model/cyclonedx-citation-2.0.schema.json index f917370c..ac76d13f 100644 --- a/schema/2.0/model/cyclonedx-citation-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-citation-2.0.schema.json @@ -27,22 +27,22 @@ "items": { "type": "string", "title": "Field Reference", - "description": "A [JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901) identifying the BOM field to which the attribution applies." + "description": "A [JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901) identifying the JSON property to which the attribution applies." }, "minItems": 1, "title": "Field References", - "description": "One or more [JSON Pointers](https://datatracker.ietf.org/doc/html/rfc6901) identifying the BOM fields to which the attribution applies.\nExactly one of the \"pointers\" or \"expressions\" elements must be present." + "description": "One or more [JSON Pointers](https://datatracker.ietf.org/doc/html/rfc6901) identifying the JSON properties to which the attribution applies.\nExactly one of the \"pointers\" or \"expressions\" elements must be present." }, "expressions": { "type": "array", "items": { "type": "string", "title": "Path Expression", - "description": "Specifies a [JSONPath](https://datatracker.ietf.org/doc/html/rfc9535) expression used to locate a value within a BOM." + "description": "Specifies a [JSONPath](https://datatracker.ietf.org/doc/html/rfc9535) expression used to locate a value within a CycloneDX artifact or payload." }, "minItems": 1, "title": "Path Expressions", - "description": "One or more path expressions used to locate values within a BOM.\nExactly one of the \"pointers\" or \"expressions\" elements must be present." + "description": "One or more path expressions used to locate values within a CycloneDX artifact or payload.\nExactly one of the \"pointers\" or \"expressions\" elements must be present." }, "timestamp": { "type": "string", diff --git a/schema/2.0/model/cyclonedx-common-2.0.schema.json b/schema/2.0/model/cyclonedx-common-2.0.schema.json index cc87f099..58ce53a5 100644 --- a/schema/2.0/model/cyclonedx-common-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-common-2.0.schema.json @@ -97,13 +97,13 @@ "mediaType": { "type": "string", "title": "Media Type", - "description": "The media type of the object. The media type can provide additional context about the kind of data being represented, such as an image, font, or executable.", + "description": "The media type of the object, optionally including media type parameters. The media type can provide additional context about the kind of data being represented, such as an image, font, or executable.", "examples": [ - "text/plain", "application/json", - "image/png" + "image/png", + "text/html; charset=utf-8" ], - "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$" + "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+(\\s*;\\s*[a-zA-Z0-9!#$&^_.+-]+=(\"[^\"]*\"|[^\\s;\"]+))*$" }, "attachment": { "type": "object", @@ -255,7 +255,7 @@ "log": "A record of events that occurred in a computer system or application, such as problems, errors, or information on current operations.", "configuration": "Parameters or settings that may be used by other components or services.", "evidence": "Information used to substantiate a claim.", - "formulation": "Describes the formulation of any referencable object within the BOM, including components, services, metadata, declarations, or the BOM itself.", + "formulation": "Describes the formulation of any referencable object within the CycloneDX artifact or payload, including components, services, metadata, declarations, or the CycloneDX artifact or payload itself.", "attestation": "Human or machine-readable statements containing facts, evidence, or testimony.", "threat-model": "An enumeration of identified weaknesses, threats, and countermeasures, dataflow diagram (DFD), attack tree, and other supporting documentation in human-readable or machine-readable format.", "adversary-model": "The defined assumptions, goals, and capabilities of an adversary.", @@ -279,7 +279,7 @@ "patent": "References information about patents which may be defined in human-readable documents or in machine-readable formats such as CycloneDX or ST.96. For detailed patent information or to reference the information provided directly by patent offices, it is recommended to leverage standards from the World Intellectual Property Organization (WIPO) such as [ST.96](https://www.wipo.int/standards/en/st96).", "patent-family": "References information about a patent family which may be defined in human-readable documents or in machine-readable formats such as CycloneDX or ST.96. A patent family is a group of related patent applications or granted patents that cover the same or similar invention. For detailed patent family information or to reference the information provided directly by patent offices, it is recommended to leverage standards from the World Intellectual Property Organization (WIPO) such as [ST.96](https://www.wipo.int/standards/en/st96).", "patent-assertion" : "References assertions made regarding patents associated with a component or service. Assertions distinguish between ownership, licensing, and other relevant interactions with patents.", - "citation": "A reference to external citations applicable to the object identified by this BOM entry or the BOM itself. When used with a BOM-Link, this allows offloading citations into a separate CycloneDX BOM.", + "citation": "A reference to external citations applicable to the object identified in a CycloneDX artifact or payload or the CycloneDX artifact or payload itself. When used with a BOM-Link, this allows offloading citations into a separate CycloneDX artifacts or payloads.", "swid-tag": "A Software Identification (SWID) tag document conforming to ISO/IEC 19770-2. The reference resolves to the XML SoftwareIdentity document itself, including all of its metadata (entities, evidence, payload, links, and meta elements). This is distinct from the `swid` identifier scheme, which carries only the tagId of a SWID tag.", "gs1-digital-link": "A [GS1 Digital Link URI](https://ref.gs1.org/standards/digital-link/uri-syntax/) that connects the component's GS1 identification key, such as a GTIN, to online sources of information, including product data, safety documentation, digital product passports, and recall status. The URI may include key qualifiers, such as a batch or serial number, enabling identification at the class, batch, or individual item level. Component identity shall be derived from the component's identifiers, not from keys embedded in this URI.", "other": "Use this if no other types accurately describe the purpose of the external reference." @@ -793,6 +793,11 @@ ], "additionalProperties": false, "properties": { + "bom-ref": { + "$ref": "#/$defs/refType", + "title": "BOM Reference", + "description": "An identifier which can be used to reference the patch elsewhere in the document, such as from an annotation. Every `bom-ref` shall be unique within the document." + }, "type": { "type": "string", "enum": [ @@ -817,9 +822,38 @@ }, "resolves": { "type": "array", - "items": {"$ref": "#/$defs/issue"}, + "items": { + "oneOf": [ + {"$ref": "#/$defs/issue"}, + { + "type": "object", + "title": "Resolved Reference", + "description": "A reference to the item the patch resolves, such as a weakness, vulnerability, use case, requirement, or threat declared elsewhere.", + "required": [ + "ref" + ], + "additionalProperties": false, + "properties": { + "ref": { + "title": "Reference", + "description": "Reference using bom-link or bom-ref to the resolved item.", + "anyOf": [ + { + "title": "Ref", + "$ref": "#/$defs/refLinkType" + }, + { + "title": "BOM-Link Element", + "$ref": "#/$defs/bomLinkElementType" + } + ] + } + } + } + ] + }, "title": "Resolves", - "description": "A collection of issues the patch resolves" + "description": "A collection of items the patch resolves. Each entry is an inline issue or a reference to the weakness, vulnerability, use case, requirement, or threat that the patch resolves." } } }, diff --git a/schema/2.0/model/cyclonedx-component-2.0.schema.json b/schema/2.0/model/cyclonedx-component-2.0.schema.json index 451d18b6..511623e2 100644 --- a/schema/2.0/model/cyclonedx-component-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-component-2.0.schema.json @@ -7,7 +7,7 @@ "$defs": { "components": { "type": "array", - "items": {"$ref": "#/$defs/componentOrChoice"}, + "items": {"$ref": "#/$defs/componentEntry"}, "uniqueItems": true, "title": "Components" }, @@ -60,12 +60,8 @@ "description": "Specifies the type of component. For software components, classify as application if no more specific appropriate classification is available or cannot be determined for the component.", "examples": ["library"] }, - "mime-type": { - "type": "string", - "title": "Mime-Type", - "description": "The mime-type of the component. When used on file components, the mime-type can provide additional context about the kind of file being represented, such as an image, font, or executable. Some library or framework components may also have an associated mime-type.", - "examples": ["image/jpeg"], - "pattern": "^[-+a-z0-9.]+/[-+a-z0-9.]+$" + "mediaType": { + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/mediaType" }, "bom-ref": { "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refType", @@ -107,7 +103,7 @@ "isExternal": { "type": "boolean", "title": "Component Is External", - "description": "Determine whether this component is external.\nAn external component is one that is not part of an assembly, but is expected to be provided by the environment, regardless of the component's `.scope`. This setting can be useful for distinguishing which components are bundled with the product and which can be relied upon to be present in the deployment environment.\nThis may be set to `true` for runtime components only. For `$.metadata.component`, it must be set to `false`.", + "description": "Determine whether this component is external.\nAn external component is one that is not part of an assembly, but is expected to be provided by the environment, regardless of the component's `.scope`. This setting can be useful for distinguishing which components are bundled with the product and which can be relied upon to be present in the deployment environment.\nThis may be set to `true` for runtime components only. For the subject of an inventory statement, it shall be `false`.", "default": false }, "description": { @@ -169,19 +165,34 @@ "type": "array", "title": "Ancestors", "description": "Describes zero or more components in which a component is derived from. This is commonly used to describe forks from existing projects where the forked version contains an ancestor node containing the original component it was forked from. For example, Component A is the original component. Component B is the component being used and documented in the BOM. However, Component B contains a pedigree node with a single ancestor documenting Component A - the original component from which Component B is derived from.", - "items": {"$ref": "#/$defs/component"} + "items": { + "oneOf": [ + {"$ref": "#/$defs/component"}, + {"$ref": "#/$defs/componentReference"} + ] + } }, "descendants": { "type": "array", "title": "Descendants", "description": "Descendants are the exact opposite of ancestors. This provides a way to document all forks (and their forks) of an original or root component.", - "items": {"$ref": "#/$defs/component"} + "items": { + "oneOf": [ + {"$ref": "#/$defs/component"}, + {"$ref": "#/$defs/componentReference"} + ] + } }, "variants": { "type": "array", "title": "Variants", "description": "Variants describe relations where the relationship between the components is not known. For example, if Component A contains nearly identical code to Component B. They are both related, but it is unclear if one is derived from the other, or if they share a common ancestor.", - "items": {"$ref": "#/$defs/component"} + "items": { + "oneOf": [ + {"$ref": "#/$defs/component"}, + {"$ref": "#/$defs/componentReference"} + ] + } }, "commits": { "type": "array", @@ -194,20 +205,15 @@ "title": "Patches", "description": ">A list of zero or more patches describing how the component deviates from an ancestor, descendant, or variant. Patches may be complementary to commits or may be used in place of commits.", "items": {"$ref": "cyclonedx-common-2.0.schema.json#/$defs/patch"} - }, - "notes": { - "type": "string", - "title": "Notes", - "description": "Notes, observations, and other non-structured commentary describing the components pedigree." } } }, "components": { "type": "array", - "items": {"$ref": "#/$defs/componentOrChoice"}, + "items": {"$ref": "#/$defs/componentEntry"}, "uniqueItems": true, "title": "Components", - "description": "A list of components included in the parent component, including software, hardware, and services. Entries may be concrete components or component-choice wrappers expressing conditional or alternate relationships. This is not a dependency tree. It provides a way to specify a hierarchical representation of component assemblies, similar to system → subsystem → parts assembly in physical supply chains." + "description": "A list of entries included in the parent component, including software, hardware, and services. Entries may be concrete components, references to components declared elsewhere, or component-choice wrappers expressing conditional or alternate relationships. This is not a dependency tree. It provides a way to specify a hierarchical representation of component assemblies, similar to system → subsystem → parts assembly in physical supply chains." }, "evidence": { "$ref": "#/$defs/componentEvidence", @@ -215,9 +221,16 @@ "description": "Provides the ability to document evidence collected through various forms of extraction or analysis." }, "releaseNotes": { - "$ref": "cyclonedx-release-notes-2.0.schema.json#/$defs/releaseNotes", - "title": "Release notes", - "description": "Specifies release notes." + "title": "Release Notes", + "description": "The release notes for the component. Either inline release notes or a reference using bom-link or bom-ref to release notes defined elsewhere, such as in the definitions.", + "oneOf": [ + { + "$ref": "cyclonedx-release-notes-2.0.schema.json#/$defs/releaseNotes" + }, + { + "$ref": "cyclonedx-release-notes-2.0.schema.json#/$defs/releaseNotesReference" + } + ] }, "modelCard": { "$ref": "cyclonedx-ai-modelcard-2.0.schema.json#/$defs/modelCard", @@ -267,9 +280,20 @@ "description": "The quantity of the item in the context in which it is declared, such as the number of identical parts within the enclosing assembly or the amount of material in the described lot. This object may only be specified for components of type `device` or `material` and shall not be specified for other component types." }, "certifications": { - "$ref": "cyclonedx-certification-2.0.schema.json#/$defs/certifications", + "type": "array", + "uniqueItems": true, "title": "Certifications", - "description": "Certifications held by or applicable to the component. Applicable to components of any type, hardware and software alike." + "description": "Certifications held by or applicable to the component. Each entry is either an inline certification or a reference using bom-link or bom-ref to a certification defined elsewhere, such as in the definitions. Applicable to components of any type, hardware and software alike.", + "items": { + "oneOf": [ + { + "$ref": "cyclonedx-certification-2.0.schema.json#/$defs/certification" + }, + { + "$ref": "cyclonedx-certification-2.0.schema.json#/$defs/certificationReference" + } + ] + } }, "endpoints": { "type": "array", @@ -286,7 +310,7 @@ "uniqueItems": true, "items": {"$ref": "cyclonedx-data-2.0.schema.json#/$defs/dataProfileChoice"}, "title": "Data Profiles", - "description": "The data handled by the service, characterized by data profiles. Each entry is either an inline profile object or a reference using bom-link or bom-ref to a previously declared profile, typically declared in the root profiles catalogue. May only be used for components of type `service`. Data movement is intentionally not expressed here: flow direction, sources, destinations, authentication, and boundary crossings are modelled via blueprint flows, assets, and boundaries, which reference this component by bom-ref." + "description": "The data handled by the service, characterized by data profiles. Each entry is either an inline profile object or a reference using bom-link or bom-ref to a previously declared profile, typically declared in the definitions. May only be used for components of type `service`. Data movement is intentionally not expressed here: flow direction, sources, destinations, authentication, and boundary crossings are modelled via blueprint flows, assets, and boundaries, which reference this component by bom-ref." }, "tags": { "$ref": "cyclonedx-common-2.0.schema.json#/$defs/tags", @@ -380,11 +404,12 @@ } ] }, - "componentOrChoice": { - "title": "Component or Component Choice", - "description": "An entry in a components array. May be a concrete component, or a component-choice wrapper that expresses a conditional or alternate relationship between two or more components. The discriminator is the `type` property: when `type` is `component-choice`, the entry shall conform to the `componentChoice` schema; otherwise it shall conform to the `component` schema.", + "componentEntry": { + "title": "Component Entry", + "description": "An entry in a components array. A concrete component, a reference to a component declared elsewhere, or a component-choice wrapper that expresses a conditional or alternate relationship between two or more entries. An entry with a `ref` property is a reference; an entry whose `type` is `component-choice` is a choice; any other entry is a component.", "oneOf": [ { "$ref": "#/$defs/component" }, + { "$ref": "#/$defs/componentReference" }, { "$ref": "#/$defs/componentChoice" } ] }, @@ -440,7 +465,7 @@ "type": "array", "minItems": 2, "uniqueItems": true, - "items": { "$ref": "#/$defs/componentOrChoice" }, + "items": { "$ref": "#/$defs/componentEntry" }, "title": "Components", "description": "Two or more alternate or grouped entries. Each entry may itself be a component-choice to express nested alternates, such as a choice between kits." }, @@ -704,7 +729,7 @@ ] }, "title": "BOM References", - "description": "The object in the BOM identified by its bom-ref. This is often a component or service but may be any object type supporting bom-refs. Tools used for analysis should already be defined in the BOM, either in the metadata/tools, components, or formulation." + "description": "The object in the BOM identified by its bom-ref. This is often a component or service but may be any object type supporting bom-refs. Tools used for analysis should already be defined in the BOM, such as in the metadata tools, an inventory, or the definitions." }, "assertion": { "$ref": "cyclonedx-evidence-2.0.schema.json#/$defs/assertion", @@ -993,6 +1018,78 @@ "minLength": 1, "title": "Identifier Value", "description": "The value of an identifier." + }, + "componentReference": { + "type": "object", + "title": "Component Reference", + "description": "A reference to a component declared elsewhere, such as in the definitions registry, in another position of the same document, or in another document via BOM-Link. A reference includes the referenced component exactly as declared: every position that references the same component includes an identical component. Where the inclusion context differs, such as a different scope or quantity, declare the component inline instead.", + "required": [ + "ref" + ], + "additionalProperties": false, + "properties": { + "ref": { + "title": "Reference", + "description": "Reference using bom-link or bom-ref to the component.", + "anyOf": [ + { + "title": "Ref", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refLinkType" + }, + { + "title": "BOM-Link Element", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/bomLinkElementType" + } + ] + } + } + }, + "inventories": { + "type": "array", + "items": {"$ref": "#/$defs/inventory"}, + "uniqueItems": true, + "title": "Inventories", + "description": "The inventories of the subjects that the document describes. Each entry declares one subject and lists the entries included in it." + }, + "inventory": { + "type": "object", + "title": "Inventory", + "description": "The declared inventory of one subject: the entries included in the subject. The completeness of the list is asserted through compositions.", + "required": [ + "subject", + "components" + ], + "additionalProperties": false, + "properties": { + "bom-ref": { + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refType", + "title": "BOM Reference", + "description": "An identifier which can be used to reference the inventory elsewhere in the document. Every `bom-ref` shall be unique within the document." + }, + "subject": { + "title": "Subject", + "description": "The subject whose inventory this statement declares. Either a concrete component or a reference using bom-link or bom-ref to a component declared elsewhere, such as in the definitions.", + "oneOf": [ + { + "$ref": "#/$defs/component" + }, + { + "$ref": "#/$defs/componentReference" + } + ] + }, + "components": { + "$ref": "#/$defs/components", + "description": "The entries included in the subject. Entries may be concrete components, references to components declared elsewhere, or component-choice wrappers." + }, + "properties": { + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/properties" + }, + "signatures": { + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/signatures", + "description": "Enveloped signatures over the inventory statement. A signature binds reference entries by their identifiers; the content of a referenced component is covered by the hashes or signatures on the referenced component itself." + } + } } } } diff --git a/schema/2.0/model/cyclonedx-composition-2.0.schema.json b/schema/2.0/model/cyclonedx-composition-2.0.schema.json index 0ad97d27..18bdde57 100644 --- a/schema/2.0/model/cyclonedx-composition-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-composition-2.0.schema.json @@ -10,13 +10,16 @@ "items": {"$ref": "#/$defs/composition"}, "uniqueItems": true, "title": "Compositions", - "description": "Compositions describe constituent parts (including components, services, and dependency relationships) and their completeness. The completeness of vulnerabilities expressed in a BOM may also be described." + "description": "Completeness assertions for enumerations in the document, such as the components of a subject, the dependencies of a component, or the vulnerability disclosure for a subject." }, "composition": { "type": "object", - "title": "Compositions", + "title": "Composition", + "description": "A completeness assertion: for each target, the enumeration named by `kind` is as complete as `aggregate` states.", "required": [ - "aggregate" + "kind", + "aggregate", + "targets" ], "additionalProperties": false, "properties": { @@ -25,13 +28,59 @@ "title": "BOM Reference", "description": "An identifier which can be used to reference the composition elsewhere in the BOM. Every `bom-ref` must be unique within the BOM.\nValue SHOULD not start with the BOM-Link intro 'urn:cdx:' to avoid conflicts with BOM-Links." }, + "kind": { + "title": "Kind", + "description": "The enumeration the completeness assertion applies to. Either a predefined kind or a custom kind described by name and description.", + "oneOf": [ + { + "type": "string", + "enum": [ + "components", + "dependencies", + "vulnerabilities", + "licenses", + "certifications" + ], + "meta:enum": { + "components": "The components included in each target: the entries of an inventory statement or of a nested assembly. The assertion does not cascade to the assemblies of nested entries.", + "dependencies": "The direct dependencies of each target. The assertion does not cascade to transitive dependencies.", + "vulnerabilities": "The vulnerability disclosure for each target.", + "licenses": "The licenses that apply to each target. A complete assertion with no licenses on the target states that the target has no licenses.", + "certifications": "The certifications held by each target. A complete assertion with no certifications on the target states that the target holds no certifications." + } + }, + { + "type": "object", + "title": "Custom Kind", + "description": "A custom completeness kind not represented in the predefined taxonomy.", + "required": [ + "name" + ], + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "minLength": 1, + "title": "Name", + "description": "The name of the custom kind." + }, + "description": { + "type": "string", + "title": "Description", + "description": "A description of the custom kind." + } + } + } + ] + }, "aggregate": { "$ref": "#/$defs/aggregateType", "title": "Aggregate", - "description": "Specifies an aggregate type that describes how complete a relationship is." + "description": "Specifies an aggregate type that describes how complete the relationship is." }, - "assemblies": { + "targets": { "type": "array", + "minItems": 1, "uniqueItems": true, "items": { "anyOf": [ @@ -42,29 +91,15 @@ { "title": "BOM-Link Element", "$ref": "cyclonedx-common-2.0.schema.json#/$defs/bomLinkElementType" + }, + { + "title": "BOM-Link Document", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/bomLinkDocumentType" } ] }, - "title": "BOM references", - "description": "The bom-ref identifiers of the components or services being described. Assemblies refer to nested relationships whereby a constituent part may include other constituent parts. References do not cascade to child parts. References are explicit for the specified constituent part only." - }, - "dependencies": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string" - }, - "title": "BOM references", - "description": "The bom-ref identifiers of the components or services being described. Dependencies refer to a relationship whereby an independent constituent part requires another independent constituent part. References do not cascade to transitive dependencies. References are explicit for the specified dependency only." - }, - "vulnerabilities": { - "type": "array", - "uniqueItems": true, - "items": { - "type": "string" - }, - "title": "BOM references", - "description": "The bom-ref identifiers of the vulnerabilities being described." + "title": "Targets", + "description": "References using bom-link or bom-ref to the objects whose enumeration the assertion describes. The document itself may be a target, referenced by a BOM-Link document reference." }, "signatures": { "$ref": "cyclonedx-common-2.0.schema.json#/$defs/signatures" @@ -73,30 +108,30 @@ }, "aggregateType": { "type": "string", - "default": "not_specified", + "default": "not-specified", "enum": [ "complete", "incomplete", - "incomplete_first_party_only", - "incomplete_first_party_proprietary_only", - "incomplete_first_party_opensource_only", - "incomplete_third_party_only", - "incomplete_third_party_proprietary_only", - "incomplete_third_party_opensource_only", + "incomplete-first-party-only", + "incomplete-first-party-proprietary-only", + "incomplete-first-party-opensource-only", + "incomplete-third-party-only", + "incomplete-third-party-proprietary-only", + "incomplete-third-party-opensource-only", "unknown", - "not_specified" + "not-specified" ], "meta:enum": { - "complete": "The relationship is complete. No further relationships including constituent components, services, or dependencies are known to exist.", - "incomplete": "The relationship is incomplete. Additional relationships exist and may include constituent components, services, or dependencies.", - "incomplete_first_party_only": "The relationship is incomplete. Only relationships for first-party components, services, or their dependencies are represented.", - "incomplete_first_party_proprietary_only": "The relationship is incomplete. Only relationships for first-party components, services, or their dependencies are represented, limited specifically to those that are proprietary.", - "incomplete_first_party_opensource_only": "The relationship is incomplete. Only relationships for first-party components, services, or their dependencies are represented, limited specifically to those that are opensource.", - "incomplete_third_party_only": "The relationship is incomplete. Only relationships for third-party components, services, or their dependencies are represented.", - "incomplete_third_party_proprietary_only": "The relationship is incomplete. Only relationships for third-party components, services, or their dependencies are represented, limited specifically to those that are proprietary.", - "incomplete_third_party_opensource_only": "The relationship is incomplete. Only relationships for third-party components, services, or their dependencies are represented, limited specifically to those that are opensource.", - "unknown": "The relationship may be complete or incomplete. This usually signifies a 'best-effort' to obtain constituent components, services, or dependencies but the completeness is inconclusive.", - "not_specified": "The relationship completeness is not specified." + "complete": "The enumeration is complete. No additional items are known to exist.", + "incomplete": "The enumeration is incomplete. Additional items are known or expected to exist.", + "incomplete-first-party-only": "The enumeration is incomplete. Only first-party items are represented.", + "incomplete-first-party-proprietary-only": "The enumeration is incomplete. Only first-party items are represented, limited specifically to those that are proprietary.", + "incomplete-first-party-opensource-only": "The enumeration is incomplete. Only first-party items are represented, limited specifically to those that are open source.", + "incomplete-third-party-only": "The enumeration is incomplete. Only third-party items are represented.", + "incomplete-third-party-proprietary-only": "The enumeration is incomplete. Only third-party items are represented, limited specifically to those that are proprietary.", + "incomplete-third-party-opensource-only": "The enumeration is incomplete. Only third-party items are represented, limited specifically to those that are open source.", + "unknown": "The enumeration may be complete or incomplete. This usually signifies a best-effort attempt whose completeness is inconclusive.", + "not-specified": "The completeness is not specified." } } } diff --git a/schema/2.0/model/cyclonedx-cryptography-2.0.schema.json b/schema/2.0/model/cyclonedx-cryptography-2.0.schema.json index cb5c00f1..f38942d3 100644 --- a/schema/2.0/model/cyclonedx-cryptography-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-cryptography-2.0.schema.json @@ -165,78 +165,6 @@ } } }, - "certificationLevel": { - "type": "array", - "title": "Certification Level", - "description": "The certification that the implementation of the cryptographic algorithm has received, if any. Certifications include revisions and levels of FIPS 140 or Common Criteria of different Extended Assurance Levels (CC-EAL).", - "items": { - "type": "string", - "enum": [ - "none", - "fips140-1-l1", - "fips140-1-l2", - "fips140-1-l3", - "fips140-1-l4", - "fips140-2-l1", - "fips140-2-l2", - "fips140-2-l3", - "fips140-2-l4", - "fips140-3-l1", - "fips140-3-l2", - "fips140-3-l3", - "fips140-3-l4", - "cc-eal1", - "cc-eal1+", - "cc-eal2", - "cc-eal2+", - "cc-eal3", - "cc-eal3+", - "cc-eal4", - "cc-eal4+", - "cc-eal5", - "cc-eal5+", - "cc-eal6", - "cc-eal6+", - "cc-eal7", - "cc-eal7+", - "cavp", - "other", - "unknown" - ], - "meta:enum": { - "none": "No certification obtained", - "fips140-1-l1": "FIPS 140-1 Level 1", - "fips140-1-l2": "FIPS 140-1 Level 2", - "fips140-1-l3": "FIPS 140-1 Level 3", - "fips140-1-l4": "FIPS 140-1 Level 4", - "fips140-2-l1": "FIPS 140-2 Level 1", - "fips140-2-l2": "FIPS 140-2 Level 2", - "fips140-2-l3": "FIPS 140-2 Level 3", - "fips140-2-l4": "FIPS 140-2 Level 4", - "fips140-3-l1": "FIPS 140-3 Level 1", - "fips140-3-l2": "FIPS 140-3 Level 2", - "fips140-3-l3": "FIPS 140-3 Level 3", - "fips140-3-l4": "FIPS 140-3 Level 4", - "cc-eal1": "Common Criteria - Evaluation Assurance Level 1", - "cc-eal1+": "Common Criteria - Evaluation Assurance Level 1 (Augmented)", - "cc-eal2": "Common Criteria - Evaluation Assurance Level 2", - "cc-eal2+": "Common Criteria - Evaluation Assurance Level 2 (Augmented)", - "cc-eal3": "Common Criteria - Evaluation Assurance Level 3", - "cc-eal3+": "Common Criteria - Evaluation Assurance Level 3 (Augmented)", - "cc-eal4": "Common Criteria - Evaluation Assurance Level 4", - "cc-eal4+": "Common Criteria - Evaluation Assurance Level 4 (Augmented)", - "cc-eal5": "Common Criteria - Evaluation Assurance Level 5", - "cc-eal5+": "Common Criteria - Evaluation Assurance Level 5 (Augmented)", - "cc-eal6": "Common Criteria - Evaluation Assurance Level 6", - "cc-eal6+": "Common Criteria - Evaluation Assurance Level 6 (Augmented)", - "cc-eal7": "Common Criteria - Evaluation Assurance Level 7", - "cc-eal7+": "Common Criteria - Evaluation Assurance Level 7 (Augmented)", - "cavp": "Cryptographic Algorithm Validation Program", - "other": "Another certification", - "unknown": "The certification level is not known" - } - } - }, "mode": { "type": "string", "title": "Mode", diff --git a/schema/2.0/model/cyclonedx-data-2.0.schema.json b/schema/2.0/model/cyclonedx-data-2.0.schema.json index 8e342a29..a3a9b2be 100644 --- a/schema/2.0/model/cyclonedx-data-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-data-2.0.schema.json @@ -249,7 +249,7 @@ }, "dataProfileChoice": { "title": "Data Profile Choice", - "description": "A data profile represented either as a complete inline object or as a reference to a previously declared profile. References use bom-link or bom-ref to point at a profile declared in the root profiles catalogue or elsewhere in the document.", + "description": "A data profile represented either as a complete inline object or as a reference to a previously declared profile. References use bom-link or bom-ref to point at a profile declared in the definitions or elsewhere in the document.", "oneOf": [ { "$ref": "#/$defs/dataProfile" diff --git a/schema/2.0/model/cyclonedx-declaration-2.0.schema.json b/schema/2.0/model/cyclonedx-declaration-2.0.schema.json index 951e5a80..f70a1e0f 100644 --- a/schema/2.0/model/cyclonedx-declaration-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-declaration-2.0.schema.json @@ -300,7 +300,7 @@ "type": "array", "title": "Components", "description": "The list of components which claims are made against.", - "items": {"$ref": "cyclonedx-component-2.0.schema.json#/$defs/component"} + "items": {"$ref": "cyclonedx-component-2.0.schema.json#/$defs/componentEntry"} } } }, diff --git a/schema/2.0/model/cyclonedx-definition-2.0.schema.json b/schema/2.0/model/cyclonedx-definition-2.0.schema.json index ec57179b..03e13f5e 100644 --- a/schema/2.0/model/cyclonedx-definition-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-definition-2.0.schema.json @@ -8,9 +8,53 @@ "definitions": { "type": "object", "title": "Definitions", - "description": "A collection of reusable objects that are defined and may be used elsewhere in the BOM.", + "description": "A collection of reusable objects that may be referenced from elsewhere in the document or provided for interchange. The canonical form of each object is independent of any assertion, so every reference to it denotes an identical object.", "additionalProperties": false, "properties": { + "components": { + "type": "array", + "uniqueItems": true, + "title": "Components", + "description": "Reusable component declarations. Each entry is a concrete component that may be referenced from any position that accepts a component reference. Declaring a component here does not by itself include it in any subject. Components may also be declared here solely for interchange, without being referenced elsewhere in the document.", + "items": { + "$ref": "cyclonedx-component-2.0.schema.json#/$defs/component" + } + }, + "parties": { + "type": "array", + "uniqueItems": true, + "title": "Parties", + "description": "Reusable party declarations. Each entry is a concrete party that may be referenced by its bom-ref from any position that accepts a party. Declaring a party here does not by itself associate the party with any subject.", + "items": { + "$ref": "cyclonedx-party-2.0.schema.json#/$defs/party" + } + }, + "licenses": { + "type": "array", + "uniqueItems": true, + "title": "Licenses", + "description": "Reusable license declarations. Each entry is a concrete license or license expression that may be referenced by its bom-ref from any position that accepts a license reference. Declaring a license here does not by itself apply the license to any subject.", + "items": { + "$ref": "cyclonedx-license-2.0.schema.json#/$defs/licenseDeclaration" + } + }, + "profiles": { + "$ref": "cyclonedx-profile-2.0.schema.json#/$defs/profiles" + }, + "releaseNotes": { + "type": "array", + "uniqueItems": true, + "title": "Release Notes", + "description": "Reusable release notes declarations. Each entry may be referenced by its bom-ref from the components whose release it describes.", + "items": { + "$ref": "cyclonedx-release-notes-2.0.schema.json#/$defs/releaseNotes" + } + }, + "certifications": { + "$ref": "cyclonedx-certification-2.0.schema.json#/$defs/certifications", + "title": "Certifications", + "description": "Reusable certification declarations. Each entry may be referenced by its bom-ref from the subjects it applies to." + }, "standards": { "$ref": "cyclonedx-standard-2.0.schema.json#/$defs/standards" }, diff --git a/schema/2.0/model/cyclonedx-dependency-2.0.schema.json b/schema/2.0/model/cyclonedx-dependency-2.0.schema.json index 09779d1b..bbaae684 100644 --- a/schema/2.0/model/cyclonedx-dependency-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-dependency-2.0.schema.json @@ -24,7 +24,7 @@ "ref": { "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refLinkType", "title": "Reference", - "description": "References a component by its bom-ref attribute" + "description": "References a component by its bom-ref property." }, "dependsOn": { "type": "array", diff --git a/schema/2.0/model/cyclonedx-formulation-2.0.schema.json b/schema/2.0/model/cyclonedx-formulation-2.0.schema.json index 2fb4d0a9..2f9b76d1 100644 --- a/schema/2.0/model/cyclonedx-formulation-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-formulation-2.0.schema.json @@ -23,15 +23,6 @@ "description": "An identifier which can be used to reference the formula elsewhere in the BOM. Every `bom-ref` must be unique within the BOM.\nValue SHOULD not start with the BOM-Link intro 'urn:cdx:' to avoid conflicts with BOM-Links.", "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refType" }, - "components": { - "title": "Components", - "description": "Transient components that are used in tasks that constitute one or more of this formula's workflows", - "type": "array", - "items": { - "$ref": "cyclonedx-component-2.0.schema.json#/$defs/component" - }, - "uniqueItems": true - }, "workflows": { "title": "Workflows", "description": "List of workflows that can be declared to accomplish specific orchestrated goals and independently triggered.", @@ -133,7 +124,7 @@ "inputs": { "title": "Inputs", "description": "Represents resources and data brought into a task at runtime by executor or task commands", - "examples": ["a `configuration` file which was declared as a local `component` or `externalReference`"], + "examples": ["a `configuration` file which was defined as a `component` in the definitions or as an `externalReference`"], "type": "array", "items": { "$ref": "#/$defs/inputType" @@ -253,7 +244,7 @@ "inputs": { "title": "Inputs", "description": "Represents resources and data brought into a task at runtime by executor or task commands", - "examples": ["a `configuration` file which was declared as a local `component` or `externalReference`"], + "examples": ["a `configuration` file which was defined as a `component` in the definitions or as an `externalReference`"], "type": "array", "items": { "$ref": "#/$defs/inputType" @@ -560,7 +551,7 @@ "inputs": { "title": "Inputs", "description": "Represents resources and data brought into a task at runtime by executor or task commands", - "examples": ["a `configuration` file which was declared as a local `component` or `externalReference`"], + "examples": ["a `configuration` file which was defined as a `component` in the definitions or as an `externalReference`"], "type": "array", "items": { "$ref": "#/$defs/inputType" @@ -801,7 +792,7 @@ "properties": { "ref": { "title": "BOM Reference", - "description": "References an object by its bom-ref attribute", + "description": "References an object by its bom-ref property.", "anyOf": [ { "title": "Ref", diff --git a/schema/2.0/model/cyclonedx-license-2.0.schema.json b/schema/2.0/model/cyclonedx-license-2.0.schema.json index 2faa5543..d034617a 100644 --- a/schema/2.0/model/cyclonedx-license-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-license-2.0.schema.json @@ -7,102 +7,134 @@ "$defs": { "licenseChoice": { "title": "License Choice", - "description": "A list of SPDX licenses and/or named licenses and/or SPDX License Expression.", + "description": "A list of SPDX licenses and/or named licenses and/or SPDX License Expression. Entries may be concrete license declarations or references to licenses defined elsewhere.", "type": "array", "items": { "oneOf": [ { - "type": "object", - "title": "License", - "required": [ - "license" - ], - "additionalProperties": false, - "properties": { - "license": { - "$ref": "#/$defs/license" - } - } + "$ref": "#/$defs/licenseDeclaration" }, { - "title": "License Expression", - "description": "Specifies the details and attributes related to a software license.\nIt must be a valid SPDX license expression, along with additional properties such as license acknowledgment.", - "type": "object", - "additionalProperties": false, - "required": [ - "expression" - ], - "properties": { - "expression": { - "type": "string", - "title": "SPDX License Expression", - "description": "A valid SPDX license expression.\nRefer to https://spdx.org/specifications for syntax requirements.", - "examples": [ - "Apache-2.0 AND (MIT OR GPL-2.0-only)", - "GPL-3.0-only WITH Classpath-exception-2.0" - ] - }, - "expressionDetails": { - "title": "Expression Details", - "description": "Details for parts of the `expression`.", - "type": "array", - "items": { - "type": "object", - "description": "This document specifies the details and attributes related to a software license identifier. An SPDX expression may be a compound of license identifiers.\nThe `license_identifier` property serves as the key that identifies each record. Note that this key is not required to be unique, as the same license identifier could apply to multiple, different but similar license details, texts, etc.", - "required": [ - "licenseIdentifier" - ], - "properties": { - "licenseIdentifier": { - "title": "License Identifier", - "description": "The valid SPDX license identifier. Refer to https://spdx.org/specifications for syntax requirements.\nThis property serves as the primary key, which uniquely identifies each record.", - "type": "string", - "examples": [ - "Apache-2.0", - "GPL-3.0-only WITH Classpath-exception-2.0", - "LicenseRef-my-custom-license" - ] - }, - "bom-ref": { - "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refType", - "title": "BOM Reference", - "description": "An identifier which can be used to reference the license elsewhere in the BOM. Every `bom-ref` must be unique within the BOM.\nValue SHOULD not start with the BOM-Link intro 'urn:cdx:' to avoid conflicts with BOM-Links." - }, - "text": { - "title": "License texts", - "description": "A way to include the textual content of the license.", - "$ref": "cyclonedx-common-2.0.schema.json#/$defs/attachment" - }, - "url": { - "type": "string", - "title": "License URL", - "description": "The URL to the license file. If specified, a 'license' externalReference should also be specified for completeness", - "examples": [ - "https://www.apache.org/licenses/LICENSE-2.0.txt" - ], - "format": "iri-reference" - } + "$ref": "#/$defs/licenseReference" + } + ] + } + }, + "licenseDeclaration": { + "title": "License Declaration", + "description": "A concrete license declaration: a single SPDX or named license, or an SPDX license expression.", + "oneOf": [ + { + "type": "object", + "title": "License", + "required": [ + "license" + ], + "additionalProperties": false, + "properties": { + "license": { + "$ref": "#/$defs/license" + } + } + }, + { + "title": "License Expression", + "description": "Specifies the details and attributes related to a software license.\nIt must be a valid SPDX license expression, along with additional properties such as license acknowledgment.", + "type": "object", + "additionalProperties": false, + "required": [ + "expression" + ], + "properties": { + "expression": { + "type": "string", + "title": "SPDX License Expression", + "description": "A valid SPDX license expression.\nRefer to https://spdx.org/specifications for syntax requirements.", + "examples": [ + "Apache-2.0 AND (MIT OR GPL-2.0-only)", + "GPL-3.0-only WITH Classpath-exception-2.0" + ] + }, + "expressionDetails": { + "title": "Expression Details", + "description": "Details for parts of the `expression`.", + "type": "array", + "items": { + "type": "object", + "description": "This document specifies the details and attributes related to a software license identifier. An SPDX expression may be a compound of license identifiers.\nThe `license_identifier` property serves as the key that identifies each record. Note that this key is not required to be unique, as the same license identifier could apply to multiple, different but similar license details, texts, etc.", + "required": [ + "licenseIdentifier" + ], + "properties": { + "licenseIdentifier": { + "title": "License Identifier", + "description": "The valid SPDX license identifier. Refer to https://spdx.org/specifications for syntax requirements.\nThis property serves as the primary key, which uniquely identifies each record.", + "type": "string", + "examples": [ + "Apache-2.0", + "GPL-3.0-only WITH Classpath-exception-2.0", + "LicenseRef-my-custom-license" + ] + }, + "text": { + "title": "License texts", + "description": "A way to include the textual content of the license.", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/attachment" }, - "additionalProperties": false - } - }, - "acknowledgement": { - "$ref": "#/$defs/licenseAcknowledgementEnumeration" - }, - "bom-ref": { - "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refType", - "title": "BOM Reference", - "description": "An identifier which can be used to reference the license elsewhere in the BOM. Every `bom-ref` must be unique within the BOM.\nValue SHOULD not start with the BOM-Link intro 'urn:cdx:' to avoid conflicts with BOM-Links." - }, - "licensing": { - "$ref": "#/$defs/licensing" - }, - "properties": { - "$ref": "cyclonedx-common-2.0.schema.json#/$defs/properties" + "url": { + "type": "string", + "title": "License URL", + "description": "The URL to the license file. If specified, a 'license' externalReference should also be specified for completeness", + "examples": [ + "https://www.apache.org/licenses/LICENSE-2.0.txt" + ], + "format": "iri-reference" + } + }, + "additionalProperties": false } + }, + "acknowledgement": { + "$ref": "#/$defs/licenseAcknowledgementEnumeration" + }, + "bom-ref": { + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refType", + "title": "BOM Reference", + "description": "An identifier which can be used to reference the license elsewhere in the BOM. Every `bom-ref` must be unique within the BOM.\nValue SHOULD not start with the BOM-Link intro 'urn:cdx:' to avoid conflicts with BOM-Links." + }, + "licensing": { + "$ref": "#/$defs/licensing" + }, + "properties": { + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/properties" } } - ] + } + ] + }, + "licenseReference": { + "type": "object", + "title": "License Reference", + "description": "A reference to a license declared elsewhere, such as in the definitions registry or in another document via BOM-Link. A reference includes the referenced license exactly as declared: every position that references the same license carries an identical license. Where the licensing context differs, such as a different acknowledgement, declare the license inline instead.", + "required": [ + "ref" + ], + "additionalProperties": false, + "properties": { + "ref": { + "title": "Reference", + "description": "Reference using bom-link or bom-ref to the license. The referent is the bom-ref of a license or of a license expression.", + "anyOf": [ + { + "title": "Ref", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refLinkType" + }, + { + "title": "BOM-Link Element", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/bomLinkElementType" + } + ] + } } }, "license": { diff --git a/schema/2.0/model/cyclonedx-metadata-2.0.schema.json b/schema/2.0/model/cyclonedx-metadata-2.0.schema.json index 5da76761..b6674418 100644 --- a/schema/2.0/model/cyclonedx-metadata-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-metadata-2.0.schema.json @@ -43,10 +43,6 @@ "description": "The person(s) who created the BOM.\nAuthors are common in BOMs created through manual processes. BOMs created through automated means may have `@.manufacturer` instead.", "items": {"$ref": "cyclonedx-common-2.0.schema.json#/$defs/organizationalContact"} }, - "component": { - "description": "The component that the BOM describes.", - "$ref": "cyclonedx-component-2.0.schema.json#/$defs/component" - }, "supplier": { "title": "Supplier", "description": " The organization that supplied the component that the BOM describes. The supplier may often be the manufacturer, but may also be a distributor or repackager.", @@ -54,7 +50,7 @@ }, "licenses": { "title": "BOM License(s)", - "description": "The license information for the BOM document.\nThis may be different from the license(s) of the component(s) that the BOM describes.", + "description": "The license information for the CycloneDX artifact or payload.", "$ref": "cyclonedx-license-2.0.schema.json#/$defs/licenseChoice" }, "distributionConstraints": { diff --git a/schema/2.0/model/cyclonedx-perspective-2.0.schema.json b/schema/2.0/model/cyclonedx-perspective-2.0.schema.json index 217cf587..fa0728c3 100644 --- a/schema/2.0/model/cyclonedx-perspective-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-perspective-2.0.schema.json @@ -80,9 +80,9 @@ "title": "Path Expression", "description": "A [JSONPath](https://datatracker.ietf.org/doc/html/rfc9535) expression that identifies the types of data relevant to this perspective.", "examples": [ - "$.components[*].pedigree", - "$.components[?(@.type=='machine-learning-model')].modelCard", - "$.components[?(@.type=='cryptographic-asset')]", + "$.inventories[*].components[*].pedigree", + "$.inventories[*].components[?(@.type=='machine-learning-model')].modelProperties", + "$.definitions.components[?(@.type=='cryptographic-asset')]", "$.vulnerabilities" ] }, diff --git a/schema/2.0/model/cyclonedx-release-notes-2.0.schema.json b/schema/2.0/model/cyclonedx-release-notes-2.0.schema.json index b16f8e92..75885eae 100644 --- a/schema/2.0/model/cyclonedx-release-notes-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-release-notes-2.0.schema.json @@ -13,6 +13,11 @@ ], "additionalProperties": false, "properties": { + "bom-ref": { + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refType", + "title": "BOM Reference", + "description": "An identifier which can be used to reference the release notes elsewhere in the document. Every `bom-ref` shall be unique within the document." + }, "type": { "$ref": "#/$defs/releaseType", "title": "Type", @@ -109,6 +114,31 @@ "$ref": "cyclonedx-common-2.0.schema.json#/$defs/attachment" } } + }, + "releaseNotesReference": { + "type": "object", + "title": "Release Notes Reference", + "description": "A reference to release notes defined elsewhere, such as in the definitions or in another document via BOM-Link. A reference includes the referenced release notes exactly as defined: every position that references the same release notes includes identical release notes.", + "required": [ + "ref" + ], + "additionalProperties": false, + "properties": { + "ref": { + "title": "Reference", + "description": "Reference using bom-link or bom-ref to the release notes.", + "anyOf": [ + { + "title": "Ref", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refLinkType" + }, + { + "title": "BOM-Link Element", + "$ref": "cyclonedx-common-2.0.schema.json#/$defs/bomLinkElementType" + } + ] + } + } } } } diff --git a/schema/2.0/model/cyclonedx-requirement-2.0.schema.json b/schema/2.0/model/cyclonedx-requirement-2.0.schema.json index d141b1b6..9c9184d8 100644 --- a/schema/2.0/model/cyclonedx-requirement-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-requirement-2.0.schema.json @@ -252,7 +252,7 @@ "additionalProperties": false, "properties": { "ref": { - "oneOf": [ + "anyOf": [ { "title": "Ref", "$ref": "cyclonedx-common-2.0.schema.json#/$defs/refLinkType" diff --git a/schema/2.0/model/cyclonedx-vulnerability-2.0.schema.json b/schema/2.0/model/cyclonedx-vulnerability-2.0.schema.json index 16d64cb5..61262795 100644 --- a/schema/2.0/model/cyclonedx-vulnerability-2.0.schema.json +++ b/schema/2.0/model/cyclonedx-vulnerability-2.0.schema.json @@ -186,7 +186,7 @@ "properties": { "components": { "type": "array", - "items": {"$ref": "cyclonedx-component-2.0.schema.json#/$defs/component"}, + "items": {"$ref": "cyclonedx-component-2.0.schema.json#/$defs/componentEntry"}, "uniqueItems": true, "title": "Components", "description": "A list of components used as tools. This may include software, hardware, and services such as microservices and function-as-a-service." diff --git a/tools/src/test/resources/2.0/invalid-bomformat-2.0.json b/tools/src/test/resources/2.0/invalid-bomformat-2.0.json index 03e60bbb..4da0d332 100644 --- a/tools/src/test/resources/2.0/invalid-bomformat-2.0.json +++ b/tools/src/test/resources/2.0/invalid-bomformat-2.0.json @@ -4,6 +4,8 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - ] + "definitions": { + "components": [ + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-certification-reference-with-extra-2.0.json b/tools/src/test/resources/2.0/invalid-certification-reference-with-extra-2.0.json new file mode 100644 index 00000000..90088148 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-certification-reference-with-extra-2.0.json @@ -0,0 +1,19 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "certifications": [ + { "bom-ref": "cert-1", "standard": "AEC-Q100" } + ], + "components": [ + { + "bom-ref": "mcu-1", + "type": "device", + "name": "Acme MCU", + "certifications": [ + { "ref": "cert-1", "standard": "A reference shall carry only the ref" } + ] + } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-citations-2.0.json b/tools/src/test/resources/2.0/invalid-citations-2.0.json index a7d2618e..10f0ab7c 100644 --- a/tools/src/test/resources/2.0/invalid-citations-2.0.json +++ b/tools/src/test/resources/2.0/invalid-citations-2.0.json @@ -7,31 +7,33 @@ "metadata": { "timestamp": "2025-05-01T14:23:00Z" }, - "components": [ - { - "type": "library", - "bom-ref": "component-1", - "name": "example-lib", - "version": "1.2.3", - "licenses": [ - { - "license": { - "id": "Apache-2.0" + "definitions": { + "components": [ + { + "type": "library", + "bom-ref": "component-1", + "name": "example-lib", + "version": "1.2.3", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } } - } - ] - } - ], + ] + } + ] + }, "citations": [ { "bom-ref": "citation-1", - "pointers": ["/components/0/name"], + "pointers": ["/definitions/components/0/name"], "timestamp": "2025-05-01T14:00:00Z", "note": "Should have at least one of the following property sets: property 'attributedTo' or property 'process'" }, { "bom-ref": "citation-1", - "pointers": ["/components/0/name"], + "pointers": ["/definitions/components/0/name"], "expressions": ["$..[?(@.bom-ref=='component-1')].version"], "timestamp": "2025-05-01T14:00:00Z", "note": "Should not have both a pointer and expression." diff --git a/tools/src/test/resources/2.0/invalid-component-choice-additional-property-2.0.json b/tools/src/test/resources/2.0/invalid-component-choice-additional-property-2.0.json index 436820ec..b87d1d88 100644 --- a/tools/src/test/resources/2.0/invalid-component-choice-additional-property-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-choice-additional-property-2.0.json @@ -3,22 +3,25 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Product" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "name": "Transistor Choice", - "description": "unexpected property `supplier`", - "operator": "XOR", - "supplier": { "name": "`supplier` is not allowed on a choice wrapper" }, + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, "components": [ - { "type": "device", "name": "Transistor A" }, - { "type": "device", "name": "Transistor B" } + { + "type": "component-choice", + "name": "Transistor Choice", + "description": "unexpected property `supplier`", + "operator": "XOR", + "supplier": { "name": "`supplier` is not allowed on a choice wrapper" }, + "components": [ + { "type": "device", "name": "Transistor A" }, + { "type": "device", "name": "Transistor B" } + ] + } ] } ] diff --git a/tools/src/test/resources/2.0/invalid-component-choice-bad-operator-2.0.json b/tools/src/test/resources/2.0/invalid-component-choice-bad-operator-2.0.json index 4c49bda4..1b7c0fff 100644 --- a/tools/src/test/resources/2.0/invalid-component-choice-bad-operator-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-choice-bad-operator-2.0.json @@ -3,21 +3,24 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Product" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "name": "Transistor Choice", - "description": "unexpected value for `operator`", - "operator": "NAND", + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, "components": [ - { "type": "device", "name": "Transistor A" }, - { "type": "device", "name": "Transistor B" } + { + "type": "component-choice", + "name": "Transistor Choice", + "description": "unexpected value for `operator`", + "operator": "NAND", + "components": [ + { "type": "device", "name": "Transistor A" }, + { "type": "device", "name": "Transistor B" } + ] + } ] } ] diff --git a/tools/src/test/resources/2.0/invalid-component-choice-missing-operator-2.0.json b/tools/src/test/resources/2.0/invalid-component-choice-missing-operator-2.0.json index 10d313d2..2a318c70 100644 --- a/tools/src/test/resources/2.0/invalid-component-choice-missing-operator-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-choice-missing-operator-2.0.json @@ -3,20 +3,23 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Product" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "name": "Transistor Choice", - "description": "missing property `operator`", + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, "components": [ - { "type": "device", "name": "Transistor A" }, - { "type": "device", "name": "Transistor B" } + { + "type": "component-choice", + "name": "Transistor Choice", + "description": "missing property `operator`", + "components": [ + { "type": "device", "name": "Transistor A" }, + { "type": "device", "name": "Transistor B" } + ] + } ] } ] diff --git a/tools/src/test/resources/2.0/invalid-component-choice-optional-operator-2.0.json b/tools/src/test/resources/2.0/invalid-component-choice-optional-operator-2.0.json index d65666b6..daeb0cf4 100644 --- a/tools/src/test/resources/2.0/invalid-component-choice-optional-operator-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-choice-optional-operator-2.0.json @@ -3,21 +3,24 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Product" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "name": "JP2 Debug Header", - "description": "invalid value for `operator`", - "operator": "OPTIONAL", + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, "components": [ - { "type": "device", "name": "Debug Header A" }, - { "type": "device", "name": "Debug Header B" } + { + "type": "component-choice", + "name": "JP2 Debug Header", + "description": "invalid value for `operator`", + "operator": "OPTIONAL", + "components": [ + { "type": "device", "name": "Debug Header A" }, + { "type": "device", "name": "Debug Header B" } + ] + } ] } ] diff --git a/tools/src/test/resources/2.0/invalid-component-choice-too-few-2.0.json b/tools/src/test/resources/2.0/invalid-component-choice-too-few-2.0.json index 9e1a9b53..9d44bf59 100644 --- a/tools/src/test/resources/2.0/invalid-component-choice-too-few-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-choice-too-few-2.0.json @@ -3,20 +3,23 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Product" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "name": "Transistor Choice", - "description": "`components` must list at least two items", - "operator": "XOR", + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, "components": [ - { "type": "device", "name": "Lone Transistor" } + { + "type": "component-choice", + "name": "Transistor Choice", + "description": "`components` must list at least two items", + "operator": "XOR", + "components": [ + { "type": "device", "name": "Lone Transistor" } + ] + } ] } ] diff --git a/tools/src/test/resources/2.0/invalid-component-evidence-assessment-technique-2.0.json b/tools/src/test/resources/2.0/invalid-component-evidence-assessment-technique-2.0.json index 008793e8..a3d063a4 100644 --- a/tools/src/test/resources/2.0/invalid-component-evidence-assessment-technique-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-evidence-assessment-technique-2.0.json @@ -2,11 +2,13 @@ "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", "specFormat": "CycloneDX", "specVersion": "2.0", "serialNumber": "urn:uuid:ee671687-395b-41f5-a30f-a58921a69e02", "version": 1, - "components": [ - { "type": "library", "name": "acme-lib", "version": "1.0.0", - "evidence": { "identity": [ - { "scheme": "purl", "confidence": 0.9, - "methods": [ { "technique": "penetration-testing", "confidence": 0.9 } ] } - ] } } - ] + "definitions": { + "components": [ + { "type": "library", "name": "acme-lib", "version": "1.0.0", + "evidence": { "identity": [ + { "scheme": "purl", "confidence": 0.9, + "methods": [ { "technique": "penetration-testing", "confidence": 0.9 } ] } + ] } } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-evidence-data-2.0.json b/tools/src/test/resources/2.0/invalid-component-evidence-data-2.0.json index 345c7606..00a4d5da 100644 --- a/tools/src/test/resources/2.0/invalid-component-evidence-data-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-evidence-data-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:dd671687-395b-41f5-a30f-a58921a69c05", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-lib", - "version": "1.0.0", - "evidence": { - "data": [ { "name": "scanner report", "type": "report" } ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-lib", + "version": "1.0.0", + "evidence": { + "data": [ { "name": "scanner report", "type": "report" } ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-evidence-presence-2.0.json b/tools/src/test/resources/2.0/invalid-component-evidence-presence-2.0.json index 52870de7..a20b3a2d 100644 --- a/tools/src/test/resources/2.0/invalid-component-evidence-presence-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-evidence-presence-2.0.json @@ -4,15 +4,17 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:dd671687-395b-41f5-a30f-a58921a69c03", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-lib", - "version": "1.0.0", - "evidence": { - "identity": [ { "scheme": "purl", "confidence": 1.0 } ], - "presence": [ { "confidence": 1.0, "status": "affected" } ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-lib", + "version": "1.0.0", + "evidence": { + "identity": [ { "scheme": "purl", "confidence": 1.0 } ], + "presence": [ { "confidence": 1.0, "status": "affected" } ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-external-version-and-range.json b/tools/src/test/resources/2.0/invalid-component-external-version-and-range.json index 9e3b5b86..c773042e 100644 --- a/tools/src/test/resources/2.0/invalid-component-external-version-and-range.json +++ b/tools/src/test/resources/2.0/invalid-component-external-version-and-range.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "InvalidVersions", - "description": "may have `version` or `versionRange`, not both. This one does - it is invalid", - "version": "9.0.14", - "versionRange": "vers:pypi/0.0.0|0.0.1|0.0.2|0.0.3|1.0|2.0pre1", - "isExternal": true - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "InvalidVersions", + "description": "may have `version` or `versionRange`, not both. This one does - it is invalid", + "version": "9.0.14", + "versionRange": "vers:pypi/0.0.0|0.0.1|0.0.2|0.0.3|1.0|2.0pre1", + "isExternal": true + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-mediatype-2.0.json b/tools/src/test/resources/2.0/invalid-component-mediatype-2.0.json new file mode 100644 index 00000000..e12c1648 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-component-mediatype-2.0.json @@ -0,0 +1,9 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { "bom-ref": "file-1", "type": "file", "name": "mystery.bin", "mediaType": "image" } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-component-mime-type-2.0.json b/tools/src/test/resources/2.0/invalid-component-mime-type-2.0.json new file mode 100644 index 00000000..0f0dd529 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-component-mime-type-2.0.json @@ -0,0 +1,9 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { "bom-ref": "file-1", "type": "file", "name": "logo.jpg", "mime-type": "image/jpeg" } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-component-ref-2.0.json b/tools/src/test/resources/2.0/invalid-component-ref-2.0.json index 86d3af7d..25845e2c 100644 --- a/tools/src/test/resources/2.0/invalid-component-ref-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-ref-2.0.json @@ -4,18 +4,20 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "bom-ref": "123", - "name": "acme-library", - "version": "1.0.0" - }, - { - "type": "library", - "bom-ref": "", - "name": "acme-library", - "version": "1.0.0" - } - ] + "definitions": { + "components": [ + { + "type": "library", + "bom-ref": "123", + "name": "acme-library", + "version": "1.0.0" + }, + { + "type": "library", + "bom-ref": "", + "name": "acme-library", + "version": "1.0.0" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-service-fields-2.0.json b/tools/src/test/resources/2.0/invalid-component-service-fields-2.0.json index aec12760..f18405bf 100644 --- a/tools/src/test/resources/2.0/invalid-component-service-fields-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-service-fields-2.0.json @@ -4,20 +4,22 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "not-a-service", - "type": "application", - "name": "Acme Application", - "endpoints": [ - "https://example.com/api" - ], - "dataProfiles": [ - { - "name": "Customer PII", - "classification": "confidential" - } - ] - } - ] + "definitions": { + "components": [ + { + "bom-ref": "not-a-service", + "type": "application", + "name": "Acme Application", + "endpoints": [ + "https://example.com/api" + ], + "dataProfiles": [ + { + "name": "Customer PII", + "classification": "confidential" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-swid-2.0.json b/tools/src/test/resources/2.0/invalid-component-swid-2.0.json index 2e64dbc2..68aff49b 100644 --- a/tools/src/test/resources/2.0/invalid-component-swid-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-swid-2.0.json @@ -10,21 +10,23 @@ "name": "Acme Inc." } }, - "components": [ - { - "type": "application", - "name": "Acme Application", - "version": "9.1.1", - "identifiers": [ - { - "party": "acme-inc", - "identities": [ - { - "scheme": "swid" - } - ] - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "application", + "name": "Acme Application", + "version": "9.1.1", + "identifiers": [ + { + "party": "acme-inc", + "identities": [ + { + "scheme": "swid" + } + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-type-2.0.json b/tools/src/test/resources/2.0/invalid-component-type-2.0.json index 3a1f0c71..056dbe3d 100644 --- a/tools/src/test/resources/2.0/invalid-component-type-2.0.json +++ b/tools/src/test/resources/2.0/invalid-component-type-2.0.json @@ -4,11 +4,13 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "foo", - "name": "acme-library", - "version": "1.0.0" - } - ] + "definitions": { + "components": [ + { + "type": "foo", + "name": "acme-library", + "version": "1.0.0" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-explicit.json b/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-explicit.json index 4f2e4068..7d14ddea 100644 --- a/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-explicit.json +++ b/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-explicit.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "InvalidVersions", - "description": "versionRange may only exist on extraneous components; set `.isExternal` explicit", - "isExternal": false, - "versionRange": "vers:pypi/0.0.0|0.0.1|0.0.2|0.0.3|1.0|2.0pre1" - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "InvalidVersions", + "description": "versionRange may only exist on extraneous components; set `.isExternal` explicit", + "isExternal": false, + "versionRange": "vers:pypi/0.0.0|0.0.1|0.0.2|0.0.3|1.0|2.0pre1" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-implicit.json b/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-implicit.json index 429d40ec..09242489 100644 --- a/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-implicit.json +++ b/tools/src/test/resources/2.0/invalid-component-versionRange-non-external-implicit.json @@ -4,12 +4,14 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "InvalidVersions", - "description": "versionRange may only exist on extraneous components; set `.isExternal` implicit by default value", - "versionRange": "vers:pypi/0.0.0|0.0.1|0.0.2|0.0.3|1.0|2.0pre1" - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "InvalidVersions", + "description": "versionRange may only exist on extraneous components; set `.isExternal` implicit by default value", + "versionRange": "vers:pypi/0.0.0|0.0.1|0.0.2|0.0.3|1.0|2.0pre1" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-composition-aggregate-casing-2.0.json b/tools/src/test/resources/2.0/invalid-composition-aggregate-casing-2.0.json new file mode 100644 index 00000000..66edcfdb --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-composition-aggregate-casing-2.0.json @@ -0,0 +1,11 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "compositions": [ + { + "kind": "components", + "aggregate": "incomplete_first_party_only", + "targets": [ "acme-app" ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-composition-custom-kind-missing-name-2.0.json b/tools/src/test/resources/2.0/invalid-composition-custom-kind-missing-name-2.0.json new file mode 100644 index 00000000..9f9037f5 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-composition-custom-kind-missing-name-2.0.json @@ -0,0 +1,13 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "compositions": [ + { + "kind": { + "description": "A custom kind without the required name." + }, + "aggregate": "complete", + "targets": [ "acme-app" ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-composition-missing-kind-2.0.json b/tools/src/test/resources/2.0/invalid-composition-missing-kind-2.0.json new file mode 100644 index 00000000..4e9df7d9 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-composition-missing-kind-2.0.json @@ -0,0 +1,10 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "compositions": [ + { + "aggregate": "complete", + "targets": [ "acme-app" ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-composition-missing-targets-2.0.json b/tools/src/test/resources/2.0/invalid-composition-missing-targets-2.0.json new file mode 100644 index 00000000..1f2ba409 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-composition-missing-targets-2.0.json @@ -0,0 +1,10 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "compositions": [ + { + "kind": "components", + "aggregate": "complete" + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-composition-old-assemblies-2.0.json b/tools/src/test/resources/2.0/invalid-composition-old-assemblies-2.0.json new file mode 100644 index 00000000..695996b1 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-composition-old-assemblies-2.0.json @@ -0,0 +1,12 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "compositions": [ + { + "kind": "components", + "aggregate": "complete", + "targets": [ "acme-app" ], + "assemblies": [ "acme-app" ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-composition-unknown-kind-2.0.json b/tools/src/test/resources/2.0/invalid-composition-unknown-kind-2.0.json new file mode 100644 index 00000000..031cf4fd --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-composition-unknown-kind-2.0.json @@ -0,0 +1,11 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "compositions": [ + { + "kind": "assemblies", + "aggregate": "complete", + "targets": [ "acme-app" ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-copyright-evidence-missing-text-2.0.json b/tools/src/test/resources/2.0/invalid-copyright-evidence-missing-text-2.0.json index 70f40a27..cd9847c7 100644 --- a/tools/src/test/resources/2.0/invalid-copyright-evidence-missing-text-2.0.json +++ b/tools/src/test/resources/2.0/invalid-copyright-evidence-missing-text-2.0.json @@ -2,9 +2,11 @@ "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", "specFormat": "CycloneDX", "specVersion": "2.0", "serialNumber": "urn:uuid:13671687-395b-41f5-a30f-a58921a6b003", "version": 1, - "components": [ - { "type": "library", "name": "acme-lib", "version": "1.0.0", - "evidence": { "copyright": [ - { "confidence": 0.9, "methods": [ { "technique": "content-match", "confidence": 0.9 } ] } ] } } - ] + "definitions": { + "components": [ + { "type": "library", "name": "acme-lib", "version": "1.0.0", + "evidence": { "copyright": [ + { "confidence": 0.9, "methods": [ { "technique": "content-match", "confidence": 0.9 } ] } ] } } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-cryptography-certification-level-2.0.json b/tools/src/test/resources/2.0/invalid-cryptography-certification-level-2.0.json new file mode 100644 index 00000000..c0eaed45 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-cryptography-certification-level-2.0.json @@ -0,0 +1,20 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { + "bom-ref": "alg-aes-256-gcm", + "type": "cryptographic-asset", + "name": "AES-256-GCM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "ae", + "certificationLevel": [ "fips140-3-l1" ] + } + } + } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-definitions-certifications-holding-reference-2.0.json b/tools/src/test/resources/2.0/invalid-definitions-certifications-holding-reference-2.0.json new file mode 100644 index 00000000..9ce7efa8 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-definitions-certifications-holding-reference-2.0.json @@ -0,0 +1,9 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "certifications": [ + "cert-declared-somewhere-else" + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-definitions-licenses-holding-reference-2.0.json b/tools/src/test/resources/2.0/invalid-definitions-licenses-holding-reference-2.0.json new file mode 100644 index 00000000..2da5d52c --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-definitions-licenses-holding-reference-2.0.json @@ -0,0 +1,9 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "licenses": [ + { "ref": "lic-declared-somewhere-else" } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-definitions-parties-holding-reference-2.0.json b/tools/src/test/resources/2.0/invalid-definitions-parties-holding-reference-2.0.json new file mode 100644 index 00000000..5f8d650d --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-definitions-parties-holding-reference-2.0.json @@ -0,0 +1,9 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "parties": [ + "party-declared-somewhere-else" + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-definitions-release-notes-holding-reference-2.0.json b/tools/src/test/resources/2.0/invalid-definitions-release-notes-holding-reference-2.0.json new file mode 100644 index 00000000..4fad27d5 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-definitions-release-notes-holding-reference-2.0.json @@ -0,0 +1,9 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "releaseNotes": [ + "rn-declared-somewhere-else" + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-dependency-2.0.json b/tools/src/test/resources/2.0/invalid-dependency-2.0.json index 62c2f81d..79395864 100644 --- a/tools/src/test/resources/2.0/invalid-dependency-2.0.json +++ b/tools/src/test/resources/2.0/invalid-dependency-2.0.json @@ -4,26 +4,28 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "library-a", - "type": "library", - "name": "library-a", - "version": "1.0.0" - }, - { - "bom-ref": "library-b", - "type": "library", - "name": "library-b", - "version": "1.0.0" - }, - { - "bom-ref": "library-c", - "type": "library", - "name": "library-c", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "library-a", + "type": "library", + "name": "library-a", + "version": "1.0.0" + }, + { + "bom-ref": "library-b", + "type": "library", + "name": "library-b", + "version": "1.0.0" + }, + { + "bom-ref": "library-c", + "type": "library", + "name": "library-c", + "version": "1.0.0" + } + ] + }, "dependencies": [ { "dependsOn": [] diff --git a/tools/src/test/resources/2.0/invalid-empty-component-2.0.json b/tools/src/test/resources/2.0/invalid-empty-component-2.0.json index d9f4e536..52442c95 100644 --- a/tools/src/test/resources/2.0/invalid-empty-component-2.0.json +++ b/tools/src/test/resources/2.0/invalid-empty-component-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library" - } - ] + "definitions": { + "components": [ + { + "type": "library" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-nested-object-missing-schema.json b/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-nested-object-missing-schema.json index 703e5793..91ddd97a 100644 --- a/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-nested-object-missing-schema.json +++ b/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-nested-object-missing-schema.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0" + } + ] + }, "ext:tools.example.io:array-item-nested-object-missing-schema": [[ { } diff --git a/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-object-missing-schema.json b/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-object-missing-schema.json index 6da0d22f..58a65f04 100644 --- a/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-object-missing-schema.json +++ b/tools/src/test/resources/2.0/invalid-extensible-properties-array-item-object-missing-schema.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0" + } + ] + }, "ext:tools.example.io:array-item-object-missing-schema": [ { } diff --git a/tools/src/test/resources/2.0/invalid-extensible-properties-item-wrong-prefix.json b/tools/src/test/resources/2.0/invalid-extensible-properties-item-wrong-prefix.json index 0282f69b..6c4b6a23 100644 --- a/tools/src/test/resources/2.0/invalid-extensible-properties-item-wrong-prefix.json +++ b/tools/src/test/resources/2.0/invalid-extensible-properties-item-wrong-prefix.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0" + } + ] + }, "example.com:booleanValue": "not `ext:: - missing prefix", "ext:example:stringValue": "not `ext:: - missing TLD", "ext:example.com:": "not `ext:: - missing name" diff --git a/tools/src/test/resources/2.0/invalid-extensible-properties-object-missing-schema.json b/tools/src/test/resources/2.0/invalid-extensible-properties-object-missing-schema.json index 06911da6..c3dfddef 100644 --- a/tools/src/test/resources/2.0/invalid-extensible-properties-object-missing-schema.json +++ b/tools/src/test/resources/2.0/invalid-extensible-properties-object-missing-schema.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0" + } + ] + }, "ext:example.org:object-missing-schema": { } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-library-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-library-2.0.json index 2489e2e7..a5f71520 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-library-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-library-2.0.json @@ -4,16 +4,18 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e05", - "components": [ - { - "type": "library", - "name": "acme-lib", - "version": "1.0.0", - "boardLocation": { - "designators": [ - "U1" - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-lib", + "version": "1.0.0", + "boardLocation": { + "designators": [ + "U1" + ] + } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-material-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-material-2.0.json index d0cb2d4c..9408dc8c 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-material-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-boardlocation-on-material-2.0.json @@ -4,16 +4,18 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e12", - "components": [ - { - "bom-ref": "comp-tantalum", - "type": "material", - "name": "Tantalum Powder", - "boardLocation": { - "designators": [ - "U1" - ] + "definitions": { + "components": [ + { + "bom-ref": "comp-tantalum", + "type": "material", + "name": "Tantalum Powder", + "boardLocation": { + "designators": [ + "U1" + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hardware-certification-missing-standard-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-certification-missing-standard-2.0.json index 78393ae5..7106ed12 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-certification-missing-standard-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-certification-missing-standard-2.0.json @@ -4,16 +4,22 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e08", - "components": [ - { - "type": "device", - "name": "Acme AVR8-328", - "certifications": [ - { - "identifier": "RCL-2026-04471", - "jurisdiction": "US" - } - ] - } - ] -} \ No newline at end of file + "definitions": { + "components": [ + { + "type": "device", + "name": "Acme AVR8-328", + "certifications": [ + { "ref": "cert-missing-standard" } + ] + } + ], + "certifications": [ + { + "bom-ref": "cert-missing-standard", + "identifier": "RCL-2026-04471", + "jurisdiction": "US" + } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-hardware-classification-code-missing-standard-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-classification-code-missing-standard-2.0.json index b4290885..a9363c6a 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-classification-code-missing-standard-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-classification-code-missing-standard-2.0.json @@ -4,18 +4,20 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e07", - "components": [ - { - "type": "device", - "name": "Acme AVR8-328", - "classification": { - "category": "semiconductor", - "codes": [ - { - "value": "8542.31" - } - ] + "definitions": { + "components": [ + { + "type": "device", + "name": "Acme AVR8-328", + "classification": { + "category": "semiconductor", + "codes": [ + { + "value": "8542.31" + } + ] + } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/invalid-hardware-devicetype-custom-no-name-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-devicetype-custom-no-name-2.0.json index e5e4049e..3da44828 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-devicetype-custom-no-name-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-devicetype-custom-no-name-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e06", - "components": [ - { - "type": "device", - "name": "Acme Power Module", - "deviceType": { - "description": "A package style missing its name." + "definitions": { + "components": [ + { + "type": "device", + "name": "Acme Power Module", + "deviceType": { + "description": "A package style missing its name." + } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/invalid-hardware-identity-evidence-technique-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-identity-evidence-technique-2.0.json index dabcf949..f1a09c3d 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-identity-evidence-technique-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-identity-evidence-technique-2.0.json @@ -4,24 +4,26 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e09", - "components": [ - { - "type": "device", - "name": "Acme AVR8-328", - "evidence": { - "identity": [ - { - "scheme": "mpn", - "confidence": 0.9, - "methods": [ - { - "technique": "photograph", - "confidence": 0.9 - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "device", + "name": "Acme AVR8-328", + "evidence": { + "identity": [ + { + "scheme": "mpn", + "confidence": 0.9, + "methods": [ + { + "technique": "photograph", + "confidence": 0.9 + } + ] + } + ] + } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/invalid-hardware-materialform-custom-no-name-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-materialform-custom-no-name-2.0.json index 825f0d48..f57fac11 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-materialform-custom-no-name-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-materialform-custom-no-name-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e13", - "components": [ - { - "bom-ref": "comp-titanium", - "type": "material", - "name": "Titanium Sponge", - "materialForm": { - "description": "A custom material form missing its required name." + "definitions": { + "components": [ + { + "bom-ref": "comp-titanium", + "type": "material", + "name": "Titanium Sponge", + "materialForm": { + "description": "A custom material form missing its required name." + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hardware-materialform-on-device-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-materialform-on-device-2.0.json index a6385d56..18788c4a 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-materialform-on-device-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-materialform-on-device-2.0.json @@ -4,12 +4,14 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e11", - "components": [ - { - "bom-ref": "comp-mcu", - "type": "device", - "name": "Acme Microcontroller", - "materialForm": "powder" - } - ] + "definitions": { + "components": [ + { + "bom-ref": "comp-mcu", + "type": "device", + "name": "Acme Microcontroller", + "materialForm": "powder" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hardware-origin-stage-custom-no-name-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-origin-stage-custom-no-name-2.0.json index cc34b6b8..cce5fd17 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-origin-stage-custom-no-name-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-origin-stage-custom-no-name-2.0.json @@ -4,25 +4,27 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e14", - "components": [ - { - "bom-ref": "comp-tungsten", - "type": "material", - "name": "Tungsten Metal Powder", - "origins": [ - { - "stage": { - "description": "A custom origin stage missing its required name." - }, - "basis": "net weight", - "distribution": [ - { - "isoCode": "US", - "percentage": 100 - } - ] - } - ] - } - ] + "definitions": { + "components": [ + { + "bom-ref": "comp-tungsten", + "type": "material", + "name": "Tungsten Metal Powder", + "origins": [ + { + "stage": { + "description": "A custom origin stage missing its required name." + }, + "basis": "net weight", + "distribution": [ + { + "isoCode": "US", + "percentage": 100 + } + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hardware-quantity-missing-value-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-quantity-missing-value-2.0.json index c4e1dc24..27f47a27 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-quantity-missing-value-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-quantity-missing-value-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e17", - "components": [ - { - "bom-ref": "comp-tantalum", - "type": "material", - "name": "Tantalum Powder", - "quantity": { - "unit": "kg" + "definitions": { + "components": [ + { + "bom-ref": "comp-tantalum", + "type": "material", + "name": "Tantalum Powder", + "quantity": { + "unit": "kg" + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hardware-quantity-on-library-2.0.json b/tools/src/test/resources/2.0/invalid-hardware-quantity-on-library-2.0.json index 9bec0c8f..e578da84 100644 --- a/tools/src/test/resources/2.0/invalid-hardware-quantity-on-library-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hardware-quantity-on-library-2.0.json @@ -4,15 +4,17 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e16", - "components": [ - { - "bom-ref": "comp-acme-lib", - "type": "library", - "name": "acme-lib", - "version": "1.0.0", - "quantity": { - "value": 4 + "definitions": { + "components": [ + { + "bom-ref": "comp-acme-lib", + "type": "library", + "name": "acme-lib", + "version": "1.0.0", + "quantity": { + "value": 4 + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hash-alg-2.0.json b/tools/src/test/resources/2.0/invalid-hash-alg-2.0.json index 0e5e94bc..63de06cc 100644 --- a/tools/src/test/resources/2.0/invalid-hash-alg-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hash-alg-2.0.json @@ -4,30 +4,32 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "scope": "required", - "hashes": [ - { - "alg": "FOO", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "scope": "required", + "hashes": [ + { + "alg": "FOO", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hash-md5-2.0.json b/tools/src/test/resources/2.0/invalid-hash-md5-2.0.json index 27239d35..6af90ce5 100644 --- a/tools/src/test/resources/2.0/invalid-hash-md5-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hash-md5-2.0.json @@ -4,30 +4,32 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "foo" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "foo" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hash-sha1-2.0.json b/tools/src/test/resources/2.0/invalid-hash-sha1-2.0.json index 96411086..d66cdc62 100644 --- a/tools/src/test/resources/2.0/invalid-hash-sha1-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hash-sha1-2.0.json @@ -4,30 +4,32 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "foo" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "foo" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hash-sha256-2.0.json b/tools/src/test/resources/2.0/invalid-hash-sha256-2.0.json index 9ed924bb..d7cb539c 100644 --- a/tools/src/test/resources/2.0/invalid-hash-sha256-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hash-sha256-2.0.json @@ -4,30 +4,32 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "foo" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "foo" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-hash-sha512-2.0.json b/tools/src/test/resources/2.0/invalid-hash-sha512-2.0.json index 0286a727..926d661f 100644 --- a/tools/src/test/resources/2.0/invalid-hash-sha512-2.0.json +++ b/tools/src/test/resources/2.0/invalid-hash-sha512-2.0.json @@ -4,30 +4,32 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "foo" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "foo" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-inventory-choice-as-subject-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-choice-as-subject-2.0.json new file mode 100644 index 00000000..2d89e489 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-choice-as-subject-2.0.json @@ -0,0 +1,19 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { "bom-ref": "reg-a", "type": "device", "name": "Regulator A" }, + { "bom-ref": "reg-b", "type": "device", "name": "Regulator B" } + ] + }, + "inventories": [ + { + "subject": { "type": "component-choice", "operator": "XOR", + "components": [ { "ref": "reg-a" }, { "ref": "reg-b" } ] }, + "components": [ + { "bom-ref": "lib-1", "type": "library", "name": "Some Library", "version": "1.0" } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-inventory-definitions-holding-reference-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-definitions-holding-reference-2.0.json new file mode 100644 index 00000000..8fb0d7a0 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-definitions-holding-reference-2.0.json @@ -0,0 +1,2 @@ +{ "specFormat": "CycloneDX", "specVersion": "2.0", + "definitions": { "components": [ { "ref": "somewhere-else" } ] } } diff --git a/tools/src/test/resources/2.0/invalid-inventory-missing-components-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-missing-components-2.0.json new file mode 100644 index 00000000..85d96a76 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-missing-components-2.0.json @@ -0,0 +1,9 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" } + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-inventory-missing-subject-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-missing-subject-2.0.json new file mode 100644 index 00000000..bed0ba84 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-missing-subject-2.0.json @@ -0,0 +1,11 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "inventories": [ + { + "components": [ + { "bom-ref": "lib-1", "type": "library", "name": "Some Library", "version": "1.0" } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-inventory-old-metadata-component-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-old-metadata-component-2.0.json new file mode 100644 index 00000000..3002f672 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-old-metadata-component-2.0.json @@ -0,0 +1,2 @@ +{ "specFormat": "CycloneDX", "specVersion": "2.0", + "metadata": { "component": { "bom-ref": "a", "type": "application", "name": "A" } } } diff --git a/tools/src/test/resources/2.0/invalid-inventory-old-root-components-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-old-root-components-2.0.json new file mode 100644 index 00000000..3a0b8464 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-old-root-components-2.0.json @@ -0,0 +1,7 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "components": [ + { "bom-ref": "lib-1", "type": "library", "name": "Some Library", "version": "1.0" } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-inventory-reference-with-name-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-reference-with-name-2.0.json new file mode 100644 index 00000000..ec2a1d5c --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-reference-with-name-2.0.json @@ -0,0 +1,17 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { "bom-ref": "pkg:generic/acme/common-runtime@4.2", "type": "library", "name": "Acme Common Runtime", "version": "4.2" } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" }, + "components": [ + { "ref": "pkg:generic/acme/common-runtime@4.2", "name": "Acme Common Runtime" } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-inventory-reference-with-nested-components-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-reference-with-nested-components-2.0.json new file mode 100644 index 00000000..f7585298 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-reference-with-nested-components-2.0.json @@ -0,0 +1,18 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { "bom-ref": "pkg:generic/acme/common-runtime@4.2", "type": "library", "name": "Acme Common Runtime", "version": "4.2" } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" }, + "components": [ + { "ref": "pkg:generic/acme/common-runtime@4.2", + "components": [ { "bom-ref": "sub-lib", "type": "library", "name": "Sub Library" } ] } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-inventory-reference-with-scope-2.0.json b/tools/src/test/resources/2.0/invalid-inventory-reference-with-scope-2.0.json new file mode 100644 index 00000000..b14dcdb1 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-inventory-reference-with-scope-2.0.json @@ -0,0 +1,17 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { "bom-ref": "pkg:generic/acme/common-runtime@4.2", "type": "library", "name": "Acme Common Runtime", "version": "4.2" } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" }, + "components": [ + { "ref": "pkg:generic/acme/common-runtime@4.2", "scope": "optional" } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-issue-type-2.0.json b/tools/src/test/resources/2.0/invalid-issue-type-2.0.json index 15dcf4ac..45375cf7 100644 --- a/tools/src/test/resources/2.0/invalid-issue-type-2.0.json +++ b/tools/src/test/resources/2.0/invalid-issue-type-2.0.json @@ -4,46 +4,48 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "group": "com.acme", - "name": "sample-library", - "version": "1.0.0", - "pedigree": { - "ancestors": [ - { - "type": "library", - "group": "org.example", - "name": "sample-library", - "version": "1.0.0" - } - ], - "patches": [ - { - "type": "unofficial", - "diff": { - "text": { - "mediaType": "text/plain", - "encoding": "base64", - "content": "blah" + "definitions": { + "components": [ + { + "type": "library", + "group": "com.acme", + "name": "sample-library", + "version": "1.0.0", + "pedigree": { + "ancestors": [ + { + "type": "library", + "group": "org.example", + "name": "sample-library", + "version": "1.0.0" + } + ], + "patches": [ + { + "type": "unofficial", + "diff": { + "text": { + "mediaType": "text/plain", + "encoding": "base64", + "content": "blah" + }, + "url": "uri/to/changes.diff" }, - "url": "uri/to/changes.diff" - }, - "resolves": [ - { - "type": "foo", - "id": "JIRA-17240", - "description": "Great new feature that does something", - "source": { - "name": "Acme Org", - "url": "https://issues.acme.org/17240" + "resolves": [ + { + "type": "foo", + "id": "JIRA-17240", + "description": "Great new feature that does something", + "source": { + "name": "Acme Org", + "url": "https://issues.acme.org/17240" + } } - } - ] - } - ] + ] + } + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-created-no-millis-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-created-no-millis-2.0.json index 8fa3a989..224a0069 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-created-no-millis-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-created-no-millis-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-empty-cert-chain-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-empty-cert-chain-2.0.json index 2c9dc638..188b30da 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-empty-cert-chain-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-empty-cert-chain-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-empty-signatures-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-empty-signatures-2.0.json index e339d2e6..4f63e07f 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-empty-signatures-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-empty-signatures-2.0.json @@ -4,12 +4,14 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [] } diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-invalid-timestamp-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-invalid-timestamp-2.0.json index 66debc69..2e8b5f67 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-invalid-timestamp-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-invalid-timestamp-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-missing-algorithm-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-missing-algorithm-2.0.json index e1246d14..dbe7cc1b 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-missing-algorithm-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-missing-algorithm-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-missing-hash-algorithm-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-missing-hash-algorithm-2.0.json index 4694cc2d..0aa1f930 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-missing-hash-algorithm-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-missing-hash-algorithm-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "Ed25519", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-missing-value-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-missing-value-2.0.json index 2aa0bf47..dd1b7968 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-missing-value-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-missing-value-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-modified-no-millis-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-modified-no-millis-2.0.json index 5abeb092..2c96fb41 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-modified-no-millis-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-modified-no-millis-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-no-key-material-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-no-key-material-2.0.json index 389cf26c..6df91e8e 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-no-key-material-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-no-key-material-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-jss-signature-type-not-jss-2.0.json b/tools/src/test/resources/2.0/invalid-jss-signature-type-not-jss-2.0.json index e19ac39f..ee63afbf 100644 --- a/tools/src/test/resources/2.0/invalid-jss-signature-type-not-jss-2.0.json +++ b/tools/src/test/resources/2.0/invalid-jss-signature-type-not-jss-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "hash_algorithm": "sha-256", diff --git a/tools/src/test/resources/2.0/invalid-license-choice-2.0.json b/tools/src/test/resources/2.0/invalid-license-choice-2.0.json index 421a5caf..df813561 100644 --- a/tools/src/test/resources/2.0/invalid-license-choice-2.0.json +++ b/tools/src/test/resources/2.0/invalid-license-choice-2.0.json @@ -4,21 +4,22 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "publisher": "Acme Inc", - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "licenses": [ - { - "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", - "license": { - "name": "Apache License 2.0" + "definitions": { + "components": [ + { + "type": "library", + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "licenses": [ + { + "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", + "license": { + "name": "Apache License 2.0" + } } - } - ] - } - ] + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-license-encoding-2.0.json b/tools/src/test/resources/2.0/invalid-license-encoding-2.0.json index 1a8ba06b..5756a462 100644 --- a/tools/src/test/resources/2.0/invalid-license-encoding-2.0.json +++ b/tools/src/test/resources/2.0/invalid-license-encoding-2.0.json @@ -4,26 +4,27 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "publisher": "Acme Inc", - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "licenses": [ - { - "license": { - "id": "Apache-2.0", - "text": { - "mediaType": "text/plain", - "encoding": "base85", - "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=" - }, - "url": "https://www.apache.org/licenses/LICENSE-2.0.txt" + "definitions": { + "components": [ + { + "type": "library", + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "text": { + "mediaType": "text/plain", + "encoding": "base85", + "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=" + }, + "url": "https://www.apache.org/licenses/LICENSE-2.0.txt" + } } - } - ] - } - ] + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-license-evidence-both-2.0.json b/tools/src/test/resources/2.0/invalid-license-evidence-both-2.0.json index 65dda81e..8525c956 100644 --- a/tools/src/test/resources/2.0/invalid-license-evidence-both-2.0.json +++ b/tools/src/test/resources/2.0/invalid-license-evidence-both-2.0.json @@ -2,9 +2,11 @@ "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", "specFormat": "CycloneDX", "specVersion": "2.0", "serialNumber": "urn:uuid:13671687-395b-41f5-a30f-a58921a6b002", "version": 1, - "components": [ - { "type": "library", "name": "acme-lib", "version": "1.0.0", - "evidence": { "licenses": [ - { "license": { "id": "Apache-2.0" }, "expression": "Apache-2.0 OR MIT", "confidence": 0.9 } ] } } - ] + "definitions": { + "components": [ + { "type": "library", "name": "acme-lib", "version": "1.0.0", + "evidence": { "licenses": [ + { "license": { "id": "Apache-2.0" }, "expression": "Apache-2.0 OR MIT", "confidence": 0.9 } ] } } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-license-id-2.0.json b/tools/src/test/resources/2.0/invalid-license-id-2.0.json index cb011b4e..f14140ee 100644 --- a/tools/src/test/resources/2.0/invalid-license-id-2.0.json +++ b/tools/src/test/resources/2.0/invalid-license-id-2.0.json @@ -4,20 +4,21 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "publisher": "Acme Inc", - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "licenses": [ - { - "license": { - "id": "Apache-2" + "definitions": { + "components": [ + { + "type": "library", + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "licenses": [ + { + "license": { + "id": "Apache-2" + } } - } - ] - } - ] + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-license-missing-id-and-name-2.0.json b/tools/src/test/resources/2.0/invalid-license-missing-id-and-name-2.0.json index 9eee4997..a72b9835 100644 --- a/tools/src/test/resources/2.0/invalid-license-missing-id-and-name-2.0.json +++ b/tools/src/test/resources/2.0/invalid-license-missing-id-and-name-2.0.json @@ -4,17 +4,19 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "license-with-no-id-nor-name", - "version": "23", - "description": "testcase for issue#288", - "licenses": [ - { - "license": {} - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "license-with-no-id-nor-name", + "version": "23", + "description": "testcase for issue#288", + "licenses": [ + { + "license": {} + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-license-reference-with-acknowledgement-2.0.json b/tools/src/test/resources/2.0/invalid-license-reference-with-acknowledgement-2.0.json new file mode 100644 index 00000000..24c77d52 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-license-reference-with-acknowledgement-2.0.json @@ -0,0 +1,23 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "licenses": [ + { + "license": { + "bom-ref": "lic-apache-2.0", + "id": "Apache-2.0" + } + } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" }, + "components": [ + { "bom-ref": "pkg:maven/acme/library-a@1.0", "type": "library", "name": "Acme Library A", "version": "1.0", + "licenses": [ { "ref": "lic-apache-2.0", "acknowledgement": "concluded" } ] } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/invalid-metadata-distribution-2.0.json b/tools/src/test/resources/2.0/invalid-metadata-distribution-2.0.json index 5a1f0a0c..eb309235 100644 --- a/tools/src/test/resources/2.0/invalid-metadata-distribution-2.0.json +++ b/tools/src/test/resources/2.0/invalid-metadata-distribution-2.0.json @@ -7,5 +7,7 @@ "metadata": { "distribution": "Unrestricted" }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/invalid-metadata-license-2.0.json b/tools/src/test/resources/2.0/invalid-metadata-license-2.0.json index b169f7fd..6e885404 100644 --- a/tools/src/test/resources/2.0/invalid-metadata-license-2.0.json +++ b/tools/src/test/resources/2.0/invalid-metadata-license-2.0.json @@ -13,5 +13,7 @@ } ] }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/invalid-metadata-timestamp-2.0.json b/tools/src/test/resources/2.0/invalid-metadata-timestamp-2.0.json index 34071006..7c2a477f 100644 --- a/tools/src/test/resources/2.0/invalid-metadata-timestamp-2.0.json +++ b/tools/src/test/resources/2.0/invalid-metadata-timestamp-2.0.json @@ -7,5 +7,7 @@ "metadata": { "timestamp": "2020-04-13" }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/invalid-missing-component-type-2.0.json b/tools/src/test/resources/2.0/invalid-missing-component-type-2.0.json index 8843fad0..59eede0c 100644 --- a/tools/src/test/resources/2.0/invalid-missing-component-type-2.0.json +++ b/tools/src/test/resources/2.0/invalid-missing-component-type-2.0.json @@ -4,10 +4,12 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "name": "acme-library", - "version": "1.0.0" - } - ] + "definitions": { + "components": [ + { + "name": "acme-library", + "version": "1.0.0" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-party-bad-role-value-2.0.json b/tools/src/test/resources/2.0/invalid-party-bad-role-value-2.0.json index 2f69c56e..66b44063 100644 --- a/tools/src/test/resources/2.0/invalid-party-bad-role-value-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-bad-role-value-2.0.json @@ -3,26 +3,29 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "roles": [ + "type": "library", + "name": "Some Library", + "parties": [ { - "role": "overlord" + "roles": [ + { + "role": "overlord" + } + ], + "person": { + "name": "Alice" + } } - ], - "person": { - "name": "Alice" - } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-empty-roles-2.0.json b/tools/src/test/resources/2.0/invalid-party-empty-roles-2.0.json index deb81278..cd0acecf 100644 --- a/tools/src/test/resources/2.0/invalid-party-empty-roles-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-empty-roles-2.0.json @@ -3,22 +3,25 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "roles": [], - "person": { - "name": "Alice" - } + "type": "library", + "name": "Some Library", + "parties": [ + { + "roles": [], + "person": { + "name": "Alice" + } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-iso-code-pattern-2.0.json b/tools/src/test/resources/2.0/invalid-party-iso-code-pattern-2.0.json index e5f68cfd..5698f368 100644 --- a/tools/src/test/resources/2.0/invalid-party-iso-code-pattern-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-iso-code-pattern-2.0.json @@ -3,31 +3,34 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "roles": [ + "type": "library", + "name": "Some Library", + "parties": [ { - "role": "supplier" - } - ], - "organization": { - "legalName": "Acme Inc.", - "addresses": [ - { - "isoCode": "italy-monza" + "roles": [ + { + "role": "supplier" + } + ], + "organization": { + "legalName": "Acme Inc.", + "addresses": [ + { + "isoCode": "italy-monza" + } + ] } - ] - } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-latitude-out-of-range-2.0.json b/tools/src/test/resources/2.0/invalid-party-latitude-out-of-range-2.0.json index db9afe9e..a40eb85a 100644 --- a/tools/src/test/resources/2.0/invalid-party-latitude-out-of-range-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-latitude-out-of-range-2.0.json @@ -3,35 +3,38 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "roles": [ + "type": "library", + "name": "Some Library", + "parties": [ { - "role": "supplier" - } - ], - "organization": { - "legalName": "Acme Inc.", - "addresses": [ - { - "country": "Antarctica", - "coordinates": { - "latitude": -123.456, - "longitude": 0.0 + "roles": [ + { + "role": "supplier" } + ], + "organization": { + "legalName": "Acme Inc.", + "addresses": [ + { + "country": "Antarctica", + "coordinates": { + "latitude": -123.456, + "longitude": 0.0 + } + } + ] } - ] - } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-missing-roles-2.0.json b/tools/src/test/resources/2.0/invalid-party-missing-roles-2.0.json index ca8ce38e..fc113acc 100644 --- a/tools/src/test/resources/2.0/invalid-party-missing-roles-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-missing-roles-2.0.json @@ -3,21 +3,24 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "person": { - "name": "Alice" - } + "type": "library", + "name": "Some Library", + "parties": [ + { + "person": { + "name": "Alice" + } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-missing-roles-via-component-2.0.json b/tools/src/test/resources/2.0/invalid-party-missing-roles-via-component-2.0.json index d0896d25..c323b73b 100644 --- a/tools/src/test/resources/2.0/invalid-party-missing-roles-via-component-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-missing-roles-via-component-2.0.json @@ -3,21 +3,24 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Product" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Product" + }, + "components": [ { - "organization": { - "legalName": "Acme Incorporated" - } + "type": "library", + "name": "Some Library", + "parties": [ + { + "organization": { + "legalName": "Acme Incorporated" + } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-no-identity-2.0.json b/tools/src/test/resources/2.0/invalid-party-no-identity-2.0.json index c83b6874..c8558926 100644 --- a/tools/src/test/resources/2.0/invalid-party-no-identity-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-no-identity-2.0.json @@ -3,21 +3,24 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "roles": [ + "type": "library", + "name": "Some Library", + "parties": [ { - "role": "author" + "roles": [ + { + "role": "author" + } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-no-identity-via-component-2.0.json b/tools/src/test/resources/2.0/invalid-party-no-identity-via-component-2.0.json index ddacd4bd..5af9a825 100644 --- a/tools/src/test/resources/2.0/invalid-party-no-identity-via-component-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-no-identity-via-component-2.0.json @@ -3,21 +3,24 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Product" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Product" + }, + "components": [ { - "roles": [ + "type": "library", + "name": "Some Library", + "parties": [ { - "role": "supplier" + "roles": [ + { + "role": "supplier" + } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-party-two-identities-2.0.json b/tools/src/test/resources/2.0/invalid-party-two-identities-2.0.json index f03e0813..a54030df 100644 --- a/tools/src/test/resources/2.0/invalid-party-two-identities-2.0.json +++ b/tools/src/test/resources/2.0/invalid-party-two-identities-2.0.json @@ -3,29 +3,32 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "roles": [ + "type": "library", + "name": "Some Library", + "parties": [ { - "role": "author" + "roles": [ + { + "role": "author" + } + ], + "organization": { + "legalName": "Acme Inc." + }, + "person": { + "name": "Alice" + } } - ], - "organization": { - "legalName": "Acme Inc." - }, - "person": { - "name": "Alice" - } + ] } ] } diff --git a/tools/src/test/resources/2.0/invalid-patch-resolves-reference-extra-2.0.json b/tools/src/test/resources/2.0/invalid-patch-resolves-reference-extra-2.0.json new file mode 100644 index 00000000..5351328b --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-patch-resolves-reference-extra-2.0.json @@ -0,0 +1,24 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { + "bom-ref": "lib-patched", + "type": "library", + "name": "Acme Patched Library", + "version": "1.0.1", + "pedigree": { + "patches": [ + { + "type": "backport", + "resolves": [ + { "ref": "vuln-1", "name": "A reference shall carry only the ref" } + ] + } + ] + } + } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-patch-type-2.0.json b/tools/src/test/resources/2.0/invalid-patch-type-2.0.json index bc5ea2df..656be59d 100644 --- a/tools/src/test/resources/2.0/invalid-patch-type-2.0.json +++ b/tools/src/test/resources/2.0/invalid-patch-type-2.0.json @@ -4,46 +4,48 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "group": "com.acme", - "name": "sample-library", - "version": "1.0.0", - "pedigree": { - "ancestors": [ - { - "type": "library", - "group": "org.example", - "name": "sample-library", - "version": "1.0.0" - } - ], - "patches": [ - { - "type": "foo", - "diff": { - "text": { - "mediaType": "text/plain", - "encoding": "base64", - "content": "blah" + "definitions": { + "components": [ + { + "type": "library", + "group": "com.acme", + "name": "sample-library", + "version": "1.0.0", + "pedigree": { + "ancestors": [ + { + "type": "library", + "group": "org.example", + "name": "sample-library", + "version": "1.0.0" + } + ], + "patches": [ + { + "type": "foo", + "diff": { + "text": { + "mediaType": "text/plain", + "encoding": "base64", + "content": "blah" + }, + "url": "uri/to/changes.diff" }, - "url": "uri/to/changes.diff" - }, - "resolves": [ - { - "type": "enhancement", - "id": "JIRA-17240", - "description": "Great new feature that does something", - "source": { - "name": "Acme Org", - "url": "https://issues.acme.org/17240" + "resolves": [ + { + "type": "enhancement", + "id": "JIRA-17240", + "description": "Great new feature that does something", + "source": { + "name": "Acme Org", + "url": "https://issues.acme.org/17240" + } } - } - ] - } - ] + ] + } + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-pedigree-choice-group-2.0.json b/tools/src/test/resources/2.0/invalid-pedigree-choice-group-2.0.json new file mode 100644 index 00000000..91ed85b2 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-pedigree-choice-group-2.0.json @@ -0,0 +1,22 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { "bom-ref": "lib-a", "type": "library", "name": "Library A", "version": "1.0" }, + { "bom-ref": "lib-b", "type": "library", "name": "Library B", "version": "1.0" }, + { + "bom-ref": "lib-fork", + "type": "library", + "name": "Library Fork", + "version": "2.0", + "pedigree": { + "ancestors": [ + { "type": "component-choice", "operator": "XOR", + "components": [ { "ref": "lib-a" }, { "ref": "lib-b" } ] } + ] + } + } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-pedigree-notes-2.0.json b/tools/src/test/resources/2.0/invalid-pedigree-notes-2.0.json new file mode 100644 index 00000000..d5d7b0bd --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-pedigree-notes-2.0.json @@ -0,0 +1,20 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { + "bom-ref": "lib-fork", + "type": "library", + "name": "Library Fork", + "version": "2.0", + "pedigree": { + "ancestors": [ + { "bom-ref": "lib-a", "type": "library", "name": "Library A", "version": "1.0" } + ], + "notes": "Commentary that now belongs in an annotation." + } + } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-properties-2.0.json b/tools/src/test/resources/2.0/invalid-properties-2.0.json index ad973792..6925a541 100644 --- a/tools/src/test/resources/2.0/invalid-properties-2.0.json +++ b/tools/src/test/resources/2.0/invalid-properties-2.0.json @@ -15,54 +15,56 @@ {} ] }, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "licenses": [ - { - "license": { - "id": "Apache-2.0", - "properties": [ - { - "value": "missing a name" - }, - { - "unexpected-property": "foo" - }, - {} - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "properties": [ + { + "value": "missing a name" + }, + { + "unexpected-property": "foo" + }, + {} + ] + } } - } - ], - "properties": [ - { - "value": "missing a name" - }, - { - "unexpected-property": "foo" - }, - {} - ] - }, - { - "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", - "type": "service", - "group": "org.partner", - "name": "Stock ticker service", - "endpoints": [ - "https://partner.org/api/v1/stock" - ], - "properties": [ - { - "value": "missing a name" - }, - { - "unexpected-property": "foo" - }, - {} - ] - } - ] + ], + "properties": [ + { + "value": "missing a name" + }, + { + "unexpected-property": "foo" + }, + {} + ] + }, + { + "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", + "type": "service", + "group": "org.partner", + "name": "Stock ticker service", + "endpoints": [ + "https://partner.org/api/v1/stock" + ], + "properties": [ + { + "value": "missing a name" + }, + { + "unexpected-property": "foo" + }, + {} + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-release-notes-reference-with-extra-2.0.json b/tools/src/test/resources/2.0/invalid-release-notes-reference-with-extra-2.0.json new file mode 100644 index 00000000..a28845c2 --- /dev/null +++ b/tools/src/test/resources/2.0/invalid-release-notes-reference-with-extra-2.0.json @@ -0,0 +1,18 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "releaseNotes": [ + { "bom-ref": "rn-1", "type": "major", "title": "My new release" } + ], + "components": [ + { + "bom-ref": "lib-a", + "type": "library", + "name": "Acme Library", + "version": "1.0.0", + "releaseNotes": { "ref": "rn-1", "title": "A reference shall carry only the ref" } + } + ] + } +} diff --git a/tools/src/test/resources/2.0/invalid-scope-2.0.json b/tools/src/test/resources/2.0/invalid-scope-2.0.json index f7dcd460..1f7aaa7f 100644 --- a/tools/src/test/resources/2.0/invalid-scope-2.0.json +++ b/tools/src/test/resources/2.0/invalid-scope-2.0.json @@ -4,12 +4,14 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "scope": "foo" - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "scope": "foo" + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-serialnumber-2.0.json b/tools/src/test/resources/2.0/invalid-serialnumber-2.0.json index b44e0300..bf383a0a 100644 --- a/tools/src/test/resources/2.0/invalid-serialnumber-2.0.json +++ b/tools/src/test/resources/2.0/invalid-serialnumber-2.0.json @@ -4,6 +4,8 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f", "version": 1, - "components": [ - ] + "definitions": { + "components": [ + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-service-data-2.0.json b/tools/src/test/resources/2.0/invalid-service-data-2.0.json index 81dae75a..ade15f81 100644 --- a/tools/src/test/resources/2.0/invalid-service-data-2.0.json +++ b/tools/src/test/resources/2.0/invalid-service-data-2.0.json @@ -4,17 +4,19 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", - "type": "service", - "name": "Stock ticker service", - "dataProfiles": [ - { - "classification": "foo", - "flow": "bar" - } - ] - } - ] + "definitions": { + "components": [ + { + "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", + "type": "service", + "name": "Stock ticker service", + "dataProfiles": [ + { + "classification": "foo", + "flow": "bar" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-additional-property-2.0.json b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-additional-property-2.0.json index 07b39cd4..70a428cf 100644 --- a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-additional-property-2.0.json +++ b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-additional-property-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:cc671687-395b-41f5-a30f-a58921a69005", "version": 1, - "components": [ - { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } - ], + "definitions": { + "components": [ + { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } + ] + }, "vulnerabilities": [ { "bom-ref": "v1", diff --git a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-confidence-range-2.0.json b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-confidence-range-2.0.json index f1760a08..3ef7beee 100644 --- a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-confidence-range-2.0.json +++ b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-confidence-range-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:cc671687-395b-41f5-a30f-a58921a69001", "version": 1, - "components": [ - { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } - ], + "definitions": { + "components": [ + { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } + ] + }, "vulnerabilities": [ { "bom-ref": "v1", diff --git a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-exploitability-2.0.json b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-exploitability-2.0.json index 0b09ffb6..f0c1fdc3 100644 --- a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-exploitability-2.0.json +++ b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-exploitability-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:cc671687-395b-41f5-a30f-a58921a69004", "version": 1, - "components": [ - { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } - ], + "definitions": { + "components": [ + { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } + ] + }, "vulnerabilities": [ { "bom-ref": "v1", diff --git a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-method-missing-technique-2.0.json b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-method-missing-technique-2.0.json index fe3c46f7..9156148e 100644 --- a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-method-missing-technique-2.0.json +++ b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-method-missing-technique-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:cc671687-395b-41f5-a30f-a58921a69007", "version": 1, - "components": [ - { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } - ], + "definitions": { + "components": [ + { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } + ] + }, "vulnerabilities": [ { "bom-ref": "v1", diff --git a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-missing-confidence-2.0.json b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-missing-confidence-2.0.json index 09cf4916..985e4764 100644 --- a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-missing-confidence-2.0.json +++ b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-missing-confidence-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:cc671687-395b-41f5-a30f-a58921a69003", "version": 1, - "components": [ - { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } - ], + "definitions": { + "components": [ + { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } + ] + }, "vulnerabilities": [ { "bom-ref": "v1", diff --git a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-technique-2.0.json b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-technique-2.0.json index e028c816..ad515baa 100644 --- a/tools/src/test/resources/2.0/invalid-vulnerability-evidence-technique-2.0.json +++ b/tools/src/test/resources/2.0/invalid-vulnerability-evidence-technique-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:cc671687-395b-41f5-a30f-a58921a69002", "version": 1, - "components": [ - { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } - ], + "definitions": { + "components": [ + { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } + ] + }, "vulnerabilities": [ { "bom-ref": "v1", diff --git a/tools/src/test/resources/2.0/invalid-vulnerability-occurrence-missing-location-2.0.json b/tools/src/test/resources/2.0/invalid-vulnerability-occurrence-missing-location-2.0.json index da71904b..c06846a7 100644 --- a/tools/src/test/resources/2.0/invalid-vulnerability-occurrence-missing-location-2.0.json +++ b/tools/src/test/resources/2.0/invalid-vulnerability-occurrence-missing-location-2.0.json @@ -4,9 +4,11 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:cc671687-395b-41f5-a30f-a58921a69006", "version": 1, - "components": [ - { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } - ], + "definitions": { + "components": [ + { "bom-ref": "c1", "type": "library", "name": "acme-lib", "version": "1.0.0" } + ] + }, "vulnerabilities": [ { "bom-ref": "v1", diff --git a/tools/src/test/resources/2.0/valid-annotation-2.0.json b/tools/src/test/resources/2.0/valid-annotation-2.0.json index 88522a6d..a5b0a162 100644 --- a/tools/src/test/resources/2.0/valid-annotation-2.0.json +++ b/tools/src/test/resources/2.0/valid-annotation-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "component-a", - "type": "library", - "name": "Component A", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-a", + "type": "library", + "name": "Component A", + "version": "1.0.0" + } + ] + }, "annotations": [ { "bom-ref": "annotation-1", diff --git a/tools/src/test/resources/2.0/valid-assembly-2.0.json b/tools/src/test/resources/2.0/valid-assembly-2.0.json index 347d3fad..157beddf 100644 --- a/tools/src/test/resources/2.0/valid-assembly-2.0.json +++ b/tools/src/test/resources/2.0/valid-assembly-2.0.json @@ -4,28 +4,30 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library-a", - "version": "1.0.0", - "components": [ - { - "type": "library", - "name": "acme-library-b", - "version": "2.0.0" - } - ] - }, - { - "type": "service", - "name": "acme-service-a", - "components": [ - { - "type": "service", - "name": "acme-service-b" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library-a", + "version": "1.0.0", + "components": [ + { + "type": "library", + "name": "acme-library-b", + "version": "2.0.0" + } + ] + }, + { + "type": "service", + "name": "acme-service-a", + "components": [ + { + "type": "service", + "name": "acme-service-b" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-bom-2.0.json b/tools/src/test/resources/2.0/valid-bom-2.0.json index af4ffa09..0fabff85 100644 --- a/tools/src/test/resources/2.0/valid-bom-2.0.json +++ b/tools/src/test/resources/2.0/valid-bom-2.0.json @@ -40,28 +40,6 @@ "phone": "800-555-1212" } ], - "component": { - "type": "application", - "parties": [ - { - "roles": [ { "role": "author" } ], - "organization": { "name": "Acme Super Heroes" } - } - ], - "name": "Acme Application", - "version": "9.1.1", - "identifiers": [ - { - "party": "acme-inc", - "identities": [ - { - "scheme": "swid", - "value": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" - } - ] - } - ] - }, "manufacturer": { "bom-ref": "acme-inc", "name": "Acme, Inc.", @@ -74,302 +52,327 @@ "email": "professional.services@example.com" } ] - }, - "supplier": { - "name": "Acme, Inc.", - "url": [ - "https://example.com" - ], - "contact": [ - { - "name": "Acme Distribution", - "email": "distribution@example.com" - } - ] } }, - "components": [ + "inventories": [ { - "bom-ref": "pkg:maven/com.acme/acme-catalina@9.0.14?packaging=jar", - "type": "application", - "parties": [ - { - "roles": [ { "role": "author" } ], - "person": { "name": "Joane Doe et al." } - }, - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "acme-catalina", - "version": "9.0.14", - "description": "Modified version of Acme Catalina", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ], - "licenses": [ - { - "license": { - "id": "Apache-2.0", - "url": "https://www.apache.org/licenses/LICENSE-2.0.txt" + "subject": { + "bom-ref": "subject-1", + "type": "application", + "parties": [ + { + "roles": [ { "role": "author" } ], + "organization": { "name": "Acme Super Heroes" } + }, + { + "roles": [ { "role": "supplier" } ], + "organization": { + "name": "Acme, Inc.", + "url": [ { "name": "homepage", "url": "https://example.com" } ] + } + }, + { + "roles": [ { "role": "support-contact" } ], + "person": { "name": "Acme Distribution", "email": [ { "name": "support", "address": "distribution@example.com" } ] } } - } - ], - "identifiers": [ + ], + "name": "Acme Application", + "version": "9.1.1", + "identifiers": [ + { + "party": "acme-inc", + "identities": [ + { + "scheme": "swid", + "value": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" + } + ] + } + ] + }, + "components": [ { - "party": "acme-inc", - "identities": [ + "bom-ref": "pkg:maven/com.acme/acme-catalina@9.0.14?packaging=jar", + "type": "application", + "parties": [ + { + "roles": [ { "role": "author" } ], + "person": { "name": "Joane Doe et al." } + }, { - "scheme": "purl", - "value": "pkg:maven/com.acme/acme-catalina@9.0.14?packaging=jar" + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } } - ] - } - ], - "pedigree": { - "ancestors": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "author" } ], - "person": { "name": "Globex Super Heroes" } - }, - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Globex" } + ], + "group": "com.acme", + "name": "acme-catalina", + "version": "9.0.14", + "description": "Modified version of Acme Catalina", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0.txt" } - ], - "group": "org.globex.catalina", - "name": "globex-catalina", - "version": "9.0.14", - "description": "Globex Catalina", - "licenses": [ - { - "license": { - "id": "Apache-2.0" + } + ], + "identifiers": [ + { + "party": "acme-inc", + "identities": [ + { + "scheme": "purl", + "value": "pkg:maven/com.acme/acme-catalina@9.0.14?packaging=jar" } - } - ], - "identifiers": [ + ] + } + ], + "pedigree": { + "ancestors": [ { - "party": "acme-inc", - "identities": [ + "type": "application", + "parties": [ { - "scheme": "purl", - "value": "pkg:maven/org.globex.catalina/globex-catalina@9.0.14?packaging=jar" + "roles": [ { "role": "author" } ], + "person": { "name": "Globex Super Heroes" } + }, + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Globex" } + } + ], + "group": "org.globex.catalina", + "name": "globex-catalina", + "version": "9.0.14", + "description": "Globex Catalina", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } + } + ], + "identifiers": [ + { + "party": "acme-inc", + "identities": [ + { + "scheme": "purl", + "value": "pkg:maven/org.globex.catalina/globex-catalina@9.0.14?packaging=jar" + } + ] } ] } + ], + "commits": [ + { + "uid": "7638417db6d59f3c431d3e1f261cc637155684cd", + "url": "https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd", + "author": { + "timestamp": "2018-11-13T20:20:39+00:00", + "name": "John Doe", + "email": "john.doe@example.com" + }, + "committer": { + "timestamp": "2018-11-07T22:01:45Z", + "name": "Jane Doe", + "email": "jane.doe@example.com" + }, + "message": "Initial commit" + } ] } - ], - "commits": [ - { - "uid": "7638417db6d59f3c431d3e1f261cc637155684cd", - "url": "https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd", - "author": { - "timestamp": "2018-11-13T20:20:39+00:00", - "name": "John Doe", - "email": "john.doe@example.com" - }, - "committer": { - "timestamp": "2018-11-07T22:01:45Z", - "name": "Jane Doe", - "email": "jane.doe@example.com" - }, - "message": "Initial commit" - } - ], - "notes": "Commentary here" - } - }, - { - "type": "library", - "bom-ref": "pkg:maven/com.example/myapplication@1.0.0?packaging=war", - "parties": [ - { - "roles": [ { "role": "supplier" } ], - "organization": { - "name": "Example, Inc.", - "url": [ - { "name": "homepage", "url": "https://example.com" }, - { "name": "homepage", "url": "https://example.net" } - ] - } - }, - { - "roles": [ { "role": "support-contact" } ], - "person": { - "name": "Example Support AMER", - "email": [ { "address": "support@example.com" } ], - "phone": [ { "number": "800-555-1212" } ] - } - }, - { - "roles": [ { "role": "support-contact" } ], - "person": { - "name": "Example Support APAC", - "email": [ { "address": "support@apac.example.com" } ] - } - }, - { - "bom-ref": "example-2-inc", - "roles": [ { "role": "manufacturer" } ], - "organization": { - "name": "Example-2, Inc.", - "url": [ - { "name": "homepage", "url": "https://example.org" } - ] - } - }, - { - "roles": [ { "role": "author" } ], - "person": { - "name": "Anthony Edward Stark", - "phone": [ { "number": "555-212-970-4133" } ], - "email": [ { "address": "ironman@example.org" } ] - } }, { - "roles": [ { "role": "author" } ], - "person": { - "name": "Peter Benjamin Parker", - "email": [ { "address": "spiderman@example.org" } ] - } - } - ], - "group": "org.example", - "name": "mylibrary", - "version": "1.0.0", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "2342c2eaf1feb9a80195dbaddf2ebaa3" - }, - { - "alg": "SHA-1", - "content": "68b78babe00a053f9e35ec6a2d9080f5b90122b0" - }, - { - "alg": "SHA-256", - "content": "708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313" - }, - { - "alg": "SHA-512", - "content": "387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef" - } - ], - "licenses": [ - { - "expression": "EPL-2.0 OR GPL-2.0-with-classpath-exception" - } - ], - "copyright": "Copyright Example Inc. All rights reserved.", - "identifiers": [ - { - "party": "example-2-inc", - "identities": [ + "type": "library", + "bom-ref": "pkg:maven/com.example/myapplication@1.0.0?packaging=war", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { + "name": "Example, Inc.", + "url": [ + { "name": "homepage", "url": "https://example.com" }, + { "name": "homepage", "url": "https://example.net" } + ] + } + }, + { + "roles": [ { "role": "support-contact" } ], + "person": { + "name": "Example Support AMER", + "email": [ { "address": "support@example.com" } ], + "phone": [ { "number": "800-555-1212" } ] + } + }, + { + "roles": [ { "role": "support-contact" } ], + "person": { + "name": "Example Support APAC", + "email": [ { "address": "support@apac.example.com" } ] + } + }, + { + "bom-ref": "example-2-inc", + "roles": [ { "role": "manufacturer" } ], + "organization": { + "name": "Example-2, Inc.", + "url": [ + { "name": "homepage", "url": "https://example.org" } + ] + } + }, { - "scheme": "cpe", - "value": "cpe:/a:example:myapplication:1.0.0" + "roles": [ { "role": "author" } ], + "person": { + "name": "Anthony Edward Stark", + "phone": [ { "number": "555-212-970-4133" } ], + "email": [ { "address": "ironman@example.org" } ] + } }, { - "scheme": "purl", - "value": "pkg:maven/com.example/myapplication@1.0.0?packaging=war" + "roles": [ { "role": "author" } ], + "person": { + "name": "Peter Benjamin Parker", + "email": [ { "address": "spiderman@example.org" } ] + } + } + ], + "group": "org.example", + "name": "mylibrary", + "version": "1.0.0", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "2342c2eaf1feb9a80195dbaddf2ebaa3" + }, + { + "alg": "SHA-1", + "content": "68b78babe00a053f9e35ec6a2d9080f5b90122b0" + }, + { + "alg": "SHA-256", + "content": "708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313" + }, + { + "alg": "SHA-512", + "content": "387b7ae16b9cae45f830671541539bf544202faae5aac544a93b7b0a04f5f846fa2f4e81ef3f1677e13aed7496408a441f5657ab6d54423e56bf6f38da124aef" + } + ], + "licenses": [ + { + "expression": "EPL-2.0 OR GPL-2.0-with-classpath-exception" + } + ], + "copyright": "Copyright Example Inc. All rights reserved.", + "identifiers": [ + { + "party": "example-2-inc", + "identities": [ + { + "scheme": "cpe", + "value": "cpe:/a:example:myapplication:1.0.0" + }, + { + "scheme": "purl", + "value": "pkg:maven/com.example/myapplication@1.0.0?packaging=war" + } + ] + } + ], + "externalReferences": [ + { + "url": "http://example.org/docs", + "type": "documentation", + "comment": "All component versions are documented here" + }, + { + "url": "http://example.org/security", + "type": "advisories" } ] - } - ], - "externalReferences": [ - { - "url": "http://example.org/docs", - "type": "documentation", - "comment": "All component versions are documented here" }, { - "url": "http://example.org/security", - "type": "advisories" - } - ] - }, - { - "type": "framework", - "parties": [ - { - "roles": [ { "role": "author" } ], - "organization": { "name": "Example Super Heroes" } - } - ], - "group": "com.example", - "name": "myframework", - "version": "1.0.0", - "description": "Example Inc, enterprise framework", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "cfcb0b64aacd2f81c1cd546543de965a" - }, - { - "alg": "SHA-1", - "content": "7fbeef2346c45d565c3341f037bce4e088af8a52" - }, - { - "alg": "SHA-256", - "content": "0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1" - }, - { - "alg": "SHA-512", - "content": "854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79" - } - ], - "licenses": [ - { - "license": { - "name": "Some random license" - } - } - ], - "identifiers": [ - { - "party": "example-2-inc", - "identities": [ + "type": "framework", + "parties": [ { - "scheme": "purl", - "value": "pkg:maven/com.example/myframework@1.0.0?packaging=war" + "roles": [ { "role": "author" } ], + "organization": { "name": "Example Super Heroes" } + } + ], + "group": "com.example", + "name": "myframework", + "version": "1.0.0", + "description": "Example Inc, enterprise framework", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "cfcb0b64aacd2f81c1cd546543de965a" + }, + { + "alg": "SHA-1", + "content": "7fbeef2346c45d565c3341f037bce4e088af8a52" + }, + { + "alg": "SHA-256", + "content": "0384db3cec55d86a6898c489fdb75a8e75fe66b26639634983d2f3c3558493d1" + }, + { + "alg": "SHA-512", + "content": "854909cdb9e3ca183056837144aab6d8069b377bd66445087cc7157bf0c3f620418705dd0b83bdc2f73a508c2bdb316ca1809d75ee6972d02023a3e7dd655c79" + } + ], + "licenses": [ + { + "license": { + "name": "Some random license" + } + } + ], + "identifiers": [ + { + "party": "example-2-inc", + "identities": [ + { + "scheme": "purl", + "value": "pkg:maven/com.example/myframework@1.0.0?packaging=war" + } + ] + } + ], + "externalReferences": [ + { + "type": "website", + "url": "http://example.com/myframework" + }, + { + "type": "advisories", + "url": "http://example.com/security" } ] } - ], - "externalReferences": [ - { - "type": "website", - "url": "http://example.com/myframework" - }, - { - "type": "advisories", - "url": "http://example.com/security" - } ] } ], @@ -380,5 +383,13 @@ "pkg:maven/com.example/myapplication@1.0.0?packaging=war" ] } + ], + "annotations": [ + { + "subjects": [ "pkg:maven/com.acme/acme-catalina@9.0.14?packaging=jar" ], + "annotator": { "organization": { "name": "Acme Super Heroes" } }, + "timestamp": "2026-08-31T12:00:00Z", + "text": "Commentary here" + } ] } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-certification-inline-2.0.json b/tools/src/test/resources/2.0/valid-certification-inline-2.0.json new file mode 100644 index 00000000..7af92201 --- /dev/null +++ b/tools/src/test/resources/2.0/valid-certification-inline-2.0.json @@ -0,0 +1,19 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { + "bom-ref": "mcu-1", + "type": "device", + "name": "Acme MCU", + "certifications": [ + { + "bom-ref": "cert-1", + "standard": "AEC-Q100" + } + ] + } + ] + } +} diff --git a/tools/src/test/resources/2.0/valid-citations-2.0.json b/tools/src/test/resources/2.0/valid-citations-2.0.json index 82bd83cc..631a9862 100644 --- a/tools/src/test/resources/2.0/valid-citations-2.0.json +++ b/tools/src/test/resources/2.0/valid-citations-2.0.json @@ -14,25 +14,32 @@ } ] }, - "components": [ - { - "type": "library", - "bom-ref": "component-1", - "name": "example-lib", - "version": "1.2.3", - "licenses": [ - { - "license": { - "id": "Apache-2.0" + "definitions": { + "components": [ + { + "bom-ref": "scan-tool-1", + "type": "application", + "name": "My Scan Tool" + }, + { + "type": "library", + "bom-ref": "component-1", + "name": "example-lib", + "version": "1.2.3", + "licenses": [ + { + "license": { + "id": "Apache-2.0" + } } - } - ] - } - ], + ] + } + ] + }, "citations": [ { "bom-ref": "citation-1", - "pointers": ["/components/0/name"], + "pointers": ["/definitions/components/0/name"], "timestamp": "2025-05-01T14:00:00Z", "attributedTo": "person-1", "note": "Manually entered by Alice Example - with `attributedTo`" @@ -62,13 +69,6 @@ ], "formulation": [ { - "components": [ - { - "bom-ref": "scan-tool-1", - "type": "application", - "name": "My Scan Tool" - } - ], "bom-ref": "workflow-1", "workflows": [ { diff --git a/tools/src/test/resources/2.0/valid-component-choice-and-2.0.json b/tools/src/test/resources/2.0/valid-component-choice-and-2.0.json index b9fe50ea..0f710785 100644 --- a/tools/src/test/resources/2.0/valid-component-choice-and-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-choice-and-2.0.json @@ -3,37 +3,39 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "bom-ref": "rf-board", - "type": "device", - "name": "RF Front End Board" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "name": "Transceiver and Matching Balun", - "description": "The transceiver and its matching balun are installed together. Selecting one without the other yields a non-functional radio.", - "operator": "AND", + "subject": { + "bom-ref": "rf-board", + "type": "device", + "name": "RF Front End Board" + }, "components": [ { - "type": "device", - "name": "2.4GHz RF Transceiver", - "parties": [ + "type": "component-choice", + "name": "Transceiver and Matching Balun", + "description": "The transceiver and its matching balun are installed together. Selecting one without the other yields a non-functional radio.", + "operator": "AND", + "components": [ { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Acme RF" } - } - ] - }, - { - "type": "device", - "name": "Matching Balun for 2.4GHz Transceiver", - "parties": [ + "type": "device", + "name": "2.4GHz RF Transceiver", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Acme RF" } + } + ] + }, { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Acme RF" } + "type": "device", + "name": "Matching Balun for 2.4GHz Transceiver", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Acme RF" } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-component-choice-in-nested-components-2.0.json b/tools/src/test/resources/2.0/valid-component-choice-in-nested-components-2.0.json index af1d4373..df926f46 100644 --- a/tools/src/test/resources/2.0/valid-component-choice-in-nested-components-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-choice-in-nested-components-2.0.json @@ -3,44 +3,46 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "bom-ref": "main-board", - "type": "device", - "name": "Main Board" - } - }, - "components": [ + "inventories": [ { - "type": "device", - "name": "Power Management Sub-board", + "subject": { + "bom-ref": "main-board", + "type": "device", + "name": "Main Board" + }, "components": [ { "type": "device", - "name": "Input Diode" - }, - { - "type": "component-choice", - "name": "U1 5V LDO Regulator", - "operator": "XOR", + "name": "Power Management Sub-board", "components": [ { "type": "device", - "name": "LD1117S50TR", - "parties": [ - { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "STMicroelectronics" } - } - ] + "name": "Input Diode" }, { - "type": "device", - "name": "AMS1117-5.0", - "parties": [ + "type": "component-choice", + "name": "U1 5V LDO Regulator", + "operator": "XOR", + "components": [ + { + "type": "device", + "name": "LD1117S50TR", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "STMicroelectronics" } + } + ] + }, { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Advanced Monolithic Systems" } + "type": "device", + "name": "AMS1117-5.0", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Advanced Monolithic Systems" } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-component-choice-nested-2.0.json b/tools/src/test/resources/2.0/valid-component-choice-nested-2.0.json index 344eae8c..9fdce765 100644 --- a/tools/src/test/resources/2.0/valid-component-choice-nested-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-choice-nested-2.0.json @@ -3,69 +3,71 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "bom-ref": "radio-module", - "type": "device", - "name": "Radio Module" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "name": "Radio Subsystem", - "description": "Choose exactly one radio subsystem. Each option is itself a tightly coupled group of transceiver and matching balun that must be installed together.", - "operator": "XOR", + "subject": { + "bom-ref": "radio-module", + "type": "device", + "name": "Radio Module" + }, "components": [ { "type": "component-choice", - "name": "2.4GHz Radio Group", - "operator": "AND", + "name": "Radio Subsystem", + "description": "Choose exactly one radio subsystem. Each option is itself a tightly coupled group of transceiver and matching balun that must be installed together.", + "operator": "XOR", "components": [ { - "type": "device", - "name": "2.4GHz Transceiver", - "parties": [ + "type": "component-choice", + "name": "2.4GHz Radio Group", + "operator": "AND", + "components": [ { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Acme RF" } - } - ] - }, - { - "type": "device", - "name": "2.4GHz Balun", - "parties": [ + "type": "device", + "name": "2.4GHz Transceiver", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Acme RF" } + } + ] + }, { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Acme RF" } - } - ] - } - ] - }, - { - "type": "component-choice", - "name": "Sub-GHz Radio Group", - "operator": "AND", - "components": [ - { - "type": "device", - "name": "915MHz Transceiver", - "parties": [ - { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Beta RF" } + "type": "device", + "name": "2.4GHz Balun", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Acme RF" } + } + ] } ] }, { - "type": "device", - "name": "915MHz Balun", - "parties": [ + "type": "component-choice", + "name": "Sub-GHz Radio Group", + "operator": "AND", + "components": [ + { + "type": "device", + "name": "915MHz Transceiver", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Beta RF" } + } + ] + }, { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Beta RF" } + "type": "device", + "name": "915MHz Balun", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Beta RF" } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-component-choice-or-2.0.json b/tools/src/test/resources/2.0/valid-component-choice-or-2.0.json index c4f64998..a8d03ebf 100644 --- a/tools/src/test/resources/2.0/valid-component-choice-or-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-choice-or-2.0.json @@ -3,48 +3,50 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "bom-ref": "acme-product", - "type": "device", - "name": "Acme Product" - } - }, - "components": [ + "inventories": [ { - "type": "component-choice", - "bom-ref": "choice-bypass-cap", - "name": "C1 0.1uF Bypass Capacitor", - "description": "Approved alternates for a 0.1uF X7R bypass capacitor in an 0805 package. Any non-empty subset of the alternates may appear in the population.", - "operator": "OR", + "subject": { + "bom-ref": "acme-product", + "type": "device", + "name": "Acme Product" + }, "components": [ { - "type": "device", - "name": "Ceramic Capacitor 0.1uF 0805 X7R", - "parties": [ + "type": "component-choice", + "bom-ref": "choice-bypass-cap", + "name": "C1 0.1uF Bypass Capacitor", + "description": "Approved alternates for a 0.1uF X7R bypass capacitor in an 0805 package. Any non-empty subset of the alternates may appear in the population.", + "operator": "OR", + "components": [ { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Kemet" } - } - ] - }, - { - "type": "device", - "name": "Ceramic Capacitor 0.1uF 0805 X7R", - "parties": [ + "type": "device", + "name": "Ceramic Capacitor 0.1uF 0805 X7R", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Kemet" } + } + ] + }, { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "TDK" } - } - ] - }, - { - "type": "device", - "name": "Ceramic Capacitor 0.1uF 0805 X7R", - "parties": [ + "type": "device", + "name": "Ceramic Capacitor 0.1uF 0805 X7R", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "TDK" } + } + ] + }, { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Murata" } + "type": "device", + "name": "Ceramic Capacitor 0.1uF 0805 X7R", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Murata" } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-component-choice-xor-2.0.json b/tools/src/test/resources/2.0/valid-component-choice-xor-2.0.json index 314d6a14..cdbf08b7 100644 --- a/tools/src/test/resources/2.0/valid-component-choice-xor-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-choice-xor-2.0.json @@ -4,51 +4,53 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "metadata": { - "component": { - "bom-ref": "acme-product-rev-1", - "type": "device", - "name": "Acme Product", - "version": "Revision 1" - } - }, - "components": [ - { - "type": "device", - "name": "Power Management Board" - }, + "inventories": [ { - "type": "component-choice", - "name": "2N2222 or PN2222A Transistor", - "operator": "XOR", + "subject": { + "bom-ref": "acme-product-rev-1", + "type": "device", + "name": "Acme Product", + "version": "Revision 1" + }, "components": [ { "type": "device", - "name": "NPN Transistor 2N2222", - "parties": [ - { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Company A" } - } - ] + "name": "Power Management Board" }, { - "type": "device", - "name": "NPN Transistor 2N2222", - "parties": [ + "type": "component-choice", + "name": "2N2222 or PN2222A Transistor", + "operator": "XOR", + "components": [ { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Company B" } - } - ] - }, - { - "type": "device", - "name": "NPN Transistor PN2222A", - "parties": [ + "type": "device", + "name": "NPN Transistor 2N2222", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Company A" } + } + ] + }, + { + "type": "device", + "name": "NPN Transistor 2N2222", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Company B" } + } + ] + }, { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Company C" } + "type": "device", + "name": "NPN Transistor PN2222A", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Company C" } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-component-data-2.0.json b/tools/src/test/resources/2.0/valid-component-data-2.0.json index 1ad261d5..e07dff6f 100644 --- a/tools/src/test/resources/2.0/valid-component-data-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-data-2.0.json @@ -4,27 +4,29 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "data", - "name": "my-configs", - "version": "1337", - "data": [ - { - "type": "configuration", - "name": "app.ini", - "contents": { - "url": "https://example.com/cfg/1337/app.ini" + "definitions": { + "components": [ + { + "type": "data", + "name": "my-configs", + "version": "1337", + "data": [ + { + "type": "configuration", + "name": "app.ini", + "contents": { + "url": "https://example.com/cfg/1337/app.ini" + } + }, + { + "type": "other", + "name": ".env", + "contents": { + "url": "https://example.com/cfg/1337/env" + } } - }, - { - "type": "other", - "name": ".env", - "contents": { - "url": "https://example.com/cfg/1337/env" - } - } - ] - } - ] + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-component-evidence-assertion-2.0.json b/tools/src/test/resources/2.0/valid-component-evidence-assertion-2.0.json index a6dbbab0..0762be6b 100644 --- a/tools/src/test/resources/2.0/valid-component-evidence-assertion-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-evidence-assertion-2.0.json @@ -4,35 +4,37 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:ee671687-395b-41f5-a30f-a58921a69d03", "version": 1, - "components": [ - { - "bom-ref": "component-acme-lib", - "type": "library", - "name": "acme-lib", - "version": "1.0.0", - "evidence": { - "identity": [ - { - "scheme": "purl", - "concludedValue": "pkg:maven/com.acme/acme-lib@1.0.0", - "confidence": 0.9, - "methods": [ - { - "technique": "software-identifier", - "confidence": 0.9, - "result": "detected", - "value": "pkg:maven/com.acme/acme-lib@1.0.0" - } - ], - "assertion": { - "parties": [ - { "party": "party-acme-supplier", "role": { "role": "supplier" } } - ] - }, - "timestamp": "2024-01-01T00:00:00.000Z" - } - ] + "definitions": { + "components": [ + { + "bom-ref": "component-acme-lib", + "type": "library", + "name": "acme-lib", + "version": "1.0.0", + "evidence": { + "identity": [ + { + "scheme": "purl", + "concludedValue": "pkg:maven/com.acme/acme-lib@1.0.0", + "confidence": 0.9, + "methods": [ + { + "technique": "software-identifier", + "confidence": 0.9, + "result": "detected", + "value": "pkg:maven/com.acme/acme-lib@1.0.0" + } + ], + "assertion": { + "parties": [ + { "party": "party-acme-supplier", "role": { "role": "supplier" } } + ] + }, + "timestamp": "2024-01-01T00:00:00.000Z" + } + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/valid-component-evidence-license-copyright-2.0.json b/tools/src/test/resources/2.0/valid-component-evidence-license-copyright-2.0.json index 27e36c13..35bb8f25 100644 --- a/tools/src/test/resources/2.0/valid-component-evidence-license-copyright-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-evidence-license-copyright-2.0.json @@ -17,102 +17,104 @@ ] } }, - "components": [ - { - "bom-ref": "component-acme-lib", - "type": "library", - "name": "acme-lib", - "version": "1.0.0", - "evidence": { - "licenses": [ - { - "bom-ref": "license-evidence-apache", - "license": { - "id": "Apache-2.0" - }, - "confidence": 0.95, - "methods": [ - { - "technique": "content-match", - "confidence": 0.95, - "result": "detected", - "value": "Matched 98% of the Apache-2.0 license text.", - "rule": { - "id": "apache-2.0", - "name": "Apache License 2.0 full text", - "version": "32.0.0", - "ruleset": "tool-scancode" + "definitions": { + "components": [ + { + "bom-ref": "component-acme-lib", + "type": "library", + "name": "acme-lib", + "version": "1.0.0", + "evidence": { + "licenses": [ + { + "bom-ref": "license-evidence-apache", + "license": { + "id": "Apache-2.0" + }, + "confidence": 0.95, + "methods": [ + { + "technique": "content-match", + "confidence": 0.95, + "result": "detected", + "value": "Matched 98% of the Apache-2.0 license text.", + "rule": { + "id": "apache-2.0", + "name": "Apache License 2.0 full text", + "version": "32.0.0", + "ruleset": "tool-scancode" + } } - } - ], - "tools": [ - "tool-scancode" - ], - "occurrences": [ - { - "location": "LICENSE", - "line": 1 - } - ], - "assertion": { - "parties": [ + ], + "tools": [ + "tool-scancode" + ], + "occurrences": [ { - "party": { - "roles": [ { "role": "operator" } ], - "organization": { "name": "Acme Inc" } + "location": "LICENSE", + "line": 1 + } + ], + "assertion": { + "parties": [ + { + "party": { + "roles": [ { "role": "operator" } ], + "organization": { "name": "Acme Inc" } + }, + "role": { "role": "operator" } }, - "role": { "role": "operator" } - }, + { + "party": { + "roles": [ { "role": "reviewer" } ], + "person": { "name": "L. Reviewer" } + }, + "role": { "role": "reviewer" } + } + ] + }, + "timestamp": "2024-02-01T00:00:00.000Z" + }, + { + "expression": "Apache-2.0 OR MIT", + "confidence": 0.7, + "methods": [ { - "party": { - "roles": [ { "role": "reviewer" } ], - "person": { "name": "L. Reviewer" } - }, - "role": { "role": "reviewer" } + "technique": "manifest-analysis", + "confidence": 0.7, + "result": "detected", + "value": "Declared in package metadata." } + ], + "tools": [ + "tool-scancode" ] - }, - "timestamp": "2024-02-01T00:00:00.000Z" - }, - { - "expression": "Apache-2.0 OR MIT", - "confidence": 0.7, - "methods": [ - { - "technique": "manifest-analysis", - "confidence": 0.7, - "result": "detected", - "value": "Declared in package metadata." - } - ], - "tools": [ - "tool-scancode" - ] - } - ], - "copyright": [ - { - "text": "Copyright 2024 Acme Inc.", - "confidence": 0.9, - "methods": [ - { - "technique": "content-match", - "confidence": 0.9, - "result": "detected" - } - ], - "tools": [ - "tool-scancode" - ], - "occurrences": [ - { - "location": "src/main.c", - "line": 2 - } - ] - } - ] + } + ], + "copyright": [ + { + "text": "Copyright 2024 Acme Inc.", + "confidence": 0.9, + "methods": [ + { + "technique": "content-match", + "confidence": 0.9, + "result": "detected" + } + ], + "tools": [ + "tool-scancode" + ], + "occurrences": [ + { + "location": "src/main.c", + "line": 2 + } + ] + } + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/valid-component-evidence-shared-technique-2.0.json b/tools/src/test/resources/2.0/valid-component-evidence-shared-technique-2.0.json index 46abf4ff..271ecfb4 100644 --- a/tools/src/test/resources/2.0/valid-component-evidence-shared-technique-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-evidence-shared-technique-2.0.json @@ -4,42 +4,44 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:dd671687-395b-41f5-a30f-a58921a69c01", "version": 1, - "components": [ - { - "bom-ref": "component-acme-lib", - "type": "library", - "name": "acme-lib", - "version": "1.0.0", - "evidence": { - "identity": [ - { - "scheme": "purl", - "concludedValue": "pkg:maven/com.acme/acme-lib@1.0.0", - "confidence": 0.9, - "methods": [ - { - "technique": "software-identifier", - "confidence": 0.9, - "value": "pkg:maven/com.acme/acme-lib@1.0.0", - "description": "Matched the declared Package URL against the component coordinate." - }, - { - "technique": "hash-comparison", - "confidence": 0.8, - "value": "7c547a9d67cc7bc315c93b6e2ff8e4b6b41ae5be454ac249655ecb5ca2a85abf" - } - ] - } - ], - "occurrences": [ - { - "location": "/opt/app/lib/acme-lib.jar", - "systemOwner": "platform-team", - "startTime": "2024-03-01T00:00:00.000Z", - "usageCount": 2 - } - ] + "definitions": { + "components": [ + { + "bom-ref": "component-acme-lib", + "type": "library", + "name": "acme-lib", + "version": "1.0.0", + "evidence": { + "identity": [ + { + "scheme": "purl", + "concludedValue": "pkg:maven/com.acme/acme-lib@1.0.0", + "confidence": 0.9, + "methods": [ + { + "technique": "software-identifier", + "confidence": 0.9, + "value": "pkg:maven/com.acme/acme-lib@1.0.0", + "description": "Matched the declared Package URL against the component coordinate." + }, + { + "technique": "hash-comparison", + "confidence": 0.8, + "value": "7c547a9d67cc7bc315c93b6e2ff8e4b6b41ae5be454ac249655ecb5ca2a85abf" + } + ] + } + ], + "occurrences": [ + { + "location": "/opt/app/lib/acme-lib.jar", + "systemOwner": "platform-team", + "startTime": "2024-03-01T00:00:00.000Z", + "usageCount": 2 + } + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/valid-component-external-with-version.json b/tools/src/test/resources/2.0/valid-component-external-with-version.json index 3ab73e19..6054db1f 100644 --- a/tools/src/test/resources/2.0/valid-component-external-with-version.json +++ b/tools/src/test/resources/2.0/valid-component-external-with-version.json @@ -4,21 +4,23 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:7dc07ac8-7fb8-4782-bf89-4762394e189d", "version": 1, - "metadata": { - "component": { - "bom-ref": "my-app", - "type": "application", - "name": "My Application" - } - }, - "components": [ + "inventories": [ { - "bom-ref": "os", - "type": "operating-system", - "name": "Ubuntu", - "version": "24.04", - "description": "Ubuntu 24.04", - "isExternal": true + "subject": { + "bom-ref": "my-app", + "type": "application", + "name": "My Application" + }, + "components": [ + { + "bom-ref": "os", + "type": "operating-system", + "name": "Ubuntu", + "version": "24.04", + "description": "Ubuntu 24.04", + "isExternal": true + } + ] } ], "dependencies": [ diff --git a/tools/src/test/resources/2.0/valid-component-external-with-versionRange.json b/tools/src/test/resources/2.0/valid-component-external-with-versionRange.json index 1e558cbb..17b650f1 100644 --- a/tools/src/test/resources/2.0/valid-component-external-with-versionRange.json +++ b/tools/src/test/resources/2.0/valid-component-external-with-versionRange.json @@ -4,21 +4,23 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:bdd25550-f1c1-4cb4-b406-0c8d05ad6382", "version": 1, - "metadata": { - "component": { - "bom-ref": "my-app", - "type": "application", - "name": "My Application" - } - }, - "components": [ + "inventories": [ { - "bom-ref": "libcurl", - "type": "library", - "name": "libcurl", - "versionRange": "vers:generic/>=8.7.1|<9.0.0", - "description": "libcurl ^8.7.1", - "isExternal": true + "subject": { + "bom-ref": "my-app", + "type": "application", + "name": "My Application" + }, + "components": [ + { + "bom-ref": "libcurl", + "type": "library", + "name": "libcurl", + "versionRange": "vers:generic/>=8.7.1|<9.0.0", + "description": "libcurl ^8.7.1", + "isExternal": true + } + ] } ], "dependencies": [ diff --git a/tools/src/test/resources/2.0/valid-component-external-without-version.json b/tools/src/test/resources/2.0/valid-component-external-without-version.json index d878309d..c2cef47c 100644 --- a/tools/src/test/resources/2.0/valid-component-external-without-version.json +++ b/tools/src/test/resources/2.0/valid-component-external-without-version.json @@ -4,20 +4,22 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "metadata": { - "component": { - "bom-ref": "my-app", - "type": "application", - "name": "My Application" - } - }, - "components": [ + "inventories": [ { - "bom-ref": "os", - "type": "operating-system", - "name": "Windows 11 (64bit)", - "description": "any Windows 11", - "isExternal": true + "subject": { + "bom-ref": "my-app", + "type": "application", + "name": "My Application" + }, + "components": [ + { + "bom-ref": "os", + "type": "operating-system", + "name": "Windows 11 (64bit)", + "description": "any Windows 11", + "isExternal": true + } + ] } ], "dependencies": [ diff --git a/tools/src/test/resources/2.0/valid-component-hashes-2.0.json b/tools/src/test/resources/2.0/valid-component-hashes-2.0.json index 0141c413..fc408bdc 100644 --- a/tools/src/test/resources/2.0/valid-component-hashes-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-hashes-2.0.json @@ -4,61 +4,63 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-example", - "version": "1.0.0", - "hashes": [ - { - "alg": "MD5", - "content": "641b6e166f8b33c5e959e2adcc18b1c7" - }, - { - "alg": "SHA-1", - "content": "9188560f22e0b73070d2efce670c74af2bdf30af" - }, - { - "alg": "SHA-256", - "content": "d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964" - }, - { - "alg": "SHA-384", - "content": "d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad" - }, - { - "alg": "SHA-512", - "content": "74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6" - }, - { - "alg": "SHA3-256", - "content": "7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa" - }, - { - "alg": "SHA3-384", - "content": "a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5" - }, - { - "alg": "SHA3-512", - "content": "7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20" - }, - { - "alg": "BLAKE2b-256", - "content": "d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237" - }, - { - "alg": "BLAKE2b-384", - "content": "e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a" - }, - { - "alg": "BLAKE2b-512", - "content": "f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d" - }, - { - "alg": "BLAKE3", - "content": "26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-example", + "version": "1.0.0", + "hashes": [ + { + "alg": "MD5", + "content": "641b6e166f8b33c5e959e2adcc18b1c7" + }, + { + "alg": "SHA-1", + "content": "9188560f22e0b73070d2efce670c74af2bdf30af" + }, + { + "alg": "SHA-256", + "content": "d88bc4e70bfb34d18b5542136639acbb26a8ae2429aa1e47489332fb389cc964" + }, + { + "alg": "SHA-384", + "content": "d4835048a0f57c74b8fb617d5366ab81376fc92bebe9a93bf24ba7f9da6c9aeeb6179f5d1361f6533211b15f3224cbad" + }, + { + "alg": "SHA-512", + "content": "74a51ff45e4c11df9ba1f0094282c80489649cb157a75fa337992d2d4592a5a1b8cb4525de8db0ae25233553924d76c36e093ea7fa9df4e5b8b07fd2e074efd6" + }, + { + "alg": "SHA3-256", + "content": "7478c7cf41c883a04ee89f1813f687886d53fa86f791fff90690c6221e3853aa" + }, + { + "alg": "SHA3-384", + "content": "a1eea7229716487ad2ebe96b2f997a8408f32f14047994fbcc99b49012cf86c96dbd518e5d57a61b0e57dd37dd0b48f5" + }, + { + "alg": "SHA3-512", + "content": "7d584825bc1767dfabe7e82b45ccb7a1119b145fa17e76b885e71429c706cef0a3171bc6575b968eec5da56a7966c02fec5402fcee55097ac01d40c550de9d20" + }, + { + "alg": "BLAKE2b-256", + "content": "d8779633380c050bccf4e733b763ab2abd8ad2db60b517d47fd29bbf76433237" + }, + { + "alg": "BLAKE2b-384", + "content": "e728ba56c2da995a559a178116c594e8bee4894a79ceb4399d8f479e5563cb1942b85936f646d14170717c576b14db7a" + }, + { + "alg": "BLAKE2b-512", + "content": "f8ce8d612a6c85c96cf7cebc230f6ddef26e6cedcfbc4a41c766033cc08c6ba097d1470948226807fb2d88d2a2b6fc0ff5e5440e93a603086fdd568bafcd1a9d" + }, + { + "alg": "BLAKE3", + "content": "26cdc7fb3fd65fc3b621a4ef70bc7d2489d5c19e70c76cf7ec20e538df0047cf" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-component-identifiers-2.0.json b/tools/src/test/resources/2.0/valid-component-identifiers-2.0.json index 7fc0608f..348ada74 100644 --- a/tools/src/test/resources/2.0/valid-component-identifiers-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-identifiers-2.0.json @@ -10,48 +10,50 @@ "name": "Acme Inc." } }, - "components": [ - { - "type": "library", - "group": "com.acme", - "name": "acme-library", - "version": "1.0.0", - "identifiers": [ - { - "bom-ref": "acme-library-identity", - "party": "acme-inc", - "identities": [ - { - "scheme": "purl", - "value": "pkg:maven/com.acme/acme-library@1.0.0" - }, - { - "scheme": "cpe", - "value": "cpe:2.3:a:acme:acme-library:1.0.0:*:*:*:*:*:*:*" - }, - { - "scheme": "swid", - "value": "acme.com-acme-library-1.0.0" - }, - { - "scheme": "swhid", - "value": "swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2" - }, - { - "scheme": "swhid", - "value": "swh:1:dir:d198bc9d7a6bcf6db04f476d29314f157507d505" - }, - { - "scheme": "omniborid", - "value": "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64" - }, - { - "scheme": "omniborid", - "value": "gitoid:blob:sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" - } - ] - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "group": "com.acme", + "name": "acme-library", + "version": "1.0.0", + "identifiers": [ + { + "bom-ref": "acme-library-identity", + "party": "acme-inc", + "identities": [ + { + "scheme": "purl", + "value": "pkg:maven/com.acme/acme-library@1.0.0" + }, + { + "scheme": "cpe", + "value": "cpe:2.3:a:acme:acme-library:1.0.0:*:*:*:*:*:*:*" + }, + { + "scheme": "swid", + "value": "acme.com-acme-library-1.0.0" + }, + { + "scheme": "swhid", + "value": "swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2" + }, + { + "scheme": "swhid", + "value": "swh:1:dir:d198bc9d7a6bcf6db04f476d29314f157507d505" + }, + { + "scheme": "omniborid", + "value": "gitoid:blob:sha1:261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64" + }, + { + "scheme": "omniborid", + "value": "gitoid:blob:sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + } + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-component-mediatype-2.0.json b/tools/src/test/resources/2.0/valid-component-mediatype-2.0.json new file mode 100644 index 00000000..8d4874a6 --- /dev/null +++ b/tools/src/test/resources/2.0/valid-component-mediatype-2.0.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b7e", + "version": 1, + "definitions": { + "components": [ + { "bom-ref": "file-logo", "type": "file", "name": "logo.jpg", "mediaType": "image/jpeg" }, + { "bom-ref": "file-index", "type": "file", "name": "index.html", "mediaType": "text/html; charset=utf-8" }, + { "bom-ref": "file-form", "type": "file", "name": "form-payload.bin", "mediaType": "multipart/form-data; boundary=\"simple boundary\"; charset=utf-8" }, + { "bom-ref": "lib-api", "type": "library", "name": "acme-api-client", "version": "1.0", "mediaType": "application/vnd.api+json" } + ] + } +} diff --git a/tools/src/test/resources/2.0/valid-component-parties-by-reference-2.0.json b/tools/src/test/resources/2.0/valid-component-parties-by-reference-2.0.json index cd29c907..ea0c17b7 100644 --- a/tools/src/test/resources/2.0/valid-component-parties-by-reference-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-parties-by-reference-2.0.json @@ -3,36 +3,39 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Product" - } - }, - "components": [ + "inventories": [ { - "type": "device", - "name": "Microcontroller", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Product" + }, + "components": [ { - "bom-ref": "party-acme-mcu", - "roles": [ + "type": "device", + "name": "Microcontroller", + "parties": [ { - "role": "manufacturer" + "bom-ref": "party-acme-mcu", + "roles": [ + { + "role": "manufacturer" + } + ], + "organization": { + "legalName": "Acme Microcontrollers S.r.l." + } } - ], - "organization": { - "legalName": "Acme Microcontrollers S.r.l." - } + ] + }, + { + "type": "device", + "name": "USB-Serial Bridge", + "parties": [ + "party-acme-mcu" + ] } ] - }, - { - "type": "device", - "name": "USB-Serial Bridge", - "parties": [ - "party-acme-mcu" - ] } ] } diff --git a/tools/src/test/resources/2.0/valid-component-parties-multi-role-2.0.json b/tools/src/test/resources/2.0/valid-component-parties-multi-role-2.0.json index 623e0b1e..0b8d9efe 100644 --- a/tools/src/test/resources/2.0/valid-component-parties-multi-role-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-parties-multi-role-2.0.json @@ -3,71 +3,74 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Industrial Sensor" - } - }, - "components": [ + "inventories": [ { - "type": "device", - "name": "Temperature Probe", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Industrial Sensor" + }, + "components": [ { - "bom-ref": "actor-acme", - "roles": [ + "type": "device", + "name": "Temperature Probe", + "parties": [ { - "role": "manufacturer" + "bom-ref": "actor-acme", + "roles": [ + { + "role": "manufacturer" + }, + { + "role": "supplier" + }, + { + "role": "support-contact" + } + ], + "organization": { + "legalName": "Acme Sensors, Inc.", + "jurisdiction": "US-CA", + "url": [ + { "name": "homepage", "url": "https://acme-sensors.example.com" } + ] + } }, { - "role": "supplier" + "roles": [ + { + "role": "author" + } + ], + "person": { + "name": "Alice Wright", + "email": [ + { "name": "work", "address": "alice@acme-sensors.example.com" } + ], + "affiliation": "actor-acme" + } }, { - "role": "support-contact" - } - ], - "organization": { - "legalName": "Acme Sensors, Inc.", - "jurisdiction": "US-CA", - "url": [ - { "name": "homepage", "url": "https://acme-sensors.example.com" } - ] - } - }, - { - "roles": [ - { - "role": "author" - } - ], - "person": { - "name": "Alice Wright", - "email": [ - { "name": "work", "address": "alice@acme-sensors.example.com" } - ], - "affiliation": "actor-acme" - } - }, - { - "roles": [ - { - "role": "quality-control" - } - ], - "organization": { - "legalName": "Quality Lab East, LLC", - "jurisdiction": "US-NJ", - "addresses": [ - { - "isoCode": "US-NJ", - "coordinates": { - "latitude": 40.7357, - "longitude": -74.1724 + "roles": [ + { + "role": "quality-control" } + ], + "organization": { + "legalName": "Quality Lab East, LLC", + "jurisdiction": "US-NJ", + "addresses": [ + { + "isoCode": "US-NJ", + "coordinates": { + "latitude": 40.7357, + "longitude": -74.1724 + } + } + ] } - ] - } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-component-ref-2.0.json b/tools/src/test/resources/2.0/valid-component-ref-2.0.json index 0eb67013..36cbc9c3 100644 --- a/tools/src/test/resources/2.0/valid-component-ref-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-ref-2.0.json @@ -4,26 +4,28 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "bom-ref": "123", - "name": "acme-library", - "version": "1.0.0", - "components": [ - { - "type": "library", - "bom-ref": "456", - "name": "acme-library", - "version": "1.0.0" - } - ] - }, - { - "type": "library", - "bom-ref": "789", - "name": "acme-library", - "version": "1.0.0" - } - ] + "definitions": { + "components": [ + { + "type": "library", + "bom-ref": "123", + "name": "acme-library", + "version": "1.0.0", + "components": [ + { + "type": "library", + "bom-ref": "456", + "name": "acme-library", + "version": "1.0.0" + } + ] + }, + { + "type": "library", + "bom-ref": "789", + "name": "acme-library", + "version": "1.0.0" + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-component-swid-2.0.json b/tools/src/test/resources/2.0/valid-component-swid-2.0.json index 31539197..a06a4ed9 100644 --- a/tools/src/test/resources/2.0/valid-component-swid-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-swid-2.0.json @@ -10,28 +10,30 @@ "name": "Acme Inc." } }, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "author" } ], - "organization": { "name": "Acme Super Heroes" } - } - ], - "name": "Acme Application", - "version": "9.1.1", - "identifiers": [ - { - "party": "acme-inc", - "identities": [ - { - "scheme": "swid", - "value": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" - } - ] - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "author" } ], + "organization": { "name": "Acme Super Heroes" } + } + ], + "name": "Acme Application", + "version": "9.1.1", + "identifiers": [ + { + "party": "acme-inc", + "identities": [ + { + "scheme": "swid", + "value": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" + } + ] + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-component-swid-full-2.0.json b/tools/src/test/resources/2.0/valid-component-swid-full-2.0.json index 1fa56ab0..f84307d1 100644 --- a/tools/src/test/resources/2.0/valid-component-swid-full-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-swid-full-2.0.json @@ -10,35 +10,37 @@ "name": "Acme Inc." } }, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "author" } ], - "organization": { "name": "Acme Super Heroes" } - } - ], - "name": "Acme Application", - "version": "9.1.1", - "identifiers": [ - { - "party": "acme-inc", - "identities": [ - { - "scheme": "swid", - "value": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" - } - ] - } - ], - "externalReferences": [ - { - "type": "swid-tag", - "url": "https://acme.example.com/swid/acme-application-9.1.1.swidtag", - "comment": "ISO/IEC 19770-2 SoftwareIdentity XML document for this application." - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "author" } ], + "organization": { "name": "Acme Super Heroes" } + } + ], + "name": "Acme Application", + "version": "9.1.1", + "identifiers": [ + { + "party": "acme-inc", + "identities": [ + { + "scheme": "swid", + "value": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1" + } + ] + } + ], + "externalReferences": [ + { + "type": "swid-tag", + "url": "https://acme.example.com/swid/acme-application-9.1.1.swidtag", + "comment": "ISO/IEC 19770-2 SoftwareIdentity XML document for this application." + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-component-types-2.0.json b/tools/src/test/resources/2.0/valid-component-types-2.0.json index 1148867a..2b273ff3 100644 --- a/tools/src/test/resources/2.0/valid-component-types-2.0.json +++ b/tools/src/test/resources/2.0/valid-component-types-2.0.json @@ -4,51 +4,53 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "application", - "name": "application-a", - "version": "1.0" - }, - { - "type": "library", - "name": "library-a", - "version": "1.0" - }, - { - "type": "framework", - "name": "framework-a", - "version": "1.0" - }, - { - "type": "container", - "name": "container-a", - "version": "1.0" - }, - { - "type": "operating-system", - "name": "operating-system-a", - "version": "1.0" - }, - { - "type": "firmware", - "name": "firmware-a", - "version": "1.0" - }, - { - "type": "device", - "name": "device-a", - "version": "1.0" - }, - { - "type": "file", - "name": "file-a", - "version": "1.0" - }, - { - "type": "data", - "name": "data-a", - "version": "1.0" - } - ] + "definitions": { + "components": [ + { + "type": "application", + "name": "application-a", + "version": "1.0" + }, + { + "type": "library", + "name": "library-a", + "version": "1.0" + }, + { + "type": "framework", + "name": "framework-a", + "version": "1.0" + }, + { + "type": "container", + "name": "container-a", + "version": "1.0" + }, + { + "type": "operating-system", + "name": "operating-system-a", + "version": "1.0" + }, + { + "type": "firmware", + "name": "firmware-a", + "version": "1.0" + }, + { + "type": "device", + "name": "device-a", + "version": "1.0" + }, + { + "type": "file", + "name": "file-a", + "version": "1.0" + }, + { + "type": "data", + "name": "data-a", + "version": "1.0" + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-composition-explicit-none-2.0.json b/tools/src/test/resources/2.0/valid-composition-explicit-none-2.0.json new file mode 100644 index 00000000..d62b8c8e --- /dev/null +++ b/tools/src/test/resources/2.0/valid-composition-explicit-none-2.0.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b82", + "version": 1, + "definitions": { + "components": [ + { "bom-ref": "alg-aes-256-gcm", "type": "cryptographic-asset", "name": "AES-256-GCM", + "cryptoProperties": { "assetType": "algorithm", "algorithmProperties": { "primitive": "ae" } } }, + { "bom-ref": "pkg:generic/acme/internal-tool@1.0", "type": "application", "name": "Acme Internal Tool", "version": "1.0" } + ] + }, + "compositions": [ + { + "kind": "certifications", + "aggregate": "complete", + "targets": [ "alg-aes-256-gcm" ] + }, + { + "kind": "licenses", + "aggregate": "complete", + "targets": [ "pkg:generic/acme/internal-tool@1.0" ] + }, + { + "kind": "certifications", + "aggregate": "unknown", + "targets": [ "pkg:generic/acme/internal-tool@1.0" ] + } + ] +} diff --git a/tools/src/test/resources/2.0/valid-composition-kinds-2.0.json b/tools/src/test/resources/2.0/valid-composition-kinds-2.0.json new file mode 100644 index 00000000..0c74dc6f --- /dev/null +++ b/tools/src/test/resources/2.0/valid-composition-kinds-2.0.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b81", + "version": 1, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" }, + "components": [ + { "bom-ref": "pkg:maven/acme/library@3.0", "type": "library", "name": "Acme Library", "version": "3.0" } + ] + } + ], + "dependencies": [ + { "ref": "acme-app", "dependsOn": [ "pkg:maven/acme/library@3.0" ] } + ], + "compositions": [ + { + "kind": "components", + "aggregate": "complete", + "targets": [ "acme-app" ] + }, + { + "kind": "dependencies", + "aggregate": "incomplete-third-party-only", + "targets": [ "acme-app" ] + }, + { + "kind": "vulnerabilities", + "aggregate": "not-specified", + "targets": [ "urn:cdx:3e671687-395b-41f5-a30f-a58921a69b81/1" ] + }, + { + "kind": { + "name": "license-identification", + "description": "The license identification for each target is as complete as the aggregate states." + }, + "aggregate": "incomplete-first-party-opensource-only", + "targets": [ "pkg:maven/acme/library@3.0" ] + } + ] +} diff --git a/tools/src/test/resources/2.0/valid-compositions-2.0.json b/tools/src/test/resources/2.0/valid-compositions-2.0.json index 7601b215..6201127a 100644 --- a/tools/src/test/resources/2.0/valid-compositions-2.0.json +++ b/tools/src/test/resources/2.0/valid-compositions-2.0.json @@ -4,34 +4,36 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "metadata": { - "component": { - "bom-ref": "acme-application-1.0", - "type": "application", - "name": "Acme Application", - "version": "1.0" - } - }, - "components": [ + "inventories": [ { - "bom-ref": "pkg:maven/partner/shaded-library@1.0", - "type": "library", - "name": "Partner Shaded Library", - "version": "1.0", + "subject": { + "bom-ref": "acme-application-1.0", + "type": "application", + "name": "Acme Application", + "version": "1.0" + }, "components": [ { - "bom-ref": "pkg:maven/ossproject/library@2.0", + "bom-ref": "pkg:maven/partner/shaded-library@1.0", + "type": "library", + "name": "Partner Shaded Library", + "version": "1.0", + "components": [ + { + "bom-ref": "pkg:maven/ossproject/library@2.0", + "type": "library", + "name": "Some Opensource Library", + "version": "2.0" + } + ] + }, + { + "bom-ref": "pkg:maven/acme/library@3.0", "type": "library", - "name": "Some Opensource Library", - "version": "2.0" + "name": "Acme Library", + "version": "3.0" } ] - }, - { - "bom-ref": "pkg:maven/acme/library@3.0", - "type": "library", - "name": "Acme Library", - "version": "3.0" } ], "dependencies": [ @@ -55,24 +57,32 @@ "compositions": [ { "bom-ref": "composition-1", + "kind": "components", "aggregate": "complete", - "assemblies": [ + "targets": [ "pkg:maven/partner/shaded-library@1.0" - ], - "dependencies": [ + ] + }, + { + "bom-ref": "composition-2", + "kind": "dependencies", + "aggregate": "complete", + "targets": [ "acme-application-1.0" ] }, { + "kind": "components", "aggregate": "unknown", - "assemblies": [ + "targets": [ "pkg:maven/acme/library@3.0" ] }, { - "aggregate": "incomplete_first_party_only", - "vulnerabilities": [ - "vulnerability-1" + "kind": "vulnerabilities", + "aggregate": "incomplete-first-party-only", + "targets": [ + "acme-application-1.0" ] } ] diff --git a/tools/src/test/resources/2.0/valid-control-full-2.0.json b/tools/src/test/resources/2.0/valid-control-full-2.0.json index 4cfffc40..6b3173ed 100644 --- a/tools/src/test/resources/2.0/valid-control-full-2.0.json +++ b/tools/src/test/resources/2.0/valid-control-full-2.0.json @@ -4,20 +4,20 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1f8a6b2c-4e7d-4f0a-9c3b-8d5e2a7f6b41", "version": 1, - "components": [ - { - "type": "library", - "bom-ref": "component-authz-lib", - "name": "acme-authz", - "version": "3.2.1" - }, - { - "bom-ref": "service-payment-api", - "type": "service", - "name": "Acme Payment API" - } - ], "definitions": { + "components": [ + { + "type": "library", + "bom-ref": "component-authz-lib", + "name": "acme-authz", + "version": "3.2.1" + }, + { + "bom-ref": "service-payment-api", + "type": "service", + "name": "Acme Payment API" + } + ], "requirements": [ { "bom-ref": "requirement-access-enforcement", diff --git a/tools/src/test/resources/2.0/valid-cryptography-certificate-2.0.json b/tools/src/test/resources/2.0/valid-cryptography-certificate-2.0.json index 46bf40f8..f49749a3 100644 --- a/tools/src/test/resources/2.0/valid-cryptography-certificate-2.0.json +++ b/tools/src/test/resources/2.0/valid-cryptography-certificate-2.0.json @@ -5,271 +5,258 @@ "serialNumber": "urn:uuid:e8c355aa-2142-4084-a8c7-6d42c8610ba2", "version": 1, "metadata": { - "timestamp": "2024-01-09T12:00:00Z", - "component": { - "type": "application", - "name": "my application", - "version": "1.0" - } + "timestamp": "2024-01-09T12:00:00Z" }, - "components": [ + "inventories": [ { - "name": "google.com", - "type": "cryptographic-asset", - "bom-ref": "c9c7ac91-2115-45e8-ae13-7d0e1dec74be", - "cryptoProperties": { - "assetType": "certificate", - "certificateProperties": { - "serialNumber": "1234567890ABCDEF", - "subjectName": "CN = www.google.com", - "issuerName": "C = US, O = Google Trust Services LLC, CN = GTS CA 1C3", - "notValidBefore": "2016-11-21T08:00:00Z", - "notValidAfter": "2017-11-22T07:59:59Z", - "certificateFormat": "X.509", - "certificateFileExtension": "crt", - "fingerprint": { - "alg": "SHA-256", - "content": "1e15e0fbd3ce95bde5945633ae96add551341b11e5bae7bba12e98ad84a5beb4" - }, - "certificateState": [ - { - "state": "active", - "reason": "Certificate is currently valid and in use" - } - ], - "creationDate": "2016-11-21T07:30:00Z", - "activationDate": "2016-11-21T08:00:00Z", - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "6b00f384-6c39-420f-91eb-94de0f7be569" + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "my application", + "version": "1.0" + }, + "components": [ + { + "name": "google.com", + "type": "cryptographic-asset", + "bom-ref": "c9c7ac91-2115-45e8-ae13-7d0e1dec74be", + "cryptoProperties": { + "assetType": "certificate", + "certificateProperties": { + "serialNumber": "1234567890ABCDEF", + "subjectName": "CN = www.google.com", + "issuerName": "C = US, O = Google Trust Services LLC, CN = GTS CA 1C3", + "notValidBefore": "2016-11-21T08:00:00Z", + "notValidAfter": "2017-11-22T07:59:59Z", + "certificateFormat": "X.509", + "certificateFileExtension": "crt", + "fingerprint": { + "alg": "SHA-256", + "content": "1e15e0fbd3ce95bde5945633ae96add551341b11e5bae7bba12e98ad84a5beb4" + }, + "certificateState": [ + { + "state": "active", + "reason": "Certificate is currently valid and in use" + } + ], + "creationDate": "2016-11-21T07:30:00Z", + "activationDate": "2016-11-21T08:00:00Z", + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "6b00f384-6c39-420f-91eb-94de0f7be569" + }, + { + "type": "publicKey", + "ref": "ceb37320-8239-40e8-ab77-8798dbd98773" + } + ] }, - { - "type": "publicKey", - "ref": "ceb37320-8239-40e8-ab77-8798dbd98773" - } - ] - }, - "oid": "2.5.4.3" - } - }, - { - "name": "SHA512withRSA", - "type": "cryptographic-asset", - "bom-ref": "6b00f384-6c39-420f-91eb-94de0f7be569", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "signature", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "certificationLevel": [ - "none" - ], - "padding": "pkcs1v15", - "cryptoFunctions": [ - "sign", - "verify" - ] - }, - "oid": "1.2.840.113549.1.1.13" - } - }, - { - "name": "RSA-2048", - "type": "cryptographic-asset", - "bom-ref": "ceb37320-8239-40e8-ab77-8798dbd98773", - "cryptoProperties": { - "assetType": "related-crypto-material", - "relatedCryptoMaterialProperties": { - "type": "public-key", - "id": "2e9ef09e-dfac-4526-96b4-d02f31af1b22", - "state": "active", - "size": 2048, - "format": "PEM", - "value": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----", - "creationDate": "2016-11-21T08:00:00Z", - "activationDate": "2016-11-21T08:20:00Z", - "updateDate": "2016-11-21T08:00:00Z", - "expirationDate": "2017-11-22T07:59:59Z", - "securedBy": { - "mechanism": "None" - }, - "fingerprint": { - "alg": "SHA-256", - "content": "a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456" - }, - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "a154af0a-0dca-4ed5-b611-2405a3a6ae47" - } - ] - }, - "oid": "1.2.840.113549.1.1.1" - } - }, - { - "name": "RSA-2048", - "type": "cryptographic-asset", - "bom-ref": "a154af0a-0dca-4ed5-b611-2405a3a6ae47", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "pke", - "algorithmFamily": "RSAES-OAEP", - "parameterSetIdentifier": "2048", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "certificationLevel": [ - "none" - ], - "padding": "oaep", - "cryptoFunctions": [ - "encrypt", - "decrypt" - ] + "oid": "2.5.4.3" + } }, - "oid": "1.2.840.113549.1.1.1" - } - }, - { - "name": "TLS 1.3 Protocol", - "type": "cryptographic-asset", - "bom-ref": "a3553dc1-f376-43d1-89dc-87bb71981c0c", - "cryptoProperties": { - "assetType": "protocol", - "protocolProperties": { - "type": "tls", - "version": "1.3", - "cipherSuites": [ - { - "name": "TLS_AES_256_GCM_SHA384", - "algorithms": [ - "1977d71b-8981-4292-b40d-842a019c2229", - "422fa336-b401-42b7-89b8-8966aa30bca0" + { + "name": "SHA512withRSA", + "type": "cryptographic-asset", + "bom-ref": "6b00f384-6c39-420f-91eb-94de0f7be569", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "signature", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" ], - "identifiers": [ - "0x13,0x02" + "padding": "pkcs1v15", + "cryptoFunctions": [ + "sign", + "verify" ] }, - { - "name": "TLS_CHACHA20_POLY1305_SHA256", - "algorithms": [ - "1af4fc08-5d0d-436e-8058-eeef921983d0", - "6af3066b-ab66-4593-975f-d9ba2c623a89" + "oid": "1.2.840.113549.1.1.13" + } + }, + { + "name": "RSA-2048", + "type": "cryptographic-asset", + "bom-ref": "ceb37320-8239-40e8-ab77-8798dbd98773", + "cryptoProperties": { + "assetType": "related-crypto-material", + "relatedCryptoMaterialProperties": { + "type": "public-key", + "id": "2e9ef09e-dfac-4526-96b4-d02f31af1b22", + "state": "active", + "size": 2048, + "format": "PEM", + "value": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----", + "creationDate": "2016-11-21T08:00:00Z", + "activationDate": "2016-11-21T08:20:00Z", + "updateDate": "2016-11-21T08:00:00Z", + "expirationDate": "2017-11-22T07:59:59Z", + "securedBy": { + "mechanism": "None" + }, + "fingerprint": { + "alg": "SHA-256", + "content": "a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456" + }, + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "a154af0a-0dca-4ed5-b611-2405a3a6ae47" + } + ] + }, + "oid": "1.2.840.113549.1.1.1" + } + }, + { + "name": "RSA-2048", + "type": "cryptographic-asset", + "bom-ref": "a154af0a-0dca-4ed5-b611-2405a3a6ae47", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "pke", + "algorithmFamily": "RSAES-OAEP", + "parameterSetIdentifier": "2048", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" ], - "identifiers": [ - "0x13,0x03" + "padding": "oaep", + "cryptoFunctions": [ + "encrypt", + "decrypt" ] - } - ] + }, + "oid": "1.2.840.113549.1.1.1" + } }, - "oid": "1.3.6.1.5.5.7.3.1" - } - }, - { - "name": "AES-256-GCM", - "type": "cryptographic-asset", - "bom-ref": "1977d71b-8981-4292-b40d-842a019c2229", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "ae", - "algorithmFamily": "AES", - "parameterSetIdentifier": "256", - "mode": "gcm", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "certificationLevel": [ - "none" - ], - "cryptoFunctions": [ - "encrypt", - "decrypt" - ] + { + "name": "TLS 1.3 Protocol", + "type": "cryptographic-asset", + "bom-ref": "a3553dc1-f376-43d1-89dc-87bb71981c0c", + "cryptoProperties": { + "assetType": "protocol", + "protocolProperties": { + "type": "tls", + "version": "1.3", + "cipherSuites": [ + { + "name": "TLS_AES_256_GCM_SHA384", + "algorithms": [ + "1977d71b-8981-4292-b40d-842a019c2229", + "422fa336-b401-42b7-89b8-8966aa30bca0" + ], + "identifiers": [ + "0x13,0x02" + ] + }, + { + "name": "TLS_CHACHA20_POLY1305_SHA256", + "algorithms": [ + "1af4fc08-5d0d-436e-8058-eeef921983d0", + "6af3066b-ab66-4593-975f-d9ba2c623a89" + ], + "identifiers": [ + "0x13,0x03" + ] + } + ] + }, + "oid": "1.3.6.1.5.5.7.3.1" + } }, - "oid": "2.16.840.1.101.3.4.1.46" - } - }, - { - "name": "SHA-384", - "type": "cryptographic-asset", - "bom-ref": "422fa336-b401-42b7-89b8-8966aa30bca0", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "hash", - "algorithmFamily": "SHA-2", - "parameterSetIdentifier": "384", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "certificationLevel": [ - "none" - ], - "cryptoFunctions": [ - "digest" - ] + { + "name": "AES-256-GCM", + "type": "cryptographic-asset", + "bom-ref": "1977d71b-8981-4292-b40d-842a019c2229", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "ae", + "algorithmFamily": "AES", + "parameterSetIdentifier": "256", + "mode": "gcm", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" + ], + "cryptoFunctions": [ + "encrypt", + "decrypt" + ] + }, + "oid": "2.16.840.1.101.3.4.1.46" + } }, - "oid": "2.16.840.1.101.3.4.2.2" - } - }, - { - "name": "ChaCha20-Poly1305", - "type": "cryptographic-asset", - "bom-ref": "1af4fc08-5d0d-436e-8058-eeef921983d0", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "ae", - "algorithmFamily": "ChaCha20", - "parameterSetIdentifier": "256", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "certificationLevel": [ - "none" - ], - "cryptoFunctions": [ - "encrypt", - "decrypt" - ] + { + "name": "SHA-384", + "type": "cryptographic-asset", + "bom-ref": "422fa336-b401-42b7-89b8-8966aa30bca0", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "hash", + "algorithmFamily": "SHA-2", + "parameterSetIdentifier": "384", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" + ], + "cryptoFunctions": [ + "digest" + ] + }, + "oid": "2.16.840.1.101.3.4.2.2" + } }, - "oid": "1.2.840.113549.1.9.16.3.18" - } - }, - { - "name": "SHA-256", - "type": "cryptographic-asset", - "bom-ref": "6af3066b-ab66-4593-975f-d9ba2c623a89", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "hash", - "algorithmFamily": "SHA-2", - "parameterSetIdentifier": "256", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "certificationLevel": [ - "none" - ], - "cryptoFunctions": [ - "digest" - ] + { + "name": "ChaCha20-Poly1305", + "type": "cryptographic-asset", + "bom-ref": "1af4fc08-5d0d-436e-8058-eeef921983d0", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "ae", + "algorithmFamily": "ChaCha20", + "parameterSetIdentifier": "256", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" + ], + "cryptoFunctions": [ + "encrypt", + "decrypt" + ] + }, + "oid": "1.2.840.113549.1.9.16.3.18" + } }, - "oid": "2.16.840.1.101.3.4.2.1" - } + { + "name": "SHA-256", + "type": "cryptographic-asset", + "bom-ref": "6af3066b-ab66-4593-975f-d9ba2c623a89", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "hash", + "algorithmFamily": "SHA-2", + "parameterSetIdentifier": "256", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" + ], + "cryptoFunctions": [ + "digest" + ] + }, + "oid": "2.16.840.1.101.3.4.2.1" + } + } + ] } ] } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-cryptography-certificate-advanced-2.0.json b/tools/src/test/resources/2.0/valid-cryptography-certificate-advanced-2.0.json index 1c7ab224..2f3103d8 100644 --- a/tools/src/test/resources/2.0/valid-cryptography-certificate-advanced-2.0.json +++ b/tools/src/test/resources/2.0/valid-cryptography-certificate-advanced-2.0.json @@ -4,313 +4,325 @@ "serialNumber": "urn:uuid:f47ac10b-58cc-4372-a567-0e02b2c3d479", "version": 1, "metadata": { - "timestamp": "2024-01-15T14:30:00Z", - "component": { - "type": "application", - "name": "enterprise-security-app", - "version": "2.1.0" - } + "timestamp": "2024-01-15T14:30:00Z" + }, + "definitions": { + "certifications": [ + { "bom-ref": "cert-fips140-3-l1", "standard": "FIPS 140-3", "level": "Level 1" } + ] }, - "components": [ + "inventories": [ { - "name": "revoked-internal-ca.example.com", - "type": "cryptographic-asset", - "bom-ref": "840ADC47-55CD-44C6-A306-B37A9149B066", - "cryptoProperties": { - "assetType": "certificate", - "certificateProperties": { - "serialNumber": "ABCDEF1234567890FEDCBA", - "subjectName": "CN = internal-ca.example.com, OU = IT Security, O = Example Corp, C = US", - "issuerName": "CN = Example Root CA, O = Example Corp, C = US", - "notValidBefore": "2023-01-01T00:00:00Z", - "notValidAfter": "2025-12-31T23:59:59Z", - "certificateFormat": "X.509", - "certificateFileExtension": "pem", - "fingerprint": { - "alg": "SHA-256", - "content": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" - }, - "certificateState": [ - { - "state": "revoked", - "reason": "Certificate was compromised due to private key exposure in security incident #2024-001" - } - ], - "creationDate": "2022-12-15T10:00:00Z", - "activationDate": "2023-01-01T00:00:00Z", - "revocationDate": "2024-01-10T15:45:30Z", - "certificateExtensions": [ - { - "commonExtensionName": "basicConstraints", - "commonExtensionValue": "CA:TRUE, pathlen:2" - }, - { - "commonExtensionName": "keyUsage", - "commonExtensionValue": "Certificate Sign, CRL Sign, Digital Signature" - }, - { - "commonExtensionName": "extendedKeyUsage", - "commonExtensionValue": "TLS Web Server Authentication, TLS Web Client Authentication" - }, - { - "commonExtensionName": "subjectAlternativeName", - "commonExtensionValue": "DNS:internal-ca.example.com, DNS:ca.internal.example.com, IP:192.168.1.100" - }, - { - "commonExtensionName": "authorityKeyIdentifier", - "commonExtensionValue": "keyid:01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10:11:12:13:14" - }, - { - "commonExtensionName": "subjectKeyIdentifier", - "commonExtensionValue": "A1:B2:C3:D4:E5:F6:07:08:09:0A:0B:0C:0D:0E:0F:10:11:12:13:14" - }, - { - "commonExtensionName": "crlDistributionPoints", - "commonExtensionValue": "URI:http://crl.example.com/root-ca.crl" - }, - { - "commonExtensionName": "authorityInformationAccess", - "commonExtensionValue": "OCSP - URI:http://ocsp.example.com, CA Issuers - URI:http://certs.example.com/root-ca.crt" + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "enterprise-security-app", + "version": "2.1.0" + }, + "components": [ + { + "name": "revoked-internal-ca.example.com", + "type": "cryptographic-asset", + "bom-ref": "840ADC47-55CD-44C6-A306-B37A9149B066", + "cryptoProperties": { + "assetType": "certificate", + "certificateProperties": { + "serialNumber": "ABCDEF1234567890FEDCBA", + "subjectName": "CN = internal-ca.example.com, OU = IT Security, O = Example Corp, C = US", + "issuerName": "CN = Example Root CA, O = Example Corp, C = US", + "notValidBefore": "2023-01-01T00:00:00Z", + "notValidAfter": "2025-12-31T23:59:59Z", + "certificateFormat": "X.509", + "certificateFileExtension": "pem", + "fingerprint": { + "alg": "SHA-256", + "content": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + }, + "certificateState": [ + { + "state": "revoked", + "reason": "Certificate was compromised due to private key exposure in security incident #2024-001" + } + ], + "creationDate": "2022-12-15T10:00:00Z", + "activationDate": "2023-01-01T00:00:00Z", + "revocationDate": "2024-01-10T15:45:30Z", + "certificateExtensions": [ + { + "commonExtensionName": "basicConstraints", + "commonExtensionValue": "CA:TRUE, pathlen:2" + }, + { + "commonExtensionName": "keyUsage", + "commonExtensionValue": "Certificate Sign, CRL Sign, Digital Signature" + }, + { + "commonExtensionName": "extendedKeyUsage", + "commonExtensionValue": "TLS Web Server Authentication, TLS Web Client Authentication" + }, + { + "commonExtensionName": "subjectAlternativeName", + "commonExtensionValue": "DNS:internal-ca.example.com, DNS:ca.internal.example.com, IP:192.168.1.100" + }, + { + "commonExtensionName": "authorityKeyIdentifier", + "commonExtensionValue": "keyid:01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10:11:12:13:14" + }, + { + "commonExtensionName": "subjectKeyIdentifier", + "commonExtensionValue": "A1:B2:C3:D4:E5:F6:07:08:09:0A:0B:0C:0D:0E:0F:10:11:12:13:14" + }, + { + "commonExtensionName": "crlDistributionPoints", + "commonExtensionValue": "URI:http://crl.example.com/root-ca.crl" + }, + { + "commonExtensionName": "authorityInformationAccess", + "commonExtensionValue": "OCSP - URI:http://ocsp.example.com, CA Issuers - URI:http://certs.example.com/root-ca.crt" + }, + { + "commonExtensionName": "certificatePolicies", + "commonExtensionValue": "Policy: 1.2.3.4.5.6.7.8.1, CPS: http://www.example.com/cps" + }, + { + "customExtensionName": "organizationalSecurityLevel", + "customExtensionValue": "HIGH" + }, + { + "customExtensionName": "incidentTrackingId", + "customExtensionValue": "SEC-2024-001" + }, + { + "customExtensionName": "complianceFramework", + "customExtensionValue": "SOX, PCI-DSS Level 1, ISO 27001" + } + ], + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "2A0DA4D2-BBCA-4515-9BCD-C870A3EA4CE8" + }, + { + "type": "publicKey", + "ref": "ACCAF8BC-5F73-4869-A3FE-1C64E8D96408" + } + ] }, - { - "commonExtensionName": "certificatePolicies", - "commonExtensionValue": "Policy: 1.2.3.4.5.6.7.8.1, CPS: http://www.example.com/cps" - }, - { - "customExtensionName": "organizationalSecurityLevel", - "customExtensionValue": "HIGH" - }, - { - "customExtensionName": "incidentTrackingId", - "customExtensionValue": "SEC-2024-001" - }, - { - "customExtensionName": "complianceFramework", - "customExtensionValue": "SOX, PCI-DSS Level 1, ISO 27001" - } - ], - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "2A0DA4D2-BBCA-4515-9BCD-C870A3EA4CE8" - }, - { - "type": "publicKey", - "ref": "ACCAF8BC-5F73-4869-A3FE-1C64E8D96408" - } - ] + "oid": "2.5.4.3" + } }, - "oid": "2.5.4.3" - } - }, - { - "name": "active-server.example.com", - "type": "cryptographic-asset", - "bom-ref": "4497B977-4D07-4245-9457-C2CF37FF399A", - "cryptoProperties": { - "assetType": "certificate", - "certificateProperties": { - "serialNumber": "1122334455667788AABBCCDD", - "subjectName": "CN = server.example.com, OU = Web Services, O = Example Corp, C = US", - "issuerName": "CN = Example Intermediate CA, O = Example Corp, C = US", - "notValidBefore": "2024-01-01T00:00:00Z", - "notValidAfter": "2025-01-01T23:59:59Z", - "certificateFormat": "X.509", - "certificateFileExtension": "crt", - "fingerprint": { - "alg": "SHA-256", - "content": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" - }, - "certificateState": [ - { - "name": "monitored", - "description": "Certificate is under enhanced monitoring due to recent security incidents", - "reason": "Proactive monitoring following organizational security policy updates" - } - ], - "creationDate": "2023-12-20T09:00:00Z", - "activationDate": "2024-01-01T00:00:00Z", - "certificateExtensions": [ - { - "commonExtensionName": "keyUsage", - "commonExtensionValue": "Digital Signature, Key Encipherment" - }, - { - "commonExtensionName": "extendedKeyUsage", - "commonExtensionValue": "TLS Web Server Authentication" - }, - { - "commonExtensionName": "subjectAlternativeName", - "commonExtensionValue": "DNS:server.example.com, DNS:www.server.example.com, DNS:api.server.example.com" + { + "name": "active-server.example.com", + "type": "cryptographic-asset", + "bom-ref": "4497B977-4D07-4245-9457-C2CF37FF399A", + "cryptoProperties": { + "assetType": "certificate", + "certificateProperties": { + "serialNumber": "1122334455667788AABBCCDD", + "subjectName": "CN = server.example.com, OU = Web Services, O = Example Corp, C = US", + "issuerName": "CN = Example Intermediate CA, O = Example Corp, C = US", + "notValidBefore": "2024-01-01T00:00:00Z", + "notValidAfter": "2025-01-01T23:59:59Z", + "certificateFormat": "X.509", + "certificateFileExtension": "crt", + "fingerprint": { + "alg": "SHA-256", + "content": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + }, + "certificateState": [ + { + "name": "monitored", + "description": "Certificate is under enhanced monitoring due to recent security incidents", + "reason": "Proactive monitoring following organizational security policy updates" + } + ], + "creationDate": "2023-12-20T09:00:00Z", + "activationDate": "2024-01-01T00:00:00Z", + "certificateExtensions": [ + { + "commonExtensionName": "keyUsage", + "commonExtensionValue": "Digital Signature, Key Encipherment" + }, + { + "commonExtensionName": "extendedKeyUsage", + "commonExtensionValue": "TLS Web Server Authentication" + }, + { + "commonExtensionName": "subjectAlternativeName", + "commonExtensionValue": "DNS:server.example.com, DNS:www.server.example.com, DNS:api.server.example.com" + }, + { + "commonExtensionName": "signedCertificateTimestamp", + "commonExtensionValue": "Log ID: ABCD1234..., Timestamp: 2024-01-01T00:00:00Z, Signature: 3045022100..." + }, + { + "customExtensionName": "deploymentEnvironment", + "customExtensionValue": "PRODUCTION" + }, + { + "customExtensionName": "businessCriticality", + "customExtensionValue": "CRITICAL" + }, + { + "customExtensionName": "autoRenewalEnabled", + "customExtensionValue": "true" + } + ], + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "14478B86-9306-45B5-BA2A-1660B723244C" + }, + { + "type": "publicKey", + "ref": "F1F3D902-0A1B-4C0C-9F6A-F36E041B0B7D" + } + ] }, - { - "commonExtensionName": "signedCertificateTimestamp", - "commonExtensionValue": "Log ID: ABCD1234..., Timestamp: 2024-01-01T00:00:00Z, Signature: 3045022100..." - }, - { - "customExtensionName": "deploymentEnvironment", - "customExtensionValue": "PRODUCTION" - }, - { - "customExtensionName": "businessCriticality", - "customExtensionValue": "CRITICAL" - }, - { - "customExtensionName": "autoRenewalEnabled", - "customExtensionValue": "true" - } - ], - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "14478B86-9306-45B5-BA2A-1660B723244C" - }, - { - "type": "publicKey", - "ref": "F1F3D902-0A1B-4C0C-9F6A-F36E041B0B7D" - } - ] + "oid": "2.5.4.3" + } }, - "oid": "2.5.4.3" - } - }, - { - "name": "RSA-SHA256", - "type": "cryptographic-asset", - "bom-ref": "2A0DA4D2-BBCA-4515-9BCD-C870A3EA4CE8", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "signature", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "padding": "pkcs1v15", - "cryptoFunctions": [ - "sign", - "verify" - ] - }, - "oid": "1.2.840.113549.1.1.11" - } - }, - { - "name": "ECDSA-P256", - "type": "cryptographic-asset", - "bom-ref": "14478B86-9306-45B5-BA2A-1660B723244C", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "signature", - "ellipticCurve": "secg/secp256r1", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ - "x86_64" - ], - "certificationLevel": ["fips140-3-l1"], - "cryptoFunctions": [ - "sign", - "verify" - ] + { + "name": "RSA-SHA256", + "type": "cryptographic-asset", + "bom-ref": "2A0DA4D2-BBCA-4515-9BCD-C870A3EA4CE8", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "signature", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" + ], + "padding": "pkcs1v15", + "cryptoFunctions": [ + "sign", + "verify" + ] + }, + "oid": "1.2.840.113549.1.1.11" + } }, - "oid": "1.2.840.10045.4.3.2" - } - }, - { - "name": "AES-256-GCM", - "type": "cryptographic-asset", - "bom-ref": "aes-256-gcm-ref", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "ae", - "algorithmFamily": "AES", - "parameterSetIdentifier": "256", - "mode": "gcm", - "executionEnvironment": "hardware", - "implementationPlatform": [ - "x86_64" + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } ], - "cryptoFunctions": [ - "encrypt", - "decrypt" - ] + "name": "ECDSA-P256", + "type": "cryptographic-asset", + "bom-ref": "14478B86-9306-45B5-BA2A-1660B723244C", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "signature", + "ellipticCurve": "secg/secp256r1", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ + "x86_64" + ], + "cryptoFunctions": [ + "sign", + "verify" + ] + }, + "oid": "1.2.840.10045.4.3.2" + } }, - "oid": "2.16.840.1.101.3.4.1.46" - } - }, - { - "name": "RSA-4096-Revoked-CA-Key", - "type": "cryptographic-asset", - "bom-ref": "ACCAF8BC-5F73-4869-A3FE-1C64E8D96408", - "cryptoProperties": { - "assetType": "related-crypto-material", - "relatedCryptoMaterialProperties": { - "type": "public-key", - "id": "revoked-ca-key-2024", - "state": "compromised", - "size": 4096, - "format": "PEM", - "value": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA...\n-----END PUBLIC KEY-----", - "creationDate": "2022-12-15T10:00:00Z", - "activationDate": "2023-01-01T00:00:00Z", - "updateDate": "2024-01-10T15:45:30Z", - "securedBy": { - "mechanism": "HSM", - "algorithmRef": [ - "aes-256-gcm-ref" - ] - }, - "fingerprint": { - "alg": "SHA-256", - "content": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" - }, - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "2A0DA4D2-BBCA-4515-9BCD-C870A3EA4CE8" - } - ] + { + "name": "AES-256-GCM", + "type": "cryptographic-asset", + "bom-ref": "aes-256-gcm-ref", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "ae", + "algorithmFamily": "AES", + "parameterSetIdentifier": "256", + "mode": "gcm", + "executionEnvironment": "hardware", + "implementationPlatform": [ + "x86_64" + ], + "cryptoFunctions": [ + "encrypt", + "decrypt" + ] + }, + "oid": "2.16.840.1.101.3.4.1.46" + } }, - "oid": "1.2.840.113549.1.1.1" - } - }, - { - "name": "ECDSA-P256-Server-Key", - "type": "cryptographic-asset", - "bom-ref": "F1F3D902-0A1B-4C0C-9F6A-F36E041B0B7D", - "cryptoProperties": { - "assetType": "related-crypto-material", - "relatedCryptoMaterialProperties": { - "type": "public-key", - "id": "server-key-2024", - "state": "active", - "size": 256, - "format": "PEM", - "value": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...\n-----END PUBLIC KEY-----", - "creationDate": "2023-12-20T09:00:00Z", - "activationDate": "2024-01-01T00:00:00Z", - "expirationDate": "2025-01-01T23:59:59Z", - "securedBy": { - "mechanism": "HSM", - "algorithmRef": [ - "aes-256-gcm-ref" - ] - }, - "fingerprint": { - "alg": "SHA-256", - "content": "d4e5f67890123456789abcdef0123456789abcdef0123456789abcdef0123456" - }, - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "14478B86-9306-45B5-BA2A-1660B723244C" - } - ] + { + "name": "RSA-4096-Revoked-CA-Key", + "type": "cryptographic-asset", + "bom-ref": "ACCAF8BC-5F73-4869-A3FE-1C64E8D96408", + "cryptoProperties": { + "assetType": "related-crypto-material", + "relatedCryptoMaterialProperties": { + "type": "public-key", + "id": "revoked-ca-key-2024", + "state": "compromised", + "size": 4096, + "format": "PEM", + "value": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA...\n-----END PUBLIC KEY-----", + "creationDate": "2022-12-15T10:00:00Z", + "activationDate": "2023-01-01T00:00:00Z", + "updateDate": "2024-01-10T15:45:30Z", + "securedBy": { + "mechanism": "HSM", + "algorithmRef": [ + "aes-256-gcm-ref" + ] + }, + "fingerprint": { + "alg": "SHA-256", + "content": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + }, + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "2A0DA4D2-BBCA-4515-9BCD-C870A3EA4CE8" + } + ] + }, + "oid": "1.2.840.113549.1.1.1" + } }, - "oid": "1.2.840.10045.2.1" - } + { + "name": "ECDSA-P256-Server-Key", + "type": "cryptographic-asset", + "bom-ref": "F1F3D902-0A1B-4C0C-9F6A-F36E041B0B7D", + "cryptoProperties": { + "assetType": "related-crypto-material", + "relatedCryptoMaterialProperties": { + "type": "public-key", + "id": "server-key-2024", + "state": "active", + "size": 256, + "format": "PEM", + "value": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...\n-----END PUBLIC KEY-----", + "creationDate": "2023-12-20T09:00:00Z", + "activationDate": "2024-01-01T00:00:00Z", + "expirationDate": "2025-01-01T23:59:59Z", + "securedBy": { + "mechanism": "HSM", + "algorithmRef": [ + "aes-256-gcm-ref" + ] + }, + "fingerprint": { + "alg": "SHA-256", + "content": "d4e5f67890123456789abcdef0123456789abcdef0123456789abcdef0123456" + }, + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "14478B86-9306-45B5-BA2A-1660B723244C" + } + ] + }, + "oid": "1.2.840.10045.2.1" + } + } + ] } ] } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-cryptography-full-2.0.json b/tools/src/test/resources/2.0/valid-cryptography-full-2.0.json index 66a96853..a8c420e8 100644 --- a/tools/src/test/resources/2.0/valid-cryptography-full-2.0.json +++ b/tools/src/test/resources/2.0/valid-cryptography-full-2.0.json @@ -4,423 +4,446 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-ecdh-brainpool160r1", - "name": "ECDH-brainpoolP160r1", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "key-agree", - "algorithmFamily": "ECDH", - "parameterSetIdentifier": "160", - "ellipticCurve": "brainpool/brainpoolP160r1", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l4"], - "cryptoFunctions": [ - "keygen", - "keyderive" - ], - "classicalSecurityLevel": 80, - "nistQuantumSecurityLevel": 0 - }, - "oid": "1.3.36.3.3.2.8.1.1.1" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-rsa-sha256", - "name": "RSA-PKCS1-1.5-SHA-256-2048", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "signature", - "algorithmFamily": "RSASSA-PKCS1", - "parameterSetIdentifier": "2048", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "padding": "pkcs1v15", - "cryptoFunctions": ["sign", "verify"], - "nistQuantumSecurityLevel": 0 - }, - "oid": "1.2.840.113549.1.1.11" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-aes-256-gcm", - "name": "AES-256-GCM", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "ae", - "algorithmFamily": "AES", - "parameterSetIdentifier": "256", - "mode": "gcm", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "cryptoFunctions": ["keygen", "encrypt", "decrypt", "tag"], - "classicalSecurityLevel": 256, - "nistQuantumSecurityLevel": 1 - }, - "oid": "2.16.840.1.101.3.4.1.46" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-sha256", - "name": "SHA-256", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "hash", - "algorithmFamily": "SHA-2", - "parameterSetIdentifier": "256", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "cryptoFunctions": ["digest"] - }, - "oid": "2.16.840.1.101.3.4.2.1" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-sha384", - "name": "SHA-384", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "hash", - "algorithmFamily": "SHA-2", - "parameterSetIdentifier": "384", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "cryptoFunctions": ["digest"] - }, - "oid": "2.16.840.1.101.3.4.2.2" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-aes-128-gcm", - "name": "AES-128-GCM", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "ae", - "algorithmFamily": "AES", - "parameterSetIdentifier": "128", - "mode": "gcm", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "cryptoFunctions": ["keygen", "encrypt", "decrypt", "tag"], - "classicalSecurityLevel": 128, - "nistQuantumSecurityLevel": 1 - }, - "oid": "2.16.840.1.101.3.4.1.6" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-chacha20-poly1305", - "name": "ChaCha20-Poly1305", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "ae", - "algorithmFamily": "ChaCha20", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["none"], - "cryptoFunctions": ["keygen", "encrypt", "decrypt", "tag"], - "classicalSecurityLevel": 256, - "nistQuantumSecurityLevel": 1 - }, - "oid": "1.2.840.113549.1.9.16.3.18" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-ffdh-group14", - "name": "FFDH Group 14", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "key-agree", - "algorithmFamily": "FFDH", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "cryptoFunctions": ["keygen", "keyderive"] - }, - "oid": "1.2.840.10046.2.1" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-ecdsa-p256", - "name": "ECDSA-P256", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "signature", - "algorithmFamily": "ECDSA", - "ellipticCurve": "secg/secp256r1", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "cryptoFunctions": ["sign", "verify"] - }, - "oid": "1.2.840.10045.4.3.2" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "algorithm-rsaes-oaep-4096", - "name": "RSAES-OAEP-4096", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "pke", - "algorithmFamily": "RSAES-OAEP", - "parameterSetIdentifier": "4096", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["fips140-3-l1"], - "padding": "oaep", - "cryptoFunctions": ["keygen", "encrypt", "decrypt"] - }, - "oid": "1.2.840.113549.1.1.7" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "key-rsa-4096-public", - "name": "Acme Corp RSA-4096 Public Key", - "cryptoProperties": { - "assetType": "related-crypto-material", - "relatedCryptoMaterialProperties": { - "type": "public-key", - "id": "key-12345-67890", - "state": "active", - "creationDate": "2024-01-01T00:00:00.000Z", - "activationDate": "2024-01-02T00:00:00.000Z", - "updateDate": "2024-01-03T00:00:00.000Z", - "expirationDate": "2026-01-01T00:00:00.000Z", - "value": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA...\n-----END PUBLIC KEY-----", - "size": 4096, - "format": "PEM", - "securedBy": { - "mechanism": "HSM", - "algorithmRef": [ "algorithm-aes-256-gcm" ] + "definitions": { + "certifications": [ + { "bom-ref": "cert-fips140-3-l4", "standard": "FIPS 140-3", "level": "Level 4" }, + { "bom-ref": "cert-fips140-3-l1", "standard": "FIPS 140-3", "level": "Level 1" } + ], + "components": [ + { + "certifications": [ + { "ref": "cert-fips140-3-l4" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-ecdh-brainpool160r1", + "name": "ECDH-brainpoolP160r1", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "key-agree", + "algorithmFamily": "ECDH", + "parameterSetIdentifier": "160", + "ellipticCurve": "brainpool/brainpoolP160r1", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": [ + "keygen", + "keyderive" + ], + "classicalSecurityLevel": 80, + "nistQuantumSecurityLevel": 0 }, - "fingerprint": { - "alg": "SHA-256", - "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + "oid": "1.3.36.3.3.2.8.1.1.1" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-rsa-sha256", + "name": "RSA-PKCS1-1.5-SHA-256-2048", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "signature", + "algorithmFamily": "RSASSA-PKCS1", + "parameterSetIdentifier": "2048", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "padding": "pkcs1v15", + "cryptoFunctions": ["sign", "verify"], + "nistQuantumSecurityLevel": 0 }, - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "algorithm-rsaes-oaep-4096" - } - ] - }, - "oid": "1.2.840.113549.1.1.1" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "certificate-example-com", - "name": "Acme Corp TLS Certificate", - "cryptoProperties": { - "assetType": "certificate", - "certificateProperties": { - "serialNumber": "0B:35:82:6D:F5:7A:02:0A:0A:21:8F:BD:F3:91:43:C3", - "subjectName": "CN=www.example.com, O=Acme Corp, C=US", - "issuerName": "CN=Acme CA, O=Acme Trust Services, C=US", - "notValidBefore": "2024-01-01T00:00:00.000Z", - "notValidAfter": "2026-01-01T00:00:00.000Z", - "certificateFormat": "X.509", - "certificateFileExtension": "crt", - "fingerprint": { - "alg": "SHA-256", - "content": "3942447fac867ae5cdb3229b658f4d48152a8b6c9e4d3f2a1b0c9d8e7f6a5b4c" + "oid": "1.2.840.113549.1.1.11" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-aes-256-gcm", + "name": "AES-256-GCM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "ae", + "algorithmFamily": "AES", + "parameterSetIdentifier": "256", + "mode": "gcm", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": ["keygen", "encrypt", "decrypt", "tag"], + "classicalSecurityLevel": 256, + "nistQuantumSecurityLevel": 1 }, - "certificateState": [ - { - "state": "active", - "reason": "Certificate in active use for TLS connections" - } - ], - "creationDate": "2024-01-01T00:00:00.000Z", - "activationDate": "2024-01-02T00:00:00.000Z", - "certificateExtensions": [ - { - "commonExtensionName": "basicConstraints", - "commonExtensionValue": "CA:FALSE, pathlen:0" - }, - { - "commonExtensionName": "keyUsage", - "commonExtensionValue": "digitalSignature, keyEncipherment" - }, - { - "commonExtensionName": "extendedKeyUsage", - "commonExtensionValue": "serverAuth, clientAuth" - }, - { - "commonExtensionName": "subjectAlternativeName", - "commonExtensionValue": "DNS:example.com, DNS:www.example.com" - }, - { - "commonExtensionName": "authorityKeyIdentifier", - "commonExtensionValue": "keyid:12:34:56:78:90:AB:CD:EF" - }, - { - "commonExtensionName": "subjectKeyIdentifier", - "commonExtensionValue": "AA:BB:CC:DD:EE:FF:00:11" - }, - { - "commonExtensionName": "authorityInformationAccess", - "commonExtensionValue": "OCSP - URI:http://ocsp.example.com" - }, - { - "commonExtensionName": "certificatePolicies", - "commonExtensionValue": "Policy: 2.23.140.1.2.1" - }, - { - "commonExtensionName": "crlDistributionPoints", - "commonExtensionValue": "URI:http://crl.example.com/root.crl" - }, - { - "commonExtensionName": "signedCertificateTimestamp", - "commonExtensionValue": "Signed by Acme CT log at 2024-01-01T00:00:00Z" - }, - { - "customExtensionName": "internalDepartment", - "customExtensionValue": "Engineering" - } - ], - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "algorithm-rsa-sha256" + "oid": "2.16.840.1.101.3.4.1.46" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-sha256", + "name": "SHA-256", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "hash", + "algorithmFamily": "SHA-2", + "parameterSetIdentifier": "256", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": ["digest"] + }, + "oid": "2.16.840.1.101.3.4.2.1" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-sha384", + "name": "SHA-384", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "hash", + "algorithmFamily": "SHA-2", + "parameterSetIdentifier": "384", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": ["digest"] + }, + "oid": "2.16.840.1.101.3.4.2.2" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-aes-128-gcm", + "name": "AES-128-GCM", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "ae", + "algorithmFamily": "AES", + "parameterSetIdentifier": "128", + "mode": "gcm", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": ["keygen", "encrypt", "decrypt", "tag"], + "classicalSecurityLevel": 128, + "nistQuantumSecurityLevel": 1 + }, + "oid": "2.16.840.1.101.3.4.1.6" + } + }, + { + "type": "cryptographic-asset", + "bom-ref": "algorithm-chacha20-poly1305", + "name": "ChaCha20-Poly1305", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "ae", + "algorithmFamily": "ChaCha20", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": ["keygen", "encrypt", "decrypt", "tag"], + "classicalSecurityLevel": 256, + "nistQuantumSecurityLevel": 1 + }, + "oid": "1.2.840.113549.1.9.16.3.18" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-ffdh-group14", + "name": "FFDH Group 14", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "key-agree", + "algorithmFamily": "FFDH", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": ["keygen", "keyderive"] + }, + "oid": "1.2.840.10046.2.1" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-ecdsa-p256", + "name": "ECDSA-P256", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "signature", + "algorithmFamily": "ECDSA", + "ellipticCurve": "secg/secp256r1", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": ["sign", "verify"] + }, + "oid": "1.2.840.10045.4.3.2" + } + }, + { + "certifications": [ + { "ref": "cert-fips140-3-l1" } + ], + "type": "cryptographic-asset", + "bom-ref": "algorithm-rsaes-oaep-4096", + "name": "RSAES-OAEP-4096", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "pke", + "algorithmFamily": "RSAES-OAEP", + "parameterSetIdentifier": "4096", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "padding": "oaep", + "cryptoFunctions": ["keygen", "encrypt", "decrypt"] + }, + "oid": "1.2.840.113549.1.1.7" + } + }, + { + "type": "cryptographic-asset", + "bom-ref": "key-rsa-4096-public", + "name": "Acme Corp RSA-4096 Public Key", + "cryptoProperties": { + "assetType": "related-crypto-material", + "relatedCryptoMaterialProperties": { + "type": "public-key", + "id": "key-12345-67890", + "state": "active", + "creationDate": "2024-01-01T00:00:00.000Z", + "activationDate": "2024-01-02T00:00:00.000Z", + "updateDate": "2024-01-03T00:00:00.000Z", + "expirationDate": "2026-01-01T00:00:00.000Z", + "value": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA...\n-----END PUBLIC KEY-----", + "size": 4096, + "format": "PEM", + "securedBy": { + "mechanism": "HSM", + "algorithmRef": [ "algorithm-aes-256-gcm" ] }, - { - "type": "publicKey", - "ref": "key-rsa-4096-public" - } - ] - }, - "oid": "2.5.4.3" - } - }, - { - "type": "cryptographic-asset", - "bom-ref": "protocol-tls-1-3", - "name": "TLS 1.3 Configuration", - "cryptoProperties": { - "assetType": "protocol", - "protocolProperties": { - "type": "tls", - "version": "1.3", - "cipherSuites": [ - { - "name": "TLS_AES_128_GCM_SHA256", - "algorithms": [ - "algorithm-aes-128-gcm", - "algorithm-sha256" - ], - "identifiers": [ - "0x13,0x01" - ] + "fingerprint": { + "alg": "SHA-256", + "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, - { - "name": "TLS_AES_256_GCM_SHA384", - "algorithms": [ - "algorithm-aes-256-gcm", - "algorithm-sha384" - ], - "identifiers": [ - "0x13,0x02" - ] + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "algorithm-rsaes-oaep-4096" + } + ] + }, + "oid": "1.2.840.113549.1.1.1" + } + }, + { + "type": "cryptographic-asset", + "bom-ref": "certificate-example-com", + "name": "Acme Corp TLS Certificate", + "cryptoProperties": { + "assetType": "certificate", + "certificateProperties": { + "serialNumber": "0B:35:82:6D:F5:7A:02:0A:0A:21:8F:BD:F3:91:43:C3", + "subjectName": "CN=www.example.com, O=Acme Corp, C=US", + "issuerName": "CN=Acme CA, O=Acme Trust Services, C=US", + "notValidBefore": "2024-01-01T00:00:00.000Z", + "notValidAfter": "2026-01-01T00:00:00.000Z", + "certificateFormat": "X.509", + "certificateFileExtension": "crt", + "fingerprint": { + "alg": "SHA-256", + "content": "3942447fac867ae5cdb3229b658f4d48152a8b6c9e4d3f2a1b0c9d8e7f6a5b4c" }, - { - "name": "TLS_CHACHA20_POLY1305_SHA256", - "algorithms": [ - "algorithm-chacha20-poly1305", - "algorithm-sha256" - ], - "identifiers": [ - "0x13,0x03" - ] - } - ], - "ikev2TransformTypes": { - "encr": [ + "certificateState": [ { - "name": "ENCR_AES_GCM_16", - "keyLength": 128, - "algorithm": "algorithm-aes-128-gcm" + "state": "active", + "reason": "Certificate in active use for TLS connections" } ], - "prf": [ + "creationDate": "2024-01-01T00:00:00.000Z", + "activationDate": "2024-01-02T00:00:00.000Z", + "certificateExtensions": [ + { + "commonExtensionName": "basicConstraints", + "commonExtensionValue": "CA:FALSE, pathlen:0" + }, + { + "commonExtensionName": "keyUsage", + "commonExtensionValue": "digitalSignature, keyEncipherment" + }, + { + "commonExtensionName": "extendedKeyUsage", + "commonExtensionValue": "serverAuth, clientAuth" + }, + { + "commonExtensionName": "subjectAlternativeName", + "commonExtensionValue": "DNS:example.com, DNS:www.example.com" + }, { - "name": "PRF_HMAC_SHA2_256", - "algorithm": "algorithm-sha256" + "commonExtensionName": "authorityKeyIdentifier", + "commonExtensionValue": "keyid:12:34:56:78:90:AB:CD:EF" + }, + { + "commonExtensionName": "subjectKeyIdentifier", + "commonExtensionValue": "AA:BB:CC:DD:EE:FF:00:11" + }, + { + "commonExtensionName": "authorityInformationAccess", + "commonExtensionValue": "OCSP - URI:http://ocsp.example.com" + }, + { + "commonExtensionName": "certificatePolicies", + "commonExtensionValue": "Policy: 2.23.140.1.2.1" + }, + { + "commonExtensionName": "crlDistributionPoints", + "commonExtensionValue": "URI:http://crl.example.com/root.crl" + }, + { + "commonExtensionName": "signedCertificateTimestamp", + "commonExtensionValue": "Signed by Acme CT log at 2024-01-01T00:00:00Z" + }, + { + "customExtensionName": "internalDepartment", + "customExtensionValue": "Engineering" } ], - "integ": [ + "relatedCryptographicAssets": [ + { + "type": "algorithm", + "ref": "algorithm-rsa-sha256" + }, { - "name": "AUTH_HMAC_SHA2_256_128", - "algorithm": "algorithm-sha256" + "type": "publicKey", + "ref": "key-rsa-4096-public" } - ], - "ke": [ + ] + }, + "oid": "2.5.4.3" + } + }, + { + "type": "cryptographic-asset", + "bom-ref": "protocol-tls-1-3", + "name": "TLS 1.3 Configuration", + "cryptoProperties": { + "assetType": "protocol", + "protocolProperties": { + "type": "tls", + "version": "1.3", + "cipherSuites": [ + { + "name": "TLS_AES_128_GCM_SHA256", + "algorithms": [ + "algorithm-aes-128-gcm", + "algorithm-sha256" + ], + "identifiers": [ + "0x13,0x01" + ] + }, + { + "name": "TLS_AES_256_GCM_SHA384", + "algorithms": [ + "algorithm-aes-256-gcm", + "algorithm-sha384" + ], + "identifiers": [ + "0x13,0x02" + ] + }, { - "group": 14, - "algorithm": "algorithm-ffdh-group14" + "name": "TLS_CHACHA20_POLY1305_SHA256", + "algorithms": [ + "algorithm-chacha20-poly1305", + "algorithm-sha256" + ], + "identifiers": [ + "0x13,0x03" + ] } ], - "esn": true, - "auth": [ + "ikev2TransformTypes": { + "encr": [ + { + "name": "ENCR_AES_GCM_16", + "keyLength": 128, + "algorithm": "algorithm-aes-128-gcm" + } + ], + "prf": [ + { + "name": "PRF_HMAC_SHA2_256", + "algorithm": "algorithm-sha256" + } + ], + "integ": [ + { + "name": "AUTH_HMAC_SHA2_256_128", + "algorithm": "algorithm-sha256" + } + ], + "ke": [ + { + "group": 14, + "algorithm": "algorithm-ffdh-group14" + } + ], + "esn": true, + "auth": [ + { + "name": "ECDSA", + "algorithm": "algorithm-ecdsa-p256" + } + ] + }, + "relatedCryptographicAssets": [ { - "name": "ECDSA", - "algorithm": "algorithm-ecdsa-p256" + "type": "algorithm", + "ref": "algorithm-aes-128-gcm" + }, + { + "type": "algorithm", + "ref": "algorithm-aes-256-gcm" + }, + { + "type": "algorithm", + "ref": "algorithm-sha256" + }, + { + "type": "algorithm", + "ref": "algorithm-sha384" + }, + { + "type": "algorithm", + "ref": "algorithm-chacha20-poly1305" } ] }, - "relatedCryptographicAssets": [ - { - "type": "algorithm", - "ref": "algorithm-aes-128-gcm" - }, - { - "type": "algorithm", - "ref": "algorithm-aes-256-gcm" - }, - { - "type": "algorithm", - "ref": "algorithm-sha256" - }, - { - "type": "algorithm", - "ref": "algorithm-sha384" - }, - { - "type": "algorithm", - "ref": "algorithm-chacha20-poly1305" - } - ] - }, - "oid": "1.3.6.1.5.5.7.3.1" + "oid": "1.3.6.1.5.5.7.3.1" + } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-cryptography-implementation-2.0.json b/tools/src/test/resources/2.0/valid-cryptography-implementation-2.0.json index 764308ee..159e743a 100644 --- a/tools/src/test/resources/2.0/valid-cryptography-implementation-2.0.json +++ b/tools/src/test/resources/2.0/valid-cryptography-implementation-2.0.json @@ -5,122 +5,122 @@ "serialNumber": "urn:uuid:e8c355aa-2142-4084-a8c7-6d42c8610ba2", "version": 1, "metadata": { - "timestamp": "2025-07-09T12:00:00Z", - "component": { - "type": "application", - "name": "my application", - "version": "1.0" - } + "timestamp": "2025-07-09T12:00:00Z" }, - "components": [ + "inventories": [ { - "type": "cryptographic-asset", - "name": "AES-128-GCM-128-12", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "algorithmFamily": "AES", - "primitive": "ae", - "parameterSetIdentifier": "128", - "mode": "gcm", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["none"], - "cryptoFunctions": [ - "keygen", - "encrypt", - "decrypt", - "tag" - ], - "classicalSecurityLevel": 128, - "nistQuantumSecurityLevel": 1 + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "my application", + "version": "1.0" + }, + "components": [ + { + "type": "cryptographic-asset", + "name": "AES-128-GCM-128-12", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "algorithmFamily": "AES", + "primitive": "ae", + "parameterSetIdentifier": "128", + "mode": "gcm", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": [ + "keygen", + "encrypt", + "decrypt", + "tag" + ], + "classicalSecurityLevel": 128, + "nistQuantumSecurityLevel": 1 + }, + "oid": "2.16.840.1.101.3.4.1.6" + } }, - "oid": "2.16.840.1.101.3.4.1.6" - } - }, - { - "name": "RSA-PKCS1-1.5-SHA512-2048", - "type": "cryptographic-asset", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "algorithmFamily": "RSASSA-PKCS1", - "primitive": "signature", - "parameterSetIdentifier": "512", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["none"], - "cryptoFunctions": [ - "sign", - "verify" - ], - "nistQuantumSecurityLevel": 0 + { + "name": "RSA-PKCS1-1.5-SHA512-2048", + "type": "cryptographic-asset", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "algorithmFamily": "RSASSA-PKCS1", + "primitive": "signature", + "parameterSetIdentifier": "512", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": [ + "sign", + "verify" + ], + "nistQuantumSecurityLevel": 0 + }, + "oid": "1.2.840.113549.1.1.13" + } }, - "oid": "1.2.840.113549.1.1.13" - } - }, - { - "name": "ECDH-secp521r1", - "bom-ref": "ecdhsecp521r1", - "type": "cryptographic-asset", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "algorithmFamily": "ECDH", - "ellipticCurve": "secg/secp521r1", - "primitive": "key-agree", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["none"], - "cryptoFunctions": [ - "keygen", - "keyderive" - ], - "nistQuantumSecurityLevel": 0 + { + "name": "ECDH-secp521r1", + "bom-ref": "ecdhsecp521r1", + "type": "cryptographic-asset", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "algorithmFamily": "ECDH", + "ellipticCurve": "secg/secp521r1", + "primitive": "key-agree", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": [ + "keygen", + "keyderive" + ], + "nistQuantumSecurityLevel": 0 + }, + "oid": "1.3.132.0.35" + } }, - "oid": "1.3.132.0.35" - } - }, - { - "name": "ML-KEM-1024", - "bom-ref": "mlkem1024", - "type": "cryptographic-asset", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "algorithmFamily": "ML-KEM", - "primitive": "kem", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["none"], - "cryptoFunctions": [ - "keygen", - "keyderive" - ], - "nistQuantumSecurityLevel": 5 + { + "name": "ML-KEM-1024", + "bom-ref": "mlkem1024", + "type": "cryptographic-asset", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "algorithmFamily": "ML-KEM", + "primitive": "kem", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": [ + "keygen", + "keyderive" + ], + "nistQuantumSecurityLevel": 5 + }, + "oid": "2.16.840.1.101.3.4.1.48" + } }, - "oid": "2.16.840.1.101.3.4.1.48" - } - }, - { - "name": "draft-ietf-tls-hybrid-design-13", - "bom-ref": "draftietftlshybriddesign13", - "type": "cryptographic-asset", - "cryptoProperties": { - "assetType": "algorithm", - "algorithmProperties": { - "primitive": "combiner", - "executionEnvironment": "software-plain-ram", - "implementationPlatform": [ "x86_64" ], - "certificationLevel": ["none"], - "cryptoFunctions": [ - "keygen", - "keyderive" - ], - "nistQuantumSecurityLevel": 0 - }, - "oid": "1.3.101.110" - } + { + "name": "draft-ietf-tls-hybrid-design-13", + "bom-ref": "draftietftlshybriddesign13", + "type": "cryptographic-asset", + "cryptoProperties": { + "assetType": "algorithm", + "algorithmProperties": { + "primitive": "combiner", + "executionEnvironment": "software-plain-ram", + "implementationPlatform": [ "x86_64" ], + "cryptoFunctions": [ + "keygen", + "keyderive" + ], + "nistQuantumSecurityLevel": 0 + }, + "oid": "1.3.101.110" + } + } + ] } ], "dependencies": [ diff --git a/tools/src/test/resources/2.0/valid-definitions-licenses-2.0.json b/tools/src/test/resources/2.0/valid-definitions-licenses-2.0.json new file mode 100644 index 00000000..61f1ab9d --- /dev/null +++ b/tools/src/test/resources/2.0/valid-definitions-licenses-2.0.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b7d", + "version": 1, + "metadata": { + "licenses": [ + { "ref": "lic-cc-by" } + ] + }, + "definitions": { + "licenses": [ + { + "license": { + "bom-ref": "lic-apache-2.0", + "id": "Apache-2.0", + "acknowledgement": "declared" + } + }, + { + "license": { + "bom-ref": "lic-cc-by", + "id": "CC-BY-4.0" + } + }, + { + "expression": "MIT OR GPL-2.0-only", + "bom-ref": "lic-dual", + "acknowledgement": "concluded" + } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" }, + "components": [ + { "bom-ref": "pkg:maven/acme/library-a@1.0", "type": "library", "name": "Acme Library A", "version": "1.0", + "licenses": [ { "ref": "lic-apache-2.0" } ] }, + { "bom-ref": "pkg:maven/acme/library-b@2.0", "type": "library", "name": "Acme Library B", "version": "2.0", + "licenses": [ { "ref": "lic-apache-2.0" }, { "ref": "lic-dual" } ] } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/valid-definitions-parties-2.0.json b/tools/src/test/resources/2.0/valid-definitions-parties-2.0.json new file mode 100644 index 00000000..9a1fe79b --- /dev/null +++ b/tools/src/test/resources/2.0/valid-definitions-parties-2.0.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b7c", + "version": 1, + "definitions": { + "parties": [ + { + "bom-ref": "party-acme", + "roles": [ + { + "role": "supplier" + } + ], + "organization": { + "legalName": "Acme, Inc.", + "url": [ + { + "name": "homepage", + "url": "https://www.acme.example.com" + } + ] + } + } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-suite", "type": "application", "name": "Acme Suite", "version": "3.0" }, + "components": [ + { "bom-ref": "pkg:maven/acme/library-a@1.0", "type": "library", "name": "Acme Library A", "version": "1.0", + "parties": [ "party-acme" ] }, + { "bom-ref": "pkg:maven/acme/library-b@2.0", "type": "library", "name": "Acme Library B", "version": "2.0", + "parties": [ "party-acme" ] } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/valid-dependency-2.0.json b/tools/src/test/resources/2.0/valid-dependency-2.0.json index 9e0bdc97..10353794 100644 --- a/tools/src/test/resources/2.0/valid-dependency-2.0.json +++ b/tools/src/test/resources/2.0/valid-dependency-2.0.json @@ -4,26 +4,28 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "library-a", - "type": "library", - "name": "library-a", - "version": "1.0.0" - }, - { - "bom-ref": "library-b", - "type": "library", - "name": "library-b", - "version": "1.0.0" - }, - { - "bom-ref": "library-c", - "type": "library", - "name": "library-c", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "library-a", + "type": "library", + "name": "library-a", + "version": "1.0.0" + }, + { + "bom-ref": "library-b", + "type": "library", + "name": "library-b", + "version": "1.0.0" + }, + { + "bom-ref": "library-c", + "type": "library", + "name": "library-c", + "version": "1.0.0" + } + ] + }, "dependencies": [ { "ref": "library-a", diff --git a/tools/src/test/resources/2.0/valid-empty-components-2.0.json b/tools/src/test/resources/2.0/valid-empty-components-2.0.json index 17710f58..b3a7684e 100644 --- a/tools/src/test/resources/2.0/valid-empty-components-2.0.json +++ b/tools/src/test/resources/2.0/valid-empty-components-2.0.json @@ -4,6 +4,8 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - ] + "definitions": { + "components": [ + ] + } } diff --git a/tools/src/test/resources/2.0/valid-evidence-2.0.json b/tools/src/test/resources/2.0/valid-evidence-2.0.json index c284a616..b29b01a3 100644 --- a/tools/src/test/resources/2.0/valid-evidence-2.0.json +++ b/tools/src/test/resources/2.0/valid-evidence-2.0.json @@ -10,164 +10,166 @@ "name": "Acme Inc." } }, - "components": [ - { - "type": "application", - "group": "com.acme.tools", - "name": "acme-bug-finder", - "version": "3.0.0", - "licenses": [ - { - "license": { - "id": "LGPL-3.0-or-later", - "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html" - } - } - ], - "identifiers": [ - { - "party": "acme-inc", - "identities": [ - { - "scheme": "purl", - "value": "pkg:maven/com.acme.tools/acme-bug-finder@3.0.0" - } - ] - } - ], - "evidence": { - "identity": [ - { - "scheme": "purl", - "concludedValue": "pkg:maven/com.acme.tools/acme-bug-finder@3.0.0", - "confidence": 1, - "methods": [ - { - "technique": "filename", - "confidence": 0.1, - "value": "acme-bug-finder-3.0.0.jar" - }, - { - "technique": "ast-fingerprint", - "confidence": 0.9, - "value": "61e4bc08251761c3a73b606b9110a65899cb7d44f3b14c81ebc1e67c98e1d9ab" - }, - { - "technique": "hash-comparison", - "confidence": 0.7, - "value": "7c547a9d67cc7bc315c93b6e2ff8e4b6b41ae5be454ac249655ecb5ca2a85abf" - } - ], - "tools": [ - "bom-ref-of-tool-that-performed-analysis" - ] - }, - { - "scheme": "cpe", - "concludedValue": "cpe:2.3:a:acme:acme-bug-finder:3.0.0:*:*:*:*:*:*:*", - "confidence": 0.8, - "methods": [ - { - "technique": "manifest-analysis", - "confidence": 0.8, - "value": "META-INF/MANIFEST.MF" - } - ] - } - ], - "occurrences": [ - { - "bom-ref": "d6bf237e-4e11-4713-9f62-56d18d5e2079", - "location": "/path/to/component" - }, - { - "bom-ref": "b574d5d1-e3cf-4dcd-9ba5-f3507eb1b175", - "location": "/another/path/to/component" - } - ], - "callStacks": [ - { - "name": "Logging call path", - "frames": [ - { - "package": "com.acme.logging.core", - "module": "Logger.class", - "function": "logMessage", - "parameters": [ - "com.acme.HelloWorld", - "Level.INFO", - "null", - "Hello World" - ], - "line": 150, - "column": 17, - "fullFilename": "/path/to/acme-logging-2.14.0.jar!/com/acme/logging/core/Logger.class" - }, - { - "module": "HelloWorld.class", - "function": "main", - "line": 20, - "column": 12, - "fullFilename": "/path/to/HelloWorld.class" - } - ] - } - ], + "definitions": { + "components": [ + { + "type": "application", + "group": "com.acme.tools", + "name": "acme-bug-finder", + "version": "3.0.0", "licenses": [ { - "license": { "id": "Apache-2.0" }, - "occurrences": [ - { - "location": "HelloWorld.class", - "line": 8, - "additionalContext": " * http://www.apache.org/licenses/LICENSE-2.0" - } - ] - }, - { - "license": { "id": "Apache-2.0" }, - "occurrences": [ - { - "location": "HelloWorld.class", - "line": 16, - "additionalContext": "// SPDX-License-Identifier: Apache-2.0" - } - ] - }, - { - "license": { "id": "MIT" }, - "occurrences": [ - { - "location": "Example.class", - "line": 22, - "additionalContext": "// SPDX-License-Identifier: MIT" - } - ] + "license": { + "id": "LGPL-3.0-or-later", + "url": "https://www.gnu.org/licenses/lgpl-3.0-standalone.html" + } } ], - "copyright": [ + "identifiers": [ { - "text": "Copyright 2012 Acme Inc.", - "occurrences": [ + "party": "acme-inc", + "identities": [ { - "location": "HelloWorld.class", - "line": 2, - "additionalContext": " * Copyright (c) 2012 Acme Inc." - } - ] - }, - { - "text": "Copyright 2011 Example Corporation", - "occurrences": [ - { - "location": "Example.class", - "line": 2, - "additionalContext": " * Copyright (c) 2011 Example Corporation" + "scheme": "purl", + "value": "pkg:maven/com.acme.tools/acme-bug-finder@3.0.0" } ] } - ] + ], + "evidence": { + "identity": [ + { + "scheme": "purl", + "concludedValue": "pkg:maven/com.acme.tools/acme-bug-finder@3.0.0", + "confidence": 1, + "methods": [ + { + "technique": "filename", + "confidence": 0.1, + "value": "acme-bug-finder-3.0.0.jar" + }, + { + "technique": "ast-fingerprint", + "confidence": 0.9, + "value": "61e4bc08251761c3a73b606b9110a65899cb7d44f3b14c81ebc1e67c98e1d9ab" + }, + { + "technique": "hash-comparison", + "confidence": 0.7, + "value": "7c547a9d67cc7bc315c93b6e2ff8e4b6b41ae5be454ac249655ecb5ca2a85abf" + } + ], + "tools": [ + "bom-ref-of-tool-that-performed-analysis" + ] + }, + { + "scheme": "cpe", + "concludedValue": "cpe:2.3:a:acme:acme-bug-finder:3.0.0:*:*:*:*:*:*:*", + "confidence": 0.8, + "methods": [ + { + "technique": "manifest-analysis", + "confidence": 0.8, + "value": "META-INF/MANIFEST.MF" + } + ] + } + ], + "occurrences": [ + { + "bom-ref": "d6bf237e-4e11-4713-9f62-56d18d5e2079", + "location": "/path/to/component" + }, + { + "bom-ref": "b574d5d1-e3cf-4dcd-9ba5-f3507eb1b175", + "location": "/another/path/to/component" + } + ], + "callStacks": [ + { + "name": "Logging call path", + "frames": [ + { + "package": "com.acme.logging.core", + "module": "Logger.class", + "function": "logMessage", + "parameters": [ + "com.acme.HelloWorld", + "Level.INFO", + "null", + "Hello World" + ], + "line": 150, + "column": 17, + "fullFilename": "/path/to/acme-logging-2.14.0.jar!/com/acme/logging/core/Logger.class" + }, + { + "module": "HelloWorld.class", + "function": "main", + "line": 20, + "column": 12, + "fullFilename": "/path/to/HelloWorld.class" + } + ] + } + ], + "licenses": [ + { + "license": { "id": "Apache-2.0" }, + "occurrences": [ + { + "location": "HelloWorld.class", + "line": 8, + "additionalContext": " * http://www.apache.org/licenses/LICENSE-2.0" + } + ] + }, + { + "license": { "id": "Apache-2.0" }, + "occurrences": [ + { + "location": "HelloWorld.class", + "line": 16, + "additionalContext": "// SPDX-License-Identifier: Apache-2.0" + } + ] + }, + { + "license": { "id": "MIT" }, + "occurrences": [ + { + "location": "Example.class", + "line": 22, + "additionalContext": "// SPDX-License-Identifier: MIT" + } + ] + } + ], + "copyright": [ + { + "text": "Copyright 2012 Acme Inc.", + "occurrences": [ + { + "location": "HelloWorld.class", + "line": 2, + "additionalContext": " * Copyright (c) 2012 Acme Inc." + } + ] + }, + { + "text": "Copyright 2011 Example Corporation", + "occurrences": [ + { + "location": "Example.class", + "line": 2, + "additionalContext": " * Copyright (c) 2011 Example Corporation" + } + ] + } + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/valid-extensible-properties.json b/tools/src/test/resources/2.0/valid-extensible-properties.json index df94c405..15ade3c1 100644 --- a/tools/src/test/resources/2.0/valid-extensible-properties.json +++ b/tools/src/test/resources/2.0/valid-extensible-properties.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0" + } + ] + }, "ext:example.org:structuredExtension": { "$schema": "https://example.org/schemas/my-extension.schema.json", "$comment": "$schema is required", diff --git a/tools/src/test/resources/2.0/valid-external-reference-2.0.json b/tools/src/test/resources/2.0/valid-external-reference-2.0.json index 32245c4a..ee8eea0a 100644 --- a/tools/src/test/resources/2.0/valid-external-reference-2.0.json +++ b/tools/src/test/resources/2.0/valid-external-reference-2.0.json @@ -4,244 +4,246 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "org.example", - "name": "mylibrary", - "version": "1.0.0", - "externalReferences": [ - { - "type": "advisories", - "url": "https://example.org/security/feed/csaf", - "comment": "Security advisories from the vendor" - }, - { - "type": "bom", - "url": "https://example.org/support/sbom/portal-server/1.0.0", - "comment": "An external SBOM that describes what this component includes", - "hashes": [ - { - "alg": "SHA-256", - "content": "708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313" - } - ] - }, - { - "type": "documentation", - "url": "https://example.org/support/documentation/portal-server/1.0.0", - "comment": "Vendor provided documentation for the product" - } - ] - }, - { - "type": "application", - "name": "dummy", - "description": "this component has all external reference types possible", - "externalReferences": [ - { - "type": "vcs", - "url": "http://example.com/extref/vcs" - }, - { - "type": "issue-tracker", - "url": "http://example.com/extref/issue-tracker" - }, - { - "type": "website", - "url": "http://example.com/extref/website" - }, - { - "type": "advisories", - "url": "http://example.com/extref/advisories" - }, - { - "type": "bom", - "url": "http://example.com/extref/bom" - }, - { - "type": "mailing-list", - "url": "http://example.com/extref/mailing-list" - }, - { - "type": "social", - "url": "http://example.com/extref/social" - }, - { - "type": "chat", - "url": "http://example.com/extref/chat" - }, - { - "type": "documentation", - "url": "http://example.com/extref/documentation" - }, - { - "type": "support", - "url": "http://example.com/extref/support" - }, - { - "type": "source-distribution", - "url": "http://example.com/extref/source-distribution" - }, - { - "type": "distribution", - "url": "http://example.com/extref/distribution" - }, - { - "type": "distribution-intake", - "url": "http://example.com/extref/distribution-intake" - }, - { - "type": "license", - "url": "http://example.com/extref/license" - }, - { - "type": "build-meta", - "url": "http://example.com/extref/build-meta" - }, - { - "type": "build-system", - "url": "http://example.com/extref/build-system" - }, - { - "type": "release-notes", - "url": "http://example.com/extref/release-notes" - }, - { - "type": "security-contact", - "url": "http://example.com/extref/security-contact" - }, - { - "type": "model-card", - "url": "http://example.com/extref/model-card" - }, - { - "type": "log", - "url": "http://example.com/extref/log" - }, - { - "type": "configuration", - "url": "http://example.com/extref/configuration" - }, - { - "type": "evidence", - "url": "http://example.com/extref/evidence" - }, - { - "type": "formulation", - "url": "http://example.com/extref/formulation" - }, - { - "type": "attestation", - "url": "http://example.com/extref/attestation" - }, - { - "type": "threat-model", - "url": "http://example.com/extref/threat-model" - }, - { - "type": "adversary-model", - "url": "http://example.com/extref/adversary-model" - }, - { - "type": "risk-assessment", - "url": "http://example.com/extref/risk-assessment" - }, - { - "type": "vulnerability-assertion", - "url": "http://example.com/extref/vulnerability-assertion" - }, - { - "type": "exploitability-statement", - "url": "http://example.com/extref/exploitability-statement" - }, - { - "type": "pentest-report", - "url": "http://example.com/extref/pentest-report" - }, - { - "type": "static-analysis-report", - "url": "http://example.com/extref/static-analysis-report" - }, - { - "type": "dynamic-analysis-report", - "url": "http://example.com/extref/dynamic-analysis-report" - }, - { - "type": "runtime-analysis-report", - "url": "http://example.com/extref/runtime-analysis-report" - }, - { - "type": "component-analysis-report", - "url": "http://example.com/extref/component-analysis-report" - }, - { - "type": "maturity-report", - "url": "http://example.com/extref/maturity-report" - }, - { - "type": "certification-report", - "url": "http://example.com/extref/certification-report" - }, - { - "type": "quality-metrics", - "url": "http://example.com/extref/quality-metrics" - }, - { - "type": "codified-infrastructure", - "url": "http://example.com/extref/codified-infrastructure" - }, - { - "type": "poam", - "url": "http://example.com/extref/poam" - }, - { - "type": "perspective", - "url": "http://example.com/extref/perspective" - }, - { - "type": "electronic-signature", - "url": "http://example.com/extref/electronic-signature" - }, - { - "type": "digital-signature", - "url": "http://example.com/extref/digital-signature" - }, - { - "type": "rfc-9116", - "url": "http://example.com/extref/rfc-9116" - }, - { - "type": "patent", - "url": "http://example.com/extref/patent" - }, - { - "type": "patent-family", - "url": "http://example.com/extref/patent-family" - }, - { - "type": "patent-assertion", - "url": "http://example.com/extref/patent-assertion" - }, - { - "type": "citation", - "url": "http://example.com/extref/citation" - }, - { - "type": "swid-tag", - "url": "http://example.com/extref/swid-tag" - }, - { - "type": "other", - "url": "http://example.com/extref/other" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "org.example", + "name": "mylibrary", + "version": "1.0.0", + "externalReferences": [ + { + "type": "advisories", + "url": "https://example.org/security/feed/csaf", + "comment": "Security advisories from the vendor" + }, + { + "type": "bom", + "url": "https://example.org/support/sbom/portal-server/1.0.0", + "comment": "An external SBOM that describes what this component includes", + "hashes": [ + { + "alg": "SHA-256", + "content": "708f1f53b41f11f02d12a11b1a38d2905d47b099afc71a0f1124ef8582ec7313" + } + ] + }, + { + "type": "documentation", + "url": "https://example.org/support/documentation/portal-server/1.0.0", + "comment": "Vendor provided documentation for the product" + } + ] + }, + { + "type": "application", + "name": "dummy", + "description": "this component has all external reference types possible", + "externalReferences": [ + { + "type": "vcs", + "url": "http://example.com/extref/vcs" + }, + { + "type": "issue-tracker", + "url": "http://example.com/extref/issue-tracker" + }, + { + "type": "website", + "url": "http://example.com/extref/website" + }, + { + "type": "advisories", + "url": "http://example.com/extref/advisories" + }, + { + "type": "bom", + "url": "http://example.com/extref/bom" + }, + { + "type": "mailing-list", + "url": "http://example.com/extref/mailing-list" + }, + { + "type": "social", + "url": "http://example.com/extref/social" + }, + { + "type": "chat", + "url": "http://example.com/extref/chat" + }, + { + "type": "documentation", + "url": "http://example.com/extref/documentation" + }, + { + "type": "support", + "url": "http://example.com/extref/support" + }, + { + "type": "source-distribution", + "url": "http://example.com/extref/source-distribution" + }, + { + "type": "distribution", + "url": "http://example.com/extref/distribution" + }, + { + "type": "distribution-intake", + "url": "http://example.com/extref/distribution-intake" + }, + { + "type": "license", + "url": "http://example.com/extref/license" + }, + { + "type": "build-meta", + "url": "http://example.com/extref/build-meta" + }, + { + "type": "build-system", + "url": "http://example.com/extref/build-system" + }, + { + "type": "release-notes", + "url": "http://example.com/extref/release-notes" + }, + { + "type": "security-contact", + "url": "http://example.com/extref/security-contact" + }, + { + "type": "model-card", + "url": "http://example.com/extref/model-card" + }, + { + "type": "log", + "url": "http://example.com/extref/log" + }, + { + "type": "configuration", + "url": "http://example.com/extref/configuration" + }, + { + "type": "evidence", + "url": "http://example.com/extref/evidence" + }, + { + "type": "formulation", + "url": "http://example.com/extref/formulation" + }, + { + "type": "attestation", + "url": "http://example.com/extref/attestation" + }, + { + "type": "threat-model", + "url": "http://example.com/extref/threat-model" + }, + { + "type": "adversary-model", + "url": "http://example.com/extref/adversary-model" + }, + { + "type": "risk-assessment", + "url": "http://example.com/extref/risk-assessment" + }, + { + "type": "vulnerability-assertion", + "url": "http://example.com/extref/vulnerability-assertion" + }, + { + "type": "exploitability-statement", + "url": "http://example.com/extref/exploitability-statement" + }, + { + "type": "pentest-report", + "url": "http://example.com/extref/pentest-report" + }, + { + "type": "static-analysis-report", + "url": "http://example.com/extref/static-analysis-report" + }, + { + "type": "dynamic-analysis-report", + "url": "http://example.com/extref/dynamic-analysis-report" + }, + { + "type": "runtime-analysis-report", + "url": "http://example.com/extref/runtime-analysis-report" + }, + { + "type": "component-analysis-report", + "url": "http://example.com/extref/component-analysis-report" + }, + { + "type": "maturity-report", + "url": "http://example.com/extref/maturity-report" + }, + { + "type": "certification-report", + "url": "http://example.com/extref/certification-report" + }, + { + "type": "quality-metrics", + "url": "http://example.com/extref/quality-metrics" + }, + { + "type": "codified-infrastructure", + "url": "http://example.com/extref/codified-infrastructure" + }, + { + "type": "poam", + "url": "http://example.com/extref/poam" + }, + { + "type": "perspective", + "url": "http://example.com/extref/perspective" + }, + { + "type": "electronic-signature", + "url": "http://example.com/extref/electronic-signature" + }, + { + "type": "digital-signature", + "url": "http://example.com/extref/digital-signature" + }, + { + "type": "rfc-9116", + "url": "http://example.com/extref/rfc-9116" + }, + { + "type": "patent", + "url": "http://example.com/extref/patent" + }, + { + "type": "patent-family", + "url": "http://example.com/extref/patent-family" + }, + { + "type": "patent-assertion", + "url": "http://example.com/extref/patent-assertion" + }, + { + "type": "citation", + "url": "http://example.com/extref/citation" + }, + { + "type": "swid-tag", + "url": "http://example.com/extref/swid-tag" + }, + { + "type": "other", + "url": "http://example.com/extref/other" + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-external-reference-properties-2.0.json b/tools/src/test/resources/2.0/valid-external-reference-properties-2.0.json index 99603fd9..b7f0ff6e 100644 --- a/tools/src/test/resources/2.0/valid-external-reference-properties-2.0.json +++ b/tools/src/test/resources/2.0/valid-external-reference-properties-2.0.json @@ -4,27 +4,29 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "application", - "name": "dummy", - "description": "this component has an external reference with properties", - "externalReferences": [ - { - "type": "component-analysis-report", - "url": "http://example.com/extref/component-analysis-report", - "properties": [ - { - "name": "author", - "value": "John Doe" - }, - { - "name": "timestamp", - "value": "2025-01-27T12:27:26Z" - } - ] - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "application", + "name": "dummy", + "description": "this component has an external reference with properties", + "externalReferences": [ + { + "type": "component-analysis-report", + "url": "http://example.com/extref/component-analysis-report", + "properties": [ + { + "name": "author", + "value": "John Doe" + }, + { + "name": "timestamp", + "value": "2025-01-27T12:27:26Z" + } + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-formulation-2.0.json b/tools/src/test/resources/2.0/valid-formulation-2.0.json index 5038abba..4b62ce99 100644 --- a/tools/src/test/resources/2.0/valid-formulation-2.0.json +++ b/tools/src/test/resources/2.0/valid-formulation-2.0.json @@ -4,31 +4,31 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "org.example", - "name": "mylibrary", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-1", + "type": "platform", + "name": "Pipeline controller image", + "version": "v0.47.0" + }, + { + "type": "library", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "org.example", + "name": "mylibrary", + "version": "1.0.0" + } + ] + }, "formulation": [ { "bom-ref": "formula-1", - "components": [ - { - "bom-ref": "component-1", - "type": "platform", - "name": "Pipeline controller image", - "version": "v0.47.0" - } - ], "workflows": [ { "bom-ref": "workflow-1", diff --git a/tools/src/test/resources/2.0/valid-hardware-certification-cdxa-2.0.json b/tools/src/test/resources/2.0/valid-hardware-certification-cdxa-2.0.json index 72460821..d703867b 100644 --- a/tools/src/test/resources/2.0/valid-hardware-certification-cdxa-2.0.json +++ b/tools/src/test/resources/2.0/valid-hardware-certification-cdxa-2.0.json @@ -4,59 +4,64 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e02", - "components": [ - { - "bom-ref": "comp-mcu-avr8-328", - "type": "device", - "name": "Acme AVR8-328", - "version": "Rev. E", - "parties": [ - { - "bom-ref": "party-acme-semi", - "roles": [ - { - "role": "manufacturer" + "definitions": { + "components": [ + { + "bom-ref": "comp-mcu-avr8-328", + "type": "device", + "name": "Acme AVR8-328", + "version": "Rev. E", + "parties": [ + { + "bom-ref": "party-acme-semi", + "roles": [ + { + "role": "manufacturer" + } + ], + "organization": { + "name": "Acme Semiconductor" } - ], - "organization": { - "name": "Acme Semiconductor" - } - }, - { - "bom-ref": "party-ridgecrest-labs", - "roles": [ - { - "name": "certification-body" + }, + { + "bom-ref": "party-ridgecrest-labs", + "roles": [ + { + "name": "certification-body" + } + ], + "organization": { + "name": "Ridgecrest Compliance Laboratories" } - ], - "organization": { - "name": "Ridgecrest Compliance Laboratories" } - } - ], - "classification": { - "category": "semiconductor", - "subcategory": "microcontroller" - }, - "deviceType": "dip", - "certifications": [ - { - "bom-ref": "cert-aecq100", - "standard": "AEC-Q100", - "identifier": "RCL-2026-04471", - "issuer": "party-ridgecrest-labs", - "issuedDate": "2026-03-02", - "level": "Grade 1", - "scope": "Automotive qualification of the AVR8-328 in the 28-pin PDIP package.", - "jurisdiction": "US", - "relatedClaims": [ - "claim-aecq100-stress" - ], - "url": "https://certs.ridgecrest.example.com/RCL-2026-04471" - } - ] - } - ], + ], + "classification": { + "category": "semiconductor", + "subcategory": "microcontroller" + }, + "deviceType": "dip", + "certifications": [ + { "ref": "cert-aecq100" } + ] + } + ], + "certifications": [ + { + "bom-ref": "cert-aecq100", + "standard": "AEC-Q100", + "identifier": "RCL-2026-04471", + "issuer": "party-ridgecrest-labs", + "issuedDate": "2026-03-02", + "level": "Grade 1", + "scope": "Automotive qualification of the AVR8-328 in the 28-pin PDIP package.", + "jurisdiction": "US", + "relatedClaims": [ + "claim-aecq100-stress" + ], + "url": "https://certs.ridgecrest.example.com/RCL-2026-04471" + } + ] + }, "declarations": { "claims": [ { @@ -66,4 +71,4 @@ } ] } -} \ No newline at end of file +} diff --git a/tools/src/test/resources/2.0/valid-hardware-certification-software-2.0.json b/tools/src/test/resources/2.0/valid-hardware-certification-software-2.0.json index 86dca710..aa0dc470 100644 --- a/tools/src/test/resources/2.0/valid-hardware-certification-software-2.0.json +++ b/tools/src/test/resources/2.0/valid-hardware-certification-software-2.0.json @@ -4,42 +4,48 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e03", - "components": [ - { - "bom-ref": "comp-acme-crypto", - "type": "library", - "name": "acme-crypto", - "version": "3.1.0", - "parties": [ - { - "bom-ref": "party-acme-software", - "roles": [ - { - "role": "author" + "definitions": { + "components": [ + { + "bom-ref": "comp-acme-crypto", + "type": "library", + "name": "acme-crypto", + "version": "3.1.0", + "parties": [ + { + "bom-ref": "party-acme-software", + "roles": [ + { + "role": "author" + } + ], + "organization": { + "name": "Acme Software" } - ], - "organization": { - "name": "Acme Software" } - } - ], - "certifications": [ - { - "standard": "FIPS 140-3", - "identifier": "4985", - "level": "Level 2", - "issuer": "party-acme-software", - "issuedDate": "2025-11-20", - "expirationDate": "2030-11-19", - "jurisdiction": "US", - "properties": [ - { - "name": "cdx:certification/module", - "value": "Acme Crypto FIPS Provider" - } - ] - } - ] - } - ] -} \ No newline at end of file + ], + "certifications": [ + { "ref": "cert-fips-140-3" } + ] + } + ], + "certifications": [ + { + "bom-ref": "cert-fips-140-3", + "standard": "FIPS 140-3", + "identifier": "4985", + "level": "Level 2", + "issuer": "party-acme-software", + "issuedDate": "2025-11-20", + "expirationDate": "2030-11-19", + "jurisdiction": "US", + "properties": [ + { + "name": "cdx:certification/module", + "value": "Acme Crypto FIPS Provider" + } + ] + } + ] + } +} diff --git a/tools/src/test/resources/2.0/valid-hardware-devicetype-custom-2.0.json b/tools/src/test/resources/2.0/valid-hardware-devicetype-custom-2.0.json index 69d38ea2..052cfd78 100644 --- a/tools/src/test/resources/2.0/valid-hardware-devicetype-custom-2.0.json +++ b/tools/src/test/resources/2.0/valid-hardware-devicetype-custom-2.0.json @@ -4,31 +4,33 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e01", - "components": [ - { - "bom-ref": "comp-power-module", - "type": "device", - "name": "Acme Power Module", - "version": "Rev B", - "classification": { - "category": "module", - "subcategory": "dc-dc-converter" - }, - "deviceType": { - "name": "lga", - "description": "Land grid array module package." - }, - "boardLocation": { - "designators": [ - "PS1" - ], - "layer": "bottom", - "subsystem": "power-input" - }, - "leadTime": { - "value": 12, - "unit": "weeks" + "definitions": { + "components": [ + { + "bom-ref": "comp-power-module", + "type": "device", + "name": "Acme Power Module", + "version": "Rev B", + "classification": { + "category": "module", + "subcategory": "dc-dc-converter" + }, + "deviceType": { + "name": "lga", + "description": "Land grid array module package." + }, + "boardLocation": { + "designators": [ + "PS1" + ], + "layer": "bottom", + "subsystem": "power-input" + }, + "leadTime": { + "value": 12, + "unit": "weeks" + } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-hardware-identity-evidence-2.0.json b/tools/src/test/resources/2.0/valid-hardware-identity-evidence-2.0.json index 8d848b8e..3ad46d8e 100644 --- a/tools/src/test/resources/2.0/valid-hardware-identity-evidence-2.0.json +++ b/tools/src/test/resources/2.0/valid-hardware-identity-evidence-2.0.json @@ -4,110 +4,112 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e04", - "components": [ - { - "bom-ref": "comp-mcu-suspect-lot", - "type": "device", - "name": "Acme AVR8-328", - "version": "Rev. E", - "parties": [ - { - "bom-ref": "party-acme-semi", - "roles": [ - { - "role": "manufacturer" + "definitions": { + "components": [ + { + "bom-ref": "comp-mcu-suspect-lot", + "type": "device", + "name": "Acme AVR8-328", + "version": "Rev. E", + "parties": [ + { + "bom-ref": "party-acme-semi", + "roles": [ + { + "role": "manufacturer" + } + ], + "organization": { + "name": "Acme Semiconductor" } - ], - "organization": { - "name": "Acme Semiconductor" - } - }, - { - "bom-ref": "party-veriparts", - "roles": [ - { - "name": "test-laboratory" + }, + { + "bom-ref": "party-veriparts", + "roles": [ + { + "name": "test-laboratory" + } + ], + "organization": { + "name": "VeriParts Component Testing" } - ], - "organization": { - "name": "VeriParts Component Testing" } - } - ], - "identifiers": [ - { - "party": "party-acme-semi", - "identities": [ - { - "scheme": "mpn", - "value": "AVR8-328-PU" - }, - { - "scheme": "serial-number", - "value": "SN-2409-118842" - } - ] - } - ], - "classification": { - "category": "semiconductor", - "subcategory": "microcontroller" - }, - "deviceType": "dip", - "boardLocation": { - "designators": [ - "U5" ], - "layer": "top", - "subsystem": "main-mcu" - }, - "evidence": { - "identity": [ + "identifiers": [ { - "scheme": "mpn", - "concludedValue": "AVR8-328-PU", - "confidence": 0.95, - "timestamp": "2026-07-18T14:30:00Z", - "assertion": { - "parties": [ - { - "party": "party-veriparts" - } - ] - }, - "methods": [ + "party": "party-acme-semi", + "identities": [ { - "technique": "visual-inspection", - "confidence": 0.9, - "value": "Laser-etched marking AVR8-328-PU, date code 2409, manufacturer logo present and correctly aligned.", - "externalReferences": [ - { - "type": "evidence", - "url": "https://lab.veriparts.example.com/reports/SN-2409-118842/top-marking.jpg", - "comment": "Photograph of the package top marking." - } - ] + "scheme": "mpn", + "value": "AVR8-328-PU" }, { - "technique": "x-ray-inspection", - "confidence": 0.85, - "description": "Die dimensions, lead frame geometry, and wire bonding consistent with the manufacturer reference sample.", - "externalReferences": [ + "scheme": "serial-number", + "value": "SN-2409-118842" + } + ] + } + ], + "classification": { + "category": "semiconductor", + "subcategory": "microcontroller" + }, + "deviceType": "dip", + "boardLocation": { + "designators": [ + "U5" + ], + "layer": "top", + "subsystem": "main-mcu" + }, + "evidence": { + "identity": [ + { + "scheme": "mpn", + "concludedValue": "AVR8-328-PU", + "confidence": 0.95, + "timestamp": "2026-07-18T14:30:00Z", + "assertion": { + "parties": [ { - "type": "evidence", - "url": "https://lab.veriparts.example.com/reports/SN-2409-118842/xray-plate.png" + "party": "party-veriparts" } ] }, - { - "technique": "electrical-testing", - "confidence": 0.8, - "description": "Supply current and oscillator startup within datasheet limits at 25 degrees Celsius." - } - ] - } - ] + "methods": [ + { + "technique": "visual-inspection", + "confidence": 0.9, + "value": "Laser-etched marking AVR8-328-PU, date code 2409, manufacturer logo present and correctly aligned.", + "externalReferences": [ + { + "type": "evidence", + "url": "https://lab.veriparts.example.com/reports/SN-2409-118842/top-marking.jpg", + "comment": "Photograph of the package top marking." + } + ] + }, + { + "technique": "x-ray-inspection", + "confidence": 0.85, + "description": "Die dimensions, lead frame geometry, and wire bonding consistent with the manufacturer reference sample.", + "externalReferences": [ + { + "type": "evidence", + "url": "https://lab.veriparts.example.com/reports/SN-2409-118842/xray-plate.png" + } + ] + }, + { + "technique": "electrical-testing", + "confidence": 0.8, + "description": "Supply current and oscillator startup within datasheet limits at 25 degrees Celsius." + } + ] + } + ] + } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-hardware-material-2.0.json b/tools/src/test/resources/2.0/valid-hardware-material-2.0.json index 5caefa35..7f7f2cb6 100644 --- a/tools/src/test/resources/2.0/valid-hardware-material-2.0.json +++ b/tools/src/test/resources/2.0/valid-hardware-material-2.0.json @@ -4,147 +4,149 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e10", - "components": [ - { - "bom-ref": "comp-smco-magnet", - "type": "device", - "name": "Samarium Cobalt Magnet", - "version": "SM2-17-A", - "classification": { - "category": "magnetic", - "subcategory": "permanent-magnet", - "codes": [ - { - "standard": "HS", - "value": "8505.11", - "description": "Permanent magnets of metal." - } - ] - }, - "deviceType": "discrete", - "quantity": { - "value": 2 - }, - "origins": [ - { - "stage": "manufactured", - "basis": "manufacturing cost", - "distribution": [ + "definitions": { + "components": [ + { + "bom-ref": "comp-smco-magnet", + "type": "device", + "name": "Samarium Cobalt Magnet", + "version": "SM2-17-A", + "classification": { + "category": "magnetic", + "subcategory": "permanent-magnet", + "codes": [ { - "isoCode": "US", - "percentage": 100 + "standard": "HS", + "value": "8505.11", + "description": "Permanent magnets of metal." } ] - } - ], - "components": [ - { - "bom-ref": "comp-samarium", - "type": "material", - "name": "Samarium Metal", - "materialForm": "ingot", - "quantity": { - "value": 12.5, - "unit": "g" - }, - "classification": { - "category": "material", - "subcategory": "rare-earth-metal", - "codes": [ + }, + "deviceType": "discrete", + "quantity": { + "value": 2 + }, + "origins": [ + { + "stage": "manufactured", + "basis": "manufacturing cost", + "distribution": [ { - "standard": "HS", - "value": "2805.30", - "description": "Rare-earth metals, scandium and yttrium." + "isoCode": "US", + "percentage": 100 } ] - }, - "origins": [ - { - "stage": "mined", - "basis": "net weight", - "distribution": [ - { - "isoCode": "AU", - "percentage": 100 - } - ] + } + ], + "components": [ + { + "bom-ref": "comp-samarium", + "type": "material", + "name": "Samarium Metal", + "materialForm": "ingot", + "quantity": { + "value": 12.5, + "unit": "g" }, - { - "stage": "separated", - "basis": "net weight", - "distribution": [ + "classification": { + "category": "material", + "subcategory": "rare-earth-metal", + "codes": [ { - "isoCode": "MY", - "percentage": 100 + "standard": "HS", + "value": "2805.30", + "description": "Rare-earth metals, scandium and yttrium." } ] }, - { - "stage": "melted", - "basis": "net weight", - "distribution": [ - { - "isoCode": "US", - "percentage": 100 - } - ] + "origins": [ + { + "stage": "mined", + "basis": "net weight", + "distribution": [ + { + "isoCode": "AU", + "percentage": 100 + } + ] + }, + { + "stage": "separated", + "basis": "net weight", + "distribution": [ + { + "isoCode": "MY", + "percentage": 100 + } + ] + }, + { + "stage": "melted", + "basis": "net weight", + "distribution": [ + { + "isoCode": "US", + "percentage": 100 + } + ] + } + ], + "leadTime": { + "value": 16, + "unit": "weeks" } - ], - "leadTime": { - "value": 16, - "unit": "weeks" } - } - ] - }, - { - "bom-ref": "comp-tungsten-powder", - "type": "material", - "name": "Tungsten Metal Powder", - "materialForm": "powder", - "quantity": { - "value": 2500, - "unit": "kg" + ] }, - "parties": [ - { - "bom-ref": "org-glsm", - "roles": [ { "role": "supplier" } ], - "organization": { - "name": "Great Lakes Specialty Metals" - } - } - ], - "origins": [ - { - "stage": "mined", - "basis": "net weight", - "distribution": [ - { - "isoCode": "PT", - "percentage": 55 - }, - { - "isoCode": "BO", - "percentage": 45 - } - ] + { + "bom-ref": "comp-tungsten-powder", + "type": "material", + "name": "Tungsten Metal Powder", + "materialForm": "powder", + "quantity": { + "value": 2500, + "unit": "kg" }, - { - "stage": { - "name": "reduced", - "description": "Hydrogen reduction of ammonium paratungstate to tungsten metal powder." - }, - "basis": "net weight", - "distribution": [ - { - "isoCode": "US", - "percentage": 100, - "performedBy": "org-glsm" + "parties": [ + { + "bom-ref": "org-glsm", + "roles": [ { "role": "supplier" } ], + "organization": { + "name": "Great Lakes Specialty Metals" } - ] - } - ] - } - ] + } + ], + "origins": [ + { + "stage": "mined", + "basis": "net weight", + "distribution": [ + { + "isoCode": "PT", + "percentage": 55 + }, + { + "isoCode": "BO", + "percentage": 45 + } + ] + }, + { + "stage": { + "name": "reduced", + "description": "Hydrogen reduction of ammonium paratungstate to tungsten metal powder." + }, + "basis": "net weight", + "distribution": [ + { + "isoCode": "US", + "percentage": 100, + "performedBy": "org-glsm" + } + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-inventory-multi-product-shared-2.0.json b/tools/src/test/resources/2.0/valid-inventory-multi-product-shared-2.0.json new file mode 100644 index 00000000..5255ae09 --- /dev/null +++ b/tools/src/test/resources/2.0/valid-inventory-multi-product-shared-2.0.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b7a", + "version": 1, + "definitions": { + "components": [ + { "bom-ref": "acme-controller", "type": "application", "name": "Acme Controller", "version": "5.0" }, + { "bom-ref": "pkg:generic/acme/common-runtime@4.2", "type": "library", "name": "Acme Common Runtime", "version": "4.2" }, + { "bom-ref": "mpn:globex/reg-5v-a", "type": "device", "name": "Globex 5V Regulator A" }, + { "bom-ref": "mpn:initech/reg-5v-b", "type": "device", "name": "Initech 5V Regulator B" }, + { "bom-ref": "acme-gateway-firmware", "type": "firmware", "name": "Acme Gateway Firmware", "version": "2.1.0", + "components": [ { "ref": "pkg:generic/acme/common-runtime@4.2" } ] } + ] + }, + "inventories": [ + { + "bom-ref": "inventory-gateway", + "subject": { "bom-ref": "acme-gateway", "type": "device", "name": "Acme Gateway", "version": "2.1" }, + "components": [ + { "bom-ref": "mpn:globex/mcu-9000", "type": "device", "name": "Globex MCU 9000", + "quantity": { "value": 1 }, "boardLocation": { "designators": [ "U1" ] } }, + { "type": "component-choice", "name": "U2 5V LDO regulator", "operator": "XOR", + "components": [ { "ref": "mpn:globex/reg-5v-a" }, { "ref": "mpn:initech/reg-5v-b" } ] }, + { "ref": "acme-gateway-firmware" }, + { "bom-ref": "gateway-only-lib", "type": "library", "name": "Gateway Only Library", "version": "0.9", "scope": "optional" } + ] + }, + { + "subject": { "ref": "acme-controller" }, + "components": [ + { "ref": "pkg:generic/acme/common-runtime@4.2" }, + { "ref": "urn:cdx:f1a2b3c4-1111-4222-8333-444455556666/3#pkg:npm/ui-kit@2.0.0" } + ] + } + ], + "dependencies": [ + { "ref": "acme-controller", "dependsOn": [ "pkg:generic/acme/common-runtime@4.2" ] }, + { "ref": "acme-gateway-firmware", "dependsOn": [ "pkg:generic/acme/common-runtime@4.2" ] } + ], + "vulnerabilities": [ + { "bom-ref": "vuln-1", "id": "CVE-2026-0001", + "affects": [ { "ref": "acme-controller" } ] } + ] +} diff --git a/tools/src/test/resources/2.0/valid-inventory-single-product-2.0.json b/tools/src/test/resources/2.0/valid-inventory-single-product-2.0.json new file mode 100644 index 00000000..2c6e48a3 --- /dev/null +++ b/tools/src/test/resources/2.0/valid-inventory-single-product-2.0.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", + "version": 1, + "metadata": { + "timestamp": "2026-08-27T12:00:00Z" + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.0" }, + "components": [ + { "bom-ref": "pkg:maven/acme/library@3.0", "type": "library", "name": "Acme Library", "version": "3.0" }, + { "bom-ref": "pkg:maven/partner/shaded-library@1.0", "type": "library", "name": "Partner Shaded Library", "version": "1.0", + "components": [ + { "bom-ref": "pkg:maven/ossproject/library@2.0", "type": "library", "name": "Some Opensource Library", "version": "2.0" } + ] } + ] + } + ], + "dependencies": [ + { "ref": "acme-app", "dependsOn": [ "pkg:maven/acme/library@3.0", "pkg:maven/partner/shaded-library@1.0" ] } + ], + "compositions": [ + { "kind": "components", "aggregate": "complete", "targets": [ "acme-app" ] } + ] +} diff --git a/tools/src/test/resources/2.0/valid-inventory-vex-only-2.0.json b/tools/src/test/resources/2.0/valid-inventory-vex-only-2.0.json new file mode 100644 index 00000000..be83159a --- /dev/null +++ b/tools/src/test/resources/2.0/valid-inventory-vex-only-2.0.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b7b", + "version": 1, + "definitions": { + "components": [ + { "bom-ref": "acme-gateway", "type": "device", "name": "Acme Gateway", "version": "2.1" }, + { "bom-ref": "acme-controller", "type": "application", "name": "Acme Controller", "version": "5.0" } + ] + }, + "vulnerabilities": [ + { "bom-ref": "vuln-1", "id": "CVE-2026-0002", + "affects": [ { "ref": "acme-gateway" }, { "ref": "acme-controller" } ] } + ] +} diff --git a/tools/src/test/resources/2.0/valid-jss-signature-cert-url-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-cert-url-2.0.json index 89da40b5..d7ed4695 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-cert-url-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-cert-url-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "RS256", diff --git a/tools/src/test/resources/2.0/valid-jss-signature-counter-signature-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-counter-signature-2.0.json index 4719de58..616b1d4a 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-counter-signature-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-counter-signature-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "Ed25519", diff --git a/tools/src/test/resources/2.0/valid-jss-signature-custom-properties-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-custom-properties-2.0.json index 64dc95cf..81d2af02 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-custom-properties-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-custom-properties-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "Ed25519", diff --git a/tools/src/test/resources/2.0/valid-jss-signature-metadata-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-metadata-2.0.json index 451f2fa9..55659d03 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-metadata-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-metadata-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "Ed25519", diff --git a/tools/src/test/resources/2.0/valid-jss-signature-multiple-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-multiple-2.0.json index 4ac90d4c..692b6ecf 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-multiple-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-multiple-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "Ed25519", diff --git a/tools/src/test/resources/2.0/valid-jss-signature-public-cert-chain-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-public-cert-chain-2.0.json index 70dee060..bc7d7238 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-public-cert-chain-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-public-cert-chain-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "ES256", diff --git a/tools/src/test/resources/2.0/valid-jss-signature-public-key-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-public-key-2.0.json index 05dcfe71..b3e086e1 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-public-key-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-public-key-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "Ed25519", diff --git a/tools/src/test/resources/2.0/valid-jss-signature-thumbprint-2.0.json b/tools/src/test/resources/2.0/valid-jss-signature-thumbprint-2.0.json index b521e562..0f7749a8 100644 --- a/tools/src/test/resources/2.0/valid-jss-signature-thumbprint-2.0.json +++ b/tools/src/test/resources/2.0/valid-jss-signature-thumbprint-2.0.json @@ -4,13 +4,15 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:1b1bff0e-fdb9-4088-8b9a-1a9f2d9006da", "version": 1, - "components": [ - { - "type": "library", - "name": "my-library", - "version": "1.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "name": "my-library", + "version": "1.0" + } + ] + }, "signatures": [ { "algorithm": "PS256", diff --git a/tools/src/test/resources/2.0/valid-license-choice-2.0.json b/tools/src/test/resources/2.0/valid-license-choice-2.0.json index 6ad3fc51..e19ffc5b 100644 --- a/tools/src/test/resources/2.0/valid-license-choice-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-choice-2.0.json @@ -4,47 +4,49 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:b1ef52c6-7cd8-43d5-9e42-5e69044bbe9e", "version": 1, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "description": "Modified version of Apache Catalina", - "scope": "required", - "licenses": [ - { - "license": { - "id": "Apache-2.0" + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } } - }, - { - "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0" - }, - { - "license": { - "name": "My Own License", - "text": { - "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + ], + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "description": "Modified version of Apache Catalina", + "scope": "required", + "licenses": [ + { + "license": { + "id": "Apache-2.0" } - } - }, - { - "expression": "LicenseRef-MIT-Style-2", - "expressionDetails": [ - { - "licenseIdentifier": "LicenseRef-MIT-Style-2", - "url": "https://example.com/license" + }, + { + "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0" + }, + { + "license": { + "name": "My Own License", + "text": { + "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + } } - ] - } - ] - } - ] + }, + { + "expression": "LicenseRef-MIT-Style-2", + "expressionDetails": [ + { + "licenseIdentifier": "LicenseRef-MIT-Style-2", + "url": "https://example.com/license" + } + ] + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-license-declared-concluded-mix-2.0.json b/tools/src/test/resources/2.0/valid-license-declared-concluded-mix-2.0.json index e6f529ac..0b481d29 100644 --- a/tools/src/test/resources/2.0/valid-license-declared-concluded-mix-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-declared-concluded-mix-2.0.json @@ -11,157 +11,159 @@ } ] }, - "components": [ - { - "type": "library", - "group": "com.example", - "name": "situation-A", - "version": "1", - "description": "Multiple licenses: declared ids/names, and a concluded expression", - "licenses": [ - { - "license": { - "id": "MIT", - "acknowledgement": "declared" + "definitions": { + "components": [ + { + "type": "library", + "group": "com.example", + "name": "situation-A", + "version": "1", + "description": "Multiple licenses: declared ids/names, and a concluded expression", + "licenses": [ + { + "license": { + "id": "MIT", + "acknowledgement": "declared" + } + }, + { + "license": { + "id": "PostgreSQL", + "acknowledgement": "declared" + } + }, + { + "license": { + "name": "Apache Software License", + "acknowledgement": "declared" + } + }, + { + "expression": "(MIT OR PostgreSQL OR Apache-2.0)", + "acknowledgement": "concluded" } - }, - { - "license": { - "id": "PostgreSQL", + ] + }, + { + "type": "library", + "group": "com.example", + "name": "situation-B", + "version": "1", + "description": "Multiple license expressions: one declared, one concluded", + "licenses": [ + { + "expression": "MIT OR (GPL-3.0 OR GPL-2.0)", "acknowledgement": "declared" + }, + { + "expression": "(GPL-3.0-only AND LGPL-2.0-only)", + "acknowledgement": "concluded" } - }, - { - "license": { - "name": "Apache Software License", + ] + }, + { + "type": "library", + "group": "com.example", + "name": "situation-C", + "version": "1", + "description": "Multiple license: one declared expression, one concluded id", + "licenses": [ + { + "expression": "GPL-3.0-or-later OR GPL-2.0", "acknowledgement": "declared" + }, + { + "license": { + "id": "GPL-3.0-only", + "acknowledgement": "concluded" + } } - }, - { - "expression": "(MIT OR PostgreSQL OR Apache-2.0)", - "acknowledgement": "concluded" - } - ] - }, - { - "type": "library", - "group": "com.example", - "name": "situation-B", - "version": "1", - "description": "Multiple license expressions: one declared, one concluded", - "licenses": [ - { - "expression": "MIT OR (GPL-3.0 OR GPL-2.0)", - "acknowledgement": "declared" - }, - { - "expression": "(GPL-3.0-only AND LGPL-2.0-only)", - "acknowledgement": "concluded" - } - ] - }, - { - "type": "library", - "group": "com.example", - "name": "situation-C", - "version": "1", - "description": "Multiple license: one declared expression, one concluded id", - "licenses": [ - { - "expression": "GPL-3.0-or-later OR GPL-2.0", - "acknowledgement": "declared" - }, - { - "license": { - "id": "GPL-3.0-only", - "acknowledgement": "concluded" - } - } - ] - }, - { - "type": "library", - "group": "com.example", - "name": "situation-D", - "version": "1", - "description": "Multiple license with texts: one declared expression, one concluded id", - "licenses": [ - { - "expression": "GPL-3.0-or-later OR GPL-2.0", - "acknowledgement": "declared", - "expressionDetails": [ - { - "licenseIdentifier": "GPL-3.0-or-later", - "text": { - "content": "specific GPL-3.0-or-later license text" + ] + }, + { + "type": "library", + "group": "com.example", + "name": "situation-D", + "version": "1", + "description": "Multiple license with texts: one declared expression, one concluded id", + "licenses": [ + { + "expression": "GPL-3.0-or-later OR GPL-2.0", + "acknowledgement": "declared", + "expressionDetails": [ + { + "licenseIdentifier": "GPL-3.0-or-later", + "text": { + "content": "specific GPL-3.0-or-later license text" + } + }, + { + "licenseIdentifier": "GPL-2.0", + "text": { + "content": "specific GPL-2.0 license text" + } } - }, - { - "licenseIdentifier": "GPL-2.0", + ] + }, + { + "license": { + "id": "GPL-3.0-only", + "acknowledgement": "concluded", "text": { - "content": "specific GPL-2.0 license text" + "content": "specific GPL-3.0-or-later license text" } } - ] - }, - { - "license": { - "id": "GPL-3.0-only", - "acknowledgement": "concluded", - "text": { - "content": "specific GPL-3.0-or-later license text" - } - } - } - ] - }, - { - "type": "library", - "group": "com.example", - "name": "situation-E", - "version": "1", - "description": "Multiple licenses with urls: declared ids/names, and a concluded expression", - "licenses": [ - { - "license": { - "id": "MIT", - "acknowledgement": "declared", - "url": "https://example.com/licenses/MIT" - } - }, - { - "license": { - "id": "PostgreSQL", - "acknowledgement": "declared", - "url": "https://example.com/licenses/PostgreSQL" - } - }, - { - "license": { - "name": "Apache Software License", - "acknowledgement": "declared", - "url": "https://example.com/licenses/Apache-2.0" } - }, - { - "expression": "(MIT AND PostgreSQL AND Apache-2.0)", - "acknowledgement": "concluded", - "expressionDetails": [ - { - "licenseIdentifier": "MIT", + ] + }, + { + "type": "library", + "group": "com.example", + "name": "situation-E", + "version": "1", + "description": "Multiple licenses with urls: declared ids/names, and a concluded expression", + "licenses": [ + { + "license": { + "id": "MIT", + "acknowledgement": "declared", "url": "https://example.com/licenses/MIT" - }, - { - "licenseIdentifier": "PostgreSQL", + } + }, + { + "license": { + "id": "PostgreSQL", + "acknowledgement": "declared", "url": "https://example.com/licenses/PostgreSQL" - }, - { - "licenseIdentifier": "Apache-2.0", + } + }, + { + "license": { + "name": "Apache Software License", + "acknowledgement": "declared", "url": "https://example.com/licenses/Apache-2.0" } - ] - } - ] - } - ] + }, + { + "expression": "(MIT AND PostgreSQL AND Apache-2.0)", + "acknowledgement": "concluded", + "expressionDetails": [ + { + "licenseIdentifier": "MIT", + "url": "https://example.com/licenses/MIT" + }, + { + "licenseIdentifier": "PostgreSQL", + "url": "https://example.com/licenses/PostgreSQL" + }, + { + "licenseIdentifier": "Apache-2.0", + "url": "https://example.com/licenses/Apache-2.0" + } + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-license-expression-2.0.json b/tools/src/test/resources/2.0/valid-license-expression-2.0.json index b31ea348..bd1803a6 100644 --- a/tools/src/test/resources/2.0/valid-license-expression-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-expression-2.0.json @@ -4,45 +4,47 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "description": "Modified version of Apache Catalina", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ], - "licenses": [ - { - "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", - "acknowledgement": "declared", - "bom-ref": "my-license" - } - ] - } - ] + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "description": "Modified version of Apache Catalina", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ], + "licenses": [ + { + "expression": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", + "acknowledgement": "declared", + "bom-ref": "my-license" + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-license-expression-with-licensing-2.0.json b/tools/src/test/resources/2.0/valid-license-expression-with-licensing-2.0.json index 151a2a7f..29aa4543 100644 --- a/tools/src/test/resources/2.0/valid-license-expression-with-licensing-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-expression-with-licensing-2.0.json @@ -4,59 +4,61 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:78a32681-a31f-4097-b151-7b771cc58157", "version": 1, - "components": [ - { - "type": "library", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "cryptographic-provider", - "version": "2.2.0", - "licenses": [ - { - "bom-ref": "acme-license-1", - "expression": "LicenseRef-AcmeCommercialLicense", - "licensing": { - "altIds": [ - "acme", - "acme-license" - ], - "licensor": { - "organization": { - "name": "Acme Inc", - "contact": [ - { - "name": "Acme Licensing Fulfillment", - "email": "licensing@example.com" - } - ] - } - }, - "licensee": { - "organization": { - "name": "Example Co." - } - }, - "purchaser": { - "individual": { - "name": "Samantha Wright", - "email": "samantha.wright@gmail.com", - "phone": "800-555-1212" - } - }, - "purchaseOrder": "PO-12345", - "licenseTypes": [ - "appliance" - ], - "lastRenewal": "2022-04-13T20:20:39+00:00", - "expiration": "2023-04-13T20:20:39+00:00" + "definitions": { + "components": [ + { + "type": "library", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } } - } - ] - } - ] + ], + "group": "com.acme", + "name": "cryptographic-provider", + "version": "2.2.0", + "licenses": [ + { + "bom-ref": "acme-license-1", + "expression": "LicenseRef-AcmeCommercialLicense", + "licensing": { + "altIds": [ + "acme", + "acme-license" + ], + "licensor": { + "organization": { + "name": "Acme Inc", + "contact": [ + { + "name": "Acme Licensing Fulfillment", + "email": "licensing@example.com" + } + ] + } + }, + "licensee": { + "organization": { + "name": "Example Co." + } + }, + "purchaser": { + "individual": { + "name": "Samantha Wright", + "email": "samantha.wright@gmail.com", + "phone": "800-555-1212" + } + }, + "purchaseOrder": "PO-12345", + "licenseTypes": [ + "appliance" + ], + "lastRenewal": "2022-04-13T20:20:39+00:00", + "expiration": "2023-04-13T20:20:39+00:00" + } + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-license-expression-with-text-2.0.json b/tools/src/test/resources/2.0/valid-license-expression-with-text-2.0.json index a5c400a7..bce90afb 100644 --- a/tools/src/test/resources/2.0/valid-license-expression-with-text-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-expression-with-text-2.0.json @@ -4,55 +4,55 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:8ad91ceb-1741-4d58-8d22-4488a0f68dbe", "version": 1, - "components": [ - { - "type": "application", - "name": "my-application", - "version": "1.33.7", - "description": "This application is composed of multiple things, and therefore has multiple licenses applied:\n* custom code - custom license\n* component A - EPL or GPL\n* component B - MIT\n* component C - MIT", - "licenses": [ - { - "bom-ref": "my-application-license", - "acknowledgement": "declared", - "expression": "LicenseRef-my-custom-license AND (EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0) AND MIT", - "expressionDetails": [ - { - "licenseIdentifier": "LicenseRef-my-custom-license", - "text": { - "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + "definitions": { + "components": [ + { + "type": "application", + "name": "my-application", + "version": "1.33.7", + "description": "This application is composed of multiple things, and therefore has multiple licenses applied:\n* custom code - custom license\n* component A - EPL or GPL\n* component B - MIT\n* component C - MIT", + "licenses": [ + { + "bom-ref": "my-application-license", + "acknowledgement": "declared", + "expression": "LicenseRef-my-custom-license AND (EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0) AND MIT", + "expressionDetails": [ + { + "licenseIdentifier": "LicenseRef-my-custom-license", + "text": { + "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + }, + "url": "https://my-application.example.com/license.txt" }, - "url": "https://my-application.example.com/license.txt" - }, - { - "licenseIdentifier": "EPL-2.0", - "text": { - "content": "Eclipse Public License - v 2.0\n\n THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION\n OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT..." - } - }, - { - "licenseIdentifier": "GPL-2.0 WITH Classpath-exception-2.0", - "text": { - "mediaType": "text/plain", - "content": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n \n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed...\n\n...\n\nLinking this library statically or dynamically with other modules is making a combined work based on this library..." - } - }, - { - "licenseIdentifier": "MIT", - "bom-ref": "LicenseDetails-component-B", - "text": { - "content": "MIT License\n\nCopyright (c) 1996 Component-B-Creators Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"),...\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software..." - } - }, - { - "licenseIdentifier": "MIT", - "bom-ref": "LicenseDetails-component-C", - "text": { - "content": "MIT License\n\nCopyright (c) 2001 Component-C-Creators Org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"),...\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software..." + { + "licenseIdentifier": "EPL-2.0", + "text": { + "content": "Eclipse Public License - v 2.0\n\n THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION\n OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT..." + } + }, + { + "licenseIdentifier": "GPL-2.0 WITH Classpath-exception-2.0", + "text": { + "mediaType": "text/plain", + "content": " GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n \n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed...\n\n...\n\nLinking this library statically or dynamically with other modules is making a combined work based on this library..." + } + }, + { + "licenseIdentifier": "MIT", + "text": { + "content": "MIT License\n\nCopyright (c) 1996 Component-B-Creators Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"),...\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software..." + } + }, + { + "licenseIdentifier": "MIT", + "text": { + "content": "MIT License\n\nCopyright (c) 2001 Component-C-Creators Org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"),...\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software..." + } } - } - ] - } - ] - } - ] + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-license-id-2.0.json b/tools/src/test/resources/2.0/valid-license-id-2.0.json index 902a3627..d518f00d 100644 --- a/tools/src/test/resources/2.0/valid-license-id-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-id-2.0.json @@ -4,47 +4,49 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "description": "Modified version of Apache Catalina", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ], - "licenses": [ - { - "license": { - "id": "Apache-2.0", - "acknowledgement": "declared", - "bom-ref": "my-license" + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } } - } - ] - } - ] + ], + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "description": "Modified version of Apache Catalina", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "acknowledgement": "declared", + "bom-ref": "my-license" + } + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-license-id-with-text-2.0.json b/tools/src/test/resources/2.0/valid-license-id-with-text-2.0.json index cda10301..422f7f2e 100644 --- a/tools/src/test/resources/2.0/valid-license-id-with-text-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-id-with-text-2.0.json @@ -4,51 +4,53 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "description": "Modified version of Apache Catalina", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ], - "licenses": [ - { - "license": { - "id": "Apache-2.0", - "acknowledgement": "declared", - "bom-ref": "my-license", - "text": { - "mediaType": "text/plain", - "content": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION..." + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "description": "Modified version of Apache Catalina", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "acknowledgement": "declared", + "bom-ref": "my-license", + "text": { + "mediaType": "text/plain", + "content": "\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION..." + } } } - } - ] - } - ] + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-license-name-2.0.json b/tools/src/test/resources/2.0/valid-license-name-2.0.json index d6d88d2c..fc7da2fa 100644 --- a/tools/src/test/resources/2.0/valid-license-name-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-name-2.0.json @@ -4,46 +4,48 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "description": "Modified version of Apache Catalina", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ], - "licenses": [ - { - "license": { - "name": "Apache License 2.0", - "bom-ref": "my-license" + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } } - } - ] - } - ] + ], + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "description": "Modified version of Apache Catalina", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ], + "licenses": [ + { + "license": { + "name": "Apache License 2.0", + "bom-ref": "my-license" + } + } + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-license-name-with-licensing-2.0.json b/tools/src/test/resources/2.0/valid-license-name-with-licensing-2.0.json index 5b2cd8ab..64649ac4 100644 --- a/tools/src/test/resources/2.0/valid-license-name-with-licensing-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-name-with-licensing-2.0.json @@ -4,59 +4,61 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "cryptographic-provider", - "version": "2.2.0", - "licenses": [ - { - "license": { - "bom-ref": "acme-license-1", - "name": "Acme Commercial License", - "licensing": { - "altIds": [ - "acme", - "acme-license" - ], - "licensor": { - "organization": { - "name": "Acme Inc", - "contact": [ - { - "name": "Acme Licensing Fulfillment", - "email": "licensing@example.com" - } - ] - } - }, - "licensee": { - "organization": { - "name": "Example Co." - } - }, - "purchaser": { - "individual": { - "name": "Samantha Wright", - "email": "samantha.wright@gmail.com", - "phone": "800-555-1212" - } - }, - "purchaseOrder": "PO-12345", - "licenseTypes": ["appliance"], - "lastRenewal": "2022-04-13T20:20:39+00:00", - "expiration": "2023-04-13T20:20:39+00:00" + "definitions": { + "components": [ + { + "type": "library", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "com.acme", + "name": "cryptographic-provider", + "version": "2.2.0", + "licenses": [ + { + "license": { + "bom-ref": "acme-license-1", + "name": "Acme Commercial License", + "licensing": { + "altIds": [ + "acme", + "acme-license" + ], + "licensor": { + "organization": { + "name": "Acme Inc", + "contact": [ + { + "name": "Acme Licensing Fulfillment", + "email": "licensing@example.com" + } + ] + } + }, + "licensee": { + "organization": { + "name": "Example Co." + } + }, + "purchaser": { + "individual": { + "name": "Samantha Wright", + "email": "samantha.wright@gmail.com", + "phone": "800-555-1212" + } + }, + "purchaseOrder": "PO-12345", + "licenseTypes": ["appliance"], + "lastRenewal": "2022-04-13T20:20:39+00:00", + "expiration": "2023-04-13T20:20:39+00:00" + } } } - } - ] - } - ] + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-license-name-with-text-2.0.json b/tools/src/test/resources/2.0/valid-license-name-with-text-2.0.json index 0e265dd2..75d525ed 100644 --- a/tools/src/test/resources/2.0/valid-license-name-with-text-2.0.json +++ b/tools/src/test/resources/2.0/valid-license-name-with-text-2.0.json @@ -4,51 +4,53 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "application", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "description": "Modified version of Apache Catalina", - "scope": "required", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ], - "licenses": [ - { - "license": { - "name": "My License", - "bom-ref": "my-license", - "acknowledgement": "declared", - "text": { - "mediaType": "text/plain", - "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec turpis efficitur, ullamcorper lorem ac, fermentum nulla. Mauris a enim nunc. Aliquam diam tellus, porttitor venenatis leo in, mollis ultricies lacus. Sed sagittis hendrerit nulla, eget pulvinar diam..." + "definitions": { + "components": [ + { + "type": "application", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "description": "Modified version of Apache Catalina", + "scope": "required", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ], + "licenses": [ + { + "license": { + "name": "My License", + "bom-ref": "my-license", + "acknowledgement": "declared", + "text": { + "mediaType": "text/plain", + "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec turpis efficitur, ullamcorper lorem ac, fermentum nulla. Mauris a enim nunc. Aliquam diam tellus, porttitor venenatis leo in, mollis ultricies lacus. Sed sagittis hendrerit nulla, eget pulvinar diam..." + } } } - } - ] - } - ] + ] + } + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-machine-learning-2.0.json b/tools/src/test/resources/2.0/valid-machine-learning-2.0.json index c95c7131..3e71aba5 100644 --- a/tools/src/test/resources/2.0/valid-machine-learning-2.0.json +++ b/tools/src/test/resources/2.0/valid-machine-learning-2.0.json @@ -4,104 +4,106 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "component-a", - "type": "machine-learning-model", - "parties": [ - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "CompVis", - "name": "stable-diffusion", - "version": "1.4", - "description": "Stable Diffusion is a latent text-to-image diffusion model capable of generating photo-realistic images given any text input. For more information about how Stable Diffusion functions, please have a look at \uD83E\uDD17's Stable Diffusion with \uD83E\uDDE8Diffusers blog.", - "modelCard": { - "modelParameters": { - "approach": { - "type": "supervised" + "definitions": { + "components": [ + { + "bom-ref": "component-a", + "type": "machine-learning-model", + "parties": [ + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "CompVis", + "name": "stable-diffusion", + "version": "1.4", + "description": "Stable Diffusion is a latent text-to-image diffusion model capable of generating photo-realistic images given any text input. For more information about how Stable Diffusion functions, please have a look at \uD83E\uDD17's Stable Diffusion with \uD83E\uDDE8Diffusers blog.", + "modelCard": { + "modelParameters": { + "approach": { + "type": "supervised" + }, + "task": "task goes here", + "architectureFamily": "the architecture family goes here", + "modelArchitecture": "The architecture of the model.", + "datasets": [ + { + "type": "dataset", + "name": "Training Data", + "contents": { + "url": "https://example.com/path/to/dataset" + }, + "classification": "public" + } + ], + "inputs": [ + { + "format": "string" + } + ], + "outputs": [ + { + "format": "byte[]" + } + ] }, - "task": "task goes here", - "architectureFamily": "the architecture family goes here", - "modelArchitecture": "The architecture of the model.", - "datasets": [ - { - "type": "dataset", - "name": "Training Data", - "contents": { - "url": "https://example.com/path/to/dataset" - }, - "classification": "public" - } - ], - "inputs": [ - { - "format": "string" - } - ], - "outputs": [ - { - "format": "byte[]" - } - ] - }, - "quantitativeAnalysis": { - "performanceMetrics": [ - { - "type": "The type of performance metric", - "value": "The value of the performance metric", - "slice": "The name of the slice this metric was computed on. By default, assume this metric is not sliced", - "confidenceInterval": { - "lowerBound": "The lower bound of the confidence interval", - "upperBound": "The upper bound of the confidence interval" + "quantitativeAnalysis": { + "performanceMetrics": [ + { + "type": "The type of performance metric", + "value": "The value of the performance metric", + "slice": "The name of the slice this metric was computed on. By default, assume this metric is not sliced", + "confidenceInterval": { + "lowerBound": "The lower bound of the confidence interval", + "upperBound": "The upper bound of the confidence interval" + } } + ], + "graphics": { + "description": "Performance images", + "collection": [ + { + "name": "FID vs CLIP Scores on 512x512 samples for different v1-versions", + "image": { + "mediaType": "image/jpeg", + "encoding": "base64", + "content": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAH4AxgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo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" + } + } + ] } - ], - "graphics": { - "description": "Performance images", - "collection": [ + }, + "considerations": { + "users": [ + "Who are the intended users of the model?" + ], + "useCases": [ + "Who are the intended users of the model?" + ], + "technicalLimitations": [ + "What are the known technical limitations of the model? E.g. What kind(s) of data should the model be expected not to perform well on? What are the factors that might degrade model performance?" + ], + "performanceTradeoffs": [ + "What are the known tradeoffs in accuracy/performance of the model?" + ], + "ethicalConsiderations": [ { - "name": "FID vs CLIP Scores on 512x512 samples for different v1-versions", - "image": { - "mediaType": "image/jpeg", - "encoding": "base64", - "content": "/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAH4AxgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo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" - } + "name": "The name of the risk", + "mitigationStrategy": "Strategy used to address this risk" + } + ], + "fairnessAssessments": [ + { + "groupAtRisk": "The groups or individuals at risk of being systematically disadvantaged by the model", + "benefits": "Expected benefits to the identified groups", + "harms": "Expected harms to the identified groups", + "mitigationStrategy": "With respect to the benefits and harms outlined, please describe any mitigation strategy implemented." } ] } - }, - "considerations": { - "users": [ - "Who are the intended users of the model?" - ], - "useCases": [ - "Who are the intended users of the model?" - ], - "technicalLimitations": [ - "What are the known technical limitations of the model? E.g. What kind(s) of data should the model be expected not to perform well on? What are the factors that might degrade model performance?" - ], - "performanceTradeoffs": [ - "What are the known tradeoffs in accuracy/performance of the model?" - ], - "ethicalConsiderations": [ - { - "name": "The name of the risk", - "mitigationStrategy": "Strategy used to address this risk" - } - ], - "fairnessAssessments": [ - { - "groupAtRisk": "The groups or individuals at risk of being systematically disadvantaged by the model", - "benefits": "Expected benefits to the identified groups", - "harms": "Expected harms to the identified groups", - "mitigationStrategy": "With respect to the benefits and harms outlined, please describe any mitigation strategy implemented." - } - ] } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-machine-learning-considerations-env-2.0.json b/tools/src/test/resources/2.0/valid-machine-learning-considerations-env-2.0.json index 765bcaf5..639965a3 100644 --- a/tools/src/test/resources/2.0/valid-machine-learning-considerations-env-2.0.json +++ b/tools/src/test/resources/2.0/valid-machine-learning-considerations-env-2.0.json @@ -4,69 +4,71 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:ed5c5ba0-2be6-4b58-ac29-01a7fd375123", "version": 1, - "components": [ - { - "bom-ref": "huggingface.co-meta-llama-Llama-2-7b", - "group": "meta-llama", - "name": "Llama-2-7b", - "type": "machine-learning-model", - "parties": [ - { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Hugging Face" } - }, - { - "roles": [ { "role": "publisher" } ], - "organization": { "name": "meta" } - } - ], - "externalReferences": [ - { - "type": "distribution", - "url": "https://huggingface.co/meta-llama/Llama-2-7b" - } - ], - "modelCard": { - "considerations": { - "environmentalConsiderations": { - "energyConsumptions": [ - { - "activity": "training", - "energyProviders": [ - { - "description": "Meta data-center, US-East", - "organization": { - "name": "Meta", - "address": { - "country": "United States", - "region": "New Jersey", - "locality": "Newark" + "definitions": { + "components": [ + { + "bom-ref": "huggingface.co-meta-llama-Llama-2-7b", + "group": "meta-llama", + "name": "Llama-2-7b", + "type": "machine-learning-model", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Hugging Face" } + }, + { + "roles": [ { "role": "publisher" } ], + "organization": { "name": "meta" } + } + ], + "externalReferences": [ + { + "type": "distribution", + "url": "https://huggingface.co/meta-llama/Llama-2-7b" + } + ], + "modelCard": { + "considerations": { + "environmentalConsiderations": { + "energyConsumptions": [ + { + "activity": "training", + "energyProviders": [ + { + "description": "Meta data-center, US-East", + "organization": { + "name": "Meta", + "address": { + "country": "United States", + "region": "New Jersey", + "locality": "Newark" + } + }, + "energySource": "natural-gas", + "energyProvided": { + "value": 0.4, + "unit": "kWh" } - }, - "energySource": "natural-gas", - "energyProvided": { - "value": 0.4, - "unit": "kWh" } + ], + "activityEnergyCost": { + "value": 0.4, + "unit": "kWh" + }, + "co2CostEquivalent": { + "value": 31.22, + "unit": "tCO2eq" + }, + "co2CostOffset": { + "value": 31.22, + "unit": "tCO2eq" } - ], - "activityEnergyCost": { - "value": 0.4, - "unit": "kWh" - }, - "co2CostEquivalent": { - "value": 31.22, - "unit": "tCO2eq" - }, - "co2CostOffset": { - "value": 31.22, - "unit": "tCO2eq" } - } - ] + ] + } } } } - } - ] + ] + } } \ No newline at end of file diff --git a/tools/src/test/resources/2.0/valid-metadata-author-2.0.json b/tools/src/test/resources/2.0/valid-metadata-author-2.0.json index c64009b3..752dfc98 100644 --- a/tools/src/test/resources/2.0/valid-metadata-author-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-author-2.0.json @@ -13,5 +13,7 @@ } ] }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/valid-metadata-distribution-2.0.json b/tools/src/test/resources/2.0/valid-metadata-distribution-2.0.json index 764cbb66..2e9adffd 100644 --- a/tools/src/test/resources/2.0/valid-metadata-distribution-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-distribution-2.0.json @@ -9,5 +9,7 @@ "tlp": "RED" } }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/valid-metadata-license-2.0.json b/tools/src/test/resources/2.0/valid-metadata-license-2.0.json index 49f6f41a..bba19deb 100644 --- a/tools/src/test/resources/2.0/valid-metadata-license-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-license-2.0.json @@ -21,5 +21,7 @@ } ] }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/valid-metadata-lifecycle-2.0.json b/tools/src/test/resources/2.0/valid-metadata-lifecycle-2.0.json index 97372bd2..3e44b7aa 100644 --- a/tools/src/test/resources/2.0/valid-metadata-lifecycle-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-lifecycle-2.0.json @@ -18,5 +18,7 @@ } ] }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/valid-metadata-manufacturer-2.0.json b/tools/src/test/resources/2.0/valid-metadata-manufacturer-2.0.json index 2ba96283..17d467a5 100644 --- a/tools/src/test/resources/2.0/valid-metadata-manufacturer-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-manufacturer-2.0.json @@ -20,5 +20,7 @@ ] } }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/valid-metadata-supplier-2.0.json b/tools/src/test/resources/2.0/valid-metadata-supplier-2.0.json index d6c7e03f..a9f3f059 100644 --- a/tools/src/test/resources/2.0/valid-metadata-supplier-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-supplier-2.0.json @@ -4,21 +4,36 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "metadata": { - "supplier": { - "bom-ref": "supplier-1", - "name": "Acme, Inc.", - "url": [ - "https://example.com" - ], - "contact": [ - { - "bom-ref": "contact-1", - "name": "Acme Distribution", - "email": "distribution@example.com" - } + "inventories": [ + { + "subject": { + "bom-ref": "acme-application", + "type": "application", + "name": "Acme Application", + "version": "9.1.1", + "parties": [ + { + "bom-ref": "party-acme-supplier", + "roles": [ + { + "role": "supplier" + } + ], + "organization": { + "legalName": "Acme, Inc.", + "url": [ + { + "name": "homepage", + "url": "https://www.acme.example.com" + } + ] + } + } + ] + }, + "components": [ + { "bom-ref": "pkg:maven/acme/library@3.0", "type": "library", "name": "Acme Library", "version": "3.0" } ] } - }, - "components": [] + ] } diff --git a/tools/src/test/resources/2.0/valid-metadata-timestamp-2.0.json b/tools/src/test/resources/2.0/valid-metadata-timestamp-2.0.json index cc8ff5c7..ab38f2e3 100644 --- a/tools/src/test/resources/2.0/valid-metadata-timestamp-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-timestamp-2.0.json @@ -7,5 +7,7 @@ "metadata": { "timestamp": "2020-04-13T20:20:39+00:00" }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/valid-metadata-tool-2.0.json b/tools/src/test/resources/2.0/valid-metadata-tool-2.0.json index c059e678..7c80aa3c 100644 --- a/tools/src/test/resources/2.0/valid-metadata-tool-2.0.json +++ b/tools/src/test/resources/2.0/valid-metadata-tool-2.0.json @@ -55,5 +55,7 @@ ] } }, - "components": [] + "definitions": { + "components": [] + } } diff --git a/tools/src/test/resources/2.0/valid-minimal-viable-2.0.json b/tools/src/test/resources/2.0/valid-minimal-viable-2.0.json index a8c300ee..79a6465c 100644 --- a/tools/src/test/resources/2.0/valid-minimal-viable-2.0.json +++ b/tools/src/test/resources/2.0/valid-minimal-viable-2.0.json @@ -4,10 +4,12 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-library" - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library" + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-origin-stage-lifecycle-2.0.json b/tools/src/test/resources/2.0/valid-origin-stage-lifecycle-2.0.json index 2d3a331d..e8d94c73 100644 --- a/tools/src/test/resources/2.0/valid-origin-stage-lifecycle-2.0.json +++ b/tools/src/test/resources/2.0/valid-origin-stage-lifecycle-2.0.json @@ -4,130 +4,132 @@ "specVersion": "2.0", "version": 1, "serialNumber": "urn:uuid:1f0e9c2a-6b7d-4a3e-9c1f-0a2b3c4d5e15", - "components": [ - { - "bom-ref": "comp-flight-controller", - "type": "device", - "name": "Acme Flight Controller", - "origins": [ - { - "stage": "designed", - "basis": "engineering hours", - "distribution": [ - { - "isoCode": "US", - "percentage": 100 - } - ] - }, - { - "stage": "manufactured", - "basis": "manufacturing cost", - "distribution": [ - { - "isoCode": "TW", - "percentage": 100 - } - ] - }, - { - "stage": "tested", - "basis": "manufacturing cost", - "distribution": [ - { - "isoCode": "MY", - "percentage": 100 - } - ] - } - ] - }, - { - "bom-ref": "comp-acme-crypto", - "type": "library", - "name": "acme-crypto", - "version": "3.1.0", - "origins": [ - { - "stage": "developed", - "basis": "engineering hours", - "distribution": [ - { - "isoCode": "US", - "percentage": 70 - }, - { - "isoCode": "DE", - "percentage": 30 - } - ] - }, - { - "stage": "built", - "basis": "build execution", - "distribution": [ - { - "isoCode": "US", - "percentage": 100 - } - ] - }, - { - "stage": "maintained", - "basis": "engineering hours", - "distribution": [ - { - "isoCode": "US", - "percentage": 80 - }, - { - "isoCode": "IN", - "percentage": 20 - } - ] - } - ] - }, - { - "bom-ref": "comp-acme-vision", - "type": "machine-learning-model", - "name": "acme-vision", - "version": "2.4.0", - "origins": [ - { - "stage": "trained", - "basis": "compute cost", - "distribution": [ - { - "isoCode": "US", - "percentage": 100 - } - ] - } - ], - "components": [ - { - "bom-ref": "comp-vision-corpus", - "type": "data", - "name": "Vision Training Corpus", - "origins": [ - { - "stage": "collected", - "basis": "record count", - "distribution": [ - { - "isoCode": "US", - "percentage": 60 - }, - { - "isoCode": "GB", - "percentage": 40 - } - ] - } - ] - } - ] - } - ] + "definitions": { + "components": [ + { + "bom-ref": "comp-flight-controller", + "type": "device", + "name": "Acme Flight Controller", + "origins": [ + { + "stage": "designed", + "basis": "engineering hours", + "distribution": [ + { + "isoCode": "US", + "percentage": 100 + } + ] + }, + { + "stage": "manufactured", + "basis": "manufacturing cost", + "distribution": [ + { + "isoCode": "TW", + "percentage": 100 + } + ] + }, + { + "stage": "tested", + "basis": "manufacturing cost", + "distribution": [ + { + "isoCode": "MY", + "percentage": 100 + } + ] + } + ] + }, + { + "bom-ref": "comp-acme-crypto", + "type": "library", + "name": "acme-crypto", + "version": "3.1.0", + "origins": [ + { + "stage": "developed", + "basis": "engineering hours", + "distribution": [ + { + "isoCode": "US", + "percentage": 70 + }, + { + "isoCode": "DE", + "percentage": 30 + } + ] + }, + { + "stage": "built", + "basis": "build execution", + "distribution": [ + { + "isoCode": "US", + "percentage": 100 + } + ] + }, + { + "stage": "maintained", + "basis": "engineering hours", + "distribution": [ + { + "isoCode": "US", + "percentage": 80 + }, + { + "isoCode": "IN", + "percentage": 20 + } + ] + } + ] + }, + { + "bom-ref": "comp-acme-vision", + "type": "machine-learning-model", + "name": "acme-vision", + "version": "2.4.0", + "origins": [ + { + "stage": "trained", + "basis": "compute cost", + "distribution": [ + { + "isoCode": "US", + "percentage": 100 + } + ] + } + ], + "components": [ + { + "bom-ref": "comp-vision-corpus", + "type": "data", + "name": "Vision Training Corpus", + "origins": [ + { + "stage": "collected", + "basis": "record count", + "distribution": [ + { + "isoCode": "US", + "percentage": 60 + }, + { + "isoCode": "GB", + "percentage": 40 + } + ] + } + ] + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-party-ai-agent-2.0.json b/tools/src/test/resources/2.0/valid-party-ai-agent-2.0.json index 9c77071a..d27f2344 100644 --- a/tools/src/test/resources/2.0/valid-party-ai-agent-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-ai-agent-2.0.json @@ -4,89 +4,92 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:33333333-3333-3333-3333-333333333333", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme Web Service" - } - }, - "components": [ - { - "bom-ref": "comp-coding-agent-runtime", - "type": "application", - "name": "Acme Coding Copilot Runtime", - "version": "1.0.0" - }, + "inventories": [ { - "bom-ref": "comp-generated-module", - "type": "library", - "name": "AI-Generated Code Module", - "version": "0.1.0", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme Web Service" + }, + "components": [ { - "bom-ref": "actor-coding-agent", - "roles": [ - { - "role": "agent" - }, - { - "role": "author" - }, + "bom-ref": "comp-coding-agent-runtime", + "type": "application", + "name": "Acme Coding Copilot Runtime", + "version": "1.0.0" + }, + { + "bom-ref": "comp-generated-module", + "type": "library", + "name": "AI-Generated Code Module", + "version": "0.1.0", + "parties": [ { - "role": "delegate" - } - ], - "system": { - "kind": "agent", - "ref": "comp-coding-agent-runtime", - "identifiers": [ - { - "scheme": "oidc-sub", - "value": "agent:acme/coding-copilot:user:alice@example.com" + "bom-ref": "actor-coding-agent", + "roles": [ + { + "role": "agent" + }, + { + "role": "author" + }, + { + "role": "delegate" + } + ], + "system": { + "kind": "agent", + "ref": "comp-coding-agent-runtime", + "identifiers": [ + { + "scheme": "oidc-sub", + "value": "agent:acme/coding-copilot:user:alice@example.com" + }, + { + "scheme": "spiffe", + "value": "spiffe://acme.example.com/agents/coding-copilot/alice" + }, + { + "scheme": "did", + "value": "did:web:acme.example.com:agents:coding-copilot:alice" + } + ], + "permissions": [ + "read-source-repository", + "execute-test-suite", + "propose-pull-request", + "comment-on-issue" + ] }, - { - "scheme": "spiffe", - "value": "spiffe://acme.example.com/agents/coding-copilot/alice" + "relations": { + "delegatedBy": "actor-alice" }, - { - "scheme": "did", - "value": "did:web:acme.example.com:agents:coding-copilot:alice" - } - ], - "permissions": [ - "read-source-repository", - "execute-test-suite", - "propose-pull-request", - "comment-on-issue" - ] - }, - "relations": { - "delegatedBy": "actor-alice" - }, - "tags": [ - "ai-agent", - "delegated-authority", - "human-in-the-loop" - ], - "properties": [ - { - "name": "cdx:agent:human-in-the-loop", - "value": "true" - }, - { - "name": "cdx:agent:requires-approval", - "value": "merge-to-main" - }, - { - "name": "cdx:agent:session-id", - "value": "sess-2026-05-12-a7b3c9" - } - ], - "externalReferences": [ - { - "type": "documentation", - "url": "https://docs.acme.example.com/coding-copilot/operations", - "comment": "Operational documentation describing the agent's behavior bounds and escalation paths." + "tags": [ + "ai-agent", + "delegated-authority", + "human-in-the-loop" + ], + "properties": [ + { + "name": "cdx:agent:human-in-the-loop", + "value": "true" + }, + { + "name": "cdx:agent:requires-approval", + "value": "merge-to-main" + }, + { + "name": "cdx:agent:session-id", + "value": "sess-2026-05-12-a7b3c9" + } + ], + "externalReferences": [ + { + "type": "documentation", + "url": "https://docs.acme.example.com/coding-copilot/operations", + "comment": "Operational documentation describing the agent's behavior bounds and escalation paths." + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-capability-profile-2.0.json b/tools/src/test/resources/2.0/valid-party-capability-profile-2.0.json index 2e3099a7..be471fae 100644 --- a/tools/src/test/resources/2.0/valid-party-capability-profile-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-capability-profile-2.0.json @@ -4,41 +4,44 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:44444444-4444-4444-4444-444444444444", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Industrial Sensor" - } - }, - "components": [ + "inventories": [ { - "bom-ref": "comp-sensor", - "type": "device", - "name": "Temperature Probe", - "parties": [ - { - "bom-ref": "party-acme-mfg-primary", - "roles": [ - { "role": "manufacturer", "order": 1 }, - { "role": "supplier", "order": 1 } - ], - "organization": { - "name": "Acme Manufacturing", - "legalName": "Acme Manufacturing, Inc.", - "jurisdiction": "US-CA" - } - }, + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Industrial Sensor" + }, + "components": [ { - "bom-ref": "party-acme-mfg-alternate", - "roles": [ - { "role": "manufacturer", "order": 2 }, - { "role": "supplier", "order": 2 } - ], - "organization": { - "name": "Acme Manufacturing East", - "legalName": "Acme Manufacturing East, LLC", - "jurisdiction": "US-NJ" - } + "bom-ref": "comp-sensor", + "type": "device", + "name": "Temperature Probe", + "parties": [ + { + "bom-ref": "party-acme-mfg-primary", + "roles": [ + { "role": "manufacturer", "order": 1 }, + { "role": "supplier", "order": 1 } + ], + "organization": { + "name": "Acme Manufacturing", + "legalName": "Acme Manufacturing, Inc.", + "jurisdiction": "US-CA" + } + }, + { + "bom-ref": "party-acme-mfg-alternate", + "roles": [ + { "role": "manufacturer", "order": 2 }, + { "role": "supplier", "order": 2 } + ], + "organization": { + "name": "Acme Manufacturing East", + "legalName": "Acme Manufacturing East, LLC", + "jurisdiction": "US-NJ" + } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-component-as-system-2.0.json b/tools/src/test/resources/2.0/valid-party-component-as-system-2.0.json index b7103ee1..d7aa1c42 100644 --- a/tools/src/test/resources/2.0/valid-party-component-as-system-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-component-as-system-2.0.json @@ -4,44 +4,47 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:22222222-2222-2222-2222-222222222222", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Product" - } - }, - "components": [ - { - "bom-ref": "comp-acme-scanner", - "type": "application", - "name": "Acme Scanner", - "version": "3.2" - }, + "inventories": [ { - "bom-ref": "comp-target", - "type": "library", - "name": "Analyzed Library", - "version": "1.4.0", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, + "components": [ { - "bom-ref": "actor-acme-scanner", - "roles": [ - { - "role": "author" - }, + "bom-ref": "comp-acme-scanner", + "type": "application", + "name": "Acme Scanner", + "version": "3.2" + }, + { + "bom-ref": "comp-target", + "type": "library", + "name": "Analyzed Library", + "version": "1.4.0", + "parties": [ { - "role": "reviewer" + "bom-ref": "actor-acme-scanner", + "roles": [ + { + "role": "author" + }, + { + "role": "reviewer" + } + ], + "system": { + "kind": "software-system", + "ref": "comp-acme-scanner", + "permissions": [ + "read-source-code", + "write-sbom-artifacts", + "sign-attestations" + ] + } } - ], - "system": { - "kind": "software-system", - "ref": "comp-acme-scanner", - "permissions": [ - "read-source-code", - "write-sbom-artifacts", - "sign-attestations" - ] - } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-custom-role-2.0.json b/tools/src/test/resources/2.0/valid-party-custom-role-2.0.json index 6ae5e2a5..1c38c07c 100644 --- a/tools/src/test/resources/2.0/valid-party-custom-role-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-custom-role-2.0.json @@ -3,30 +3,33 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "GDPR-Subject Application" - } - }, - "components": [ + "inventories": [ { - "type": "application", - "name": "Customer Records Service", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "GDPR-Subject Application" + }, + "components": [ { - "roles": [ + "type": "application", + "name": "Customer Records Service", + "parties": [ { - "name": "Data Protection Officer", - "description": "Custom role for the EU GDPR Article 37 designated officer." + "roles": [ + { + "name": "Data Protection Officer", + "description": "Custom role for the EU GDPR Article 37 designated officer." + } + ], + "person": { + "name": "Eve Carter", + "email": [ + { "name": "work", "address": "dpo@example.com" } + ] + } } - ], - "person": { - "name": "Eve Carter", - "email": [ - { "name": "work", "address": "dpo@example.com" } - ] - } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-organization-all-fields-2.0.json b/tools/src/test/resources/2.0/valid-party-organization-all-fields-2.0.json index f83a0246..bada6241 100644 --- a/tools/src/test/resources/2.0/valid-party-organization-all-fields-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-organization-all-fields-2.0.json @@ -5,157 +5,162 @@ "serialNumber": "urn:uuid:11111111-1111-1111-1111-111111111111", "version": 1, "metadata": { - "timestamp": "2026-05-13T00:00:00Z", - "component": { - "type": "device", - "name": "Acme Product" - } + "timestamp": "2026-05-13T00:00:00Z" }, - "components": [ + "inventories": [ { - "bom-ref": "comp-acme-product", - "type": "device", - "name": "Acme Industrial Sensor", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, + "components": [ { - "bom-ref": "actor-globex-holdings", - "roles": [ - { - "role": "manufacturer", - "order": 1 - }, - { - "role": "supplier" - }, - { - "role": "publisher" - }, + "bom-ref": "comp-acme-product", + "type": "device", + "name": "Acme Industrial Sensor", + "parties": [ { - "name": "Sustainability Auditor", - "description": "Custom role for the internal sustainability review function that operates alongside external auditors." - } - ], - "organization": { - "name": "Globex", - "legalName": "Globex Holdings, Inc.", - "description": "Diversified manufacturer headquartered in New York with operations across North America and Europe.", - "logo": "https://www.globex.example.com/assets/logo.svg", - "foundingDate": "1989-06-15", - "dissolutionDate": "2099-12-31", - "jurisdiction": "US-DE", - "identifiers": [ - { - "scheme": "lei", - "schemeVersion": "ISO 17442:2020", - "value": "5493001KJTIIGC8Y1R12", - "issuedDate": "2018-04-12", - "expirationDate": "2026-04-12", - "issuer": "actor-gleif" - }, - { - "scheme": "duns", - "value": "079530961" + "bom-ref": "actor-globex-holdings", + "roles": [ + { + "role": "manufacturer", + "order": 1 + }, + { + "role": "supplier" + }, + { + "role": "publisher" + }, + { + "name": "Sustainability Auditor", + "description": "Custom role for the internal sustainability review function that operates alongside external auditors." + } + ], + "organization": { + "name": "Globex", + "legalName": "Globex Holdings, Inc.", + "description": "Diversified manufacturer headquartered in New York with operations across North America and Europe.", + "logo": "https://www.globex.example.com/assets/logo.svg", + "foundingDate": "1989-06-15", + "dissolutionDate": "2099-12-31", + "jurisdiction": "US-DE", + "identifiers": [ + { + "scheme": "lei", + "schemeVersion": "ISO 17442:2020", + "value": "5493001KJTIIGC8Y1R12", + "issuedDate": "2018-04-12", + "expirationDate": "2026-04-12", + "issuer": "actor-gleif" + }, + { + "scheme": "duns", + "value": "079530961" + }, + { + "scheme": "iso6523", + "value": "0060:079530961", + "schemeVersion": "ISO/IEC 6523-1:1998" + }, + { + "scheme": { + "name": "Internal Supplier Code", + "description": "Globex internal ERP supplier identifier", + "url": "https://internal.globex.example.com/erp/suppliers" + }, + "value": "SUP-00482" + } + ], + "formerNames": [ + "Globex Industries, Inc.", + "Globex Manufacturing Group" + ], + "url": [ + { "name": "homepage", "url": "https://www.globex.example.com" }, + { "name": "investor", "url": "https://investor.globex.example.com" } + ], + "addresses": [ + { + "bom-ref": "addr-globex-hq", + "streetAddress": "Globex Tower\nFloor 42\n200 Park Avenue", + "locality": "New York", + "region": "New York", + "postalCode": "10166", + "country": "United States", + "isoCode": "US-NY", + "postOfficeBoxNumber": "1200", + "coordinates": { + "latitude": 40.7551, + "longitude": -73.9756, + "altitude": 12, + "datum": "WGS84" + } + }, + { + "bom-ref": "addr-globex-plant", + "streetAddress": "5 Industrial Parkway", + "locality": "Hillsboro", + "isoCode": "US-OR", + "country": "United States", + "coordinates": { + "latitude": 45.5229, + "longitude": -122.9898 + } + } + ] }, - { - "scheme": "iso6523", - "value": "0060:079530961", - "schemeVersion": "ISO/IEC 6523-1:1998" + "relations": { + "parent": "actor-globex-parent-trust", + "delegatedBy": "actor-globex-board" }, - { - "scheme": { - "name": "Internal Supplier Code", - "description": "Globex internal ERP supplier identifier", - "url": "https://internal.globex.example.com/erp/suppliers" + "tags": [ + "fortune-500", + "iso-9001-certified", + "iso-14001-certified" + ], + "properties": [ + { + "name": "cdx:actor:stock-ticker", + "value": "GBX" }, - "value": "SUP-00482" - } - ], - "formerNames": [ - "Globex Industries, Inc.", - "Globex Manufacturing Group" - ], - "url": [ - { "name": "homepage", "url": "https://www.globex.example.com" }, - { "name": "investor", "url": "https://investor.globex.example.com" } - ], - "addresses": [ - { - "bom-ref": "addr-globex-hq", - "streetAddress": "Globex Tower\nFloor 42\n200 Park Avenue", - "locality": "New York", - "region": "New York", - "postalCode": "10166", - "country": "United States", - "isoCode": "US-NY", - "postOfficeBoxNumber": "1200", - "coordinates": { - "latitude": 40.7551, - "longitude": -73.9756, - "altitude": 12, - "datum": "WGS84" + { + "name": "cdx:actor:industry-naics", + "value": "334413" } - }, - { - "bom-ref": "addr-globex-plant", - "streetAddress": "5 Industrial Parkway", - "locality": "Hillsboro", - "isoCode": "US-OR", - "country": "United States", - "coordinates": { - "latitude": 45.5229, - "longitude": -122.9898 + ], + "externalReferences": [ + { + "type": "website", + "url": "https://www.globex.example.com" + }, + { + "type": "documentation", + "url": "https://www.globex.example.com/about/governance", + "comment": "Corporate governance disclosures." } - } - ] - }, - "relations": { - "parent": "actor-globex-parent-trust", - "delegatedBy": "actor-globex-board" - }, - "tags": [ - "fortune-500", - "iso-9001-certified", - "iso-14001-certified" - ], - "properties": [ - { - "name": "cdx:actor:stock-ticker", - "value": "GBX" + ] }, { - "name": "cdx:actor:industry-naics", - "value": "334413" - } - ], - "externalReferences": [ - { - "type": "website", - "url": "https://www.globex.example.com" - }, - { - "type": "documentation", - "url": "https://www.globex.example.com/about/governance", - "comment": "Corporate governance disclosures." + "bom-ref": "actor-globex-support", + "roles": [ + { + "role": "support-contact" + } + ], + "person": { + "name": "Jordan Reyes", + "email": [ + { "name": "work", "address": "support@globex.example.com" } + ], + "phone": [ + { "name": "office", "number": "+1-555-0188" } + ], + "affiliation": "actor-globex-holdings" + } } ] - }, - { - "bom-ref": "actor-globex-support", - "roles": [ - { - "role": "support-contact" - } - ], - "person": { - "name": "Jordan Reyes", - "email": [ - { "name": "work", "address": "support@globex.example.com" } - ], - "phone": [ - { "name": "office", "number": "+1-555-0188" } - ], - "affiliation": "actor-globex-holdings" - } } ] } diff --git a/tools/src/test/resources/2.0/valid-party-organization-with-component-supplier-2.0.json b/tools/src/test/resources/2.0/valid-party-organization-with-component-supplier-2.0.json index 6742e73d..2728a2e5 100644 --- a/tools/src/test/resources/2.0/valid-party-organization-with-component-supplier-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-organization-with-component-supplier-2.0.json @@ -3,51 +3,54 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Acme Product" - } - }, - "components": [ + "inventories": [ { - "type": "device", - "name": "Microcontroller", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Acme Product" + }, + "components": [ { - "bom-ref": "party-acme-mcu", - "roles": [ - { - "role": "manufacturer" - }, + "type": "device", + "name": "Microcontroller", + "parties": [ { - "role": "supplier" - } - ], - "organization": { - "legalName": "Acme Microcontrollers S.r.l.", - "jurisdiction": "IT-BO", - "identifiers": [ - { - "scheme": "vat", - "value": "IT09686720019" - } - ], - "url": [ - { "name": "homepage", "url": "https://www.acme-mcu.example.com" } - ], - "addresses": [ - { - "streetAddress": "Via dei Fornai 10", - "locality": "Bologna", - "isoCode": "IT-BO", - "coordinates": { - "latitude": 45.5845, - "longitude": 9.2744 + "bom-ref": "party-acme-mcu", + "roles": [ + { + "role": "manufacturer" + }, + { + "role": "supplier" } + ], + "organization": { + "legalName": "Acme Microcontrollers S.r.l.", + "jurisdiction": "IT-BO", + "identifiers": [ + { + "scheme": "vat", + "value": "IT09686720019" + } + ], + "url": [ + { "name": "homepage", "url": "https://www.acme-mcu.example.com" } + ], + "addresses": [ + { + "streetAddress": "Via dei Fornai 10", + "locality": "Bologna", + "isoCode": "IT-BO", + "coordinates": { + "latitude": 45.5845, + "longitude": 9.2744 + } + } + ] } - ] - } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-person-2.0.json b/tools/src/test/resources/2.0/valid-party-person-2.0.json index d012948d..741d15eb 100644 --- a/tools/src/test/resources/2.0/valid-party-person-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-person-2.0.json @@ -3,56 +3,59 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Acme App" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "Some Library", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Acme App" + }, + "components": [ { - "bom-ref": "actor-alice", - "roles": [ + "type": "library", + "name": "Some Library", + "parties": [ { - "role": "author" - } - ], - "person": { - "name": "Alice Marie Wright", - "sortName": "Wright, Alice Marie", - "honorificPrefix": "Dr.", - "honorificSuffix": "PhD", - "jobTitle": "Principal Software Engineer", - "description": "Lead author of the analyzed library. Maintains the cryptography subsystem and reviews release candidates.", - "email": [ - { "name": "work", "address": "alice@example.com" } - ], - "phone": [ - { "name": "mobile", "number": "+1-555-0177" } - ], - "url": [ - { - "name": "homepage", - "url": "https://alice.example.com" - }, - { - "name": "github", - "url": "https://github.com/alice" - }, - { - "name": "linkedin", - "url": "https://www.linkedin.com/in/alice-wright" + "bom-ref": "actor-alice", + "roles": [ + { + "role": "author" + } + ], + "person": { + "name": "Alice Marie Wright", + "sortName": "Wright, Alice Marie", + "honorificPrefix": "Dr.", + "honorificSuffix": "PhD", + "jobTitle": "Principal Software Engineer", + "description": "Lead author of the analyzed library. Maintains the cryptography subsystem and reviews release candidates.", + "email": [ + { "name": "work", "address": "alice@example.com" } + ], + "phone": [ + { "name": "mobile", "number": "+1-555-0177" } + ], + "url": [ + { + "name": "homepage", + "url": "https://alice.example.com" + }, + { + "name": "github", + "url": "https://github.com/alice" + }, + { + "name": "linkedin", + "url": "https://www.linkedin.com/in/alice-wright" + } + ], + "address": { + "isoCode": "US-CA", + "locality": "Mountain View" + } } - ], - "address": { - "isoCode": "US-CA", - "locality": "Mountain View" } - } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-persona-attacker-2.0.json b/tools/src/test/resources/2.0/valid-party-persona-attacker-2.0.json index ec241da6..87ace02c 100644 --- a/tools/src/test/resources/2.0/valid-party-persona-attacker-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-persona-attacker-2.0.json @@ -3,28 +3,31 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Threat-Modeled Product" - } - }, - "components": [ + "inventories": [ { - "type": "application", - "name": "Threat-Modeled Product Frontend", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Threat-Modeled Product" + }, + "components": [ { - "roles": [ + "type": "application", + "name": "Threat-Modeled Product Frontend", + "parties": [ { - "role": "attacker" + "roles": [ + { + "role": "attacker" + } + ], + "persona": { + "archetype": "attacker", + "scope": "external", + "assumedPosture": "unauthenticated" + } } - ], - "persona": { - "archetype": "attacker", - "scope": "external", - "assumedPosture": "unauthenticated" - } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-persona-end-user-2.0.json b/tools/src/test/resources/2.0/valid-party-persona-end-user-2.0.json index 2c6dc6d6..a917a32d 100644 --- a/tools/src/test/resources/2.0/valid-party-persona-end-user-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-persona-end-user-2.0.json @@ -3,33 +3,36 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Mobile Banking App" - } - }, - "components": [ + "inventories": [ { - "type": "application", - "name": "Mobile Banking App Frontend", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Mobile Banking App" + }, + "components": [ { - "roles": [ + "type": "application", + "name": "Mobile Banking App Frontend", + "parties": [ { - "role": "end-user" + "roles": [ + { + "role": "end-user" + } + ], + "persona": { + "archetype": "end-user", + "scope": "external", + "assumedPosture": "authenticated", + "permissions": [ + "view-account", + "initiate-payment", + "update-profile" + ] + } } - ], - "persona": { - "archetype": "end-user", - "scope": "external", - "assumedPosture": "authenticated", - "permissions": [ - "view-account", - "initiate-payment", - "update-profile" - ] - } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-system-as-author-2.0.json b/tools/src/test/resources/2.0/valid-party-system-as-author-2.0.json index 706cbeb6..e8992e44 100644 --- a/tools/src/test/resources/2.0/valid-party-system-as-author-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-system-as-author-2.0.json @@ -3,32 +3,35 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "Web Service" - } - }, - "components": [ + "inventories": [ { - "type": "library", - "name": "AI-Generated Code Module", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "Web Service" + }, + "components": [ { - "roles": [ - { - "role": "author" - }, + "type": "library", + "name": "AI-Generated Code Module", + "parties": [ { - "role": "agent" + "roles": [ + { + "role": "author" + }, + { + "role": "agent" + } + ], + "system": { + "kind": "agent" + }, + "relations": { + "delegatedBy": "actor-alice" + } } - ], - "system": { - "kind": "agent" - }, - "relations": { - "delegatedBy": "actor-alice" - } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-system-custom-kind-2.0.json b/tools/src/test/resources/2.0/valid-party-system-custom-kind-2.0.json index c1d88f4e..5308c8ee 100644 --- a/tools/src/test/resources/2.0/valid-party-system-custom-kind-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-system-custom-kind-2.0.json @@ -3,29 +3,32 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "device", - "name": "Factory Line 1 Controls" - } - }, - "components": [ + "inventories": [ { - "type": "device", - "name": "Line 1 Press", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "device", + "name": "Factory Line 1 Controls" + }, + "components": [ { - "roles": [ + "type": "device", + "name": "Line 1 Press", + "parties": [ { - "role": "operator" - } - ], - "system": { - "kind": { - "name": "programmable-logic-controller", - "description": "Industrial PLC executing ladder logic on the factory floor. Custom kind pending adoption into the predefined system-kind taxonomy." + "roles": [ + { + "role": "operator" + } + ], + "system": { + "kind": { + "name": "programmable-logic-controller", + "description": "Industrial PLC executing ladder logic on the factory floor. Custom kind pending adoption into the predefined system-kind taxonomy." + } + } } - } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-party-system-service-account-2.0.json b/tools/src/test/resources/2.0/valid-party-system-service-account-2.0.json index 7a5a11ee..a35d478a 100644 --- a/tools/src/test/resources/2.0/valid-party-system-service-account-2.0.json +++ b/tools/src/test/resources/2.0/valid-party-system-service-account-2.0.json @@ -3,40 +3,43 @@ "specFormat": "CycloneDX", "specVersion": "2.0", "version": 1, - "metadata": { - "component": { - "type": "application", - "name": "CI-Built Application" - } - }, - "components": [ + "inventories": [ { - "type": "application", - "name": "Build Output", - "parties": [ + "subject": { + "bom-ref": "subject-1", + "type": "application", + "name": "CI-Built Application" + }, + "components": [ { - "roles": [ - { - "role": "author" - }, + "type": "application", + "name": "Build Output", + "parties": [ { - "role": "integrator" - } - ], - "system": { - "kind": "service-account", - "permissions": [ - "read-source", - "write-artifacts", - "sign-attestations" - ], - "identifiers": [ - { - "scheme": "oidc-sub", - "value": "repo:acme/widget:ref:refs/heads/main" + "roles": [ + { + "role": "author" + }, + { + "role": "integrator" + } + ], + "system": { + "kind": "service-account", + "permissions": [ + "read-source", + "write-artifacts", + "sign-attestations" + ], + "identifiers": [ + { + "scheme": "oidc-sub", + "value": "repo:acme/widget:ref:refs/heads/main" + } + ] } - ] - } + } + ] } ] } diff --git a/tools/src/test/resources/2.0/valid-patch-2.0.json b/tools/src/test/resources/2.0/valid-patch-2.0.json index 2ee1f640..033f7619 100644 --- a/tools/src/test/resources/2.0/valid-patch-2.0.json +++ b/tools/src/test/resources/2.0/valid-patch-2.0.json @@ -4,86 +4,88 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "group": "com.acme", - "name": "sample-library", - "version": "1.0.0", - "pedigree": { - "ancestors": [ - { - "type": "library", - "group": "org.example", - "name": "sample-library", - "version": "1.0.0" - } - ], - "patches": [ - { - "type": "unofficial", - "diff": { - "text": { - "mediaType": "text/plain", - "encoding": "base64", - "content": "blah" + "definitions": { + "components": [ + { + "type": "library", + "group": "com.acme", + "name": "sample-library", + "version": "1.0.0", + "pedigree": { + "ancestors": [ + { + "type": "library", + "group": "org.example", + "name": "sample-library", + "version": "1.0.0" + } + ], + "patches": [ + { + "type": "unofficial", + "diff": { + "text": { + "mediaType": "text/plain", + "encoding": "base64", + "content": "blah" + }, + "url": "uri/to/changes.diff" }, - "url": "uri/to/changes.diff" - }, - "resolves": [ - { - "type": "enhancement", - "id": "JIRA-17240", - "description": "Great new feature that does something", - "source": { - "name": "Acme Org", - "url": "https://issues.acme.org/17240" + "resolves": [ + { + "type": "enhancement", + "id": "JIRA-17240", + "description": "Great new feature that does something", + "source": { + "name": "Acme Org", + "url": "https://issues.acme.org/17240" + } } - } - ] - }, - { - "type": "backport", - "diff": { - "text": { - "mediaType": "text/plain", - "encoding": "base64", - "content": "blah" - }, - "url": "uri/to/changes.diff" + ] }, - "resolves": [ - { - "type": "security", - "id": "CVE-2019-9997", - "name": "CVE-2019-9997", - "description": "blah blah", - "source": { - "name": "NVD", - "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997" + { + "type": "backport", + "diff": { + "text": { + "mediaType": "text/plain", + "encoding": "base64", + "content": "blah" }, - "references": [ - "http://some/other/site-1", - "http://some/other/site-2" - ] + "url": "uri/to/changes.diff" }, - { - "type": "defect", - "id": "JIRA-874319", - "description": "Enable to do something", - "source": { - "name": "Example Org", - "url": "https://issues.example.org/874319" + "resolves": [ + { + "type": "security", + "id": "CVE-2019-9997", + "name": "CVE-2019-9997", + "description": "blah blah", + "source": { + "name": "NVD", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997" + }, + "references": [ + "http://some/other/site-1", + "http://some/other/site-2" + ] }, - "references": [ - "http://some/other/site-1", - "http://some/other/site-2" - ] - } - ] - } - ] + { + "type": "defect", + "id": "JIRA-874319", + "description": "Enable to do something", + "source": { + "name": "Example Org", + "url": "https://issues.example.org/874319" + }, + "references": [ + "http://some/other/site-1", + "http://some/other/site-2" + ] + } + ] + } + ] + } } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/valid-patch-resolves-references-2.0.json b/tools/src/test/resources/2.0/valid-patch-resolves-references-2.0.json new file mode 100644 index 00000000..8e1fe662 --- /dev/null +++ b/tools/src/test/resources/2.0/valid-patch-resolves-references-2.0.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b80", + "version": 1, + "definitions": { + "requirements": [ + { + "bom-ref": "req-input-validation", + "id": "REQ-VAL-001", + "name": "Validate all external input" + } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "1.1" }, + "components": [ + { + "bom-ref": "pkg:generic/acme/library-patched@1.0.1", + "type": "library", + "name": "Acme Patched Library", + "version": "1.0.1", + "pedigree": { + "ancestors": [ + { "bom-ref": "pkg:generic/acme/library@1.0.0", "type": "library", "name": "Acme Library", "version": "1.0.0" } + ], + "patches": [ + { + "bom-ref": "patch-1", + "type": "backport", + "resolves": [ + { + "type": "defect", + "id": "ACME-1234", + "description": "Crash when parsing empty input" + }, + { "ref": "vuln-2026-0003" }, + { "ref": "req-input-validation" } + ] + } + ] + } + } + ] + } + ], + "vulnerabilities": [ + { "bom-ref": "vuln-2026-0003", "id": "CVE-2026-0003", + "affects": [ { "ref": "pkg:generic/acme/library-patched@1.0.1" } ] } + ], + "annotations": [ + { + "subjects": [ "patch-1" ], + "annotator": { + "organization": { + "name": "Acme Security Team" + } + }, + "timestamp": "2026-08-28T12:00:00Z", + "text": "Backport verified against the 1.0 branch; upstream fix lands in 2.0." + } + ] +} diff --git a/tools/src/test/resources/2.0/valid-patent-2.0.json b/tools/src/test/resources/2.0/valid-patent-2.0.json index bbcb64ce..c4781162 100644 --- a/tools/src/test/resources/2.0/valid-patent-2.0.json +++ b/tools/src/test/resources/2.0/valid-patent-2.0.json @@ -4,78 +4,78 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:123e4567-e89b-12d3-a456-426614174000", "version": 1, - "components": [ - { - "bom-ref": "component-1", - "type": "library", - "parties": [ - { - "bom-ref": "org-acme-inc", - "roles": [ - { - "role": "manufacturer" - } - ], - "organization": { - "name": "Acme Inc", - "url": [ + "definitions": { + "components": [ + { + "bom-ref": "component-1", + "type": "library", + "parties": [ + { + "bom-ref": "org-acme-inc", + "roles": [ { - "name": "homepage", - "url": "https://example.com" + "role": "manufacturer" } - ] + ], + "organization": { + "name": "Acme Inc", + "url": [ + { + "name": "homepage", + "url": "https://example.com" + } + ] + } } - } - ], - "name": "High-Efficiency Processor", - "version": "1.0", - "patentAssertions": [ - { - "bom-ref": "patent-assertion-1", - "assertionType": "ownership", - "asserter": "org-acme-inc", - "patentRefs": [ - "patent-1" - ], - "notes": "Covers the core processing architecture for advanced computation." - }, - { - "bom-ref": "patent-assertion-2", - "assertionType": "license", - "asserter": "org-acme-inc", - "patentRefs": [ - "patent-3" - ], - "notes": "Licensed for use in North America." - } - ] - }, - { - "bom-ref": "service-1", - "type": "service", - "name": "Data Analysis Service", - "patentAssertions": [ - { - "bom-ref": "patent-assertion-3", - "assertionType": "exclusive-rights", - "asserter": { - "name": "Partner Company", - "contact": [ - { - "name": "Sam Smith", - "phone": "800-555-1212" - } - ] + ], + "name": "High-Efficiency Processor", + "version": "1.0", + "patentAssertions": [ + { + "bom-ref": "patent-assertion-1", + "assertionType": "ownership", + "asserter": "org-acme-inc", + "patentRefs": [ + "patent-1" + ], + "notes": "Covers the core processing architecture for advanced computation." }, - "patentRefs": [ - "patent-2" - ], - "notes": "Exclusive rights for machine learning integration." - } - ] - } - ], - "definitions": { + { + "bom-ref": "patent-assertion-2", + "assertionType": "license", + "asserter": "org-acme-inc", + "patentRefs": [ + "patent-3" + ], + "notes": "Licensed for use in North America." + } + ] + }, + { + "bom-ref": "service-1", + "type": "service", + "name": "Data Analysis Service", + "patentAssertions": [ + { + "bom-ref": "patent-assertion-3", + "assertionType": "exclusive-rights", + "asserter": { + "name": "Partner Company", + "contact": [ + { + "name": "Sam Smith", + "phone": "800-555-1212" + } + ] + }, + "patentRefs": [ + "patent-2" + ], + "notes": "Exclusive rights for machine learning integration." + } + ] + } + ], "patents": [ { "bom-ref": "patent-1", diff --git a/tools/src/test/resources/2.0/valid-pedigree-references-2.0.json b/tools/src/test/resources/2.0/valid-pedigree-references-2.0.json new file mode 100644 index 00000000..379c2414 --- /dev/null +++ b/tools/src/test/resources/2.0/valid-pedigree-references-2.0.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://cyclonedx.org/schema/2.0/cyclonedx-2.0.schema.json", + "specFormat": "CycloneDX", + "specVersion": "2.0", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b7f", + "version": 1, + "definitions": { + "components": [ + { "bom-ref": "pkg:generic/ossproject/library@1.0", "type": "library", "name": "Some Opensource Library", "version": "1.0" }, + { "bom-ref": "pkg:generic/acme/library-fork@1.0-acme.2", "type": "library", "name": "Acme Library Fork", "version": "1.0-acme.2" } + ] + }, + "inventories": [ + { + "subject": { "bom-ref": "acme-app", "type": "application", "name": "Acme Application", "version": "2.0" }, + "components": [ + { + "bom-ref": "pkg:generic/acme/library-fork@1.0-acme.3", + "type": "library", + "name": "Acme Library Fork", + "version": "1.0-acme.3", + "pedigree": { + "ancestors": [ + { "ref": "pkg:generic/ossproject/library@1.0" } + ], + "variants": [ + { "ref": "pkg:generic/acme/library-fork@1.0-acme.2" }, + { "bom-ref": "pkg:generic/partner/library-fork@1.0-partner.1", "type": "library", "name": "Partner Library Fork", "version": "1.0-partner.1" } + ] + } + } + ] + } + ] +} diff --git a/tools/src/test/resources/2.0/valid-perspective-2.0.json b/tools/src/test/resources/2.0/valid-perspective-2.0.json index 382d6590..cec7538b 100644 --- a/tools/src/test/resources/2.0/valid-perspective-2.0.json +++ b/tools/src/test/resources/2.0/valid-perspective-2.0.json @@ -14,34 +14,36 @@ } ] }, - "components": [ - { - "bom-ref": "pkg:maven/com.acme/sample-library@1.0.0?packaging=jar", - "type": "library", - "parties": [ - { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "sample-library", - "version": "1.0.0" - }, - { - "bom-ref": "pkg:maven/com.acme/sample-framework@2.1.0?packaging=jar", - "type": "library", - "parties": [ - { - "roles": [ { "role": "supplier" } ], - "organization": { "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "sample-framework", - "version": "2.1.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "pkg:maven/com.acme/sample-library@1.0.0?packaging=jar", + "type": "library", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "com.acme", + "name": "sample-library", + "version": "1.0.0" + }, + { + "bom-ref": "pkg:maven/com.acme/sample-framework@2.1.0?packaging=jar", + "type": "library", + "parties": [ + { + "roles": [ { "role": "supplier" } ], + "organization": { "name": "Acme Inc" } + } + ], + "group": "com.acme", + "name": "sample-framework", + "version": "2.1.0" + } + ] + }, "dependencies": [ { "ref": "pkg:maven/com.acme/sample-framework@2.1.0?packaging=jar", diff --git a/tools/src/test/resources/2.0/valid-properties-2.0.json b/tools/src/test/resources/2.0/valid-properties-2.0.json index 7dd70a9e..b564de0c 100644 --- a/tools/src/test/resources/2.0/valid-properties-2.0.json +++ b/tools/src/test/resources/2.0/valid-properties-2.0.json @@ -23,78 +23,80 @@ } ] }, - "components": [ - { - "type": "library", - "name": "acme-library", - "version": "1.0.0", - "licenses": [ - { - "license": { - "id": "Apache-2.0", - "properties": [ - { - "name": "Foo", - "value": "Bar" - }, - { - "name": "Foo", - "value": "Two" - }, - { - "name": "Bar", - "value": "Foo" - }, - { - "name": "value-is-optional" - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-library", + "version": "1.0.0", + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "properties": [ + { + "name": "Foo", + "value": "Bar" + }, + { + "name": "Foo", + "value": "Two" + }, + { + "name": "Bar", + "value": "Foo" + }, + { + "name": "value-is-optional" + } + ] + } + } + ], + "properties": [ + { + "name": "Foo", + "value": "Bar" + }, + { + "name": "Foo", + "value": "Two" + }, + { + "name": "Bar", + "value": "Foo" + }, + { + "name": "value-is-optional" } - } - ], - "properties": [ - { - "name": "Foo", - "value": "Bar" - }, - { - "name": "Foo", - "value": "Two" - }, - { - "name": "Bar", - "value": "Foo" - }, - { - "name": "value-is-optional" - } - ] - }, - { - "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", - "type": "service", - "group": "org.partner", - "name": "Stock ticker service", - "endpoints": [ - "https://partner.org/api/v1/stock" - ], - "properties": [ - { - "name": "Foo", - "value": "Bar" - }, - { - "name": "Foo", - "value": "Two" - }, - { - "name": "Bar", - "value": "Foo" - }, - { - "name": "value-is-optional" - } - ] - } - ] + ] + }, + { + "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", + "type": "service", + "group": "org.partner", + "name": "Stock ticker service", + "endpoints": [ + "https://partner.org/api/v1/stock" + ], + "properties": [ + { + "name": "Foo", + "value": "Bar" + }, + { + "name": "Foo", + "value": "Two" + }, + { + "name": "Bar", + "value": "Foo" + }, + { + "name": "value-is-optional" + } + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-release-notes-2.0.json b/tools/src/test/resources/2.0/valid-release-notes-2.0.json index f7a2fc91..461919e5 100644 --- a/tools/src/test/resources/2.0/valid-release-notes-2.0.json +++ b/tools/src/test/resources/2.0/valid-release-notes-2.0.json @@ -4,172 +4,120 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "acme-example", - "version": "1.0.0", - "externalReferences": [ - { - "type": "release-notes", - "url": "https://example.com/releases/1.0.0" - } - ], - "releaseNotes": { - "type": "major", - "title": "My new release", - "featuredImage": "https://example.com/featured_image.png", - "socialImage": "https://example.com/social_image.png", - "description": "The main description of your release", - "timestamp": "2021-09-17T00:51:18+00:00", - "aliases": [ - "Project Orion" - ], - "tags": [ - "CMS", - "SEO", - "wysiwyg" + "definitions": { + "components": [ + { + "type": "library", + "name": "acme-example", + "version": "1.0.0", + "externalReferences": [ + { + "type": "release-notes", + "url": "https://example.com/releases/1.0.0" + } ], - "resolves": [ + "releaseNotes": { "ref": "rn-1.0.0" } + }, + { + "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", + "type": "service", + "parties": [ { - "type": "enhancement", - "id": "JIRA-17240", - "description": "Great new feature that does something", - "source": { - "name": "Acme Org", - "url": "https://issues.example.com/17240" + "roles": [ + { + "role": "provider" + } + ], + "organization": { + "name": "Partner Org", + "url": [ + { + "name": "homepage", + "url": "https://partner.org" + } + ] } }, { - "type": "security", - "id": "CVE-2019-9997", - "name": "CVE-2019-9997", - "description": "A security issue was fixed that did something bad", - "source": { - "name": "NVD", - "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9997" - }, - "references": [ - "http://some/other/site-1", - "http://some/other/site-2" - ] + "roles": [ + { + "role": "support-contact" + } + ], + "person": { + "name": "Support", + "email": [ + { + "address": "support@partner.org" + } + ], + "phone": [ + { + "number": "800-555-1212" + } + ] + } } ], - "notes": [ + "group": "org.partner", + "name": "Stock ticker service", + "version": "2020-Q2", + "description": "Provides real-time stock information", + "endpoints": [ + "https://partner.org/api/v1/lookup", + "https://partner.org/api/v1/stock" + ], + "dataProfiles": [ { - "locale": "en-US", - "text": { - "mediaType": "text/html", - "encoding": "base64", - "content": "PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5SZWxlYXNlIG5vdGVzIGhlcmU8L3A+" - } + "name": "Customer PII", + "classification": "confidential", + "informationTypes": [ + "pii" + ] }, { - "locale": "es", - "text": { - "mediaType": "text/html", - "encoding": "base64", - "content": "PGgxPk15IG5ldyByZWxlYXNlPGgxPgo8cD5Ob3RhcyBkZSBsYSB2ZXJzacOzbiBhcXXDrTwvcD4=" - } - } - ] - } - }, - { - "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", - "type": "service", - "parties": [ - { - "roles": [ - { - "role": "provider" - } - ], - "organization": { - "name": "Partner Org", - "url": [ - { - "name": "homepage", - "url": "https://partner.org" - } + "name": "Personally Identifiable Financial Information", + "classification": "confidential", + "informationTypes": [ + "pii", + "financial" ] - } - }, - { - "roles": [ - { - "role": "support-contact" + }, + { + "name": "Public Market Data", + "classification": "public" + }, + { + "name": "Partner Data", + "classification": { + "name": "partner-restricted", + "description": "Data subject to the partner data-sharing agreement." } - ], - "person": { - "name": "Support", - "email": [ - { - "address": "support@partner.org" - } - ], - "phone": [ - { - "number": "800-555-1212" - } - ] } - } - ], - "group": "org.partner", - "name": "Stock ticker service", - "version": "2020-Q2", - "description": "Provides real-time stock information", - "endpoints": [ - "https://partner.org/api/v1/lookup", - "https://partner.org/api/v1/stock" - ], - "dataProfiles": [ - { - "name": "Customer PII", - "classification": "confidential", - "informationTypes": [ - "pii" - ] - }, - { - "name": "Personally Identifiable Financial Information", - "classification": "confidential", - "informationTypes": [ - "pii", - "financial" - ] - }, - { - "name": "Public Market Data", - "classification": "public" - }, - { - "name": "Partner Data", - "classification": { - "name": "partner-restricted", - "description": "Data subject to the partner data-sharing agreement." + ], + "licenses": [ + { + "license": { + "name": "Partner license" + } } - } - ], - "licenses": [ - { - "license": { - "name": "Partner license" + ], + "externalReferences": [ + { + "type": "website", + "url": "http://partner.org" + }, + { + "type": "documentation", + "url": "http://api.partner.org/swagger" } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "http://partner.org" - }, - { - "type": "documentation", - "url": "http://api.partner.org/swagger" - } - ], - "releaseNotes": { + ], + "releaseNotes": { "ref": "rn-1.0.0" } + } + ], + "releaseNotes": [ + { + "bom-ref": "rn-1.0.0", "type": "major", "title": "My new release", "featuredImage": "https://example.com/featured_image.png", @@ -228,6 +176,6 @@ } ] } - } - ] + ] + } } diff --git a/tools/src/test/resources/2.0/valid-release-notes-inline-2.0.json b/tools/src/test/resources/2.0/valid-release-notes-inline-2.0.json new file mode 100644 index 00000000..23c89a13 --- /dev/null +++ b/tools/src/test/resources/2.0/valid-release-notes-inline-2.0.json @@ -0,0 +1,18 @@ +{ + "specFormat": "CycloneDX", + "specVersion": "2.0", + "definitions": { + "components": [ + { + "bom-ref": "lib-a", + "type": "library", + "name": "Acme Library", + "version": "1.0.0", + "releaseNotes": { + "type": "major", + "title": "My new release" + } + } + ] + } +} diff --git a/tools/src/test/resources/2.0/valid-saasbom-2.0.json b/tools/src/test/resources/2.0/valid-saasbom-2.0.json index 7d7f6173..77a16a3b 100644 --- a/tools/src/test/resources/2.0/valid-saasbom-2.0.json +++ b/tools/src/test/resources/2.0/valid-saasbom-2.0.json @@ -5,196 +5,202 @@ "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, "metadata": { - "timestamp": "2021-01-10T12:00:00Z", - "component": { - "bom-ref": "acme-stock-application", - "type": "application", - "name": "Acme SaaSBOM Example", - "version": "2022-1" - } - }, - "profiles": { - "dataProfiles": [ - { - "bom-ref": "profile-customer", - "name": "Customer Data", - "classification": "confidential", - "informationTypes": [ - "pii" - ], - "subjects": [ - { - "name": "Acme Customers", - "type": "group", - "regulations": [ - "GDPR", - "CCPA" - ] - } - ] - }, - { - "bom-ref": "profile-pii", - "name": "Personally Identifiable Information", - "classification": "confidential", - "informationTypes": [ - "pii" - ] - }, - { - "bom-ref": "profile-pifi", - "name": "Personally Identifiable Financial Information", - "classification": "confidential", - "informationTypes": [ - "pii", - "financial" - ] - }, - { - "bom-ref": "profile-public", - "name": "Public Market Data", - "classification": "public" - } - ] + "timestamp": "2021-01-10T12:00:00Z" }, - "components": [ - { - "bom-ref": "stock-ticker-service", - "type": "service", - "parties": [ - { - "bom-ref": "party-acme", - "roles": [ - { - "role": "provider" - } - ], - "organization": { - "name": "Acme Inc", - "url": [ - { - "name": "homepage", - "url": "https://example.com" - } - ] - } - } - ], - "group": "com.example", - "name": "Stock Ticker Service", - "version": "2022-1", - "endpoints": [ - "https://example.com/", - "https://example.com/app" - ], + "definitions": { + "profiles": { "dataProfiles": [ - "profile-customer", - "profile-pii", - "profile-pifi", - "profile-public" - ], - "externalReferences": [ { - "type": "documentation", - "url": "https://example.com/app/swagger" - } - ], - "components": [ - { - "bom-ref": "ms-1.example.com", - "type": "service", - "parties": [ - "party-acme" + "bom-ref": "profile-customer", + "name": "Customer Data", + "classification": "confidential", + "informationTypes": [ + "pii" ], - "group": "com.example", - "name": "Microservice 1", - "version": "2022-1", - "description": "Example Microservice", - "endpoints": [ - "https://ms-1.example.com" - ], - "dataProfiles": [ - "profile-pii" - ], - "externalReferences": [ + "subjects": [ { - "type": "documentation", - "url": "https://ms-1.example.com/swagger" + "name": "Acme Customers", + "type": "group", + "regulations": [ + "GDPR", + "CCPA" + ] } ] }, { - "bom-ref": "ms-2.example.com", - "type": "service", - "parties": [ - "party-acme" - ], - "group": "com.example", - "name": "Microservice 2", - "version": "2022-1", - "description": "Example Microservice", - "endpoints": [ - "https://ms-2.example.com" - ], - "dataProfiles": [ - "profile-pifi" - ], - "externalReferences": [ - { - "type": "documentation", - "url": "https://ms-2.example.com/swagger" - } + "bom-ref": "profile-pii", + "name": "Personally Identifiable Information", + "classification": "confidential", + "informationTypes": [ + "pii" + ] + }, + { + "bom-ref": "profile-pifi", + "name": "Personally Identifiable Financial Information", + "classification": "confidential", + "informationTypes": [ + "pii", + "financial" ] }, { - "bom-ref": "ms-3.example.com", + "bom-ref": "profile-public", + "name": "Public Market Data", + "classification": "public" + } + ] + } + }, + "inventories": [ + { + "subject": { + "bom-ref": "acme-stock-application", + "type": "application", + "name": "Acme SaaSBOM Example", + "version": "2022-1" + }, + "components": [ + { + "bom-ref": "stock-ticker-service", "type": "service", "parties": [ - "party-acme" + { + "bom-ref": "party-acme", + "roles": [ + { + "role": "provider" + } + ], + "organization": { + "name": "Acme Inc", + "url": [ + { + "name": "homepage", + "url": "https://example.com" + } + ] + } + } ], "group": "com.example", - "name": "Microservice 3", + "name": "Stock Ticker Service", "version": "2022-1", - "description": "Example Microservice", "endpoints": [ - "https://ms-3.example.com" + "https://example.com/", + "https://example.com/app" ], "dataProfiles": [ + "profile-customer", + "profile-pii", + "profile-pifi", "profile-public" ], "externalReferences": [ { "type": "documentation", - "url": "https://ms-3.example.com/swagger" + "url": "https://example.com/app/swagger" } - ] - }, - { - "bom-ref": "ms-1-pgsql.example.com", - "type": "service", - "group": "org.postgresql", - "name": "Postgres", - "version": "14.1", - "description": "Postgres database for Microservice #1", - "endpoints": [ - "https://ms-1-pgsql.example.com:5432" - ], - "dataProfiles": [ - "profile-pii" - ] - }, - { - "bom-ref": "s3-example.amazon.com", - "type": "service", - "isExternal": true, - "group": "com.amazon", - "name": "S3", - "description": "S3 bucket", - "endpoints": [ - "https://s3-example.amazon.com" ], - "dataProfiles": [ - "profile-public" + "components": [ + { + "bom-ref": "ms-1.example.com", + "type": "service", + "parties": [ + "party-acme" + ], + "group": "com.example", + "name": "Microservice 1", + "version": "2022-1", + "description": "Example Microservice", + "endpoints": [ + "https://ms-1.example.com" + ], + "dataProfiles": [ + "profile-pii" + ], + "externalReferences": [ + { + "type": "documentation", + "url": "https://ms-1.example.com/swagger" + } + ] + }, + { + "bom-ref": "ms-2.example.com", + "type": "service", + "parties": [ + "party-acme" + ], + "group": "com.example", + "name": "Microservice 2", + "version": "2022-1", + "description": "Example Microservice", + "endpoints": [ + "https://ms-2.example.com" + ], + "dataProfiles": [ + "profile-pifi" + ], + "externalReferences": [ + { + "type": "documentation", + "url": "https://ms-2.example.com/swagger" + } + ] + }, + { + "bom-ref": "ms-3.example.com", + "type": "service", + "parties": [ + "party-acme" + ], + "group": "com.example", + "name": "Microservice 3", + "version": "2022-1", + "description": "Example Microservice", + "endpoints": [ + "https://ms-3.example.com" + ], + "dataProfiles": [ + "profile-public" + ], + "externalReferences": [ + { + "type": "documentation", + "url": "https://ms-3.example.com/swagger" + } + ] + }, + { + "bom-ref": "ms-1-pgsql.example.com", + "type": "service", + "group": "org.postgresql", + "name": "Postgres", + "version": "14.1", + "description": "Postgres database for Microservice #1", + "endpoints": [ + "https://ms-1-pgsql.example.com:5432" + ], + "dataProfiles": [ + "profile-pii" + ] + }, + { + "bom-ref": "s3-example.amazon.com", + "type": "service", + "isExternal": true, + "group": "com.amazon", + "name": "S3", + "description": "S3 bucket", + "endpoints": [ + "https://s3-example.amazon.com" + ], + "dataProfiles": [ + "profile-public" + ] + } ] } ] diff --git a/tools/src/test/resources/2.0/valid-service-2.0.json b/tools/src/test/resources/2.0/valid-service-2.0.json index cce89f90..87616822 100644 --- a/tools/src/test/resources/2.0/valid-service-2.0.json +++ b/tools/src/test/resources/2.0/valid-service-2.0.json @@ -4,138 +4,140 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "pkg:maven/com.acme/stock-java-client@1.0.12", - "type": "library", - "parties": [ - { - "roles": [ - { - "role": "publisher" + "definitions": { + "components": [ + { + "bom-ref": "pkg:maven/com.acme/stock-java-client@1.0.12", + "type": "library", + "parties": [ + { + "roles": [ + { + "role": "publisher" + } + ], + "organization": { + "name": "Acme Inc" } - ], - "organization": { - "name": "Acme Inc" } - } - ], - "group": "com.acme", - "name": "stock-java-client", - "version": "1.0.12", - "hashes": [ - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - } - ], - "licenses": [ - { - "license": { - "id": "Apache-2.0" + ], + "group": "com.acme", + "name": "stock-java-client", + "version": "1.0.12", + "hashes": [ + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" } - } - ] - }, - { - "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", - "type": "service", - "isExternal": true, - "parties": [ - { - "bom-ref": "party-partner-org", - "roles": [ - { - "role": "provider" + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0" } - ], - "organization": { - "name": "Partner Org", - "url": [ - { - "name": "homepage", - "url": "https://partner.org" - } - ] } - }, - { - "roles": [ - { - "role": "support-contact" - } - ], - "person": { - "name": "Support", - "email": [ + ] + }, + { + "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", + "type": "service", + "isExternal": true, + "parties": [ + { + "bom-ref": "party-partner-org", + "roles": [ { - "address": "support@partner.org" + "role": "provider" } ], - "phone": [ + "organization": { + "name": "Partner Org", + "url": [ + { + "name": "homepage", + "url": "https://partner.org" + } + ] + } + }, + { + "roles": [ { - "number": "800-555-1212" + "role": "support-contact" } ], - "affiliation": "party-partner-org" + "person": { + "name": "Support", + "email": [ + { + "address": "support@partner.org" + } + ], + "phone": [ + { + "number": "800-555-1212" + } + ], + "affiliation": "party-partner-org" + } } - } - ], - "group": "org.partner", - "name": "Stock ticker service", - "version": "2020-Q2", - "description": "Provides real-time stock information", - "endpoints": [ - "https://partner.org/api/v1/lookup", - "https://partner.org/api/v1/stock" - ], - "dataProfiles": [ - { - "name": "Customer PII", - "classification": "confidential", - "informationTypes": [ - "pii" - ] - }, - { - "name": "Personally Identifiable Financial Information", - "classification": "confidential", - "informationTypes": [ - "pii", - "financial" - ] - }, - { - "name": "Public Market Data", - "classification": "public" - }, - { - "name": "Partner Data", - "classification": { - "name": "partner-restricted", - "description": "Data subject to the partner data-sharing agreement." + ], + "group": "org.partner", + "name": "Stock ticker service", + "version": "2020-Q2", + "description": "Provides real-time stock information", + "endpoints": [ + "https://partner.org/api/v1/lookup", + "https://partner.org/api/v1/stock" + ], + "dataProfiles": [ + { + "name": "Customer PII", + "classification": "confidential", + "informationTypes": [ + "pii" + ] + }, + { + "name": "Personally Identifiable Financial Information", + "classification": "confidential", + "informationTypes": [ + "pii", + "financial" + ] + }, + { + "name": "Public Market Data", + "classification": "public" + }, + { + "name": "Partner Data", + "classification": { + "name": "partner-restricted", + "description": "Data subject to the partner data-sharing agreement." + } } - } - ], - "licenses": [ - { - "license": { - "name": "Partner license" + ], + "licenses": [ + { + "license": { + "name": "Partner license" + } } - } - ], - "externalReferences": [ - { - "type": "website", - "url": "http://partner.org" - }, - { - "type": "documentation", - "url": "http://api.partner.org/swagger" - } - ] - } - ], + ], + "externalReferences": [ + { + "type": "website", + "url": "http://partner.org" + }, + { + "type": "documentation", + "url": "http://api.partner.org/swagger" + } + ] + } + ] + }, "dependencies": [ { "ref": "pkg:maven/com.acme/stock-java-client@1.0.12", diff --git a/tools/src/test/resources/2.0/valid-service-empty-objects-2.0.json b/tools/src/test/resources/2.0/valid-service-empty-objects-2.0.json index c2c2bb93..d9314adc 100644 --- a/tools/src/test/resources/2.0/valid-service-empty-objects-2.0.json +++ b/tools/src/test/resources/2.0/valid-service-empty-objects-2.0.json @@ -4,24 +4,26 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", - "type": "service", - "parties": [ - { - "roles": [ - { - "role": "provider" - } - ], - "organization": {} - } - ], - "name": "Stock ticker service", - "endpoints": [], - "dataProfiles": [], - "externalReferences": [] - } - ] + "definitions": { + "components": [ + { + "bom-ref": "b2a46a4b-8367-4bae-9820-95557cfe03a8", + "type": "service", + "parties": [ + { + "roles": [ + { + "role": "provider" + } + ], + "organization": {} + } + ], + "name": "Stock ticker service", + "endpoints": [], + "dataProfiles": [], + "externalReferences": [] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-tags-2.0.json b/tools/src/test/resources/2.0/valid-tags-2.0.json index dd45e065..3207a389 100644 --- a/tools/src/test/resources/2.0/valid-tags-2.0.json +++ b/tools/src/test/resources/2.0/valid-tags-2.0.json @@ -4,29 +4,31 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "type": "library", - "name": "my-json-parser", - "version": "1.0", - "tags": [ - "json-parser", - "javascript", - "node.js" - ] - }, - { - "type": "service", - "name": "my service", - "endpoints": [ - "https://example.com/myservice" - ], - "tags": [ - "microservice", - "golang", - "aws", - "us-east-1" - ] - } - ] + "definitions": { + "components": [ + { + "type": "library", + "name": "my-json-parser", + "version": "1.0", + "tags": [ + "json-parser", + "javascript", + "node.js" + ] + }, + { + "type": "service", + "name": "my service", + "endpoints": [ + "https://example.com/myservice" + ], + "tags": [ + "microservice", + "golang", + "aws", + "us-east-1" + ] + } + ] + } } diff --git a/tools/src/test/resources/2.0/valid-threatmodel-simple-2.0.json b/tools/src/test/resources/2.0/valid-threatmodel-simple-2.0.json index d8d14f03..a34d4998 100644 --- a/tools/src/test/resources/2.0/valid-threatmodel-simple-2.0.json +++ b/tools/src/test/resources/2.0/valid-threatmodel-simple-2.0.json @@ -3,20 +3,6 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "profiles": { - "threatProfiles": [ - { - "bom-ref": "tp-apt", - "name": "Advanced persistent threat", - "sophistication": "advanced", - "resources": "substantial", - "skillSet": [ - "malware-development", - "spear-phishing" - ] - } - ] - }, "threats": { "methodologies": [ "STRIDE", "attack-tree" ], "threats": [ @@ -200,6 +186,20 @@ ] }, "definitions": { + "profiles": { + "threatProfiles": [ + { + "bom-ref": "tp-apt", + "name": "Advanced persistent threat", + "sophistication": "advanced", + "resources": "substantial", + "skillSet": [ + "malware-development", + "spear-phishing" + ] + } + ] + }, "businessObjectives": [ { "bom-ref": "obj-protect-data", diff --git a/tools/src/test/resources/2.0/valid-vex-mitigating-control-2.0.json b/tools/src/test/resources/2.0/valid-vex-mitigating-control-2.0.json index 0a61131a..492c1192 100644 --- a/tools/src/test/resources/2.0/valid-vex-mitigating-control-2.0.json +++ b/tools/src/test/resources/2.0/valid-vex-mitigating-control-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:8d4f2a1b-6c3e-4b9d-a5f0-1e7c8b2d4a96", "version": 1, - "components": [ - { - "type": "library", - "bom-ref": "component-xml-parser", - "name": "acme-xml-parser", - "version": "2.4.0" - } - ], + "definitions": { + "components": [ + { + "type": "library", + "bom-ref": "component-xml-parser", + "name": "acme-xml-parser", + "version": "2.4.0" + } + ] + }, "controls": [ { "bom-ref": "control-waf", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-2.0.json index c776ffe8..e95f3cec 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-2.0.json @@ -4,15 +4,17 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, - "components": [ - { - "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4", - "type": "library", - "group": "com.fasterxml.jackson.core", - "name": "jackson-databind", - "version": "2.9.4" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4", + "type": "library", + "group": "com.fasterxml.jackson.core", + "name": "jackson-databind", + "version": "2.9.4" + } + ] + }, "vulnerabilities": [ { "bom-ref": "6eee14da-8f42-4cc4-bb65-203235f02415", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-2.0.json index 2d86a9c6..c3a5d5e7 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-2.0.json @@ -38,14 +38,16 @@ ] } }, - "components": [ - { - "bom-ref": "component-openssh", - "type": "application", - "name": "openssh", - "version": "7.2" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-openssh", + "type": "application", + "name": "openssh", + "version": "7.2" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-cve-2023-38408", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-callstacks-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-callstacks-2.0.json index 7bd654fc..aba75879 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-callstacks-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-callstacks-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:12671687-395b-41f5-a30f-a58921a6a001", "version": 1, - "components": [ - { - "bom-ref": "component-acme-api", - "type": "application", - "name": "acme-api", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-acme-api", + "type": "application", + "name": "acme-api", + "version": "1.0.0" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-multipath-sqli", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-hardened-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-hardened-2.0.json index 304097ab..4dfb43fb 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-hardened-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-hardened-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:ee671687-395b-41f5-a30f-a58921a69d02", "version": 1, - "components": [ - { - "bom-ref": "component-acme-app", - "type": "application", - "name": "acme-app", - "version": "2.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-acme-app", + "type": "application", + "name": "acme-app", + "version": "2.0.0" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-hardened", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-llm-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-llm-2.0.json index 126a4d73..40deedd8 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-llm-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-llm-2.0.json @@ -17,14 +17,16 @@ ] } }, - "components": [ - { - "bom-ref": "component-support-assistant", - "type": "machine-learning-model", - "name": "support-assistant", - "version": "2024.05" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-support-assistant", + "type": "machine-learning-model", + "name": "support-assistant", + "version": "2024.05" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-prompt-injection", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-not-affected-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-not-affected-2.0.json index 52cfb205..b7dc130d 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-not-affected-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-not-affected-2.0.json @@ -17,14 +17,16 @@ ] } }, - "components": [ - { - "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4", - "type": "library", - "name": "jackson-databind", - "version": "2.9.4" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.4", + "type": "library", + "name": "jackson-databind", + "version": "2.9.4" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-not-affected", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-perspectives-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-perspectives-2.0.json index 2f64ba78..e023ad51 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-perspectives-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-perspectives-2.0.json @@ -7,14 +7,16 @@ "metadata": { "timestamp": "2024-05-10T00:00:00.000Z" }, - "components": [ - { - "bom-ref": "component-acme-lib", - "type": "library", - "name": "acme-lib", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-acme-lib", + "type": "library", + "name": "acme-lib", + "version": "1.0.0" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-perspectival", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-sast-rule-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-sast-rule-2.0.json index fb92650f..1eb90068 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-sast-rule-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-sast-rule-2.0.json @@ -29,14 +29,16 @@ ] } }, - "components": [ - { - "bom-ref": "component-acme-app", - "type": "application", - "name": "acme-app", - "version": "3.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-acme-app", + "type": "application", + "name": "acme-app", + "version": "3.0.0" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-internal-sqli", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-shared-occurrence-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-shared-occurrence-2.0.json index 075372f3..0c974397 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-shared-occurrence-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-shared-occurrence-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:dd671687-395b-41f5-a30f-a58921a69c02", "version": 1, - "components": [ - { - "bom-ref": "component-webapp", - "type": "application", - "name": "acme-webapp", - "version": "4.2.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-webapp", + "type": "application", + "name": "acme-webapp", + "version": "4.2.0" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-exploited", diff --git a/tools/src/test/resources/2.0/valid-vulnerability-evidence-unknown-technique-2.0.json b/tools/src/test/resources/2.0/valid-vulnerability-evidence-unknown-technique-2.0.json index c40b783e..d75dc5e2 100644 --- a/tools/src/test/resources/2.0/valid-vulnerability-evidence-unknown-technique-2.0.json +++ b/tools/src/test/resources/2.0/valid-vulnerability-evidence-unknown-technique-2.0.json @@ -4,14 +4,16 @@ "specVersion": "2.0", "serialNumber": "urn:uuid:ff671687-395b-41f5-a30f-a58921a69f02", "version": 1, - "components": [ - { - "bom-ref": "component-acme-lib", - "type": "library", - "name": "acme-lib", - "version": "1.0.0" - } - ], + "definitions": { + "components": [ + { + "bom-ref": "component-acme-lib", + "type": "library", + "name": "acme-lib", + "version": "1.0.0" + } + ] + }, "vulnerabilities": [ { "bom-ref": "vuln-imported",