Skip to content

Commit 9475ea1

Browse files
authored
Merge pull request #588 from justahero/sebastian/support-signature-in-1.4
Add support for `signature` field in 1.4
2 parents 9a0f1a7 + 9c5517a commit 9475ea1

27 files changed

+745
-16
lines changed

cyclonedx-bom/src/errors.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ pub enum XmlReadError {
9898
element: String,
9999
},
100100

101+
#[error("Invalid enum value '{value}' given in {element}")]
102+
InvalidEnumVariant { value: String, element: String },
103+
101104
#[error("Could not parse {value} as {data_type} on {element}")]
102105
InvalidParseError {
103106
value: String,

cyclonedx-bom/src/models/bom.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use crate::models::external_reference::ExternalReferences;
3535
use crate::models::metadata::Metadata;
3636
use crate::models::property::Properties;
3737
use crate::models::service::{Service, Services};
38+
use crate::models::signature::Signature;
3839
use crate::models::vulnerability::Vulnerabilities;
3940
use crate::validation::{
4041
FailureReason, Validate, ValidationContext, ValidationError, ValidationPathComponent,
@@ -85,7 +86,10 @@ pub struct Bom {
8586
pub dependencies: Option<Dependencies>,
8687
pub compositions: Option<Compositions>,
8788
pub properties: Option<Properties>,
89+
/// Added in version 1.4
8890
pub vulnerabilities: Option<Vulnerabilities>,
91+
/// Added in version 1.4
92+
pub signature: Option<Signature>,
8993
}
9094

9195
impl Bom {
@@ -105,10 +109,7 @@ impl Bom {
105109
SpecVersion::V1_4 => Ok(crate::specs::v1_4::bom::Bom::deserialize(json)?.into()),
106110
}
107111
} else {
108-
return Err(BomError::UnsupportedSpecVersion(
109-
"No field 'specVersion' found".to_string(),
110-
)
111-
.into());
112+
Err(BomError::UnsupportedSpecVersion("No field 'specVersion' found".to_string()).into())
112113
}
113114
}
114115

@@ -214,6 +215,7 @@ impl Default for Bom {
214215
compositions: None,
215216
properties: None,
216217
vulnerabilities: None,
218+
signature: None,
217219
}
218220
}
219221
}
@@ -617,6 +619,7 @@ mod test {
617619
compositions: None,
618620
properties: None,
619621
vulnerabilities: None,
622+
signature: None,
620623
};
621624

622625
let actual = bom
@@ -642,6 +645,7 @@ mod test {
642645
compositions: None,
643646
properties: None,
644647
vulnerabilities: None,
648+
signature: None,
645649
};
646650

647651
let actual = bom.validate().expect("Failed to validate bom");
@@ -698,9 +702,11 @@ mod test {
698702
aggregate: AggregateType::Complete,
699703
assemblies: Some(vec![BomReference("assembly".to_string())]),
700704
dependencies: Some(vec![BomReference("dependencies".to_string())]),
705+
signature: None,
701706
}])),
702707
properties: None,
703708
vulnerabilities: None,
709+
signature: None,
704710
};
705711

706712
let actual = bom.validate().expect("Failed to validate bom");
@@ -783,6 +789,7 @@ mod test {
783789
properties: None,
784790
components: None,
785791
evidence: None,
792+
signature: None,
786793
}])),
787794
services: Some(Services(vec![Service {
788795
bom_ref: None,
@@ -799,6 +806,7 @@ mod test {
799806
external_references: None,
800807
properties: None,
801808
services: None,
809+
signature: None,
802810
}])),
803811
external_references: Some(ExternalReferences(vec![ExternalReference {
804812
external_reference_type: ExternalReferenceType::UnknownExternalReferenceType(
@@ -816,6 +824,7 @@ mod test {
816824
aggregate: AggregateType::UnknownAggregateType("unknown".to_string()),
817825
assemblies: None,
818826
dependencies: None,
827+
signature: None,
819828
}])),
820829
properties: Some(Properties(vec![Property {
821830
name: "name".to_string(),
@@ -841,6 +850,7 @@ mod test {
841850
vulnerability_targets: None,
842851
properties: None,
843852
}])),
853+
signature: None,
844854
};
845855

846856
let actual = bom
@@ -1001,6 +1011,7 @@ mod test {
10011011
compositions: None,
10021012
properties: None,
10031013
vulnerabilities: None,
1014+
signature: None,
10041015
}
10051016
.validate_with_context(ValidationContext::default())
10061017
.expect("Error while validating");

cyclonedx-bom/src/models/component.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ use crate::{
3636
validation::{Validate, ValidationContext, ValidationError, ValidationResult},
3737
};
3838

39+
use super::signature::Signature;
40+
3941
#[derive(Debug, PartialEq, Eq)]
4042
pub struct Component {
4143
pub component_type: Classification,
@@ -61,6 +63,8 @@ pub struct Component {
6163
pub properties: Option<Properties>,
6264
pub components: Option<Components>,
6365
pub evidence: Option<ComponentEvidence>,
66+
/// Added in version 1.4
67+
pub signature: Option<Signature>,
6468
}
6569

6670
impl Component {
@@ -94,6 +98,7 @@ impl Component {
9498
properties: None,
9599
components: None,
96100
evidence: None,
101+
signature: None,
97102
}
98103
}
99104
}
@@ -608,6 +613,7 @@ mod test {
608613
hash::{Hash, HashAlgorithm, HashValue},
609614
license::LicenseChoice,
610615
property::Property,
616+
signature::Algorithm,
611617
},
612618
validation::ValidationPathComponent,
613619
};
@@ -692,6 +698,10 @@ mod test {
692698
))])),
693699
copyright: Some(CopyrightTexts(vec![Copyright("copyright".to_string())])),
694700
}),
701+
signature: Some(Signature {
702+
algorithm: Algorithm::HS512,
703+
value: "abcdefgh".to_string(),
704+
}),
695705
}])
696706
.validate_with_context(ValidationContext::default())
697707
.expect("Error while validating");
@@ -780,6 +790,10 @@ mod test {
780790
))])),
781791
copyright: Some(CopyrightTexts(vec![Copyright("copyright".to_string())])),
782792
}),
793+
signature: Some(Signature {
794+
algorithm: Algorithm::HS512,
795+
value: "abcdefgh".to_string(),
796+
}),
783797
}])
784798
.validate_with_context(ValidationContext::default())
785799
.expect("Error while validating");
@@ -1194,6 +1208,7 @@ mod test {
11941208
properties: None,
11951209
components: None,
11961210
evidence: None,
1211+
signature: None,
11971212
}
11981213
}
11991214
}

