Changelog
All notable changes to this project will be documented in this file.
unreleased
BREAKING changes
Removed deprecated symbols
Changed constructor of
CycloneDX\Contrib\License\Factories\LicenseFactoryChanged dependencies
Removed
Class
CycloneDX\Core\Factories\LicenseFactory(#571 via #587)
UseCycloneDX\Contrib\License\Factories\LicenseFactoryinstead.Class
CycloneDX\Core\Utils\BomUtility(#571 via #587)
UseCycloneDX\Contrib\Bom\Utils\BomUtilsinstead.Method
CycloneDX\Core\Validation\BaseValidator::getSpec()(#590 via #591)
Changed
CycloneDX\Contrib\License\Factories\LicenseFactory::__construct()parameters are no longer autopopulated (#571 via #587)
Downstream implementations have to populate the parameters on their own, now.CycloneDX\Core\Models\Component::setPackageUrl()accepts?string(#571 via #588)
Downstream implementations may use package-url/packageurl-php for generation.CycloneDX\Core\Models\Component::getPackageUrl()returns?string(#571 via #588)
Downstream implementations may use package-url/packageurl-php for parsing.CycloneDX\Core\Validation\BaseValidator::__construct()parameter is typeCycloneDX\Core\Spec\Version(#590 via #591)
Was internal typeCycloneDX\Core\Spec\_SpecProtocol.
Dependencies
3.10.0 - 2026-01-07
3.9.0 - 2025-12-02
Added
new Entry point
\CycloneDX\Contrib(via #569)
Changed
Deprecated
Refactored
3.8.0 - 2025-10-23
3.7.0 - 2025-09-09
Added
Pulled SPDX license IDs v1.0-3.27.0 (via #553)
3.6.0 - 2025-06-05
Added
Pulled SPDX license IDs v1.0-3.26.0 (via #537)
3.5.4 - 2025-05-12
Maintenance release.
3.5.3 - 2025-02-19
Added
Misc
Added
Overridemarkers where needed (via #508)
See also: https://wiki.php.net/rfc/marking_overriden_methods
3.5.2 - 2025-01-27
Style
Applied latest PHP Coding Standards (via #495)
Misc
Various refactors
3.5.1 - 2024-12-01
3.5.0 - 2024-11-18
3.4.2 - 2024-10-24
Fixed
Encode quotation mark in URLs (via #477)
3.4.1 - 2024-08-31
3.4.0 - 2024-05-06
Changed
Updated SPDX license list to
v3.24.0(via #439)
3.3.1 - 2024-05-06
3.3.0 - 2024-04-26
Changed
Added
Namespace
\CycloneDX\Core\EnumsNamespace
\CycloneDX\Core\Models\License
3.2.0 - 2024-04-10
Added basic support for *CycloneDX* Specification-1.6.
Changed
Method
\CycloneDX\Core\Spec\SpecFactory::makeForVersion()supports CycloneDX Specification-1.6 now (#421 via #422)Classes
\CycloneDX\Core\Serialization\{DOM,JSON}\Normalizers\*support CycloneDX Specification-1.6 now (#421 via #422)Classes
\CycloneDX\Core\Validation\Validators\*support CycloneDX Specification-1.6 now (#421 via #422)
Added
Style
Applied latest PHP Coding Standards (via #415)
3.1.2 - 2024-03-18
Documentation
Rendered (API) docs are hosted on readthedocs (#8 via #414)
3.1.1 - 2024-02-05
3.1.0 - 2023-12-02
Added
Migration/fixup of URL(
iri-reference) when normalizing to JSON (via #380)
3.0.2 - 2023-11-27
3.0.1 - 2023-09-16
Fixed
fixed a possible JSON schema validation issue regarding “version” property (via #352)
3.0.0 - 2023-08-27
BREAKING
Style
Applied latest PHP Coding Standards (via #341)
2.3.0 - 2023-06-27
Added support for *CycloneDX* Specification-1.5.
Changed
Method
\CycloneDX\Core\Spec\SpecFactory::makeForVersion()supports CycloneDX Specification-1.5 now (#193 via #255)Classes
\CycloneDX\Core\Serialization\{DOM,JSON}\Normalizers\*support CycloneDX Specification-1.5 now (#193 via #255)Classes
\CycloneDX\Core\Validation\Validators\*support CycloneDX Specification-1.5 now (#193 via #255)
Added
Namespace
\CycloneDX\Core\EnumsEnum
ComponentTypegot new cases (#193 via #255)
New:Data,DeviceDriver,MachineLearningModel,PlatformEnum
ExternalReferenceTypegot new cases (#193 via #255)
New:AdversaryModel,Attestation,CertificationReport,CodifiedInfrastructure,ComponentAnalysisReport,Configuration,DistributionIntake,DynamicAnalysisReport,Evidence,ExploitabilityStatement,Formulation,Log,MaturityReport,ModelCard,POAM,PentestReport,QualityMetrics,RiskAssessment,RuntimeAnalysisReport,SecurityContact,StaticAnalysisReport,ThreatModel,VulnerabilityAssertion
Namespace
\CycloneDX\Core\Spec
Misc
2.2.0 - 2023-06-02
Changed
Class
\CycloneDX\Core\Serialization\JsonSerializerClass
\CycloneDX\Core\Serialization\XmlSerializer
Style
2.1.2 - 2023-04-05
Fixed
Docs
Fixed link to CycloneDX-specification in README (via #288)
2.1.1 - 2023-03-28
2.1.0 - 2023-03-24
Fixed
Changed
Added
Published generator for BOM’s SerialNumber:
\CycloneDX\Core\Utils\BomUtility::randomSerialNumber()(#277 via #278)
The code was donated from cyclonedx-php-composer.
2.0.0 - 2023-03-20
BREAKING
Removed support for PHP v8.0 (via #204)
Changed models’ aggregation properties to be no longer optional (#66 via #131)
Streamlined repository data structures to follow a common method naming scheme (via #131)
Enumeration-like classes were converted to native PHP Enumerations (#140, #256 via #204, #257)
Added
Misc
API changes v2 - the details
Overall
BREAKING: enforced the use of concrete UnionTypes instead of protocols/interfaces/abstracts (#114 via #125)
Affected the usages of no longer public\CycloneDX\Core\Models\License\AbstractDisjunctiveLicenseand methods that used license-related classes. This was possible due to PHP8’s UnionType language feature.Changed some methods to no longer throw
\InvalidArgumentException(via #125)
PhpDoc annotations were updated, so that code analysis tools should pick up. This was possible by enforcing correct typing on PHP8 language level.BREAKING: every occurrence of
{M,m}etaDatawith a capital “D” was renamed to{M,m}etadatawith a small “d” (#133 via #131, #149)
This affects class names, method names, variable names, property names, file names, documentation - everything.
\CycloneDX\Core\Collectionsnamespace\CycloneDX\Core\EnumnamespaceClassificationclassExternalReferenceTypeclassHashAlgorithmclass
CycloneDX\Core\FactoriesnamespaceLicenseFactoryclassBREAKING: check whether something is a valid SPDX Expression is now complete, was best effort implementation (#247 via #249)
This affects all methods that potentially would createLicenseExpressionmodels.
Utilizes ``composer/spdx-licenses` <https://packagist.org/packages/composer/spdx-licenses>`_.BREAKING: changed constructor method
__construct()(via #249)BREAKING: removed method
makeDisjunctiveFromExpression()(#163 vial #166)BREAKING: removed method
setSpdxLicenseValidator()(via #249)BREAKING: renamed method
getSpdxLicenseValidator()->getLicenseIdentifiers()(via #249)BREAKING: renamed method
makeDisjunctiveWithId()->makeSpdxLicense()(#164 vial #168)BREAKING: renamed method
makeDisjunctiveWithName()->makeNamedLicense()(#164 vial #168)Added new method
getSpdxLicenses()(via #249)
\CycloneDX\Core\ModelsnamespaceBomclassBREAKING: changed constructor to no longer accept components (#187 via #188)
BREAKING: renamed methods
{get,set}ComponentRepository()->{get,set}Components()(#133 via #131)BREAKING: renamed methods
{get,set}ExternalReferenceRepository()->{get,set}ExternalReferences()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)BREAKING: renamed methods
{get,set}MetaData()->{get,set}Metadata()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)Added new methods
{get,set}SerialNumber()(via #186)
ComponentclassBREAKING: renamed methods
{get,set}DependenciesBomRefRepository()->{get,set}Dependencies()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)BREAKING: renamed methods
{get,set}ExternalReferenceRepository()->{get,set}ExternalReferences()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)BREAKING: renamed methods
{get,set}HashRepository()->{get,set}Hashes()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)BREAKING: renamed methods
{get,set}License()->{get,set}Licenses()(via #131)
Also changed it work with classLicenseRepositoryonly, was working with variousModels\License\*types (#66 via #131)BREAKING: changed class property
versionto be optional, to reflect CycloneDX v1.4 (#27 via #118, #131)
This affects constructor arguments, and affects methods{get,set}Version().BREAKING: changed property
typeto be of type\CycloneDX\Core\Enum\ComponentType(#140 via #204)
This affects constructor arguments, and affects methods{get,set}Type().Added new methods
{get,set}Author()([#184] via #185)
ExternalReferenceclassBREAKING: renamed methods
{get,set}HashRepository()->{get,set}Hashes()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)BREAKING: changed property
typeto be of type\CycloneDX\Core\Enum\ExternalReferenceType(#140 via #204)
This affects constructor arguments, and affects methods{get,set}Type().
LicensesnamespaceAbstractDisjunctiveLicenseDisjunctiveLicenseWithNameclassDisjunctiveLicenseWithIdclassLicenseExpressionclass
MetaDataclassBREAKING: renamed class to
Metadata(#133 via #131)
Even though PHP is case-insensitive with class names, autoloaders may be case-sensitive. Therefore, this is considered a breaking change.BREAKING: changed methods
{get,set}Tools()so that their parameter & return type is non-nullable, was nullable (#66 via #131)
ToolclassBREAKING: renamed methods
{get,set}ExternalReferenceRepository()->{get,set}ExternalReferences()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)BREAKING: renamed methods
{get,set}HashRepository()->{get,set}Hashes()(#133 via #131)
Also changed parameter & return type to non-nullable, was nullable (#66 via #131)
\CycloneDX\Core\RepositoriesnamespaceOverall:
DisjunctiveLicenseRepositoryclassBREAKING: renamed the class to
\CycloneDX\Core\Collections\LicenseRepository(via #131)BREAKING: added the capability to also aggregate instances of class
Models\LicenseExpression(via #131)
Therefore, various getters and setters and the constructor changed their signatures, was usage of\CycloneDX\Core\Models\License\AbstractDisjunctiveLicenseonly.
HashRepositoryclassBREAKING: renamed to
\CycloneDX\Core\Collections\HashDictionary(#133 via #131)BREAKING: renamed all methods and changed all method signatures to match the overall streamlined scheme (#133 via #131)
BREAKING: changed all method signatures to enable handling of native PHP Enumeration type
\CycloneDX\Core\Enum\HashAlgorithm(#140 via #204)
\CycloneDX\Core\SerializenamespaceOverall
SerializerInterfaceinterfaceBaseSerializerabstract classBREAKING: complete redesign (via #155)
{Json,Xml}SerializerclassBREAKING: complete redesign (via #155)
{DOM,JSON}\NormalizerFactoryclassesBREAKING: removed method
makeForLicenseExpression()(via #131)BREAKING: removed method
makeForDisjunctiveLicense()(via #131)BREAKING: removed method
makeForDisjunctiveLicenseRepository()(via #131)BREAKING: removed method
makeForHashRepositonary()- usemakeForHashDictionary()instead (#133 via #131)BREAKING: removed method
setSpec()(via #131)Added new method
makeForLicense()(via #131)Added new method
makeForLicenseRepository()(via #131)
{DOM,JSON}\NormalizersnamespacesBREAKING: removed classes
DisjunctiveLicenseNormalizer- useLicenseNormalizerinstead (via #131)BREAKING: removed classes
LicenseExpressionNormalizer- useLicenseNormalizerinstead (via #131)BREAKING: removed classes
DisjunctiveLicenseRepositoryNormalizer(via #131)BREAKING: renamed classes
HashRepositoryNormalizer->HashDictionaryNormalizer(#133 via #131)
Also changed signatures to acceptModels\HashDictionaryinstead ofModels\HashRepositoryBREAKING: changed signatures of class
HashNormalizerto accept native PHP Enumeration type\CycloneDX\Core\Enum\HashAlgorithm(#140 via #204)Added new classes
ComponentEvidenceNormalizerthat can normalizeComponentEvidence(#238 via #241)Added new classes
LicenseNormalizerthat can normalize every existing license model (via #131)Added new classes
LicenseRepositoryNormalizerthat can normalizeLicenseRepository(via #131)ExternalReferenceNormalizerclassesChanged the method
normalize()to actually throw\DomainExceptionwhen\ExternalReference‘s type was not supported by the spec (via #65)
This is considered a non-breaking change, because the behaviour was already documented in the API, even though there was no need for an implementation before.
ExternalReferenceNormalizerclasses
JSON\Normalizers\BomNormalizerclassChanged: method
normalize()‘s result data may contain the$schemastring (via #155)
JSON\Normalizers\ExternalReferenceNormalizerclassBREAKING: method
normalize()may throw\UnexpectedValueExceptionwhen the url is invalid to format “ini-reference” (via #151)
\CycloneDX\Core\SpdxnamespaceBREAKING: renamed the class
License->LicenseIdentifiers(#133 via #143, #249)BREAKING: renamed method
getLicense()->fixLicense()(via #249)BREAKING: renamed method
getLicenses()->getKnownLicenses(), and removed keys from return value (via #249)BREAKING: renamed method
validate()->isKnownLicense()(via #249)
\CycloneDX\Core\Specnamespace\CycloneDX\Core\ValidationnamespaceBaseValidatorclassBREAKING: removed deprecated method
setSpec()(via #144)
ValidatorInterfaceinterfaceValidators\{Json,JsonStrict,Xml}ValidatorclassesValidators\{Json,JsonStrict}Validatorclasses
1.6.3 - 2022-09-15
Maintenance Release.
Legal:
Transferred copyright to OWASP Foundation. (via #121)
1.6.2 - 2022-09-12
Maintenance release.
Docs:
Added “Responsibilities”, “Capabilities” and “Usage” sections to README. (via #115)
1.6.1 - 2022-08-16
Maintenance release.
1.6.0 - 2022-08-03
Changed
Use version 9b04a94 of CycloneDX specification for XML and JSON schema validation. (via #105)
Use SPDX license enumeration from version 9b04a94 of CycloneDX specification. (via #105)
Style
Fixe some whitespaces. (via #82)
1.5.0 - 2022-03-08
Changed
Use version 82bf9e3 of CycloneDX specification for XML and JSON schema validation. (via #79)
Use SPDX license enumeration from version 82bf9e3 of CycloneDX specification. (via #79)
1.4.2 - 2022-02-05
Fixed
Return type of
CycloneDX\Core\Serialize\SerializerInterface::serialize()and implementations/usage are documented asnon-empty-string, were undocumentedstringbefore. (via #70)
1.4.1 - 2022-01-31
Fixed
CycloneDX\Core\Validation\ValidatorInterface::validateString()and implementations are documented asnon-empty-string, were undocumentedstringbefore. (via #63)
1.4.0 - 2021-12-20
1.3.1 - 2021-12-03
Fixed
XML serializer & DOM normalizer no longer generate invalid
XML::anyURI. (via #34)
1.3.0 - 2021-12-01
Changed
JSON result does no longer have slashes escaped in strings. (via #33)
Old:"http:\/\/exampe.com"
New:"http://exampe.com"
1.2.0 - 2021-11-29
Added
Prevention of information-loss on metadata-component’s ExternalReferences, when normalizing to a specification that does not support
bom.metadata(via #26)
1.1.0 - 2021-11-25
Added
Support for ExternalReferences in BOM and Component (via #17)
1.0.3 - 2021-11-15
Fixed
CycloneDX\Core\Models\License\AbstractDisjunctiveLicense::setUrl()no longer restricts the argument to be a valid URL.
Per schema definitionlicenseType.urlshould be a URI, not a URL. See #18
Changed
CycloneDX\Core\Models\License\AbstractDisjunctiveLicense::setUrl()no longer throwsInvalidArgumentExceptionif the argument is not a URL (via #19)
1.0.2 - 2021-10-30
Fixed
Psalm-annotation of
CycloneDX\Core\Enums\Classification::isValidValue()(via #10)
1.0.1 - 2021-10-23
Removed composer’s conflict constraint.
This was done to enable some workflows with package forks/mirrors that don’t have proper version detection.
See #9
1.0.0 - 2021-10-07
Initial release.
Split the library from
`/src/Core`` of cyclonedx-php-composer (346e6200fb2f5086061b15c2ee44f540893ce97d) <https://github.com/CycloneDX/cyclonedx-php-composer/tree/346e6200fb2f5086061b15c2ee44f540893ce97d/src/Core>`_