@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.
Files changed (264) hide show
  1. package/README.md +15 -8
  2. package/bin/audit.js +7 -4
  3. package/bin/cdxgen.js +256 -37
  4. package/bin/convert.js +146 -22
  5. package/bin/evinse.js +25 -3
  6. package/bin/repl.js +47 -3
  7. package/bin/sign.js +211 -34
  8. package/bin/tracebom.js +18 -6
  9. package/bin/validate.js +18 -3
  10. package/bin/verify.js +113 -5
  11. package/data/behavior-taxonomy.schema.json +1491 -0
  12. package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
  13. package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
  14. package/data/pqc-migration.json +239 -0
  15. package/data/remediations.json +52 -0
  16. package/data/rules/cbom-security.yaml +4 -3
  17. package/data/rules/package-integrity.yaml +28 -0
  18. package/lib/audit/index.js +25 -3
  19. package/lib/cli/bomAssembly.js +80 -1
  20. package/lib/cli/cliOptions.js +121 -17
  21. package/lib/cli/index.js +609 -898
  22. package/lib/cli/jsBom.js +3 -0
  23. package/lib/cli/jvmBom.js +365 -40
  24. package/lib/cli/managedBom.js +19 -3
  25. package/lib/cli/nativeBom.js +10 -0
  26. package/lib/core/env.js +26 -0
  27. package/lib/core/fs.js +126 -3
  28. package/lib/core/globPatterns.js +218 -0
  29. package/lib/core/processTree.js +99 -12
  30. package/lib/core/projectConfig.js +332 -25
  31. package/lib/core/toolRegistry.js +15 -1
  32. package/lib/ecosystems/denoutils.js +2 -2
  33. package/lib/ecosystems/golem.js +3 -8
  34. package/lib/ecosystems/gradleutils.js +1082 -6
  35. package/lib/ecosystems/jsEvidence.js +90 -38
  36. package/lib/ecosystems/kosi.js +3 -5
  37. package/lib/ecosystems/npmVersionResolution.js +376 -0
  38. package/lib/ecosystems/parsers-python.js +89 -28
  39. package/lib/ecosystems/parsers-rust.js +117 -15
  40. package/lib/ecosystems/remote/huggingface.js +22 -0
  41. package/lib/ecosystems/rusi.js +2 -4
  42. package/lib/ecosystems/scalasem.js +2 -1
  43. package/lib/evinser/evinser.js +196 -34
  44. package/lib/evinser/scalasem.js +5 -1
  45. package/lib/helpers/agenticToolutils.js +112 -1
  46. package/lib/helpers/bomSigner.js +43 -9
  47. package/lib/helpers/jssSigner.js +1276 -0
  48. package/lib/inventory/agentBlueprint.js +193 -0
  49. package/lib/inventory/agentToolNames.js +145 -0
  50. package/lib/inventory/aiCollector.js +153 -7
  51. package/lib/inventory/aiInventory.js +44 -8
  52. package/lib/inventory/aiProviders.js +324 -0
  53. package/lib/inventory/bomUtils.js +8 -1
  54. package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
  55. package/lib/inventory/citations.js +31 -2
  56. package/lib/inventory/communityAiConfigParser.js +978 -80
  57. package/lib/inventory/cyclonedx20.js +152 -0
  58. package/lib/inventory/cyclonedx20Common.js +286 -0
  59. package/lib/inventory/cyclonedx20Derived.js +159 -0
  60. package/lib/inventory/cyclonedx20Parties.js +552 -0
  61. package/lib/inventory/cyclonedx20Read.js +768 -0
  62. package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
  63. package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
  64. package/lib/inventory/cyclonedx20ReadContext.js +380 -0
  65. package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
  66. package/lib/inventory/cyclonedx20ReadSections.js +599 -0
  67. package/lib/inventory/cyclonedx20Render.js +766 -0
  68. package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
  69. package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
  70. package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
  71. package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
  72. package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
  73. package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
  74. package/lib/inventory/cyclonedx20RenderSections.js +499 -0
  75. package/lib/inventory/cyclonedx20Tables.js +594 -0
  76. package/lib/inventory/deps.js +106 -13
  77. package/lib/inventory/dosai.js +236 -1
  78. package/lib/inventory/dosaiParsers.js +3 -6
  79. package/lib/inventory/dotnetRuntime.js +164 -14
  80. package/lib/inventory/ecosystemFormulationParsers.js +979 -0
  81. package/lib/inventory/envcontext.js +132 -38
  82. package/lib/inventory/evidenceUtils.js +2 -1
  83. package/lib/inventory/formulationParsers.js +95 -13
  84. package/lib/inventory/hbom.js +45 -6
  85. package/lib/inventory/hbomLoader.js +166 -0
  86. package/lib/inventory/mcpConfigParser.js +5 -0
  87. package/lib/inventory/occurrenceKey.js +90 -0
  88. package/lib/inventory/pqcMigration.js +426 -0
  89. package/lib/inventory/rustFormulationParser.js +21 -10
  90. package/lib/inventory/source.js +65 -6
  91. package/lib/parsers/huggingfaceManifest.js +9 -1
  92. package/lib/parsers/huggingfaceUtils.js +18 -0
  93. package/lib/parsers/kiroPermissions.js +166 -0
  94. package/lib/server/server.js +36 -34
  95. package/lib/stages/postgen/postgen.js +41 -1
  96. package/lib/stages/postgen/specVersionCompat.js +76 -0
  97. package/lib/validator/bomValidator.js +8 -1
  98. package/lib/validator/complianceEngine.js +30 -3
  99. package/lib/validator/complianceRules.js +1416 -4
  100. package/lib/validator/generated/validate-2.0.mjs +57554 -13851
  101. package/lib/validator/index.js +48 -7
  102. package/lib/validator/reporters/json.js +6 -0
  103. package/package.json +9 -9
  104. package/types/bin/repl.d.ts.map +1 -1
  105. package/types/lib/audit/index.d.ts +6 -2
  106. package/types/lib/audit/index.d.ts.map +1 -1
  107. package/types/lib/cli/bomAssembly.d.ts +16 -0
  108. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  109. package/types/lib/cli/cliOptions.d.ts +6 -0
  110. package/types/lib/cli/cliOptions.d.ts.map +1 -1
  111. package/types/lib/cli/index.d.ts.map +1 -1
  112. package/types/lib/cli/jsBom.d.ts +2 -1
  113. package/types/lib/cli/jsBom.d.ts.map +1 -1
  114. package/types/lib/cli/jvmBom.d.ts +15 -0
  115. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  116. package/types/lib/cli/managedBom.d.ts.map +1 -1
  117. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  118. package/types/lib/core/boundedFile.d.ts +30 -0
  119. package/types/lib/core/boundedFile.d.ts.map +1 -1
  120. package/types/lib/core/env.d.ts +10 -0
  121. package/types/lib/core/env.d.ts.map +1 -1
  122. package/types/lib/core/fs.d.ts +4 -0
  123. package/types/lib/core/fs.d.ts.map +1 -1
  124. package/types/lib/core/globPatterns.d.ts +70 -0
  125. package/types/lib/core/globPatterns.d.ts.map +1 -0
  126. package/types/lib/core/paths.d.ts +9 -0
  127. package/types/lib/core/paths.d.ts.map +1 -1
  128. package/types/lib/core/processTree.d.ts +16 -5
  129. package/types/lib/core/processTree.d.ts.map +1 -1
  130. package/types/lib/core/projectConfig.d.ts +47 -8
  131. package/types/lib/core/projectConfig.d.ts.map +1 -1
  132. package/types/lib/core/toolRegistry.d.ts.map +1 -1
  133. package/types/lib/ecosystems/golem.d.ts.map +1 -1
  134. package/types/lib/ecosystems/gradleutils.d.ts +248 -8
  135. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  136. package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
  137. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
  138. package/types/lib/ecosystems/kosi.d.ts.map +1 -1
  139. package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
  140. package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
  141. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  142. package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
  143. package/types/lib/ecosystems/pythonutils.d.ts +1 -1
  144. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
  145. package/types/lib/ecosystems/rusi.d.ts.map +1 -1
  146. package/types/lib/ecosystems/scalasem.d.ts +58 -16
  147. package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
  148. package/types/lib/evinser/evinser.d.ts +61 -9
  149. package/types/lib/evinser/evinser.d.ts.map +1 -1
  150. package/types/lib/evinser/scalasem.d.ts.map +1 -1
  151. package/types/lib/helpers/agenticToolutils.d.ts +53 -19
  152. package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
  153. package/types/lib/helpers/bomSigner.d.ts +20 -3
  154. package/types/lib/helpers/bomSigner.d.ts.map +1 -1
  155. package/types/lib/helpers/jssSigner.d.ts +288 -0
  156. package/types/lib/helpers/jssSigner.d.ts.map +1 -0
  157. package/types/lib/helpers/vsixutils.d.ts +303 -19
  158. package/types/lib/helpers/vsixutils.d.ts.map +1 -1
  159. package/types/lib/inventory/agentBlueprint.d.ts +70 -0
  160. package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
  161. package/types/lib/inventory/agentToolNames.d.ts +51 -0
  162. package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
  163. package/types/lib/inventory/aiCollector.d.ts.map +1 -1
  164. package/types/lib/inventory/aiInventory.d.ts.map +1 -1
  165. package/types/lib/inventory/aiProviders.d.ts +85 -0
  166. package/types/lib/inventory/aiProviders.d.ts.map +1 -0
  167. package/types/lib/inventory/bomUtils.d.ts.map +1 -1
  168. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
  169. package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
  170. package/types/lib/inventory/citations.d.ts +5 -0
  171. package/types/lib/inventory/citations.d.ts.map +1 -1
  172. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
  173. package/types/lib/inventory/cyclonedx20.d.ts +99 -0
  174. package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
  175. package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
  176. package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
  177. package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
  178. package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
  179. package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
  180. package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
  181. package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
  182. package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
  183. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
  184. package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
  185. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
  186. package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
  187. package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
  188. package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
  189. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
  190. package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
  191. package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
  192. package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
  193. package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
  194. package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
  195. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
  196. package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
  197. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
  198. package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
  199. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
  200. package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
  201. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
  202. package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
  203. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
  204. package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
  205. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
  206. package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
  207. package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
  208. package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
  209. package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
  210. package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
  211. package/types/lib/inventory/deps.d.ts +35 -2
  212. package/types/lib/inventory/deps.d.ts.map +1 -1
  213. package/types/lib/inventory/dosai.d.ts +19 -0
  214. package/types/lib/inventory/dosai.d.ts.map +1 -1
  215. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
  216. package/types/lib/inventory/dotnetRuntime.d.ts +51 -4
  217. package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -1
  218. package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
  219. package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
  220. package/types/lib/inventory/envcontext.d.ts +22 -6
  221. package/types/lib/inventory/envcontext.d.ts.map +1 -1
  222. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  223. package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
  224. package/types/lib/inventory/hbom.d.ts +11 -0
  225. package/types/lib/inventory/hbom.d.ts.map +1 -1
  226. package/types/lib/inventory/hbomLoader.d.ts +54 -0
  227. package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
  228. package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
  229. package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
  230. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
  231. package/types/lib/inventory/occurrenceKey.d.ts +52 -0
  232. package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
  233. package/types/lib/inventory/pqcMigration.d.ts +84 -0
  234. package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
  235. package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
  236. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
  237. package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
  238. package/types/lib/inventory/scalaDedupe.d.ts +43 -0
  239. package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
  240. package/types/lib/inventory/source.d.ts +15 -0
  241. package/types/lib/inventory/source.d.ts.map +1 -1
  242. package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
  243. package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
  244. package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
  245. package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
  246. package/types/lib/parsers/kiroPermissions.d.ts +62 -0
  247. package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
  248. package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
  249. package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
  250. package/types/lib/server/server.d.ts.map +1 -1
  251. package/types/lib/stages/postgen/postgen.d.ts +7 -0
  252. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  253. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  254. package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
  255. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
  256. package/types/lib/validator/bomValidator.d.ts +5 -1
  257. package/types/lib/validator/bomValidator.d.ts.map +1 -1
  258. package/types/lib/validator/complianceEngine.d.ts +4 -4
  259. package/types/lib/validator/complianceEngine.d.ts.map +1 -1
  260. package/types/lib/validator/complianceRules.d.ts +14 -2
  261. package/types/lib/validator/complianceRules.d.ts.map +1 -1
  262. package/types/lib/validator/index.d.ts +10 -0
  263. package/types/lib/validator/index.d.ts.map +1 -1
  264. 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
+ }
@@ -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 (initial public draft) proposes
291
- # classical algorithms be disallowed after 2035.
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 (initial public draft) proposes to disallow classical algorithms."
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
+ }
@@ -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
- return bomJson;
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
  /**
@@ -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
- if (allImports) {
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 = [];