@cdxgen/cdxgen 13.6.0 → 13.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -8
- package/bin/audit.js +7 -4
- package/bin/cdxgen.js +256 -37
- package/bin/convert.js +146 -22
- package/bin/evinse.js +25 -3
- package/bin/repl.js +47 -3
- package/bin/sign.js +211 -34
- package/bin/tracebom.js +18 -6
- package/bin/validate.js +18 -3
- package/bin/verify.js +113 -5
- package/data/behavior-taxonomy.schema.json +1491 -0
- package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
- package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
- package/data/pqc-migration.json +239 -0
- package/data/remediations.json +52 -0
- package/data/rules/cbom-security.yaml +4 -3
- package/data/rules/package-integrity.yaml +28 -0
- package/lib/audit/index.js +25 -3
- package/lib/cli/bomAssembly.js +80 -1
- package/lib/cli/cliOptions.js +121 -17
- package/lib/cli/index.js +609 -898
- package/lib/cli/jsBom.js +3 -0
- package/lib/cli/jvmBom.js +365 -40
- package/lib/cli/managedBom.js +19 -3
- package/lib/cli/nativeBom.js +10 -0
- package/lib/core/env.js +26 -0
- package/lib/core/fs.js +126 -3
- package/lib/core/globPatterns.js +218 -0
- package/lib/core/processTree.js +99 -12
- package/lib/core/projectConfig.js +332 -25
- package/lib/core/toolRegistry.js +15 -1
- package/lib/ecosystems/denoutils.js +2 -2
- package/lib/ecosystems/golem.js +3 -8
- package/lib/ecosystems/gradleutils.js +1082 -6
- package/lib/ecosystems/jsEvidence.js +90 -38
- package/lib/ecosystems/kosi.js +3 -5
- package/lib/ecosystems/npmVersionResolution.js +376 -0
- package/lib/ecosystems/parsers-python.js +89 -28
- package/lib/ecosystems/parsers-rust.js +117 -15
- package/lib/ecosystems/remote/huggingface.js +22 -0
- package/lib/ecosystems/rusi.js +2 -4
- package/lib/ecosystems/scalasem.js +2 -1
- package/lib/evinser/evinser.js +196 -34
- package/lib/evinser/scalasem.js +5 -1
- package/lib/helpers/agenticToolutils.js +112 -1
- package/lib/helpers/bomSigner.js +43 -9
- package/lib/helpers/jssSigner.js +1276 -0
- package/lib/inventory/agentBlueprint.js +193 -0
- package/lib/inventory/agentToolNames.js +145 -0
- package/lib/inventory/aiCollector.js +153 -7
- package/lib/inventory/aiInventory.js +44 -8
- package/lib/inventory/aiProviders.js +324 -0
- package/lib/inventory/bomUtils.js +8 -1
- package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
- package/lib/inventory/citations.js +31 -2
- package/lib/inventory/communityAiConfigParser.js +978 -80
- package/lib/inventory/cyclonedx20.js +152 -0
- package/lib/inventory/cyclonedx20Common.js +286 -0
- package/lib/inventory/cyclonedx20Derived.js +159 -0
- package/lib/inventory/cyclonedx20Parties.js +552 -0
- package/lib/inventory/cyclonedx20Read.js +768 -0
- package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
- package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
- package/lib/inventory/cyclonedx20ReadContext.js +380 -0
- package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
- package/lib/inventory/cyclonedx20ReadSections.js +599 -0
- package/lib/inventory/cyclonedx20Render.js +766 -0
- package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
- package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
- package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
- package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
- package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
- package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
- package/lib/inventory/cyclonedx20RenderSections.js +499 -0
- package/lib/inventory/cyclonedx20Tables.js +594 -0
- package/lib/inventory/deps.js +106 -13
- package/lib/inventory/dosai.js +236 -1
- package/lib/inventory/dosaiParsers.js +3 -6
- package/lib/inventory/dotnetRuntime.js +164 -14
- package/lib/inventory/ecosystemFormulationParsers.js +979 -0
- package/lib/inventory/envcontext.js +132 -38
- package/lib/inventory/evidenceUtils.js +2 -1
- package/lib/inventory/formulationParsers.js +95 -13
- package/lib/inventory/hbom.js +45 -6
- package/lib/inventory/hbomLoader.js +166 -0
- package/lib/inventory/mcpConfigParser.js +5 -0
- package/lib/inventory/occurrenceKey.js +90 -0
- package/lib/inventory/pqcMigration.js +426 -0
- package/lib/inventory/rustFormulationParser.js +21 -10
- package/lib/inventory/source.js +65 -6
- package/lib/parsers/huggingfaceManifest.js +9 -1
- package/lib/parsers/huggingfaceUtils.js +18 -0
- package/lib/parsers/kiroPermissions.js +166 -0
- package/lib/server/server.js +36 -34
- package/lib/stages/postgen/postgen.js +41 -1
- package/lib/stages/postgen/specVersionCompat.js +76 -0
- package/lib/validator/bomValidator.js +8 -1
- package/lib/validator/complianceEngine.js +30 -3
- package/lib/validator/complianceRules.js +1416 -4
- package/lib/validator/generated/validate-2.0.mjs +57554 -13851
- package/lib/validator/index.js +48 -7
- package/lib/validator/reporters/json.js +6 -0
- package/package.json +9 -9
- package/types/bin/repl.d.ts.map +1 -1
- package/types/lib/audit/index.d.ts +6 -2
- package/types/lib/audit/index.d.ts.map +1 -1
- package/types/lib/cli/bomAssembly.d.ts +16 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -1
- package/types/lib/cli/cliOptions.d.ts +6 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -1
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/cli/jsBom.d.ts +2 -1
- package/types/lib/cli/jsBom.d.ts.map +1 -1
- package/types/lib/cli/jvmBom.d.ts +15 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -1
- package/types/lib/cli/managedBom.d.ts.map +1 -1
- package/types/lib/cli/nativeBom.d.ts.map +1 -1
- package/types/lib/core/boundedFile.d.ts +30 -0
- package/types/lib/core/boundedFile.d.ts.map +1 -1
- package/types/lib/core/env.d.ts +10 -0
- package/types/lib/core/env.d.ts.map +1 -1
- package/types/lib/core/fs.d.ts +4 -0
- package/types/lib/core/fs.d.ts.map +1 -1
- package/types/lib/core/globPatterns.d.ts +70 -0
- package/types/lib/core/globPatterns.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +9 -0
- package/types/lib/core/paths.d.ts.map +1 -1
- package/types/lib/core/processTree.d.ts +16 -5
- package/types/lib/core/processTree.d.ts.map +1 -1
- package/types/lib/core/projectConfig.d.ts +47 -8
- package/types/lib/core/projectConfig.d.ts.map +1 -1
- package/types/lib/core/toolRegistry.d.ts.map +1 -1
- package/types/lib/ecosystems/golem.d.ts.map +1 -1
- package/types/lib/ecosystems/gradleutils.d.ts +248 -8
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
- package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/kosi.d.ts.map +1 -1
- package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
- package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
- package/types/lib/ecosystems/pythonutils.d.ts +1 -1
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
- package/types/lib/ecosystems/rusi.d.ts.map +1 -1
- package/types/lib/ecosystems/scalasem.d.ts +58 -16
- package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
- package/types/lib/evinser/evinser.d.ts +61 -9
- package/types/lib/evinser/evinser.d.ts.map +1 -1
- package/types/lib/evinser/scalasem.d.ts.map +1 -1
- package/types/lib/helpers/agenticToolutils.d.ts +53 -19
- package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
- package/types/lib/helpers/bomSigner.d.ts +20 -3
- package/types/lib/helpers/bomSigner.d.ts.map +1 -1
- package/types/lib/helpers/jssSigner.d.ts +288 -0
- package/types/lib/helpers/jssSigner.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +303 -19
- package/types/lib/helpers/vsixutils.d.ts.map +1 -1
- package/types/lib/inventory/agentBlueprint.d.ts +70 -0
- package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
- package/types/lib/inventory/agentToolNames.d.ts +51 -0
- package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -1
- package/types/lib/inventory/aiInventory.d.ts.map +1 -1
- package/types/lib/inventory/aiProviders.d.ts +85 -0
- package/types/lib/inventory/aiProviders.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -1
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +5 -0
- package/types/lib/inventory/citations.d.ts.map +1 -1
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/cyclonedx20.d.ts +99 -0
- package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +35 -2
- package/types/lib/inventory/deps.d.ts.map +1 -1
- package/types/lib/inventory/dosai.d.ts +19 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -1
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
- package/types/lib/inventory/dotnetRuntime.d.ts +51 -4
- package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -1
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +22 -6
- package/types/lib/inventory/envcontext.d.ts.map +1 -1
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
- package/types/lib/inventory/hbom.d.ts +11 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -1
- package/types/lib/inventory/hbomLoader.d.ts +54 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
- package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
- package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/occurrenceKey.d.ts +52 -0
- package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
- package/types/lib/inventory/pqcMigration.d.ts +84 -0
- package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
- package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
- package/types/lib/inventory/scalaDedupe.d.ts +43 -0
- package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +15 -0
- package/types/lib/inventory/source.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
- package/types/lib/parsers/kiroPermissions.d.ts +62 -0
- package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
- package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
- package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
- package/types/lib/server/server.d.ts.map +1 -1
- package/types/lib/stages/postgen/postgen.d.ts +7 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
- package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
- package/types/lib/validator/bomValidator.d.ts +5 -1
- package/types/lib/validator/bomValidator.d.ts.map +1 -1
- package/types/lib/validator/complianceEngine.d.ts +4 -4
- package/types/lib/validator/complianceEngine.d.ts.map +1 -1
- package/types/lib/validator/complianceRules.d.ts +14 -2
- package/types/lib/validator/complianceRules.d.ts.map +1 -1
- package/types/lib/validator/index.d.ts +10 -0
- package/types/lib/validator/index.d.ts.map +1 -1
- package/types/lib/validator/reporters/json.d.ts.map +1 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Post-quantum migration facts for cryptographic assets (cdxgen/cdxgen#4592). Each class cites the table or section its dates and members come from: NIST IR 8547 (final, October 2026), https://csrc.nist.gov/pubs/ir/8547/final, and, for DSA, FIPS 186-5. lib/inventory/pqcMigration.js classifies an asset by algorithmFamily, then OID, then normalised name (lower case, letters and digits only), and turns the class into a risks.risks[] entry. The likelihood and impact levels are cdxgen's fixed rating per class, not values from the IR; docs/CDX_CONVERT.md (CycloneDX 2.0, post-quantum migration risks) documents them, and docs/CUSTOM_PROPERTIES.md the cdx:crypto:pqc:* properties.",
|
|
3
|
+
"source": {
|
|
4
|
+
"document": "NIST IR 8547 (final, October 2026)",
|
|
5
|
+
"url": "https://csrc.nist.gov/pubs/ir/8547/final"
|
|
6
|
+
},
|
|
7
|
+
"$excludedNote": "Not classified, because IR 8547 Tables 2 and 4 do not list them: RSAES-PKCS1 (SP 800-56B specifies RSA key transport with OAEP and KTS, not PKCS #1 v1.5 encryption) and X3DH (a Signal protocol, not an SP 800-56A scheme). Quantum-safe per IR 8547 Tables 3 and 5-8, so no risk: ML-DSA, SLH-DSA, LMS/HSS, XMSS, ML-KEM, AES, Ascon, and SHA-2/SHA-3 members with at least 128 bits of collision strength.",
|
|
8
|
+
"unclassifiedPrimitives": [
|
|
9
|
+
"combiner"
|
|
10
|
+
],
|
|
11
|
+
"$unclassifiedPrimitivesNote": "NIST IR 8547 Section 3.2.1: a hybrid (composite) key-establishment scheme combines the shared secrets of its component schemes and is approved when one input comes from an approved scheme, so a combiner is not classified by the OID of one of its inputs.",
|
|
12
|
+
"quantumSafeFamilies": [
|
|
13
|
+
"ML-DSA",
|
|
14
|
+
"SLH-DSA",
|
|
15
|
+
"LMS",
|
|
16
|
+
"XMSS",
|
|
17
|
+
"ML-KEM",
|
|
18
|
+
"AES",
|
|
19
|
+
"Ascon",
|
|
20
|
+
"SHA-2",
|
|
21
|
+
"SHA-3",
|
|
22
|
+
"HMAC",
|
|
23
|
+
"HKDF",
|
|
24
|
+
"KMAC"
|
|
25
|
+
],
|
|
26
|
+
"minimumKeySizes": {
|
|
27
|
+
"$comment": "Smallest key size per key family with the 112 bits of classical security strength that IR 8547 Table 2 (ECDSA, RSA) and Table 4 (finite-field and elliptic-curve DH and MQV, RSA) list as the approved parameters. Key sizes for 112 bits: SP 800-57 Part 1 Rev. 5 Table 2 (RSA k = 2048, FFC L = 2048, ECC f = 224).",
|
|
28
|
+
"rsa": 2048,
|
|
29
|
+
"ff": 2048,
|
|
30
|
+
"ec": 224
|
|
31
|
+
},
|
|
32
|
+
"namedGroupKeySizes": {
|
|
33
|
+
"$comment": "Finite-field groups whose name carries no separate key size: the ffdhe groups of RFC 7919, whose modulus size is the number in the name.",
|
|
34
|
+
"ffdhe2048": 2048,
|
|
35
|
+
"ffdhe3072": 3072,
|
|
36
|
+
"ffdhe4096": 4096,
|
|
37
|
+
"ffdhe6144": 6144,
|
|
38
|
+
"ffdhe8192": 8192
|
|
39
|
+
},
|
|
40
|
+
"classes": {
|
|
41
|
+
"quantum-vulnerable-signature": {
|
|
42
|
+
"source": "NIST IR 8547 Table 2 (quantum-vulnerable digital signature algorithms): ECDSA and RSA at >= 112 bits, EdDSA at >= 128 bits of classical security strength [FIPS186]",
|
|
43
|
+
"transition": "Deprecated after 2030; disallowed after 2035",
|
|
44
|
+
"deprecatedAfter": "2030",
|
|
45
|
+
"disallowedAfter": "2035",
|
|
46
|
+
"riskName": "Post-quantum migration",
|
|
47
|
+
"statement": "This digital signature algorithm is quantum-vulnerable; NIST IR 8547 Table 2 deprecates it after 2030 and disallows it after 2035.",
|
|
48
|
+
"rationale": "{algorithm} is a quantum-vulnerable digital signature algorithm listed in NIST IR 8547 Table 2: deprecated after 2030, disallowed after 2035.",
|
|
49
|
+
"likelihood": "high",
|
|
50
|
+
"impact": "major",
|
|
51
|
+
"families": {
|
|
52
|
+
"ECDSA": "ec",
|
|
53
|
+
"EdDSA": null,
|
|
54
|
+
"RSASSA-PKCS1": "rsa",
|
|
55
|
+
"RSASSA-PSS": "rsa",
|
|
56
|
+
"RSA-X931": "rsa"
|
|
57
|
+
},
|
|
58
|
+
"oids": {
|
|
59
|
+
"1.2.840.10045.4.1": "ec",
|
|
60
|
+
"1.2.840.10045.4.3.1": "ec",
|
|
61
|
+
"1.2.840.10045.4.3.2": "ec",
|
|
62
|
+
"1.2.840.10045.4.3.3": "ec",
|
|
63
|
+
"1.2.840.10045.4.3.4": "ec",
|
|
64
|
+
"1.3.101.112": null,
|
|
65
|
+
"1.3.101.113": null,
|
|
66
|
+
"1.2.840.113549.1.1.2": "rsa",
|
|
67
|
+
"1.2.840.113549.1.1.3": "rsa",
|
|
68
|
+
"1.2.840.113549.1.1.4": "rsa",
|
|
69
|
+
"1.2.840.113549.1.1.5": "rsa",
|
|
70
|
+
"1.2.840.113549.1.1.10": "rsa",
|
|
71
|
+
"1.2.840.113549.1.1.11": "rsa",
|
|
72
|
+
"1.2.840.113549.1.1.12": "rsa",
|
|
73
|
+
"1.2.840.113549.1.1.13": "rsa",
|
|
74
|
+
"1.2.840.113549.1.1.14": "rsa",
|
|
75
|
+
"1.2.840.113549.1.1.15": "rsa",
|
|
76
|
+
"1.2.840.113549.1.1.16": "rsa",
|
|
77
|
+
"2.16.840.1.101.3.4.3.9": "ec",
|
|
78
|
+
"2.16.840.1.101.3.4.3.10": "ec",
|
|
79
|
+
"2.16.840.1.101.3.4.3.11": "ec",
|
|
80
|
+
"2.16.840.1.101.3.4.3.12": "ec",
|
|
81
|
+
"2.16.840.1.101.3.4.3.13": "rsa",
|
|
82
|
+
"2.16.840.1.101.3.4.3.14": "rsa",
|
|
83
|
+
"2.16.840.1.101.3.4.3.15": "rsa",
|
|
84
|
+
"2.16.840.1.101.3.4.3.16": "rsa"
|
|
85
|
+
},
|
|
86
|
+
"names": {
|
|
87
|
+
"ecdsa": "ec",
|
|
88
|
+
"eddsa": null,
|
|
89
|
+
"ed25519": null,
|
|
90
|
+
"ed448": null,
|
|
91
|
+
"rsapss": "rsa",
|
|
92
|
+
"rsassapss": "rsa",
|
|
93
|
+
"rsassapkcs1": "rsa"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"quantum-vulnerable-key-establishment": {
|
|
97
|
+
"source": "NIST IR 8547 Table 4 (quantum-vulnerable key-establishment schemes): finite-field DH and MQV, elliptic-curve DH and MQV [SP80056A] and RSA [SP80056B], at >= 112 bits of classical security strength",
|
|
98
|
+
"transition": "Deprecated after 2030; disallowed after 2035",
|
|
99
|
+
"deprecatedAfter": "2030",
|
|
100
|
+
"disallowedAfter": "2035",
|
|
101
|
+
"riskName": "Post-quantum migration",
|
|
102
|
+
"statement": "This key-establishment scheme is quantum-vulnerable; NIST IR 8547 Table 4 deprecates it after 2030 and disallows it after 2035.",
|
|
103
|
+
"rationale": "{algorithm} is a quantum-vulnerable key-establishment scheme listed in NIST IR 8547 Table 4: deprecated after 2030, disallowed after 2035.",
|
|
104
|
+
"likelihood": "high",
|
|
105
|
+
"impact": "major",
|
|
106
|
+
"families": {
|
|
107
|
+
"FFDH": "ff",
|
|
108
|
+
"MQV": "ff",
|
|
109
|
+
"ECDH": "ec",
|
|
110
|
+
"RSAES-OAEP": "rsa"
|
|
111
|
+
},
|
|
112
|
+
"oids": {
|
|
113
|
+
"1.2.840.10046.2.1": "ff",
|
|
114
|
+
"1.2.840.113549.1.3.1": "ff",
|
|
115
|
+
"1.3.132.1.12": "ec",
|
|
116
|
+
"1.3.132.1.13": "ec",
|
|
117
|
+
"1.3.101.110": null,
|
|
118
|
+
"1.3.101.111": null,
|
|
119
|
+
"1.2.840.113549.1.1.7": "rsa"
|
|
120
|
+
},
|
|
121
|
+
"names": {
|
|
122
|
+
"dh": "ff",
|
|
123
|
+
"ffdh": "ff",
|
|
124
|
+
"mqv": "ff",
|
|
125
|
+
"ecdh": "ec",
|
|
126
|
+
"ecmqv": "ec",
|
|
127
|
+
"x25519": null,
|
|
128
|
+
"x448": null,
|
|
129
|
+
"rsaoaep": "rsa",
|
|
130
|
+
"rsaesoaep": "rsa",
|
|
131
|
+
"ffdhe2048": "ff",
|
|
132
|
+
"ffdhe3072": "ff",
|
|
133
|
+
"ffdhe4096": "ff",
|
|
134
|
+
"ffdhe6144": "ff",
|
|
135
|
+
"ffdhe8192": "ff"
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"quantum-vulnerable-public-key": {
|
|
139
|
+
"source": "NIST IR 8547 Table 2 (ECDSA, RSA [FIPS186]) and Table 4 (elliptic-curve DH and MQV [SP80056A], RSA [SP80056B]): the key algorithm alone does not say which use applies, and both tables give the same transition",
|
|
140
|
+
"transition": "Deprecated after 2030; disallowed after 2035",
|
|
141
|
+
"deprecatedAfter": "2030",
|
|
142
|
+
"disallowedAfter": "2035",
|
|
143
|
+
"riskName": "Post-quantum migration",
|
|
144
|
+
"statement": "This public-key algorithm is quantum-vulnerable whether it signs (NIST IR 8547 Table 2) or establishes keys (Table 4); both tables deprecate it after 2030 and disallow it after 2035.",
|
|
145
|
+
"rationale": "{algorithm} is a quantum-vulnerable public-key algorithm listed in NIST IR 8547 Table 2 and Table 4: deprecated after 2030, disallowed after 2035.",
|
|
146
|
+
"likelihood": "high",
|
|
147
|
+
"impact": "major",
|
|
148
|
+
"families": {},
|
|
149
|
+
"oids": {
|
|
150
|
+
"1.2.840.113549.1.1.1": "rsa",
|
|
151
|
+
"1.2.840.10045.2.1": "ec"
|
|
152
|
+
},
|
|
153
|
+
"names": {
|
|
154
|
+
"rsa": "rsa",
|
|
155
|
+
"rsaencryption": "rsa",
|
|
156
|
+
"ec": "ec",
|
|
157
|
+
"ecpublickey": "ec",
|
|
158
|
+
"idecpublickey": "ec"
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"below-minimum-strength": {
|
|
162
|
+
"source": "NIST IR 8547 Table 2 and Table 4 list only parameters with >= 112 bits of classical security strength; key sizes per SP 800-57 Part 1 Rev. 5 Table 2",
|
|
163
|
+
"transition": "Below the minimum strength of the currently approved parameters in NIST IR 8547 Table 2 and Table 4",
|
|
164
|
+
"riskName": "Key below the approved strength",
|
|
165
|
+
"statement": "This key is below the 112 bits of classical security strength that NIST IR 8547 Tables 2 and 4 list for the currently approved quantum-vulnerable public-key algorithms.",
|
|
166
|
+
"rationale": "{algorithm} uses a {size}-bit key, below the {minimum}-bit minimum (112 bits of classical security strength) of the parameters NIST IR 8547 Table 2 and Table 4 list.",
|
|
167
|
+
"likelihood": "very-high",
|
|
168
|
+
"impact": "major"
|
|
169
|
+
},
|
|
170
|
+
"hash-sha1": {
|
|
171
|
+
"source": "NIST IR 8547 Table 8 (hash functions and XOFs), footnote 4",
|
|
172
|
+
"transition": "Currently deprecated for all remaining technical applications; disallowed for use in FIPS-validated cryptographic modules after 2030",
|
|
173
|
+
"disallowedAfter": "2030",
|
|
174
|
+
"riskName": "Deprecated hash function",
|
|
175
|
+
"statement": "SHA-1 is currently deprecated for all remaining technical applications and will be disallowed for use in FIPS-validated cryptographic modules after 2030 (NIST IR 8547 Table 8, footnote 4).",
|
|
176
|
+
"rationale": "{algorithm} is SHA-1, whose collision security strength is below 80 bits (NIST IR 8547 Table 8); it is currently deprecated and disallowed in FIPS-validated modules after 2030.",
|
|
177
|
+
"likelihood": "high",
|
|
178
|
+
"impact": "moderate",
|
|
179
|
+
"families": {
|
|
180
|
+
"SHA-1": null
|
|
181
|
+
},
|
|
182
|
+
"oids": {
|
|
183
|
+
"1.3.14.3.2.26": null
|
|
184
|
+
},
|
|
185
|
+
"names": {
|
|
186
|
+
"sha1": null
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"symmetric-112-bit": {
|
|
190
|
+
"source": "NIST IR 8547 Section 4.1.3 and Table 8: SHA-224, SHA-512/224 and SHA3-224 have 112 bits of collision security strength",
|
|
191
|
+
"transition": "Disallowed in 2030",
|
|
192
|
+
"disallowedIn": "2030",
|
|
193
|
+
"riskName": "112-bit security strength",
|
|
194
|
+
"statement": "This algorithm provides 112 bits of security; NIST IR 8547 section 4.1.3 says NIST's symmetric standards at the 112-bit security level will be disallowed in 2030.",
|
|
195
|
+
"rationale": "{algorithm} has 112 bits of collision security strength (NIST IR 8547 Table 8); section 4.1.3 says the 112-bit symmetric standards will be disallowed in 2030.",
|
|
196
|
+
"likelihood": "medium",
|
|
197
|
+
"impact": "moderate",
|
|
198
|
+
"families": {},
|
|
199
|
+
"oids": {
|
|
200
|
+
"2.16.840.1.101.3.4.2.4": null,
|
|
201
|
+
"2.16.840.1.101.3.4.2.5": null,
|
|
202
|
+
"2.16.840.1.101.3.4.2.7": null
|
|
203
|
+
},
|
|
204
|
+
"names": {
|
|
205
|
+
"sha224": null,
|
|
206
|
+
"sha512224": null,
|
|
207
|
+
"sha3224": null
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"dsa-generation-not-approved": {
|
|
211
|
+
"source": "FIPS 186-5 (February 2023), section 4 (The Digital Signature Algorithm) and Appendix E: DSA is no longer approved for digital signature generation and may be used to verify signatures generated prior to the implementation date of FIPS 186-5; NIST IR 8547 Table 2 does not list it",
|
|
212
|
+
"url": "https://csrc.nist.gov/pubs/fips/186-5/final",
|
|
213
|
+
"transition": "No longer approved for digital signature generation; may be used only to verify signatures generated prior to the implementation date of FIPS 186-5",
|
|
214
|
+
"riskName": "Signature algorithm no longer approved",
|
|
215
|
+
"statement": "FIPS 186-5 no longer approves DSA for digital signature generation; DSA may be used only to verify signatures generated prior to the implementation date of FIPS 186-5 (section 4).",
|
|
216
|
+
"rationale": "{algorithm} is DSA, which FIPS 186-5 (section 4) no longer approves for digital signature generation; it may be used only to verify signatures generated prior to the implementation date of FIPS 186-5.",
|
|
217
|
+
"likelihood": "high",
|
|
218
|
+
"impact": "moderate",
|
|
219
|
+
"families": {
|
|
220
|
+
"DSA": null
|
|
221
|
+
},
|
|
222
|
+
"oids": {
|
|
223
|
+
"1.2.840.10040.4.1": null,
|
|
224
|
+
"1.2.840.10040.4.3": null,
|
|
225
|
+
"2.16.840.1.101.3.4.3.1": null,
|
|
226
|
+
"2.16.840.1.101.3.4.3.2": null,
|
|
227
|
+
"2.16.840.1.101.3.4.3.3": null,
|
|
228
|
+
"2.16.840.1.101.3.4.3.4": null,
|
|
229
|
+
"2.16.840.1.101.3.4.3.5": null,
|
|
230
|
+
"2.16.840.1.101.3.4.3.6": null,
|
|
231
|
+
"2.16.840.1.101.3.4.3.7": null,
|
|
232
|
+
"2.16.840.1.101.3.4.3.8": null
|
|
233
|
+
},
|
|
234
|
+
"names": {
|
|
235
|
+
"dsa": null
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
package/data/remediations.json
CHANGED
|
@@ -167,6 +167,58 @@
|
|
|
167
167
|
},
|
|
168
168
|
"docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=java"
|
|
169
169
|
},
|
|
170
|
+
"jvm.gradle.lockfile-only": {
|
|
171
|
+
"ecosystem": "java",
|
|
172
|
+
"kind": "fallback.engaged",
|
|
173
|
+
"impact": "transitive-deps",
|
|
174
|
+
"title": "The components came from Gradle dependency lockfiles, which record no dependency graph between them",
|
|
175
|
+
"targetTier": "resolved",
|
|
176
|
+
"actions": [
|
|
177
|
+
{
|
|
178
|
+
"kind": "config",
|
|
179
|
+
"command": "Let Gradle run to read the resolved dependency graph: drop --no-install-deps, and drop the gradle-prefer-lockfile flag or the GRADLE_PREFER_LOCKFILE variable if either is set."
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"kind": "rerun"
|
|
183
|
+
}
|
|
184
|
+
],
|
|
185
|
+
"verify": {
|
|
186
|
+
"rules": [],
|
|
187
|
+
"expectTier": "resolved",
|
|
188
|
+
"eventsCleared": [
|
|
189
|
+
"jvm.gradle.lockfile-only"
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
"docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=java"
|
|
193
|
+
},
|
|
194
|
+
"jvm.gradle.verification-metadata-only": {
|
|
195
|
+
"ecosystem": "java",
|
|
196
|
+
"kind": "fallback.engaged",
|
|
197
|
+
"impact": "transitive-deps",
|
|
198
|
+
"title": "The components came from gradle/verification-metadata.xml, which records no dependency graph between them",
|
|
199
|
+
"targetTier": "resolved",
|
|
200
|
+
"actions": [
|
|
201
|
+
{
|
|
202
|
+
"kind": "config",
|
|
203
|
+
"command": "Let Gradle run to read the resolved dependency graph: drop --no-install-deps, and drop the gradle-prefer-lockfile flag or the GRADLE_PREFER_LOCKFILE variable if either is set."
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"kind": "config",
|
|
207
|
+
"command": "Commit Gradle dependency lockfiles for a flat but resolved inventory: enable dependencyLocking and run 'gradle dependencies --write-locks'."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"kind": "rerun"
|
|
211
|
+
}
|
|
212
|
+
],
|
|
213
|
+
"verify": {
|
|
214
|
+
"rules": [],
|
|
215
|
+
"expectTier": "resolved",
|
|
216
|
+
"eventsCleared": [
|
|
217
|
+
"jvm.gradle.verification-metadata-only"
|
|
218
|
+
]
|
|
219
|
+
},
|
|
220
|
+
"docs": "https://cyclonedx.github.io/cdxgen/#/PROJECT_TYPES?id=java"
|
|
221
|
+
},
|
|
170
222
|
"jvm.gradle.invocation-failed": {
|
|
171
223
|
"ecosystem": "java",
|
|
172
224
|
"kind": "command.failed",
|
|
@@ -287,11 +287,12 @@
|
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
# Post-quantum OIDs (ML-DSA RFC 9881, SLH-DSA RFC 9909, ML-KEM RFC 9935) and
|
|
290
|
-
# the classical-only cutoff. NIST IR 8547 (
|
|
291
|
-
#
|
|
290
|
+
# the classical-only cutoff. NIST IR 8547 (final, October 2026) Tables 2 and 4
|
|
291
|
+
# disallow quantum-vulnerable signature and key-establishment algorithms after
|
|
292
|
+
# 2035.
|
|
292
293
|
- id: CBC-005
|
|
293
294
|
name: "Classical-only CA certificate valid past the post-quantum transition"
|
|
294
|
-
description: "A CA certificate whose key and signature algorithms are both classical stays valid beyond 2035-01-01, past the date NIST IR 8547 (
|
|
295
|
+
description: "A CA certificate whose key and signature algorithms are both classical stays valid beyond 2035-01-01, past the date after which NIST IR 8547 (final, October 2026, Tables 2 and 4) disallows quantum-vulnerable algorithms."
|
|
295
296
|
severity: low
|
|
296
297
|
category: cbom-security
|
|
297
298
|
dry-run-support: full
|
|
@@ -362,3 +362,31 @@
|
|
|
362
362
|
"platform": $contains(purl, 'platform=') ? $substringAfter(purl, 'platform=') : 'ruby',
|
|
363
363
|
"requiredRubyVersion": $prop($, 'cdx:gem:rubyVersionSpecifiers')
|
|
364
364
|
}
|
|
365
|
+
|
|
366
|
+
- id: INT-016
|
|
367
|
+
name: "Gradle verification metadata disagrees with the artifact digest"
|
|
368
|
+
description: >-
|
|
369
|
+
A component carries cdx:gradle:verificationMismatch=true: the digest
|
|
370
|
+
gradle/verification-metadata.xml records for this component's artifact
|
|
371
|
+
differs from the digest cdxgen computed from the artifact in the local
|
|
372
|
+
cache. A released Maven version does not change after publishing, so a
|
|
373
|
+
stale file cannot explain this. The likely causes are an artifact
|
|
374
|
+
republished on a mirror or internal repository, or a corrupted or
|
|
375
|
+
tampered cache. The recorded digest is never applied over the
|
|
376
|
+
artifact's own, and SNAPSHOT versions are not compared.
|
|
377
|
+
severity: high
|
|
378
|
+
category: package-integrity
|
|
379
|
+
dry-run-support: full
|
|
380
|
+
condition: |
|
|
381
|
+
components[
|
|
382
|
+
$prop($, 'cdx:gradle:verificationMismatch') = 'true'
|
|
383
|
+
]
|
|
384
|
+
location: |
|
|
385
|
+
{ "bomRef": $."bom-ref", "purl": purl }
|
|
386
|
+
message: "The digest gradle/verification-metadata.xml records for '{{ name }}@{{ version }}' differs from the digest of the artifact on disk"
|
|
387
|
+
mitigation: "Compare the jar in the local cache with the copy the repository serves, and find out which repository or mirror served the differing one. Regenerate gradle/verification-metadata.xml only after that check: regenerating it first records the suspect digest and removes the evidence"
|
|
388
|
+
evidence: |
|
|
389
|
+
{
|
|
390
|
+
"verificationMethods": $prop($, 'cdx:gradle:verificationMethods'),
|
|
391
|
+
"pgpKeyIds": $prop($, 'cdx:gradle:pgpKeyIds')
|
|
392
|
+
}
|
package/lib/audit/index.js
CHANGED
|
@@ -30,6 +30,10 @@ import {
|
|
|
30
30
|
getNonCycloneDxErrorMessage,
|
|
31
31
|
isCycloneDxBom,
|
|
32
32
|
} from "../inventory/bomUtils.js";
|
|
33
|
+
import {
|
|
34
|
+
formatReadLossNotice,
|
|
35
|
+
loadBomForAnalysis,
|
|
36
|
+
} from "../inventory/cyclonedx20.js";
|
|
33
37
|
import {
|
|
34
38
|
collectPolicyViolations,
|
|
35
39
|
loadPolicy,
|
|
@@ -122,10 +126,14 @@ const PYTHON_OBFUSCATION_PATTERN =
|
|
|
122
126
|
const PYTHON_SETUP_CMDCLASS_PATTERN = /\bcmdclass\s*=/i;
|
|
123
127
|
|
|
124
128
|
/**
|
|
125
|
-
* Read and validate a CycloneDX BOM file.
|
|
129
|
+
* Read and validate a CycloneDX BOM file. A CycloneDX 2.0 document is read
|
|
130
|
+
* into cdxgen's internal 1.x-shaped model, so the audit rules keep reading
|
|
131
|
+
* `components`, `bom-ref` and `metadata.component`; the number of losses
|
|
132
|
+
* the read reported is printed once on stderr, with the details in
|
|
133
|
+
* thoughtLog.
|
|
126
134
|
*
|
|
127
135
|
* @param {string} bomPath BOM file path
|
|
128
|
-
* @returns {object} parsed CycloneDX BOM
|
|
136
|
+
* @returns {object} parsed CycloneDX BOM in the 1.x shape
|
|
129
137
|
*/
|
|
130
138
|
export function loadBomFile(bomPath) {
|
|
131
139
|
const resolvedPath = resolve(bomPath);
|
|
@@ -138,7 +146,21 @@ export function loadBomFile(bomPath) {
|
|
|
138
146
|
if (!isCycloneDxBom(bomJson)) {
|
|
139
147
|
throw new Error(getNonCycloneDxErrorMessage(bomJson, "cdx-audit"));
|
|
140
148
|
}
|
|
141
|
-
|
|
149
|
+
let analysis;
|
|
150
|
+
try {
|
|
151
|
+
analysis = loadBomForAnalysis(bomJson);
|
|
152
|
+
} catch (error) {
|
|
153
|
+
throw new Error(`Failed to read ${resolvedPath}: ${error.message}`);
|
|
154
|
+
}
|
|
155
|
+
const { internalBom, losses } = analysis;
|
|
156
|
+
if (losses.length) {
|
|
157
|
+
// stderr: stdout carries the --report json/sarif payload.
|
|
158
|
+
console.warn(formatReadLossNotice(losses));
|
|
159
|
+
for (const loss of losses) {
|
|
160
|
+
thoughtLog(`cdx-audit 2.0 loss at ${loss.pointer}: ${loss.reason}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return internalBom;
|
|
142
164
|
}
|
|
143
165
|
|
|
144
166
|
/**
|
package/lib/cli/bomAssembly.js
CHANGED
|
@@ -1113,6 +1113,65 @@ export function hasNpmBinCommandEvidence(allImports, pkg) {
|
|
|
1113
1113
|
return false;
|
|
1114
1114
|
}
|
|
1115
1115
|
|
|
1116
|
+
/**
|
|
1117
|
+
* Return a CycloneDX organisational entity built from a collector-supplied
|
|
1118
|
+
* supplier or manufacturer, or undefined when the value is not a well-formed
|
|
1119
|
+
* entity.
|
|
1120
|
+
*
|
|
1121
|
+
* An entity needs a non-empty string name. When a url is present it must be
|
|
1122
|
+
* an array of valid IRI references; any other shape (a single string, an
|
|
1123
|
+
* array holding non-strings) drops the entity so the BOM stays schema
|
|
1124
|
+
* valid. Each contact is reduced to its string name, email and phone, and a
|
|
1125
|
+
* contact with none of them is left out. The entity bom-ref is not copied,
|
|
1126
|
+
* because CycloneDX 1.4 does not allow it there.
|
|
1127
|
+
*
|
|
1128
|
+
* @param {Object} entity Collector-supplied organisational entity
|
|
1129
|
+
* @returns {Object|undefined} Organisational entity, or undefined
|
|
1130
|
+
*/
|
|
1131
|
+
export function toOrganizationalEntity(entity) {
|
|
1132
|
+
if (!entity || typeof entity !== "object" || Array.isArray(entity)) {
|
|
1133
|
+
return undefined;
|
|
1134
|
+
}
|
|
1135
|
+
if (typeof entity.name !== "string" || !entity.name.trim().length) {
|
|
1136
|
+
return undefined;
|
|
1137
|
+
}
|
|
1138
|
+
const result = { name: entity.name.trim() };
|
|
1139
|
+
if (entity.url !== undefined) {
|
|
1140
|
+
if (
|
|
1141
|
+
!Array.isArray(entity.url) ||
|
|
1142
|
+
!entity.url.every(
|
|
1143
|
+
(u) => typeof u === "string" && u.length && isValidIriReference(u),
|
|
1144
|
+
)
|
|
1145
|
+
) {
|
|
1146
|
+
return undefined;
|
|
1147
|
+
}
|
|
1148
|
+
if (entity.url.length) {
|
|
1149
|
+
result.url = [...entity.url];
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
if (Array.isArray(entity.contact)) {
|
|
1153
|
+
const contacts = [];
|
|
1154
|
+
for (const contact of entity.contact) {
|
|
1155
|
+
if (!contact || typeof contact !== "object" || Array.isArray(contact)) {
|
|
1156
|
+
continue;
|
|
1157
|
+
}
|
|
1158
|
+
const reduced = {};
|
|
1159
|
+
for (const field of ["name", "email", "phone"]) {
|
|
1160
|
+
if (typeof contact[field] === "string" && contact[field].trim()) {
|
|
1161
|
+
reduced[field] = contact[field].trim();
|
|
1162
|
+
}
|
|
1163
|
+
}
|
|
1164
|
+
if (Object.keys(reduced).length) {
|
|
1165
|
+
contacts.push(reduced);
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
if (contacts.length) {
|
|
1169
|
+
result.contact = contacts;
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
return result;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1116
1175
|
/**
|
|
1117
1176
|
* Given the specified package, create a CycloneDX component and add it to the list.
|
|
1118
1177
|
*/
|
|
@@ -1192,7 +1251,9 @@ export function addComponent(
|
|
|
1192
1251
|
const description = pkg.description || undefined;
|
|
1193
1252
|
let compScope = pkg.scope;
|
|
1194
1253
|
let isTypeOnlyPkg = false;
|
|
1195
|
-
|
|
1254
|
+
// addEvidenceForImports flags an installed version that none of the
|
|
1255
|
+
// project's imports resolve to; its name matching an import is no use.
|
|
1256
|
+
if (allImports && !pkg._npmImportsResolveElsewhere) {
|
|
1196
1257
|
const impPkgs = Object.keys(allImports);
|
|
1197
1258
|
const hasBinCommandEvidence = hasNpmBinCommandEvidence(allImports, pkg);
|
|
1198
1259
|
if (
|
|
@@ -1281,6 +1342,24 @@ export function addComponent(
|
|
|
1281
1342
|
delete component.swhid;
|
|
1282
1343
|
}
|
|
1283
1344
|
processHashes(pkg, component);
|
|
1345
|
+
// A collector that resolved the organisations behind a component keeps
|
|
1346
|
+
// them here: the AI collectors record the Hugging Face namespace that
|
|
1347
|
+
// published a model or dataset as the supplier, and the organisation
|
|
1348
|
+
// that created a model as the manufacturer. The supplier is a valid
|
|
1349
|
+
// component field in every spec version cdxgen emits; the manufacturer
|
|
1350
|
+
// arrived in CycloneDX 1.6. Only a well-formed organisational entity is
|
|
1351
|
+
// copied, so a collector that puts a string url or a build string on the
|
|
1352
|
+
// package cannot make the BOM fail schema validation.
|
|
1353
|
+
const supplier = toOrganizationalEntity(pkg.supplier);
|
|
1354
|
+
if (supplier) {
|
|
1355
|
+
component.supplier = supplier;
|
|
1356
|
+
}
|
|
1357
|
+
if (options.specVersion >= 1.6) {
|
|
1358
|
+
const manufacturer = toOrganizationalEntity(pkg.manufacturer);
|
|
1359
|
+
if (manufacturer) {
|
|
1360
|
+
component.manufacturer = manufacturer;
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1284
1363
|
// Upgrade authors section
|
|
1285
1364
|
if (options.specVersion >= 1.6 && component.author) {
|
|
1286
1365
|
const authorsList = [];
|