cyclonedx-bom/src/models/composition.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ use crate::validation::{
2121
ValidationResult,
2222
};
2323

24+
use super::signature::Signature;
25+
2426
#[derive(Debug, PartialEq, Eq)]
2527
pub struct Composition {
2628
pub aggregate: AggregateType,
2729
pub assemblies: Option<Vec<BomReference>>,
2830
pub dependencies: Option<Vec<BomReference>>,
31+
pub signature: Option<Signature>,
2932
}
3033

3134
impl Validate for Composition {
@@ -131,6 +134,8 @@ pub struct BomReference(pub(crate) String);
131134

132135
#[cfg(test)]
133136
mod test {
137+
use crate::models::signature::Algorithm;
138+
134139
use super::*;
135140
use pretty_assertions::assert_eq;
136141

@@ -140,6 +145,10 @@ mod test {
140145
aggregate: AggregateType::Complete,
141146
assemblies: Some(vec![BomReference("reference".to_string())]),
142147
dependencies: Some(vec![BomReference("reference".to_string())]),
148+
signature: Some(Signature {
149+
algorithm: Algorithm::HS512,
150+
value: "abcdefgh".to_string(),
151+
}),
143152
}])
144153
.validate()
145154
.expect("Error while validating");
@@ -153,6 +162,10 @@ mod test {
153162
aggregate: AggregateType::UnknownAggregateType("unknown aggregate type".to_string()),
154163
assemblies: Some(vec![BomReference("reference".to_string())]),
155164
dependencies: Some(vec![BomReference("reference".to_string())]),
165+
signature: Some(Signature {
166+
algorithm: Algorithm::HS512,
167+
value: "abcdefgh".to_string(),
168+
}),
156169
}])
157170
.validate()
158171
.expect("Error while validating");

cyclonedx-bom/src/models/metadata.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ mod test {
191191
properties: None,
192192
components: None,
193193
evidence: None,
194+
signature: None,
194195
}),
195196
manufacture: Some(OrganizationalEntity {
196197
name: Some(NormalizedString::new("name")),
@@ -255,6 +256,7 @@ mod test {
255256
properties: None,
256257
components: None,
257258
evidence: None,
259+
signature: None,
258260
}),
259261
manufacture: Some(OrganizationalEntity {
260262
name: Some(NormalizedString("invalid\tname".to_string())),

cyclonedx-bom/src/models/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ pub mod metadata;
3030
pub mod organization;
3131
pub mod property;
3232
pub mod service;
33+
pub mod signature;
3334
pub mod tool;
3435
pub mod vulnerability;
3536
pub mod vulnerability_analysis;

cyclonedx-bom/src/models/service.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ use crate::validation::{
2626
ValidationResult,
2727
};
2828

29+
use super::signature::Signature;
30+
2931
/// Represents a service as described in the [CycloneDX use cases](https://cyclonedx.org/use-cases/#service-definition)
3032
///
3133
/// Defined via the [XML schema](https://cyclonedx.org/docs/1.3/xml/#type_service)
@@ -45,6 +47,8 @@ pub struct Service {
4547
pub external_references: Option<ExternalReferences>,
4648
pub properties: Option<Properties>,
4749
pub services: Option<Services>,
50+
/// Added in version 1.4
51+
pub signature: Option<Signature>,
4852
}
4953

5054
impl Service {
@@ -70,6 +74,7 @@ impl Service {
7074
external_references: None,
7175
properties: None,
7276
services: None,
77+
signature: None,
7378
}
7479
}
7580
}
@@ -284,6 +289,7 @@ mod test {
284289
external_reference::{ExternalReference, ExternalReferenceType},
285290
license::LicenseChoice,
286291
property::Property,
292+
signature::Algorithm,
287293
},
288294
};
289295

@@ -324,6 +330,10 @@ mod test {
324330
value: NormalizedString::new("value"),
325331
}])),
326332
services: Some(Services(vec![])),
333+
signature: Some(Signature {
334+
algorithm: Algorithm::HS512,
335+
value: "abcdefgh".to_string(),
336+
}),
327337
}])
328338
.validate_with_context(ValidationContext::default())
329339
.expect("Error while validating");
@@ -381,7 +391,12 @@ mod test {
381391
external_references: None,
382392
properties: None,
383393
services: None,
394+
signature: None,
384395
}])),
396+
signature: Some(Signature {
397+
algorithm: Algorithm::HS512,
398+
value: "abcdefgh".to_string(),
399+
}),
385400
}])
386401
.validate_with_context(ValidationContext::default())
387402
.expect("Error while validating");

0 commit comments

Comments
 (0)