Skip to content

Commit

Permalink
feat(spec1-5): add support for additional compositions and compositio…
Browse files Browse the repository at this point in the history
…n identity

Signed-off-by: nscuro <nscuro@protonmail.com>
  • Loading branch information
nscuro committed Jun 17, 2023
1 parent d7e68f3 commit 637efcd
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 11 deletions.
27 changes: 27 additions & 0 deletions convert.go
Expand Up @@ -87,6 +87,10 @@ func (b *BOM) convert(specVersion SpecVersion) {
convertVulnerabilities(b.Vulnerabilities, specVersion)
}

if b.Compositions != nil {
convertCompositions(b.Compositions, specVersion)
}

if b.ExternalReferences != nil {
convertExternalReferences(b.ExternalReferences, specVersion)
}
Expand Down Expand Up @@ -142,6 +146,19 @@ func componentConverter(specVersion SpecVersion) func(*Component) {
}
}

func convertCompositions(comps *[]Composition, specVersion SpecVersion) {
if comps == nil {
return
}

for i := range *comps {
comp := &(*comps)[i]
if !specVersion.supportsCompositionAggregate(comp.Aggregate) {
comp.Aggregate = CompositionAggregateUnknown
}
}
}

// convertExternalReferences modifies an ExternalReference slice such that it adheres to a given SpecVersion.
func convertExternalReferences(extRefs *[]ExternalReference, specVersion SpecVersion) {
if extRefs == nil {
Expand Down Expand Up @@ -338,6 +355,16 @@ func (sv SpecVersion) supportsComponentType(cType ComponentType) bool {
return false
}

func (sv SpecVersion) supportsCompositionAggregate(ca CompositionAggregate) bool {
switch ca {
case CompositionAggregateIncompleteFirstPartyOpenSourceOnly, CompositionAggregateIncompleteFirstPartyProprietaryOnly,
CompositionAggregateIncompleteThirdPartyOpenSourceOnly, CompositionAggregateIncompleteThirdPartyProprietaryOnly:
return sv >= SpecVersion1_5
}

return sv >= SpecVersion1_3
}

func (sv SpecVersion) supportsExternalReferenceType(ert ExternalReferenceType) bool {
switch ert {
case ERTypeAdversaryModel, ERTypeAttestation, ERTypeCertificationReport, ERTypeCodifiedInfrastructure,
Expand Down
24 changes: 15 additions & 9 deletions cyclonedx.go
Expand Up @@ -166,20 +166,26 @@ type Component struct {
}

type Composition struct {
Aggregate CompositionAggregate `json:"aggregate" xml:"aggregate"`
Assemblies *[]BOMReference `json:"assemblies,omitempty" xml:"assemblies>assembly,omitempty"`
Dependencies *[]BOMReference `json:"dependencies,omitempty" xml:"dependencies>dependency,omitempty"`
BOMRef string `json:"bom-ref,omitempty" xml:"bom-ref,attr,omitempty"`
Aggregate CompositionAggregate `json:"aggregate" xml:"aggregate"`
Assemblies *[]BOMReference `json:"assemblies,omitempty" xml:"assemblies>assembly,omitempty"`
Dependencies *[]BOMReference `json:"dependencies,omitempty" xml:"dependencies>dependency,omitempty"`
Vulnerabilities *[]BOMReference `json:"vulnerabilities,omitempty" xml:"vulnerabilities>vulnerability,omitempty"`
}

type CompositionAggregate string

const (
CompositionAggregateComplete CompositionAggregate = "complete"
CompositionAggregateIncomplete CompositionAggregate = "incomplete"
CompositionAggregateIncompleteFirstPartyOnly CompositionAggregate = "incomplete_first_party_only"
CompositionAggregateIncompleteThirdPartyOnly CompositionAggregate = "incomplete_third_party_only"
CompositionAggregateUnknown CompositionAggregate = "unknown"
CompositionAggregateNotSpecified CompositionAggregate = "not_specified"
CompositionAggregateComplete CompositionAggregate = "complete"
CompositionAggregateIncomplete CompositionAggregate = "incomplete"
CompositionAggregateIncompleteFirstPartyOnly CompositionAggregate = "incomplete_first_party_only"
CompositionAggregateIncompleteFirstPartyOpenSourceOnly CompositionAggregate = "incomplete_first_party_opensource_only"
CompositionAggregateIncompleteFirstPartyProprietaryOnly CompositionAggregate = "incomplete_first_party_proprietary_only"
CompositionAggregateIncompleteThirdPartyOnly CompositionAggregate = "incomplete_third_party_only"
CompositionAggregateIncompleteThirdPartyOpenSourceOnly CompositionAggregate = "incomplete_third_party_opensource_only"
CompositionAggregateIncompleteThirdPartyProprietaryOnly CompositionAggregate = "incomplete_third_party_proprietary_only"
CompositionAggregateNotSpecified CompositionAggregate = "not_specified"
CompositionAggregateUnknown CompositionAggregate = "unknown"
)

type Copyright struct {
Expand Down
Expand Up @@ -46,6 +46,7 @@
],
"compositions": [
{
"bom-ref": "composition-1",
"aggregate": "complete",
"assemblies": [
"pkg:maven/partner/shaded-library@1.0"
Expand All @@ -59,6 +60,21 @@
"assemblies": [
"pkg:maven/acme/library@3.0"
]
},
{
"aggregate": "incomplete_first_party_only",
"vulnerabilities": [
"vulnerability-1"
]
}
],
"vulnerabilities": [
{
"bom-ref": "vulnerability-1",
"id": "ACME-12345",
"source": {
"name": "Acme Inc"
}
}
]
}
Expand Down
Expand Up @@ -32,7 +32,7 @@
</dependency>
</dependencies>
<compositions>
<composition>
<composition bom-ref="composition-1">
<aggregate>complete</aggregate>
<assemblies>
<assembly ref="pkg:maven/partner/shaded-library@1.0"></assembly>
Expand All @@ -47,5 +47,19 @@
<assembly ref="pkg:maven/acme/library@3.0"></assembly>
</assemblies>
</composition>
<composition>
<aggregate>incomplete_first_party_only</aggregate>
<assemblies>
<assembly ref="vulnerability-1"></assembly>
</assemblies>
</composition>
</compositions>
<vulnerabilities>
<vulnerability bom-ref="vulnerability-1">
<id>ACME-12345</id>
<source>
<name>Acme Inc</name>
</source>
</vulnerability>
</vulnerabilities>
</bom>
16 changes: 16 additions & 0 deletions testdata/valid-compositions.json
Expand Up @@ -44,8 +44,18 @@
]
}
],
"vulnerabilities": [
{
"bom-ref": "vulnerability-1",
"id": "ACME-12345",
"source": {
"name": "Acme Inc"
}
}
],
"compositions": [
{
"bom-ref": "composition-1",
"aggregate": "complete",
"assemblies": [
"pkg:maven/partner/shaded-library@1.0"
Expand All @@ -59,6 +69,12 @@
"assemblies": [
"pkg:maven/acme/library@3.0"
]
},
{
"aggregate": "incomplete_first_party_only",
"vulnerabilities": [
"vulnerability-1"
]
}
]
}
16 changes: 15 additions & 1 deletion testdata/valid-compositions.xml
Expand Up @@ -31,8 +31,16 @@
<dependency ref="pkg:maven/acme/library@3.0"/>
</dependency>
</dependencies>
<vulnerabilities>
<vulnerability bom-ref="vulnerability-1">
<id>ACME-12345</id>
<source>
<name>Acme Inc</name>
</source>
</vulnerability>
</vulnerabilities>
<compositions>
<composition>
<composition bom-ref="composition-1">
<aggregate>complete</aggregate>
<assemblies>
<assembly ref="pkg:maven/partner/shaded-library@1.0"/>
Expand All @@ -47,5 +55,11 @@
<assembly ref="pkg:maven/acme/library@3.0"/>
</assemblies>
</composition>
<composition>
<aggregate>incomplete_first_party_only</aggregate>
<assemblies>
<assembly ref="vulnerability-1"/>
</assemblies>
</composition>
</compositions>
</bom>

0 comments on commit 637efcd

Please sign in to comment.