@quantakrypto/core 0.4.3 → 0.5.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 (314) hide show
  1. package/README.md +76 -27
  2. package/dist/cbom-merge.d.ts +9 -0
  3. package/dist/cbom-merge.d.ts.map +1 -0
  4. package/dist/cbom-merge.js +121 -0
  5. package/dist/cbom-merge.js.map +1 -0
  6. package/dist/cbom.d.ts +5 -0
  7. package/dist/cbom.d.ts.map +1 -1
  8. package/dist/cbom.js +132 -37
  9. package/dist/cbom.js.map +1 -1
  10. package/dist/comments.d.ts +6 -26
  11. package/dist/comments.d.ts.map +1 -1
  12. package/dist/comments.js +77 -38
  13. package/dist/comments.js.map +1 -1
  14. package/dist/dependencies.d.ts.map +1 -1
  15. package/dist/dependencies.js +1 -1
  16. package/dist/dependencies.js.map +1 -1
  17. package/dist/detect-utils.d.ts +59 -21
  18. package/dist/detect-utils.d.ts.map +1 -1
  19. package/dist/detect-utils.js +143 -8
  20. package/dist/detect-utils.js.map +1 -1
  21. package/dist/detectors/age.d.ts +16 -0
  22. package/dist/detectors/age.d.ts.map +1 -0
  23. package/dist/detectors/age.js +40 -0
  24. package/dist/detectors/age.js.map +1 -0
  25. package/dist/detectors/ansible.d.ts +13 -0
  26. package/dist/detectors/ansible.d.ts.map +1 -0
  27. package/dist/detectors/ansible.js +108 -0
  28. package/dist/detectors/ansible.js.map +1 -0
  29. package/dist/detectors/bicep.d.ts +20 -0
  30. package/dist/detectors/bicep.d.ts.map +1 -0
  31. package/dist/detectors/bicep.js +74 -0
  32. package/dist/detectors/bicep.js.map +1 -0
  33. package/dist/detectors/c.d.ts +4 -2
  34. package/dist/detectors/c.d.ts.map +1 -1
  35. package/dist/detectors/c.js +222 -4
  36. package/dist/detectors/c.js.map +1 -1
  37. package/dist/detectors/cicd.d.ts +27 -0
  38. package/dist/detectors/cicd.d.ts.map +1 -0
  39. package/dist/detectors/cicd.js +129 -0
  40. package/dist/detectors/cicd.js.map +1 -0
  41. package/dist/detectors/cloud-kms.d.ts +24 -0
  42. package/dist/detectors/cloud-kms.d.ts.map +1 -0
  43. package/dist/detectors/cloud-kms.js +99 -0
  44. package/dist/detectors/cloud-kms.js.map +1 -0
  45. package/dist/detectors/cloudformation.d.ts +38 -0
  46. package/dist/detectors/cloudformation.d.ts.map +1 -0
  47. package/dist/detectors/cloudformation.js +201 -0
  48. package/dist/detectors/cloudformation.js.map +1 -0
  49. package/dist/detectors/codesign.d.ts +50 -0
  50. package/dist/detectors/codesign.d.ts.map +1 -0
  51. package/dist/detectors/codesign.js +143 -0
  52. package/dist/detectors/codesign.js.map +1 -0
  53. package/dist/detectors/csharp.d.ts.map +1 -1
  54. package/dist/detectors/csharp.js +13 -3
  55. package/dist/detectors/csharp.js.map +1 -1
  56. package/dist/detectors/dart.d.ts +35 -0
  57. package/dist/detectors/dart.d.ts.map +1 -0
  58. package/dist/detectors/dart.js +177 -0
  59. package/dist/detectors/dart.js.map +1 -0
  60. package/dist/detectors/database.d.ts +19 -0
  61. package/dist/detectors/database.d.ts.map +1 -0
  62. package/dist/detectors/database.js +97 -0
  63. package/dist/detectors/database.js.map +1 -0
  64. package/dist/detectors/dkim.d.ts +54 -0
  65. package/dist/detectors/dkim.d.ts.map +1 -0
  66. package/dist/detectors/dkim.js +92 -0
  67. package/dist/detectors/dkim.js.map +1 -0
  68. package/dist/detectors/dnssec.d.ts +55 -0
  69. package/dist/detectors/dnssec.d.ts.map +1 -0
  70. package/dist/detectors/dnssec.js +116 -0
  71. package/dist/detectors/dnssec.js.map +1 -0
  72. package/dist/detectors/elixir.d.ts +20 -0
  73. package/dist/detectors/elixir.d.ts.map +1 -0
  74. package/dist/detectors/elixir.js +227 -0
  75. package/dist/detectors/elixir.js.map +1 -0
  76. package/dist/detectors/java.d.ts.map +1 -1
  77. package/dist/detectors/java.js +34 -4
  78. package/dist/detectors/java.js.map +1 -1
  79. package/dist/detectors/jose.d.ts +20 -0
  80. package/dist/detectors/jose.d.ts.map +1 -0
  81. package/dist/detectors/jose.js +72 -0
  82. package/dist/detectors/jose.js.map +1 -0
  83. package/dist/detectors/jwk.d.ts +25 -0
  84. package/dist/detectors/jwk.d.ts.map +1 -0
  85. package/dist/detectors/jwk.js +131 -0
  86. package/dist/detectors/jwk.js.map +1 -0
  87. package/dist/detectors/k8s.d.ts +17 -0
  88. package/dist/detectors/k8s.d.ts.map +1 -0
  89. package/dist/detectors/k8s.js +88 -0
  90. package/dist/detectors/k8s.js.map +1 -0
  91. package/dist/detectors/keystore.d.ts +19 -0
  92. package/dist/detectors/keystore.d.ts.map +1 -0
  93. package/dist/detectors/keystore.js +76 -0
  94. package/dist/detectors/keystore.js.map +1 -0
  95. package/dist/detectors/mesh.d.ts +34 -0
  96. package/dist/detectors/mesh.d.ts.map +1 -0
  97. package/dist/detectors/mesh.js +91 -0
  98. package/dist/detectors/mesh.js.map +1 -0
  99. package/dist/detectors/messaging.d.ts +16 -0
  100. package/dist/detectors/messaging.d.ts.map +1 -0
  101. package/dist/detectors/messaging.js +79 -0
  102. package/dist/detectors/messaging.js.map +1 -0
  103. package/dist/detectors/objc.d.ts +41 -0
  104. package/dist/detectors/objc.d.ts.map +1 -0
  105. package/dist/detectors/objc.js +146 -0
  106. package/dist/detectors/objc.js.map +1 -0
  107. package/dist/detectors/openpgp.d.ts +20 -0
  108. package/dist/detectors/openpgp.d.ts.map +1 -0
  109. package/dist/detectors/openpgp.js +151 -0
  110. package/dist/detectors/openpgp.js.map +1 -0
  111. package/dist/detectors/pem.d.ts.map +1 -1
  112. package/dist/detectors/pem.js +33 -1
  113. package/dist/detectors/pem.js.map +1 -1
  114. package/dist/detectors/php.d.ts +25 -0
  115. package/dist/detectors/php.d.ts.map +1 -0
  116. package/dist/detectors/php.js +171 -0
  117. package/dist/detectors/php.js.map +1 -0
  118. package/dist/detectors/pkcs11.d.ts +17 -0
  119. package/dist/detectors/pkcs11.d.ts.map +1 -0
  120. package/dist/detectors/pkcs11.js +87 -0
  121. package/dist/detectors/pkcs11.js.map +1 -0
  122. package/dist/detectors/proxy.d.ts +52 -0
  123. package/dist/detectors/proxy.d.ts.map +1 -0
  124. package/dist/detectors/proxy.js +157 -0
  125. package/dist/detectors/proxy.js.map +1 -0
  126. package/dist/detectors/pulumi.d.ts +19 -0
  127. package/dist/detectors/pulumi.d.ts.map +1 -0
  128. package/dist/detectors/pulumi.js +80 -0
  129. package/dist/detectors/pulumi.js.map +1 -0
  130. package/dist/detectors/python.d.ts.map +1 -1
  131. package/dist/detectors/python.js +70 -0
  132. package/dist/detectors/python.js.map +1 -1
  133. package/dist/detectors/rust.d.ts.map +1 -1
  134. package/dist/detectors/rust.js +73 -0
  135. package/dist/detectors/rust.js.map +1 -1
  136. package/dist/detectors/secrets.d.ts +24 -0
  137. package/dist/detectors/secrets.d.ts.map +1 -0
  138. package/dist/detectors/secrets.js +63 -0
  139. package/dist/detectors/secrets.js.map +1 -0
  140. package/dist/detectors/solidity.d.ts +50 -0
  141. package/dist/detectors/solidity.d.ts.map +1 -0
  142. package/dist/detectors/solidity.js +108 -0
  143. package/dist/detectors/solidity.js.map +1 -0
  144. package/dist/detectors/source.d.ts.map +1 -1
  145. package/dist/detectors/source.js +243 -53
  146. package/dist/detectors/source.js.map +1 -1
  147. package/dist/detectors/spire.d.ts +49 -0
  148. package/dist/detectors/spire.d.ts.map +1 -0
  149. package/dist/detectors/spire.js +77 -0
  150. package/dist/detectors/spire.js.map +1 -0
  151. package/dist/detectors/ssh-ca.d.ts +72 -0
  152. package/dist/detectors/ssh-ca.d.ts.map +1 -0
  153. package/dist/detectors/ssh-ca.js +119 -0
  154. package/dist/detectors/ssh-ca.js.map +1 -0
  155. package/dist/detectors/stateful-hbs.d.ts.map +1 -1
  156. package/dist/detectors/stateful-hbs.js +9 -6
  157. package/dist/detectors/stateful-hbs.js.map +1 -1
  158. package/dist/detectors/supply-chain.d.ts +17 -0
  159. package/dist/detectors/supply-chain.d.ts.map +1 -0
  160. package/dist/detectors/supply-chain.js +89 -0
  161. package/dist/detectors/supply-chain.js.map +1 -0
  162. package/dist/detectors/swift.d.ts +22 -0
  163. package/dist/detectors/swift.d.ts.map +1 -0
  164. package/dist/detectors/swift.js +120 -0
  165. package/dist/detectors/swift.js.map +1 -0
  166. package/dist/detectors/terraform.d.ts +21 -0
  167. package/dist/detectors/terraform.d.ts.map +1 -0
  168. package/dist/detectors/terraform.js +150 -0
  169. package/dist/detectors/terraform.js.map +1 -0
  170. package/dist/detectors/vault.d.ts +15 -0
  171. package/dist/detectors/vault.d.ts.map +1 -0
  172. package/dist/detectors/vault.js +97 -0
  173. package/dist/detectors/vault.js.map +1 -0
  174. package/dist/detectors/vpn.d.ts +22 -0
  175. package/dist/detectors/vpn.d.ts.map +1 -0
  176. package/dist/detectors/vpn.js +73 -0
  177. package/dist/detectors/vpn.js.map +1 -0
  178. package/dist/detectors/weak-hash.d.ts +71 -0
  179. package/dist/detectors/weak-hash.d.ts.map +1 -0
  180. package/dist/detectors/weak-hash.js +116 -0
  181. package/dist/detectors/weak-hash.js.map +1 -0
  182. package/dist/detectors/webauthn.d.ts +61 -0
  183. package/dist/detectors/webauthn.d.ts.map +1 -0
  184. package/dist/detectors/webauthn.js +109 -0
  185. package/dist/detectors/webauthn.js.map +1 -0
  186. package/dist/detectors/xmldsig.d.ts +23 -0
  187. package/dist/detectors/xmldsig.d.ts.map +1 -0
  188. package/dist/detectors/xmldsig.js +84 -0
  189. package/dist/detectors/xmldsig.js.map +1 -0
  190. package/dist/evidence.d.ts +79 -4
  191. package/dist/evidence.d.ts.map +1 -1
  192. package/dist/evidence.js +76 -0
  193. package/dist/evidence.js.map +1 -1
  194. package/dist/index.d.ts +17 -9
  195. package/dist/index.d.ts.map +1 -1
  196. package/dist/index.js +21 -9
  197. package/dist/index.js.map +1 -1
  198. package/dist/inventory.d.ts +0 -2
  199. package/dist/inventory.d.ts.map +1 -1
  200. package/dist/inventory.js +15 -6
  201. package/dist/inventory.js.map +1 -1
  202. package/dist/policy.d.ts +67 -0
  203. package/dist/policy.d.ts.map +1 -0
  204. package/dist/policy.js +115 -0
  205. package/dist/policy.js.map +1 -0
  206. package/dist/registry.d.ts +9 -4
  207. package/dist/registry.d.ts.map +1 -1
  208. package/dist/registry.js +81 -4
  209. package/dist/registry.js.map +1 -1
  210. package/dist/remediate-pipeline.d.ts +0 -3
  211. package/dist/remediate-pipeline.d.ts.map +1 -1
  212. package/dist/remediate-pipeline.js +23 -2
  213. package/dist/remediate-pipeline.js.map +1 -1
  214. package/dist/remediation.d.ts +10 -0
  215. package/dist/remediation.d.ts.map +1 -1
  216. package/dist/remediation.js +32 -0
  217. package/dist/remediation.js.map +1 -1
  218. package/dist/report.d.ts +9 -0
  219. package/dist/report.d.ts.map +1 -1
  220. package/dist/report.js +38 -1
  221. package/dist/report.js.map +1 -1
  222. package/dist/scan-worker.js +5 -3
  223. package/dist/scan-worker.js.map +1 -1
  224. package/dist/scan.d.ts.map +1 -1
  225. package/dist/scan.js +35 -6
  226. package/dist/scan.js.map +1 -1
  227. package/dist/standards-profiles.d.ts +58 -0
  228. package/dist/standards-profiles.d.ts.map +1 -0
  229. package/dist/standards-profiles.js +100 -0
  230. package/dist/standards-profiles.js.map +1 -0
  231. package/dist/standards.d.ts +96 -0
  232. package/dist/standards.d.ts.map +1 -0
  233. package/dist/standards.js +107 -0
  234. package/dist/standards.js.map +1 -0
  235. package/dist/types.d.ts +6 -5
  236. package/dist/types.d.ts.map +1 -1
  237. package/dist/types.js.map +1 -1
  238. package/dist/version.d.ts +1 -1
  239. package/dist/version.js +1 -1
  240. package/dist/version.js.map +1 -1
  241. package/dist/vex.d.ts +39 -0
  242. package/dist/vex.d.ts.map +1 -0
  243. package/dist/vex.js +87 -0
  244. package/dist/vex.js.map +1 -0
  245. package/dist/walk.d.ts +8 -3
  246. package/dist/walk.d.ts.map +1 -1
  247. package/dist/walk.js +32 -1
  248. package/dist/walk.js.map +1 -1
  249. package/package.json +1 -1
  250. package/src/cbom-merge.ts +146 -0
  251. package/src/cbom.ts +153 -39
  252. package/src/comments.ts +84 -39
  253. package/src/dependencies.ts +2 -1
  254. package/src/detect-utils.ts +146 -12
  255. package/src/detectors/age.ts +60 -0
  256. package/src/detectors/ansible.ts +140 -0
  257. package/src/detectors/bicep.ts +107 -0
  258. package/src/detectors/c.ts +240 -6
  259. package/src/detectors/cicd.ts +171 -0
  260. package/src/detectors/cloud-kms.ts +141 -0
  261. package/src/detectors/cloudformation.ts +250 -0
  262. package/src/detectors/codesign.ts +214 -0
  263. package/src/detectors/csharp.ts +13 -3
  264. package/src/detectors/dart.ts +237 -0
  265. package/src/detectors/database.ts +141 -0
  266. package/src/detectors/dkim.ts +172 -0
  267. package/src/detectors/dnssec.ts +195 -0
  268. package/src/detectors/elixir.ts +268 -0
  269. package/src/detectors/java.ts +39 -4
  270. package/src/detectors/jose.ts +110 -0
  271. package/src/detectors/jwk.ts +170 -0
  272. package/src/detectors/k8s.ts +115 -0
  273. package/src/detectors/keystore.ts +109 -0
  274. package/src/detectors/mesh.ts +130 -0
  275. package/src/detectors/messaging.ts +106 -0
  276. package/src/detectors/objc.ts +209 -0
  277. package/src/detectors/openpgp.ts +194 -0
  278. package/src/detectors/pem.ts +31 -1
  279. package/src/detectors/php.ts +230 -0
  280. package/src/detectors/pkcs11.ts +113 -0
  281. package/src/detectors/proxy.ts +236 -0
  282. package/src/detectors/pulumi.ts +106 -0
  283. package/src/detectors/python.ts +71 -0
  284. package/src/detectors/rust.ts +76 -0
  285. package/src/detectors/secrets.ts +103 -0
  286. package/src/detectors/solidity.ts +176 -0
  287. package/src/detectors/source.ts +283 -73
  288. package/src/detectors/spire.ts +143 -0
  289. package/src/detectors/ssh-ca.ts +215 -0
  290. package/src/detectors/stateful-hbs.ts +9 -6
  291. package/src/detectors/supply-chain.ts +117 -0
  292. package/src/detectors/swift.ts +149 -0
  293. package/src/detectors/terraform.ts +188 -0
  294. package/src/detectors/vault.ts +120 -0
  295. package/src/detectors/vpn.ts +103 -0
  296. package/src/detectors/weak-hash.ts +217 -0
  297. package/src/detectors/webauthn.ts +205 -0
  298. package/src/detectors/xmldsig.ts +115 -0
  299. package/src/evidence.ts +138 -4
  300. package/src/index.ts +50 -12
  301. package/src/inventory.ts +15 -7
  302. package/src/policy.ts +180 -0
  303. package/src/registry.ts +81 -4
  304. package/src/remediate-pipeline.ts +26 -3
  305. package/src/remediation.ts +39 -0
  306. package/src/report.ts +43 -1
  307. package/src/scan-worker.ts +5 -3
  308. package/src/scan.ts +41 -6
  309. package/src/standards-profiles.ts +136 -0
  310. package/src/standards.ts +186 -0
  311. package/src/types.ts +11 -4
  312. package/src/version.ts +1 -1
  313. package/src/vex.ts +122 -0
  314. package/src/walk.ts +33 -2
@@ -0,0 +1,74 @@
1
+ import { eachMatch, findingFromRule, hasExtension, maskBlockComments, maskCommentLines, } from "../detect-utils.js";
2
+ import { CWE_BROKEN_CRYPTO, CWE_WEAK_STRENGTH } from "../cwe.js";
3
+ const BICEP_EXTENSIONS = [".bicep"];
4
+ // Bicep string values are single-quoted. `kty: 'RSA'` / `'RSA-HSM'` (KEM) and
5
+ // `kty: 'EC'` / `'EC-HSM'` (EC). The `(?<![\w-])` lookbehind stops a longer key name
6
+ // from matching on a `kty` suffix; the value bound keeps `'EC'` from matching `'ECX'`.
7
+ const RE_BICEP_KTY_RSA = /(?<![\w-])kty\s*:\s*'RSA(?:-HSM)?'/g;
8
+ const RE_BICEP_KTY_EC = /(?<![\w-])kty\s*:\s*'EC(?:-HSM)?'/g;
9
+ // Legacy TLS floor. `TLS1_0` / `TLS1_1` are deprecated; `TLS1_2` / `TLS1_3` are fine,
10
+ // and the closing quote keeps this from matching them.
11
+ const RE_BICEP_MIN_TLS = /(?<![\w])minimumTlsVersion\s*:\s*'TLS1_[01]'/g;
12
+ const RULE_BICEP_KTY_RSA = {
13
+ id: "bicep-keyvault-rsa",
14
+ title: "Bicep Azure Key Vault RSA key",
15
+ description: "Azure Bicep Microsoft.KeyVault key with kty: 'RSA'",
16
+ category: "kem",
17
+ severity: "high",
18
+ confidence: "high",
19
+ algorithm: "RSA",
20
+ hndl: true,
21
+ cwe: CWE_BROKEN_CRYPTO,
22
+ message: "Bicep provisions a classical RSA Azure Key Vault key, which is not quantum-safe.",
23
+ remediation: "Plan migration to PQC (ML-KEM-768 for encryption, ML-DSA-65 for signatures).",
24
+ };
25
+ const RULE_BICEP_KTY_EC = {
26
+ id: "bicep-keyvault-ec",
27
+ title: "Bicep Azure Key Vault EC key",
28
+ description: "Azure Bicep Microsoft.KeyVault key with kty: 'EC'",
29
+ category: "key-exchange",
30
+ severity: "high",
31
+ confidence: "high",
32
+ algorithm: "ECDH",
33
+ hndl: true,
34
+ cwe: CWE_BROKEN_CRYPTO,
35
+ message: "Bicep provisions a classical EC Azure Key Vault key; EC keys feed ECDSA signatures and ECDH key agreement (the ECDH path is harvest-now-decrypt-later exposed).",
36
+ remediation: "For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).",
37
+ };
38
+ const RULE_BICEP_MIN_TLS = {
39
+ id: "bicep-min-tls-legacy",
40
+ title: "Bicep legacy minimum TLS version",
41
+ description: "Azure Bicep resource pins minimumTlsVersion to TLS 1.0/1.1",
42
+ category: "tls",
43
+ severity: "medium",
44
+ confidence: "high",
45
+ hndl: false,
46
+ cwe: CWE_WEAK_STRENGTH,
47
+ message: "Bicep resource pins a deprecated TLS floor (TLS 1.0/1.1); require TLS 1.2+ (1.3).",
48
+ remediation: "Set minimumTlsVersion: 'TLS1_2' and prefer PQC-hybrid key exchange as it lands.",
49
+ };
50
+ /** Detects classical asymmetric crypto and legacy TLS declared in Azure Bicep. */
51
+ export const bicepDetector = {
52
+ id: "bicep-crypto",
53
+ description: "Classical asymmetric crypto and legacy TLS declared in Azure Bicep (IaC)",
54
+ scope: "config",
55
+ language: "any",
56
+ rules: [RULE_BICEP_KTY_RSA, RULE_BICEP_KTY_EC, RULE_BICEP_MIN_TLS],
57
+ appliesTo: (f) => hasExtension(f, BICEP_EXTENSIONS),
58
+ detect({ file, content }) {
59
+ // Bicep comments are `//` and `/* … */`; mask block comments (multi-line) then
60
+ // whole `//` comment lines so a commented-out resource can't fire. Offsets preserved.
61
+ const scan = maskCommentLines(maskBlockComments(content), ["//"]);
62
+ const findings = [];
63
+ const add = (re, rule) => eachMatch(re, scan, (m) => findings.push(findingFromRule(rule, { file, content, index: m.index, matchLength: m[0].length })));
64
+ // The bare `kty` field is generic; only treat it as a Key Vault key when the
65
+ // resource type is actually present, mirroring the cloudformation ARM gate.
66
+ if (content.includes("Microsoft.KeyVault")) {
67
+ add(RE_BICEP_KTY_RSA, RULE_BICEP_KTY_RSA);
68
+ add(RE_BICEP_KTY_EC, RULE_BICEP_KTY_EC);
69
+ }
70
+ add(RE_BICEP_MIN_TLS, RULE_BICEP_MIN_TLS);
71
+ return findings;
72
+ },
73
+ };
74
+ //# sourceMappingURL=bicep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bicep.js","sourceRoot":"","sources":["../../src/detectors/bicep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * IaC detector: classical asymmetric cryptography and legacy TLS declared in Azure\n * Bicep (`.bicep`) — Azure's native IaC DSL, distinct from the ARM/CloudFormation\n * JSON the cloudformation detector already covers (Bicep is the *source*; ARM JSON is\n * its compiled output). Bicep provisions the same Key Vault keys and TLS floors, but\n * in its own single-quoted-string syntax that the JSON detector never sees.\n *\n * Covered (gated to `.bicep` files):\n * - `Microsoft.KeyVault/vaults/keys` `kty: 'RSA' | 'RSA-HSM' | 'EC' | 'EC-HSM'` — a\n * classical Key Vault key. RSA is KEM (HNDL); EC feeds ECDSA + ECDH (the ECDH path\n * is HNDL). Gated to a `Microsoft.KeyVault` marker so a stray `kty` elsewhere in a\n * template does not fire.\n * - `minimumTlsVersion: 'TLS1_0' | 'TLS1_1'` — a deprecated TLS floor on storage /\n * app-service / other resources (RFC 8996). Not HNDL (a config weakness), category\n * \"tls\".\n */\nimport type { Detector, Finding, RuleMeta } from \"../types.js\";\nimport {\n eachMatch,\n findingFromRule,\n hasExtension,\n maskBlockComments,\n maskCommentLines,\n} from \"../detect-utils.js\";\nimport { CWE_BROKEN_CRYPTO, CWE_WEAK_STRENGTH } from \"../cwe.js\";\n\nconst BICEP_EXTENSIONS: readonly string[] = [\".bicep\"];\n\n// Bicep string values are single-quoted. `kty: 'RSA'` / `'RSA-HSM'` (KEM) and\n// `kty: 'EC'` / `'EC-HSM'` (EC). The `(?<![\\w-])` lookbehind stops a longer key name\n// from matching on a `kty` suffix; the value bound keeps `'EC'` from matching `'ECX'`.\nconst RE_BICEP_KTY_RSA = /(?<![\\w-])kty\\s*:\\s*'RSA(?:-HSM)?'/g;\nconst RE_BICEP_KTY_EC = /(?<![\\w-])kty\\s*:\\s*'EC(?:-HSM)?'/g;\n// Legacy TLS floor. `TLS1_0` / `TLS1_1` are deprecated; `TLS1_2` / `TLS1_3` are fine,\n// and the closing quote keeps this from matching them.\nconst RE_BICEP_MIN_TLS = /(?<![\\w])minimumTlsVersion\\s*:\\s*'TLS1_[01]'/g;\n\nconst RULE_BICEP_KTY_RSA: RuleMeta = {\n id: \"bicep-keyvault-rsa\",\n title: \"Bicep Azure Key Vault RSA key\",\n description: \"Azure Bicep Microsoft.KeyVault key with kty: 'RSA'\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Bicep provisions a classical RSA Azure Key Vault key, which is not quantum-safe.\",\n remediation: \"Plan migration to PQC (ML-KEM-768 for encryption, ML-DSA-65 for signatures).\",\n};\nconst RULE_BICEP_KTY_EC: RuleMeta = {\n id: \"bicep-keyvault-ec\",\n title: \"Bicep Azure Key Vault EC key\",\n description: \"Azure Bicep Microsoft.KeyVault key with kty: 'EC'\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Bicep provisions a classical EC Azure Key Vault key; EC keys feed ECDSA signatures and ECDH key agreement (the ECDH path is harvest-now-decrypt-later exposed).\",\n remediation:\n \"For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_BICEP_MIN_TLS: RuleMeta = {\n id: \"bicep-min-tls-legacy\",\n title: \"Bicep legacy minimum TLS version\",\n description: \"Azure Bicep resource pins minimumTlsVersion to TLS 1.0/1.1\",\n category: \"tls\",\n severity: \"medium\",\n confidence: \"high\",\n hndl: false,\n cwe: CWE_WEAK_STRENGTH,\n message: \"Bicep resource pins a deprecated TLS floor (TLS 1.0/1.1); require TLS 1.2+ (1.3).\",\n remediation: \"Set minimumTlsVersion: 'TLS1_2' and prefer PQC-hybrid key exchange as it lands.\",\n};\n\n/** Detects classical asymmetric crypto and legacy TLS declared in Azure Bicep. */\nexport const bicepDetector: Detector = {\n id: \"bicep-crypto\",\n description: \"Classical asymmetric crypto and legacy TLS declared in Azure Bicep (IaC)\",\n scope: \"config\",\n language: \"any\",\n rules: [RULE_BICEP_KTY_RSA, RULE_BICEP_KTY_EC, RULE_BICEP_MIN_TLS],\n appliesTo: (f) => hasExtension(f, BICEP_EXTENSIONS),\n detect({ file, content }): Finding[] {\n // Bicep comments are `//` and `/* … */`; mask block comments (multi-line) then\n // whole `//` comment lines so a commented-out resource can't fire. Offsets preserved.\n const scan = maskCommentLines(maskBlockComments(content), [\"//\"]);\n const findings: Finding[] = [];\n const add = (re: RegExp, rule: RuleMeta) =>\n eachMatch(re, scan, (m) =>\n findings.push(\n findingFromRule(rule, { file, content, index: m.index, matchLength: m[0].length }),\n ),\n );\n // The bare `kty` field is generic; only treat it as a Key Vault key when the\n // resource type is actually present, mirroring the cloudformation ARM gate.\n if (content.includes(\"Microsoft.KeyVault\")) {\n add(RE_BICEP_KTY_RSA, RULE_BICEP_KTY_RSA);\n add(RE_BICEP_KTY_EC, RULE_BICEP_KTY_EC);\n }\n add(RE_BICEP_MIN_TLS, RULE_BICEP_MIN_TLS);\n return findings;\n },\n};\n"]}
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Source-code detector for classical asymmetric cryptography in C / C++ using
3
- * OpenSSL (the dominant crypto library for the ecosystem). Lexical, same
4
- * strategy as the other packs; the OpenSSL function names are distinctive.
3
+ * OpenSSL (the dominant crypto library for the ecosystem), libsodium, and — for
4
+ * the embedded / firmware / IoT niche Mbed TLS (`mbedtls_*`) and wolfSSL /
5
+ * wolfCrypt (`wc_*`). Lexical, same strategy as the other packs; every library's
6
+ * function names are distinctive enough to keep the false-positive risk low.
5
7
  *
6
8
  * NOTE: scanning OpenSSL's OWN source/headers will naturally light up (the
7
9
  * library declares these symbols) — that is inherent to lexical scanning of a
@@ -1 +1 @@
1
- {"version":3,"file":"c.d.ts","sourceRoot":"","sources":["../../src/detectors/c.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,aAAa,CAAC;AAsQ/D,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,QAoDvB,CAAC"}
1
+ {"version":3,"file":"c.d.ts","sourceRoot":"","sources":["../../src/detectors/c.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,aAAa,CAAC;AA4b/D,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,QAsGvB,CAAC"}
@@ -27,8 +27,26 @@ const RE_C_RSA_VERIFY = /\bRSA_verify\s*\(/g;
27
27
  const RE_C_RSA_CRYPT = /\bRSA_public_encrypt\s*\(|\bRSA_private_decrypt\s*\(/g;
28
28
  // C/OpenSSL legacy TLS configuration (mirrors source.ts tlsDetector): forcing a
29
29
  // deprecated protocol version or disabling certificate verification.
30
- const RE_C_TLS_VERSION = /\bTLSv1_method\b|\bSSLv3_method\b/g;
30
+ // TLSv1_method / TLSv1_1_method (+ the client/server-specific variants) and the
31
+ // SSLv2/SSLv3 method constructors — all pin a deprecated protocol (RFC 8996).
32
+ const RE_C_TLS_VERSION = /\b(?:TLSv1(?:_1)?|SSLv2|SSLv3)(?:_client|_server)?_method\b/g;
31
33
  const RE_C_TLS_VERIFY_NONE = /\bSSL_VERIFY_NONE\b/g;
34
+ // Embedded C crypto libraries (the "embedded" niche): Mbed TLS and wolfSSL /
35
+ // wolfCrypt. Both use highly-distinctive `mbedtls_*` / `wc_*` prefixes, so the
36
+ // false-positive risk is low. These dominate firmware / IoT / RTOS builds where
37
+ // OpenSSL is too heavy — a codebase surface qScan previously missed entirely.
38
+ const RE_C_MBEDTLS_RSA = /\bmbedtls_rsa_gen_key\s*\(/g;
39
+ const RE_C_MBEDTLS_EC = /\bmbedtls_ecp_gen_key(?:pair)?\s*\(/g;
40
+ const RE_C_MBEDTLS_ECDSA = /\bmbedtls_ecdsa_(?:sign|write_signature|read_signature|verify)\w*\s*\(/g;
41
+ const RE_C_MBEDTLS_ECDH = /\bmbedtls_ecdh_(?:compute_shared|calc_secret)\s*\(/g;
42
+ const RE_C_MBEDTLS_DH = /\bmbedtls_dhm_(?:make_public|make_params|calc_secret)\s*\(/g;
43
+ const RE_C_WOLF_RSA = /\bwc_MakeRsaKey\s*\(|\bwc_RsaPublicEncrypt\s*\(|\bwc_RsaPrivateDecrypt\s*\(/g;
44
+ const RE_C_WOLF_ECC = /\bwc_ecc_make_key(?:_ex)?\s*\(/g;
45
+ const RE_C_WOLF_ECDSA = /\bwc_ecc_sign_hash\s*\(|\bwc_ecc_verify_hash\s*\(/g;
46
+ const RE_C_WOLF_ECDH = /\bwc_ecc_shared_secret\s*\(/g;
47
+ const RE_C_WOLF_DH = /\bwc_DhGenerateKeyPair\s*\(|\bwc_DhAgree\s*\(/g;
48
+ const RE_C_WOLF_CURVE25519 = /\bwc_curve25519_(?:make_key|shared_secret)\s*\(/g;
49
+ const RE_C_WOLF_ED25519 = /\bwc_ed25519_(?:make_key|sign_msg|verify_msg)\s*\(/g;
32
50
  const RULE_C_RSA = {
33
51
  id: "c-rsa-keygen",
34
52
  title: "C/OpenSSL RSA key generation",
@@ -240,10 +258,161 @@ const RULE_C_TLS_VERIFY_NONE = {
240
258
  message: "SSL_VERIFY_NONE disables TLS certificate verification (MITM risk).",
241
259
  remediation: "Use SSL_VERIFY_PEER and verify certificates properly.",
242
260
  };
261
+ // --- Mbed TLS (embedded) ---
262
+ const RULE_C_MBEDTLS_RSA = {
263
+ id: "c-mbedtls-rsa-keygen",
264
+ title: "Mbed TLS RSA key generation",
265
+ description: "Mbed TLS mbedtls_rsa_gen_key",
266
+ category: "kem",
267
+ severity: "high",
268
+ confidence: "high",
269
+ algorithm: "RSA",
270
+ hndl: true,
271
+ cwe: CWE_BROKEN_CRYPTO,
272
+ message: "Generates a classical RSA key pair (Mbed TLS, embedded), which is not quantum-safe.",
273
+ };
274
+ const RULE_C_MBEDTLS_EC = {
275
+ id: "c-mbedtls-ec-keygen",
276
+ title: "Mbed TLS EC key generation",
277
+ description: "Mbed TLS mbedtls_ecp_gen_key / mbedtls_ecp_gen_keypair",
278
+ category: "key-exchange",
279
+ severity: "high",
280
+ confidence: "high",
281
+ algorithm: "ECDH",
282
+ hndl: true,
283
+ cwe: CWE_BROKEN_CRYPTO,
284
+ message: "Generates a classical EC key pair (Mbed TLS, embedded). EC keys feed BOTH ECDSA signatures and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.",
285
+ remediation: "For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).",
286
+ };
287
+ const RULE_C_MBEDTLS_ECDSA = {
288
+ id: "c-mbedtls-ecdsa",
289
+ title: "Mbed TLS ECDSA signature",
290
+ description: "Mbed TLS mbedtls_ecdsa_sign / write_signature / read_signature / verify",
291
+ category: "signature",
292
+ severity: "high",
293
+ confidence: "high",
294
+ algorithm: "ECDSA",
295
+ hndl: false,
296
+ cwe: CWE_BROKEN_CRYPTO,
297
+ message: "Classical ECDSA (Mbed TLS, embedded) is forgeable by a quantum attacker.",
298
+ remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
299
+ };
300
+ const RULE_C_MBEDTLS_ECDH = {
301
+ id: "c-mbedtls-ecdh",
302
+ title: "Mbed TLS ECDH key agreement",
303
+ description: "Mbed TLS mbedtls_ecdh_compute_shared / mbedtls_ecdh_calc_secret",
304
+ category: "key-exchange",
305
+ severity: "high",
306
+ confidence: "high",
307
+ algorithm: "ECDH",
308
+ hndl: true,
309
+ cwe: CWE_BROKEN_CRYPTO,
310
+ message: "Elliptic-curve Diffie-Hellman (Mbed TLS, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).",
311
+ };
312
+ const RULE_C_MBEDTLS_DH = {
313
+ id: "c-mbedtls-dh",
314
+ title: "Mbed TLS Diffie-Hellman key exchange",
315
+ description: "Mbed TLS mbedtls_dhm_make_public / make_params / calc_secret",
316
+ category: "key-exchange",
317
+ severity: "high",
318
+ confidence: "high",
319
+ algorithm: "DH",
320
+ hndl: true,
321
+ cwe: CWE_BROKEN_CRYPTO,
322
+ message: "Finite-field Diffie-Hellman (Mbed TLS, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).",
323
+ };
324
+ // --- wolfSSL / wolfCrypt (embedded) ---
325
+ const RULE_C_WOLF_RSA = {
326
+ id: "c-wolfssl-rsa",
327
+ title: "wolfSSL RSA key/usage",
328
+ description: "wolfCrypt wc_MakeRsaKey / wc_RsaPublicEncrypt / wc_RsaPrivateDecrypt",
329
+ category: "kem",
330
+ severity: "high",
331
+ confidence: "high",
332
+ algorithm: "RSA",
333
+ hndl: true,
334
+ cwe: CWE_BROKEN_CRYPTO,
335
+ message: "Classical RSA key generation / encryption (wolfSSL, embedded) is harvest-now-decrypt-later exposed.",
336
+ };
337
+ const RULE_C_WOLF_ECC = {
338
+ id: "c-wolfssl-ecc-keygen",
339
+ title: "wolfSSL EC key generation",
340
+ description: "wolfCrypt wc_ecc_make_key / wc_ecc_make_key_ex",
341
+ category: "key-exchange",
342
+ severity: "high",
343
+ confidence: "high",
344
+ algorithm: "ECDH",
345
+ hndl: true,
346
+ cwe: CWE_BROKEN_CRYPTO,
347
+ message: "Generates a classical EC key pair (wolfSSL, embedded). EC keys feed BOTH ECDSA signatures and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.",
348
+ remediation: "For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).",
349
+ };
350
+ const RULE_C_WOLF_ECDSA = {
351
+ id: "c-wolfssl-ecdsa",
352
+ title: "wolfSSL ECDSA signature",
353
+ description: "wolfCrypt wc_ecc_sign_hash / wc_ecc_verify_hash",
354
+ category: "signature",
355
+ severity: "high",
356
+ confidence: "high",
357
+ algorithm: "ECDSA",
358
+ hndl: false,
359
+ cwe: CWE_BROKEN_CRYPTO,
360
+ message: "Classical ECDSA (wolfSSL, embedded) is forgeable by a quantum attacker.",
361
+ remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
362
+ };
363
+ const RULE_C_WOLF_ECDH = {
364
+ id: "c-wolfssl-ecdh",
365
+ title: "wolfSSL ECDH key agreement",
366
+ description: "wolfCrypt wc_ecc_shared_secret",
367
+ category: "key-exchange",
368
+ severity: "high",
369
+ confidence: "high",
370
+ algorithm: "ECDH",
371
+ hndl: true,
372
+ cwe: CWE_BROKEN_CRYPTO,
373
+ message: "Elliptic-curve Diffie-Hellman (wolfSSL, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).",
374
+ };
375
+ const RULE_C_WOLF_DH = {
376
+ id: "c-wolfssl-dh",
377
+ title: "wolfSSL Diffie-Hellman key exchange",
378
+ description: "wolfCrypt wc_DhGenerateKeyPair / wc_DhAgree",
379
+ category: "key-exchange",
380
+ severity: "high",
381
+ confidence: "high",
382
+ algorithm: "DH",
383
+ hndl: true,
384
+ cwe: CWE_BROKEN_CRYPTO,
385
+ message: "Finite-field Diffie-Hellman (wolfSSL, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).",
386
+ };
387
+ const RULE_C_WOLF_CURVE25519 = {
388
+ id: "c-wolfssl-curve25519",
389
+ title: "wolfSSL X25519 key agreement",
390
+ description: "wolfCrypt wc_curve25519_make_key / wc_curve25519_shared_secret",
391
+ category: "key-exchange",
392
+ severity: "medium",
393
+ confidence: "high",
394
+ algorithm: "X25519",
395
+ hndl: true,
396
+ cwe: CWE_BROKEN_CRYPTO,
397
+ message: "X25519 key agreement (wolfSSL, embedded) is modern but classical, and harvest-now-decrypt-later exposed.",
398
+ };
399
+ const RULE_C_WOLF_ED25519 = {
400
+ id: "c-wolfssl-ed25519",
401
+ title: "wolfSSL Ed25519 signature",
402
+ description: "wolfCrypt wc_ed25519_make_key / wc_ed25519_sign_msg / wc_ed25519_verify_msg",
403
+ category: "signature",
404
+ severity: "low",
405
+ confidence: "high",
406
+ algorithm: "EdDSA",
407
+ hndl: false,
408
+ cwe: CWE_BROKEN_CRYPTO,
409
+ message: "Ed25519 signatures (wolfSSL, embedded) are classical and forgeable by a quantum attacker.",
410
+ remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
411
+ };
243
412
  /** Detects classical asymmetric crypto in C/C++ (OpenSSL). */
244
413
  export const cDetector = {
245
414
  id: "c-crypto",
246
- description: "Classical asymmetric crypto in C/C++ (OpenSSL)",
415
+ description: "Classical asymmetric crypto in C/C++ (OpenSSL, libsodium, Mbed TLS, wolfSSL)",
247
416
  scope: "source",
248
417
  language: "c",
249
418
  rules: [
@@ -264,6 +433,18 @@ export const cDetector = {
264
433
  RULE_C_RSA_CRYPT,
265
434
  RULE_C_TLS_VERSION,
266
435
  RULE_C_TLS_VERIFY_NONE,
436
+ RULE_C_MBEDTLS_RSA,
437
+ RULE_C_MBEDTLS_EC,
438
+ RULE_C_MBEDTLS_ECDSA,
439
+ RULE_C_MBEDTLS_ECDH,
440
+ RULE_C_MBEDTLS_DH,
441
+ RULE_C_WOLF_RSA,
442
+ RULE_C_WOLF_ECC,
443
+ RULE_C_WOLF_ECDSA,
444
+ RULE_C_WOLF_ECDH,
445
+ RULE_C_WOLF_DH,
446
+ RULE_C_WOLF_CURVE25519,
447
+ RULE_C_WOLF_ED25519,
267
448
  ],
268
449
  appliesTo: (f) => hasExtension(f, C_EXTENSIONS),
269
450
  detect({ file, content }) {
@@ -276,9 +457,34 @@ export const cDetector = {
276
457
  add(RE_C_DSA, RULE_C_DSA);
277
458
  add(RE_C_DH, RULE_C_DH);
278
459
  add(RE_C_EVP_KEYGEN, RULE_C_EVP_KEYGEN);
279
- add(RE_C_EVP_DERIVE, RULE_C_EVP_DERIVE);
460
+ // `EVP_PKEY_derive` is OpenSSL's entry point for BOTH (EC)DH key agreement and the
461
+ // symmetric KDFs (HKDF/scrypt/TLS1-PRF). Real (EC)DH always sets a peer key via
462
+ // `EVP_PKEY_derive_set_peer`; a KDF never does. So only treat it as classical key
463
+ // agreement when a peer is set, or when no KDF context marker is present.
464
+ const hasKdfCtx = /\bEVP_PKEY_(?:HKDF|SCRYPT|TLS1_PRF)\b/.test(content);
465
+ if (content.includes("EVP_PKEY_derive_set_peer") || !hasKdfCtx) {
466
+ add(RE_C_EVP_DERIVE, RULE_C_EVP_DERIVE);
467
+ }
280
468
  add(RE_C_EVP_CRYPT, RULE_C_EVP_CRYPT);
281
- add(RE_C_EVP_SIGN, RULE_C_EVP_SIGN);
469
+ // `EVP_DigestSign*` also drives HMAC/CMAC (a symmetric MAC keyed by
470
+ // `EVP_PKEY_new_mac_key(EVP_PKEY_HMAC/CMAC, …)`), which is NOT a classical
471
+ // asymmetric signature. Suppress a `DigestSign*` match ONLY when a MAC key setup
472
+ // sits just before it — per-match, so a real RSA/ECDSA sign elsewhere in the same
473
+ // file is still reported. `DigestVerify*` (no MAC form here) is never suppressed.
474
+ eachMatch(RE_C_EVP_SIGN, content, (m) => {
475
+ const isSign = m[0].includes("DigestSign");
476
+ if (isSign) {
477
+ const back = content.slice(Math.max(0, m.index - 300), m.index);
478
+ if (/EVP_PKEY_new_mac_key|EVP_PKEY_(?:HMAC|CMAC)\b/.test(back))
479
+ return;
480
+ }
481
+ findings.push(findingFromRule(RULE_C_EVP_SIGN, {
482
+ file,
483
+ content,
484
+ index: m.index,
485
+ matchLength: m[0].length,
486
+ }));
487
+ });
282
488
  add(RE_C_SODIUM_BOX, RULE_C_SODIUM_BOX);
283
489
  add(RE_C_SODIUM_SIGN, RULE_C_SODIUM_SIGN);
284
490
  add(RE_C_ECDSA_VERIFY, RULE_C_ECDSA_VERIFY);
@@ -286,6 +492,18 @@ export const cDetector = {
286
492
  add(RE_C_RSA_CRYPT, RULE_C_RSA_CRYPT);
287
493
  add(RE_C_TLS_VERSION, RULE_C_TLS_VERSION);
288
494
  add(RE_C_TLS_VERIFY_NONE, RULE_C_TLS_VERIFY_NONE);
495
+ add(RE_C_MBEDTLS_RSA, RULE_C_MBEDTLS_RSA);
496
+ add(RE_C_MBEDTLS_EC, RULE_C_MBEDTLS_EC);
497
+ add(RE_C_MBEDTLS_ECDSA, RULE_C_MBEDTLS_ECDSA);
498
+ add(RE_C_MBEDTLS_ECDH, RULE_C_MBEDTLS_ECDH);
499
+ add(RE_C_MBEDTLS_DH, RULE_C_MBEDTLS_DH);
500
+ add(RE_C_WOLF_RSA, RULE_C_WOLF_RSA);
501
+ add(RE_C_WOLF_ECC, RULE_C_WOLF_ECC);
502
+ add(RE_C_WOLF_ECDSA, RULE_C_WOLF_ECDSA);
503
+ add(RE_C_WOLF_ECDH, RULE_C_WOLF_ECDH);
504
+ add(RE_C_WOLF_DH, RULE_C_WOLF_DH);
505
+ add(RE_C_WOLF_CURVE25519, RULE_C_WOLF_CURVE25519);
506
+ add(RE_C_WOLF_ED25519, RULE_C_WOLF_ED25519);
289
507
  return findings;
290
508
  },
291
509
  };
@@ -1 +1 @@
1
- {"version":3,"file":"c.js","sourceRoot":"","sources":["../../src/detectors/c.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Source-code detector for classical asymmetric cryptography in C / C++ using\n * OpenSSL (the dominant crypto library for the ecosystem). Lexical, same\n * strategy as the other packs; the OpenSSL function names are distinctive.\n *\n * NOTE: scanning OpenSSL's OWN source/headers will naturally light up (the\n * library declares these symbols) — that is inherent to lexical scanning of a\n * crypto library, not a false positive in application code. Matches the classic\n * `*_generate_key` / `ECDSA_sign` / `ECDH_compute_key` call forms plus the\n * `EVP_RSA_gen` helper.\n *\n * HNDL: RSA encryption and (EC)DH key agreement are harvest-now-decrypt-later\n * exposed (hndl:true); ECDSA / DSA signatures are hndl:false but forgeable.\n * `EC_KEY_generate_key` is ambiguous (feeds ECDSA + ECDH), classified\n * conservatively as key-exchange-capable (hndl:true).\n */\nimport type { Detector, Finding, RuleMeta } from \"../types.js\";\nimport { C_EXTENSIONS, eachMatch, findingFromRule, hasExtension } from \"../detect-utils.js\";\nimport { CWE_BROKEN_CRYPTO, CWE_CERT_VALIDATION, CWE_WEAK_STRENGTH } from \"../cwe.js\";\n\nconst RE_C_RSA = /\\bRSA_generate_key(?:_ex)?\\s*\\(|\\bEVP_RSA_gen\\s*\\(/g;\nconst RE_C_EC = /\\bEC_KEY_generate_key\\s*\\(|\\bEC_KEY_new_by_curve_name\\s*\\(/g;\nconst RE_C_ECDSA = /\\bECDSA_do_sign\\s*\\(|\\bECDSA_sign\\s*\\(/g;\nconst RE_C_ECDH = /\\bECDH_compute_key\\s*\\(/g;\nconst RE_C_DSA = /\\bDSA_generate_key\\s*\\(|\\bDSA_generate_parameters(?:_ex)?\\s*\\(/g;\nconst RE_C_DH = /\\bDH_generate_key\\s*\\(|\\bDH_generate_parameters(?:_ex)?\\s*\\(/g;\n// Modern OpenSSL 3.x EVP API (the legacy *_generate_key forms above are\n// deprecated) + libsodium — the biggest C false-negative surface (audit F1).\nconst RE_C_EVP_KEYGEN = /\\bEVP_PKEY_(?:Q_)?keygen\\s*\\(|\\bEVP_PKEY_paramgen\\s*\\(/g;\nconst RE_C_EVP_DERIVE = /\\bEVP_PKEY_derive\\s*\\(/g;\nconst RE_C_EVP_CRYPT = /\\bEVP_PKEY_(?:encrypt|decrypt)\\s*\\(/g;\nconst RE_C_EVP_SIGN = /\\bEVP_DigestSign(?:Init)?\\s*\\(|\\bEVP_DigestVerify(?:Init)?\\s*\\(/g;\n// X25519: crypto_box / crypto_kx key pairs (incl. the fully-qualified\n// curve25519xsalsa20poly1305 form) plus the low-level crypto_scalarmult\n// primitive — all classical Curve25519 key agreement (audit recall gap).\nconst RE_C_SODIUM_BOX =\n /\\bcrypto_box_(?:curve25519xsalsa20poly1305_)?(?:seed_)?keypair\\s*\\(|\\bcrypto_kx_keypair\\s*\\(|\\bcrypto_scalarmult_(?:curve25519|base)\\s*\\(/g;\n// EdDSA: crypto_sign key pairs, including the explicit _ed25519 forms and the\n// deterministic seed_keypair variants (audit recall gap: _ed25519_keypair).\nconst RE_C_SODIUM_SIGN = /\\bcrypto_sign_(?:ed25519_)?(?:seed_)?keypair\\s*\\(/g;\n// Legacy verify / decrypt counterparts to the *_sign / *_encrypt rules above\n// (audit F4-c): the classic OpenSSL RSA/ECDSA verification and RSA raw\n// decryption call forms that the modern EVP + legacy keygen rules don't cover.\nconst RE_C_ECDSA_VERIFY = /\\bECDSA_verify\\s*\\(/g;\nconst RE_C_RSA_VERIFY = /\\bRSA_verify\\s*\\(/g;\nconst RE_C_RSA_CRYPT = /\\bRSA_public_encrypt\\s*\\(|\\bRSA_private_decrypt\\s*\\(/g;\n// C/OpenSSL legacy TLS configuration (mirrors source.ts tlsDetector): forcing a\n// deprecated protocol version or disabling certificate verification.\nconst RE_C_TLS_VERSION = /\\bTLSv1_method\\b|\\bSSLv3_method\\b/g;\nconst RE_C_TLS_VERIFY_NONE = /\\bSSL_VERIFY_NONE\\b/g;\n\nconst RULE_C_RSA: RuleMeta = {\n id: \"c-rsa-keygen\",\n title: \"C/OpenSSL RSA key generation\",\n description: \"OpenSSL RSA_generate_key(_ex) / EVP_RSA_gen\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Generates a classical RSA key pair (C/OpenSSL), which is not quantum-safe.\",\n};\nconst RULE_C_EC: RuleMeta = {\n id: \"c-ec-keygen\",\n title: \"C/OpenSSL EC key generation\",\n description: \"OpenSSL EC_KEY_generate_key / EC_KEY_new_by_curve_name\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Generates a classical EC key pair (C/OpenSSL). EC keys feed BOTH ECDSA signatures and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.\",\n remediation:\n \"For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_ECDSA: RuleMeta = {\n id: \"c-ecdsa\",\n title: \"C/OpenSSL ECDSA signature\",\n description: \"OpenSSL ECDSA_sign / ECDSA_do_sign\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Classical ECDSA signing (C/OpenSSL) is forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_ECDH: RuleMeta = {\n id: \"c-ecdh\",\n title: \"C/OpenSSL ECDH key agreement\",\n description: \"OpenSSL ECDH_compute_key\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Elliptic-curve Diffie-Hellman (C/OpenSSL) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_DSA: RuleMeta = {\n id: \"c-dsa\",\n title: \"C/OpenSSL DSA key/usage\",\n description: \"OpenSSL DSA_generate_key / DSA_generate_parameters\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"DSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Classical DSA (C/OpenSSL) is deprecated and forgeable by a quantum attacker.\",\n remediation: \"Rotate off DSA and migrate to ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_DH: RuleMeta = {\n id: \"c-dh\",\n title: \"C/OpenSSL Diffie-Hellman key exchange\",\n description: \"OpenSSL DH_generate_key / DH_generate_parameters\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"DH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Finite-field Diffie-Hellman (C/OpenSSL) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_EVP_KEYGEN: RuleMeta = {\n id: \"c-evp-keygen\",\n title: \"C/OpenSSL EVP key generation\",\n description: \"OpenSSL 3.x EVP_PKEY_keygen / EVP_PKEY_Q_keygen / paramgen\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"unknown\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Generates an asymmetric key via the OpenSSL 3.x EVP API (the key type — RSA/EC/DH/X25519 — is set on the CTX). Treated conservatively as key-exchange-capable (harvest-now-decrypt-later).\",\n remediation:\n \"For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_EVP_DERIVE: RuleMeta = {\n id: \"c-evp-derive\",\n title: \"C/OpenSSL EVP key agreement\",\n description: \"OpenSSL 3.x EVP_PKEY_derive (ECDH / DH shared secret)\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Derives an (EC)DH shared secret via the OpenSSL EVP API — broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_EVP_CRYPT: RuleMeta = {\n id: \"c-evp-pkey-crypt\",\n title: \"C/OpenSSL EVP public-key encryption\",\n description: \"OpenSSL 3.x EVP_PKEY_encrypt / EVP_PKEY_decrypt (RSA)\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"RSA public-key encryption/decryption via the OpenSSL EVP API is harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_EVP_SIGN: RuleMeta = {\n id: \"c-evp-sign\",\n title: \"C/OpenSSL EVP signing\",\n description: \"OpenSSL 3.x EVP_DigestSign* / EVP_DigestVerify*\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"unknown\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Classical signature via the OpenSSL EVP API (RSA/ECDSA/EdDSA) is forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_SODIUM_BOX: RuleMeta = {\n id: \"c-libsodium-box\",\n title: \"libsodium X25519 key pair\",\n description:\n \"libsodium crypto_box / crypto_kx keypair + crypto_scalarmult (X25519 key agreement)\",\n category: \"key-exchange\",\n severity: \"medium\",\n confidence: \"high\",\n algorithm: \"X25519\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"libsodium crypto_box uses X25519 key agreement — modern but classical, and harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_SODIUM_SIGN: RuleMeta = {\n id: \"c-libsodium-sign\",\n title: \"libsodium Ed25519 key pair\",\n description: \"libsodium crypto_sign(_ed25519)(_seed)_keypair (Ed25519 signatures)\",\n category: \"signature\",\n severity: \"low\",\n confidence: \"high\",\n algorithm: \"EdDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"libsodium crypto_sign uses Ed25519 signatures — classical and forgeable by a quantum attacker.\",\n};\nconst RULE_C_ECDSA_VERIFY: RuleMeta = {\n id: \"c-ecdsa-verify\",\n title: \"C/OpenSSL ECDSA signature verification\",\n description: \"OpenSSL ECDSA_verify\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Classical ECDSA verification (C/OpenSSL) trusts signatures forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_RSA_VERIFY: RuleMeta = {\n id: \"c-rsa-verify\",\n title: \"C/OpenSSL RSA signature verification\",\n description: \"OpenSSL RSA_verify\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Classical RSA signature verification (C/OpenSSL) trusts signatures forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_RSA_CRYPT: RuleMeta = {\n id: \"c-rsa-crypt\",\n title: \"C/OpenSSL RSA public-key encryption\",\n description: \"OpenSSL RSA_public_encrypt / RSA_private_decrypt\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Legacy RSA public-key encryption/decryption (C/OpenSSL) is harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_TLS_VERSION: RuleMeta = {\n id: \"c-tls-legacy-version\",\n title: \"Legacy TLS/SSL version pinned (C/OpenSSL)\",\n description: \"OpenSSL TLSv1_method / SSLv3_method\",\n category: \"tls\",\n severity: \"medium\",\n confidence: \"high\",\n hndl: false,\n cwe: CWE_WEAK_STRENGTH,\n message: \"TLS 1.0 / SSLv3 are deprecated and insecure; require TLS 1.3.\",\n remediation: \"Use TLS_method() with a minimum of TLS 1.3 and prefer PQC-hybrid key exchange.\",\n};\nconst RULE_C_TLS_VERIFY_NONE: RuleMeta = {\n id: \"c-tls-verify-none\",\n title: \"TLS certificate verification disabled (C/OpenSSL)\",\n description: \"OpenSSL SSL_VERIFY_NONE\",\n category: \"tls\",\n severity: \"high\",\n confidence: \"high\",\n hndl: false,\n cwe: CWE_CERT_VALIDATION,\n message: \"SSL_VERIFY_NONE disables TLS certificate verification (MITM risk).\",\n remediation: \"Use SSL_VERIFY_PEER and verify certificates properly.\",\n};\n\n/** Detects classical asymmetric crypto in C/C++ (OpenSSL). */\nexport const cDetector: Detector = {\n id: \"c-crypto\",\n description: \"Classical asymmetric crypto in C/C++ (OpenSSL)\",\n scope: \"source\",\n language: \"c\",\n rules: [\n RULE_C_RSA,\n RULE_C_EC,\n RULE_C_ECDSA,\n RULE_C_ECDH,\n RULE_C_DSA,\n RULE_C_DH,\n RULE_C_EVP_KEYGEN,\n RULE_C_EVP_DERIVE,\n RULE_C_EVP_CRYPT,\n RULE_C_EVP_SIGN,\n RULE_C_SODIUM_BOX,\n RULE_C_SODIUM_SIGN,\n RULE_C_ECDSA_VERIFY,\n RULE_C_RSA_VERIFY,\n RULE_C_RSA_CRYPT,\n RULE_C_TLS_VERSION,\n RULE_C_TLS_VERIFY_NONE,\n ],\n appliesTo: (f) => hasExtension(f, C_EXTENSIONS),\n detect({ file, content }): Finding[] {\n const findings: Finding[] = [];\n const add = (re: RegExp, rule: RuleMeta) =>\n eachMatch(re, content, (m) =>\n findings.push(\n findingFromRule(rule, { file, content, index: m.index, matchLength: m[0].length }),\n ),\n );\n add(RE_C_RSA, RULE_C_RSA);\n add(RE_C_EC, RULE_C_EC);\n add(RE_C_ECDSA, RULE_C_ECDSA);\n add(RE_C_ECDH, RULE_C_ECDH);\n add(RE_C_DSA, RULE_C_DSA);\n add(RE_C_DH, RULE_C_DH);\n add(RE_C_EVP_KEYGEN, RULE_C_EVP_KEYGEN);\n add(RE_C_EVP_DERIVE, RULE_C_EVP_DERIVE);\n add(RE_C_EVP_CRYPT, RULE_C_EVP_CRYPT);\n add(RE_C_EVP_SIGN, RULE_C_EVP_SIGN);\n add(RE_C_SODIUM_BOX, RULE_C_SODIUM_BOX);\n add(RE_C_SODIUM_SIGN, RULE_C_SODIUM_SIGN);\n add(RE_C_ECDSA_VERIFY, RULE_C_ECDSA_VERIFY);\n add(RE_C_RSA_VERIFY, RULE_C_RSA_VERIFY);\n add(RE_C_RSA_CRYPT, RULE_C_RSA_CRYPT);\n add(RE_C_TLS_VERSION, RULE_C_TLS_VERSION);\n add(RE_C_TLS_VERIFY_NONE, RULE_C_TLS_VERIFY_NONE);\n return findings;\n },\n};\n"]}
1
+ {"version":3,"file":"c.js","sourceRoot":"","sources":["../../src/detectors/c.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEtF,MAAM,QAAQ,GAAG,qDAAqD,CAAC;AACvE,MAAM,OAAO,GAAG,6DAA6D,CAAC;AAC9E,MAAM,UAAU,GAAG,yCAAyC,CAAC;AAC7D,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAC7C,MAAM,QAAQ,GAAG,iEAAiE,CAAC;AACnF,MAAM,OAAO,GAAG,+DAA+D,CAAC;AAChF,wEAAwE;AACxE,6EAA6E;AAC7E,MAAM,eAAe,GAAG,yDAAyD,CAAC;AAClF,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAClD,MAAM,cAAc,GAAG,sCAAsC,CAAC;AAC9D,MAAM,aAAa,GAAG,kEAAkE,CAAC;AACzF,sEAAsE;AACtE,wEAAwE;AACxE,yEAAyE;AACzE,MAAM,eAAe,GACnB,4IAA4I,CAAC;AAC/I,8EAA8E;AAC9E,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,oDAAoD,CAAC;AAC9E,6EAA6E;AAC7E,uEAAuE;AACvE,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AACjD,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAC7C,MAAM,cAAc,GAAG,uDAAuD,CAAC;AAC/E,gFAAgF;AAChF,qEAAqE;AACrE,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,8DAA8D,CAAC;AACxF,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AACpD,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,eAAe,GAAG,sCAAsC,CAAC;AAC/D,MAAM,kBAAkB,GACtB,yEAAyE,CAAC;AAC5E,MAAM,iBAAiB,GAAG,qDAAqD,CAAC;AAChF,MAAM,eAAe,GAAG,6DAA6D,CAAC;AACtF,MAAM,aAAa,GACjB,8EAA8E,CAAC;AACjF,MAAM,aAAa,GAAG,iCAAiC,CAAC;AACxD,MAAM,eAAe,GAAG,oDAAoD,CAAC;AAC7E,MAAM,cAAc,GAAG,8BAA8B,CAAC;AACtD,MAAM,YAAY,GAAG,gDAAgD,CAAC;AACtE,MAAM,oBAAoB,GAAG,kDAAkD,CAAC;AAChF,MAAM,iBAAiB,GAAG,qDAAqD,CAAC;AAEhF,MAAM,UAAU,GAAa;IAC3B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,8BAA8B;IACrC,WAAW,EAAE,6CAA6C;IAC1D,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EAAE,4EAA4E;CACtF,CAAC;AACF,MAAM,SAAS,GAAa;IAC1B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,6BAA6B;IACpC,WAAW,EAAE,wDAAwD;IACrE,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,+JAA+J;IACjK,WAAW,EACT,8FAA8F;CACjG,CAAC;AACF,MAAM,YAAY,GAAa;IAC7B,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,2BAA2B;IAClC,WAAW,EAAE,oCAAoC;IACjD,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EAAE,yEAAyE;IAClF,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AACF,MAAM,WAAW,GAAa;IAC5B,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,8BAA8B;IACrC,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,sGAAsG;CACzG,CAAC;AACF,MAAM,UAAU,GAAa;IAC3B,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,yBAAyB;IAChC,WAAW,EAAE,oDAAoD;IACjE,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EAAE,8EAA8E;IACvF,WAAW,EAAE,qDAAqD;CACnE,CAAC;AACF,MAAM,SAAS,GAAa;IAC1B,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,uCAAuC;IAC9C,WAAW,EAAE,kDAAkD;IAC/D,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,oGAAoG;CACvG,CAAC;AACF,MAAM,iBAAiB,GAAa;IAClC,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,8BAA8B;IACrC,WAAW,EAAE,4DAA4D;IACzE,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,4LAA4L;IAC9L,WAAW,EACT,8FAA8F;CACjG,CAAC;AACF,MAAM,iBAAiB,GAAa;IAClC,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,6BAA6B;IACpC,WAAW,EAAE,uDAAuD;IACpE,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,mHAAmH;CACtH,CAAC;AACF,MAAM,gBAAgB,GAAa;IACjC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,qCAAqC;IAC5C,WAAW,EAAE,uDAAuD;IACpE,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,oGAAoG;CACvG,CAAC;AACF,MAAM,eAAe,GAAa;IAChC,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EAAE,iDAAiD;IAC9D,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,mGAAmG;IACrG,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AACF,MAAM,iBAAiB,GAAa;IAClC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,2BAA2B;IAClC,WAAW,EACT,qFAAqF;IACvF,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,QAAQ;IACnB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,+GAA+G;CAClH,CAAC;AACF,MAAM,kBAAkB,GAAa;IACnC,EAAE,EAAE,kBAAkB;IACtB,KAAK,EAAE,4BAA4B;IACnC,WAAW,EAAE,qEAAqE;IAClF,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,gGAAgG;CACnG,CAAC;AACF,MAAM,mBAAmB,GAAa;IACpC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,wCAAwC;IAC/C,WAAW,EAAE,sBAAsB;IACnC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,6FAA6F;IAC/F,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AACF,MAAM,iBAAiB,GAAa;IAClC,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,sCAAsC;IAC7C,WAAW,EAAE,oBAAoB;IACjC,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,qGAAqG;IACvG,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AACF,MAAM,gBAAgB,GAAa;IACjC,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,qCAAqC;IAC5C,WAAW,EAAE,kDAAkD;IAC/D,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,+FAA+F;CAClG,CAAC;AACF,MAAM,kBAAkB,GAAa;IACnC,EAAE,EAAE,sBAAsB;IAC1B,KAAK,EAAE,2CAA2C;IAClD,WAAW,EAAE,qCAAqC;IAClD,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,MAAM;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EAAE,+DAA+D;IACxE,WAAW,EAAE,gFAAgF;CAC9F,CAAC;AACF,MAAM,sBAAsB,GAAa;IACvC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,mDAAmD;IAC1D,WAAW,EAAE,yBAAyB;IACtC,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,mBAAmB;IACxB,OAAO,EAAE,oEAAoE;IAC7E,WAAW,EAAE,uDAAuD;CACrE,CAAC;AACF,8BAA8B;AAC9B,MAAM,kBAAkB,GAAa;IACnC,EAAE,EAAE,sBAAsB;IAC1B,KAAK,EAAE,6BAA6B;IACpC,WAAW,EAAE,8BAA8B;IAC3C,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EAAE,qFAAqF;CAC/F,CAAC;AACF,MAAM,iBAAiB,GAAa;IAClC,EAAE,EAAE,qBAAqB;IACzB,KAAK,EAAE,4BAA4B;IACnC,WAAW,EAAE,wDAAwD;IACrE,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,wKAAwK;IAC1K,WAAW,EACT,8FAA8F;CACjG,CAAC;AACF,MAAM,oBAAoB,GAAa;IACrC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,0BAA0B;IACjC,WAAW,EAAE,yEAAyE;IACtF,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EAAE,0EAA0E;IACnF,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AACF,MAAM,mBAAmB,GAAa;IACpC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,6BAA6B;IACpC,WAAW,EAAE,iEAAiE;IAC9E,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,+GAA+G;CAClH,CAAC;AACF,MAAM,iBAAiB,GAAa;IAClC,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,sCAAsC;IAC7C,WAAW,EAAE,8DAA8D;IAC3E,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,6GAA6G;CAChH,CAAC;AACF,yCAAyC;AACzC,MAAM,eAAe,GAAa;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EAAE,sEAAsE;IACnF,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,qGAAqG;CACxG,CAAC;AACF,MAAM,eAAe,GAAa;IAChC,EAAE,EAAE,sBAAsB;IAC1B,KAAK,EAAE,2BAA2B;IAClC,WAAW,EAAE,gDAAgD;IAC7D,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,uKAAuK;IACzK,WAAW,EACT,8FAA8F;CACjG,CAAC;AACF,MAAM,iBAAiB,GAAa;IAClC,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,yBAAyB;IAChC,WAAW,EAAE,iDAAiD;IAC9D,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EAAE,yEAAyE;IAClF,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AACF,MAAM,gBAAgB,GAAa;IACjC,EAAE,EAAE,gBAAgB;IACpB,KAAK,EAAE,4BAA4B;IACnC,WAAW,EAAE,gCAAgC;IAC7C,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,8GAA8G;CACjH,CAAC;AACF,MAAM,cAAc,GAAa;IAC/B,EAAE,EAAE,cAAc;IAClB,KAAK,EAAE,qCAAqC;IAC5C,WAAW,EAAE,6CAA6C;IAC1D,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,4GAA4G;CAC/G,CAAC;AACF,MAAM,sBAAsB,GAAa;IACvC,EAAE,EAAE,sBAAsB;IAC1B,KAAK,EAAE,8BAA8B;IACrC,WAAW,EAAE,gEAAgE;IAC7E,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,QAAQ;IACnB,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,0GAA0G;CAC7G,CAAC;AACF,MAAM,mBAAmB,GAAa;IACpC,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,2BAA2B;IAClC,WAAW,EAAE,6EAA6E;IAC1F,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,OAAO;IAClB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,iBAAiB;IACtB,OAAO,EACL,2FAA2F;IAC7F,WAAW,EAAE,4CAA4C;CAC1D,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAa;IACjC,EAAE,EAAE,UAAU;IACd,WAAW,EAAE,8EAA8E;IAC3F,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE;QACL,UAAU;QACV,SAAS;QACT,YAAY;QACZ,WAAW;QACX,UAAU;QACV,SAAS;QACT,iBAAiB;QACjB,iBAAiB;QACjB,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,kBAAkB;QAClB,mBAAmB;QACnB,iBAAiB;QACjB,gBAAgB;QAChB,kBAAkB;QAClB,sBAAsB;QACtB,kBAAkB;QAClB,iBAAiB;QACjB,oBAAoB;QACpB,mBAAmB;QACnB,iBAAiB;QACjB,eAAe;QACf,eAAe;QACf,iBAAiB;QACjB,gBAAgB;QAChB,cAAc;QACd,sBAAsB;QACtB,mBAAmB;KACpB;IACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC;IAC/C,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;QACtB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,IAAc,EAAE,EAAE,CACzC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAC3B,QAAQ,CAAC,IAAI,CACX,eAAe,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CACnF,CACF,CAAC;QACJ,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1B,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACxB,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC9B,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5B,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1B,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACxB,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACxC,mFAAmF;QACnF,gFAAgF;QAChF,kFAAkF;QAClF,0EAA0E;QAC1E,MAAM,SAAS,GAAG,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/D,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAC1C,CAAC;QACD,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACtC,oEAAoE;QACpE,2EAA2E;QAC3E,iFAAiF;QACjF,kFAAkF;QAClF,kFAAkF;QAClF,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACtC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;gBAChE,IAAI,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,OAAO;YACzE,CAAC;YACD,QAAQ,CAAC,IAAI,CACX,eAAe,CAAC,eAAe,EAAE;gBAC/B,IAAI;gBACJ,OAAO;gBACP,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;aACzB,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACxC,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QAC1C,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;QAC5C,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACxC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACtC,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QAC1C,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QAClD,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QAC1C,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACxC,GAAG,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC;QAC9C,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;QAC5C,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACxC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QACpC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QACpC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACxC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACtC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAClC,GAAG,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QAClD,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;QAC5C,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC","sourcesContent":["/**\n * Source-code detector for classical asymmetric cryptography in C / C++ using\n * OpenSSL (the dominant crypto library for the ecosystem), libsodium, and — for\n * the embedded / firmware / IoT niche — Mbed TLS (`mbedtls_*`) and wolfSSL /\n * wolfCrypt (`wc_*`). Lexical, same strategy as the other packs; every library's\n * function names are distinctive enough to keep the false-positive risk low.\n *\n * NOTE: scanning OpenSSL's OWN source/headers will naturally light up (the\n * library declares these symbols) — that is inherent to lexical scanning of a\n * crypto library, not a false positive in application code. Matches the classic\n * `*_generate_key` / `ECDSA_sign` / `ECDH_compute_key` call forms plus the\n * `EVP_RSA_gen` helper.\n *\n * HNDL: RSA encryption and (EC)DH key agreement are harvest-now-decrypt-later\n * exposed (hndl:true); ECDSA / DSA signatures are hndl:false but forgeable.\n * `EC_KEY_generate_key` is ambiguous (feeds ECDSA + ECDH), classified\n * conservatively as key-exchange-capable (hndl:true).\n */\nimport type { Detector, Finding, RuleMeta } from \"../types.js\";\nimport { C_EXTENSIONS, eachMatch, findingFromRule, hasExtension } from \"../detect-utils.js\";\nimport { CWE_BROKEN_CRYPTO, CWE_CERT_VALIDATION, CWE_WEAK_STRENGTH } from \"../cwe.js\";\n\nconst RE_C_RSA = /\\bRSA_generate_key(?:_ex)?\\s*\\(|\\bEVP_RSA_gen\\s*\\(/g;\nconst RE_C_EC = /\\bEC_KEY_generate_key\\s*\\(|\\bEC_KEY_new_by_curve_name\\s*\\(/g;\nconst RE_C_ECDSA = /\\bECDSA_do_sign\\s*\\(|\\bECDSA_sign\\s*\\(/g;\nconst RE_C_ECDH = /\\bECDH_compute_key\\s*\\(/g;\nconst RE_C_DSA = /\\bDSA_generate_key\\s*\\(|\\bDSA_generate_parameters(?:_ex)?\\s*\\(/g;\nconst RE_C_DH = /\\bDH_generate_key\\s*\\(|\\bDH_generate_parameters(?:_ex)?\\s*\\(/g;\n// Modern OpenSSL 3.x EVP API (the legacy *_generate_key forms above are\n// deprecated) + libsodium — the biggest C false-negative surface (audit F1).\nconst RE_C_EVP_KEYGEN = /\\bEVP_PKEY_(?:Q_)?keygen\\s*\\(|\\bEVP_PKEY_paramgen\\s*\\(/g;\nconst RE_C_EVP_DERIVE = /\\bEVP_PKEY_derive\\s*\\(/g;\nconst RE_C_EVP_CRYPT = /\\bEVP_PKEY_(?:encrypt|decrypt)\\s*\\(/g;\nconst RE_C_EVP_SIGN = /\\bEVP_DigestSign(?:Init)?\\s*\\(|\\bEVP_DigestVerify(?:Init)?\\s*\\(/g;\n// X25519: crypto_box / crypto_kx key pairs (incl. the fully-qualified\n// curve25519xsalsa20poly1305 form) plus the low-level crypto_scalarmult\n// primitive — all classical Curve25519 key agreement (audit recall gap).\nconst RE_C_SODIUM_BOX =\n /\\bcrypto_box_(?:curve25519xsalsa20poly1305_)?(?:seed_)?keypair\\s*\\(|\\bcrypto_kx_keypair\\s*\\(|\\bcrypto_scalarmult_(?:curve25519|base)\\s*\\(/g;\n// EdDSA: crypto_sign key pairs, including the explicit _ed25519 forms and the\n// deterministic seed_keypair variants (audit recall gap: _ed25519_keypair).\nconst RE_C_SODIUM_SIGN = /\\bcrypto_sign_(?:ed25519_)?(?:seed_)?keypair\\s*\\(/g;\n// Legacy verify / decrypt counterparts to the *_sign / *_encrypt rules above\n// (audit F4-c): the classic OpenSSL RSA/ECDSA verification and RSA raw\n// decryption call forms that the modern EVP + legacy keygen rules don't cover.\nconst RE_C_ECDSA_VERIFY = /\\bECDSA_verify\\s*\\(/g;\nconst RE_C_RSA_VERIFY = /\\bRSA_verify\\s*\\(/g;\nconst RE_C_RSA_CRYPT = /\\bRSA_public_encrypt\\s*\\(|\\bRSA_private_decrypt\\s*\\(/g;\n// C/OpenSSL legacy TLS configuration (mirrors source.ts tlsDetector): forcing a\n// deprecated protocol version or disabling certificate verification.\n// TLSv1_method / TLSv1_1_method (+ the client/server-specific variants) and the\n// SSLv2/SSLv3 method constructors — all pin a deprecated protocol (RFC 8996).\nconst RE_C_TLS_VERSION = /\\b(?:TLSv1(?:_1)?|SSLv2|SSLv3)(?:_client|_server)?_method\\b/g;\nconst RE_C_TLS_VERIFY_NONE = /\\bSSL_VERIFY_NONE\\b/g;\n// Embedded C crypto libraries (the \"embedded\" niche): Mbed TLS and wolfSSL /\n// wolfCrypt. Both use highly-distinctive `mbedtls_*` / `wc_*` prefixes, so the\n// false-positive risk is low. These dominate firmware / IoT / RTOS builds where\n// OpenSSL is too heavy — a codebase surface qScan previously missed entirely.\nconst RE_C_MBEDTLS_RSA = /\\bmbedtls_rsa_gen_key\\s*\\(/g;\nconst RE_C_MBEDTLS_EC = /\\bmbedtls_ecp_gen_key(?:pair)?\\s*\\(/g;\nconst RE_C_MBEDTLS_ECDSA =\n /\\bmbedtls_ecdsa_(?:sign|write_signature|read_signature|verify)\\w*\\s*\\(/g;\nconst RE_C_MBEDTLS_ECDH = /\\bmbedtls_ecdh_(?:compute_shared|calc_secret)\\s*\\(/g;\nconst RE_C_MBEDTLS_DH = /\\bmbedtls_dhm_(?:make_public|make_params|calc_secret)\\s*\\(/g;\nconst RE_C_WOLF_RSA =\n /\\bwc_MakeRsaKey\\s*\\(|\\bwc_RsaPublicEncrypt\\s*\\(|\\bwc_RsaPrivateDecrypt\\s*\\(/g;\nconst RE_C_WOLF_ECC = /\\bwc_ecc_make_key(?:_ex)?\\s*\\(/g;\nconst RE_C_WOLF_ECDSA = /\\bwc_ecc_sign_hash\\s*\\(|\\bwc_ecc_verify_hash\\s*\\(/g;\nconst RE_C_WOLF_ECDH = /\\bwc_ecc_shared_secret\\s*\\(/g;\nconst RE_C_WOLF_DH = /\\bwc_DhGenerateKeyPair\\s*\\(|\\bwc_DhAgree\\s*\\(/g;\nconst RE_C_WOLF_CURVE25519 = /\\bwc_curve25519_(?:make_key|shared_secret)\\s*\\(/g;\nconst RE_C_WOLF_ED25519 = /\\bwc_ed25519_(?:make_key|sign_msg|verify_msg)\\s*\\(/g;\n\nconst RULE_C_RSA: RuleMeta = {\n id: \"c-rsa-keygen\",\n title: \"C/OpenSSL RSA key generation\",\n description: \"OpenSSL RSA_generate_key(_ex) / EVP_RSA_gen\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Generates a classical RSA key pair (C/OpenSSL), which is not quantum-safe.\",\n};\nconst RULE_C_EC: RuleMeta = {\n id: \"c-ec-keygen\",\n title: \"C/OpenSSL EC key generation\",\n description: \"OpenSSL EC_KEY_generate_key / EC_KEY_new_by_curve_name\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Generates a classical EC key pair (C/OpenSSL). EC keys feed BOTH ECDSA signatures and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.\",\n remediation:\n \"For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_ECDSA: RuleMeta = {\n id: \"c-ecdsa\",\n title: \"C/OpenSSL ECDSA signature\",\n description: \"OpenSSL ECDSA_sign / ECDSA_do_sign\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Classical ECDSA signing (C/OpenSSL) is forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_ECDH: RuleMeta = {\n id: \"c-ecdh\",\n title: \"C/OpenSSL ECDH key agreement\",\n description: \"OpenSSL ECDH_compute_key\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Elliptic-curve Diffie-Hellman (C/OpenSSL) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_DSA: RuleMeta = {\n id: \"c-dsa\",\n title: \"C/OpenSSL DSA key/usage\",\n description: \"OpenSSL DSA_generate_key / DSA_generate_parameters\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"DSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Classical DSA (C/OpenSSL) is deprecated and forgeable by a quantum attacker.\",\n remediation: \"Rotate off DSA and migrate to ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_DH: RuleMeta = {\n id: \"c-dh\",\n title: \"C/OpenSSL Diffie-Hellman key exchange\",\n description: \"OpenSSL DH_generate_key / DH_generate_parameters\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"DH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Finite-field Diffie-Hellman (C/OpenSSL) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_EVP_KEYGEN: RuleMeta = {\n id: \"c-evp-keygen\",\n title: \"C/OpenSSL EVP key generation\",\n description: \"OpenSSL 3.x EVP_PKEY_keygen / EVP_PKEY_Q_keygen / paramgen\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"unknown\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Generates an asymmetric key via the OpenSSL 3.x EVP API (the key type — RSA/EC/DH/X25519 — is set on the CTX). Treated conservatively as key-exchange-capable (harvest-now-decrypt-later).\",\n remediation:\n \"For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_EVP_DERIVE: RuleMeta = {\n id: \"c-evp-derive\",\n title: \"C/OpenSSL EVP key agreement\",\n description: \"OpenSSL 3.x EVP_PKEY_derive (ECDH / DH shared secret)\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Derives an (EC)DH shared secret via the OpenSSL EVP API — broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_EVP_CRYPT: RuleMeta = {\n id: \"c-evp-pkey-crypt\",\n title: \"C/OpenSSL EVP public-key encryption\",\n description: \"OpenSSL 3.x EVP_PKEY_encrypt / EVP_PKEY_decrypt (RSA)\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"RSA public-key encryption/decryption via the OpenSSL EVP API is harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_EVP_SIGN: RuleMeta = {\n id: \"c-evp-sign\",\n title: \"C/OpenSSL EVP signing\",\n description: \"OpenSSL 3.x EVP_DigestSign* / EVP_DigestVerify*\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"unknown\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Classical signature via the OpenSSL EVP API (RSA/ECDSA/EdDSA) is forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_SODIUM_BOX: RuleMeta = {\n id: \"c-libsodium-box\",\n title: \"libsodium X25519 key pair\",\n description:\n \"libsodium crypto_box / crypto_kx keypair + crypto_scalarmult (X25519 key agreement)\",\n category: \"key-exchange\",\n severity: \"medium\",\n confidence: \"high\",\n algorithm: \"X25519\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"libsodium crypto_box uses X25519 key agreement — modern but classical, and harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_SODIUM_SIGN: RuleMeta = {\n id: \"c-libsodium-sign\",\n title: \"libsodium Ed25519 key pair\",\n description: \"libsodium crypto_sign(_ed25519)(_seed)_keypair (Ed25519 signatures)\",\n category: \"signature\",\n severity: \"low\",\n confidence: \"high\",\n algorithm: \"EdDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"libsodium crypto_sign uses Ed25519 signatures — classical and forgeable by a quantum attacker.\",\n};\nconst RULE_C_ECDSA_VERIFY: RuleMeta = {\n id: \"c-ecdsa-verify\",\n title: \"C/OpenSSL ECDSA signature verification\",\n description: \"OpenSSL ECDSA_verify\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Classical ECDSA verification (C/OpenSSL) trusts signatures forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_RSA_VERIFY: RuleMeta = {\n id: \"c-rsa-verify\",\n title: \"C/OpenSSL RSA signature verification\",\n description: \"OpenSSL RSA_verify\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Classical RSA signature verification (C/OpenSSL) trusts signatures forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_RSA_CRYPT: RuleMeta = {\n id: \"c-rsa-crypt\",\n title: \"C/OpenSSL RSA public-key encryption\",\n description: \"OpenSSL RSA_public_encrypt / RSA_private_decrypt\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Legacy RSA public-key encryption/decryption (C/OpenSSL) is harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_TLS_VERSION: RuleMeta = {\n id: \"c-tls-legacy-version\",\n title: \"Legacy TLS/SSL version pinned (C/OpenSSL)\",\n description: \"OpenSSL TLSv1_method / SSLv3_method\",\n category: \"tls\",\n severity: \"medium\",\n confidence: \"high\",\n hndl: false,\n cwe: CWE_WEAK_STRENGTH,\n message: \"TLS 1.0 / SSLv3 are deprecated and insecure; require TLS 1.3.\",\n remediation: \"Use TLS_method() with a minimum of TLS 1.3 and prefer PQC-hybrid key exchange.\",\n};\nconst RULE_C_TLS_VERIFY_NONE: RuleMeta = {\n id: \"c-tls-verify-none\",\n title: \"TLS certificate verification disabled (C/OpenSSL)\",\n description: \"OpenSSL SSL_VERIFY_NONE\",\n category: \"tls\",\n severity: \"high\",\n confidence: \"high\",\n hndl: false,\n cwe: CWE_CERT_VALIDATION,\n message: \"SSL_VERIFY_NONE disables TLS certificate verification (MITM risk).\",\n remediation: \"Use SSL_VERIFY_PEER and verify certificates properly.\",\n};\n// --- Mbed TLS (embedded) ---\nconst RULE_C_MBEDTLS_RSA: RuleMeta = {\n id: \"c-mbedtls-rsa-keygen\",\n title: \"Mbed TLS RSA key generation\",\n description: \"Mbed TLS mbedtls_rsa_gen_key\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Generates a classical RSA key pair (Mbed TLS, embedded), which is not quantum-safe.\",\n};\nconst RULE_C_MBEDTLS_EC: RuleMeta = {\n id: \"c-mbedtls-ec-keygen\",\n title: \"Mbed TLS EC key generation\",\n description: \"Mbed TLS mbedtls_ecp_gen_key / mbedtls_ecp_gen_keypair\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Generates a classical EC key pair (Mbed TLS, embedded). EC keys feed BOTH ECDSA signatures and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.\",\n remediation:\n \"For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_MBEDTLS_ECDSA: RuleMeta = {\n id: \"c-mbedtls-ecdsa\",\n title: \"Mbed TLS ECDSA signature\",\n description: \"Mbed TLS mbedtls_ecdsa_sign / write_signature / read_signature / verify\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Classical ECDSA (Mbed TLS, embedded) is forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_MBEDTLS_ECDH: RuleMeta = {\n id: \"c-mbedtls-ecdh\",\n title: \"Mbed TLS ECDH key agreement\",\n description: \"Mbed TLS mbedtls_ecdh_compute_shared / mbedtls_ecdh_calc_secret\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Elliptic-curve Diffie-Hellman (Mbed TLS, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_MBEDTLS_DH: RuleMeta = {\n id: \"c-mbedtls-dh\",\n title: \"Mbed TLS Diffie-Hellman key exchange\",\n description: \"Mbed TLS mbedtls_dhm_make_public / make_params / calc_secret\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"DH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Finite-field Diffie-Hellman (Mbed TLS, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\n// --- wolfSSL / wolfCrypt (embedded) ---\nconst RULE_C_WOLF_RSA: RuleMeta = {\n id: \"c-wolfssl-rsa\",\n title: \"wolfSSL RSA key/usage\",\n description: \"wolfCrypt wc_MakeRsaKey / wc_RsaPublicEncrypt / wc_RsaPrivateDecrypt\",\n category: \"kem\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"RSA\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Classical RSA key generation / encryption (wolfSSL, embedded) is harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_WOLF_ECC: RuleMeta = {\n id: \"c-wolfssl-ecc-keygen\",\n title: \"wolfSSL EC key generation\",\n description: \"wolfCrypt wc_ecc_make_key / wc_ecc_make_key_ex\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Generates a classical EC key pair (wolfSSL, embedded). EC keys feed BOTH ECDSA signatures and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.\",\n remediation:\n \"For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).\",\n};\nconst RULE_C_WOLF_ECDSA: RuleMeta = {\n id: \"c-wolfssl-ecdsa\",\n title: \"wolfSSL ECDSA signature\",\n description: \"wolfCrypt wc_ecc_sign_hash / wc_ecc_verify_hash\",\n category: \"signature\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message: \"Classical ECDSA (wolfSSL, embedded) is forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\nconst RULE_C_WOLF_ECDH: RuleMeta = {\n id: \"c-wolfssl-ecdh\",\n title: \"wolfSSL ECDH key agreement\",\n description: \"wolfCrypt wc_ecc_shared_secret\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"ECDH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Elliptic-curve Diffie-Hellman (wolfSSL, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_WOLF_DH: RuleMeta = {\n id: \"c-wolfssl-dh\",\n title: \"wolfSSL Diffie-Hellman key exchange\",\n description: \"wolfCrypt wc_DhGenerateKeyPair / wc_DhAgree\",\n category: \"key-exchange\",\n severity: \"high\",\n confidence: \"high\",\n algorithm: \"DH\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Finite-field Diffie-Hellman (wolfSSL, embedded) is broken by Shor's algorithm (harvest-now-decrypt-later).\",\n};\nconst RULE_C_WOLF_CURVE25519: RuleMeta = {\n id: \"c-wolfssl-curve25519\",\n title: \"wolfSSL X25519 key agreement\",\n description: \"wolfCrypt wc_curve25519_make_key / wc_curve25519_shared_secret\",\n category: \"key-exchange\",\n severity: \"medium\",\n confidence: \"high\",\n algorithm: \"X25519\",\n hndl: true,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"X25519 key agreement (wolfSSL, embedded) is modern but classical, and harvest-now-decrypt-later exposed.\",\n};\nconst RULE_C_WOLF_ED25519: RuleMeta = {\n id: \"c-wolfssl-ed25519\",\n title: \"wolfSSL Ed25519 signature\",\n description: \"wolfCrypt wc_ed25519_make_key / wc_ed25519_sign_msg / wc_ed25519_verify_msg\",\n category: \"signature\",\n severity: \"low\",\n confidence: \"high\",\n algorithm: \"EdDSA\",\n hndl: false,\n cwe: CWE_BROKEN_CRYPTO,\n message:\n \"Ed25519 signatures (wolfSSL, embedded) are classical and forgeable by a quantum attacker.\",\n remediation: \"ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)\",\n};\n\n/** Detects classical asymmetric crypto in C/C++ (OpenSSL). */\nexport const cDetector: Detector = {\n id: \"c-crypto\",\n description: \"Classical asymmetric crypto in C/C++ (OpenSSL, libsodium, Mbed TLS, wolfSSL)\",\n scope: \"source\",\n language: \"c\",\n rules: [\n RULE_C_RSA,\n RULE_C_EC,\n RULE_C_ECDSA,\n RULE_C_ECDH,\n RULE_C_DSA,\n RULE_C_DH,\n RULE_C_EVP_KEYGEN,\n RULE_C_EVP_DERIVE,\n RULE_C_EVP_CRYPT,\n RULE_C_EVP_SIGN,\n RULE_C_SODIUM_BOX,\n RULE_C_SODIUM_SIGN,\n RULE_C_ECDSA_VERIFY,\n RULE_C_RSA_VERIFY,\n RULE_C_RSA_CRYPT,\n RULE_C_TLS_VERSION,\n RULE_C_TLS_VERIFY_NONE,\n RULE_C_MBEDTLS_RSA,\n RULE_C_MBEDTLS_EC,\n RULE_C_MBEDTLS_ECDSA,\n RULE_C_MBEDTLS_ECDH,\n RULE_C_MBEDTLS_DH,\n RULE_C_WOLF_RSA,\n RULE_C_WOLF_ECC,\n RULE_C_WOLF_ECDSA,\n RULE_C_WOLF_ECDH,\n RULE_C_WOLF_DH,\n RULE_C_WOLF_CURVE25519,\n RULE_C_WOLF_ED25519,\n ],\n appliesTo: (f) => hasExtension(f, C_EXTENSIONS),\n detect({ file, content }): Finding[] {\n const findings: Finding[] = [];\n const add = (re: RegExp, rule: RuleMeta) =>\n eachMatch(re, content, (m) =>\n findings.push(\n findingFromRule(rule, { file, content, index: m.index, matchLength: m[0].length }),\n ),\n );\n add(RE_C_RSA, RULE_C_RSA);\n add(RE_C_EC, RULE_C_EC);\n add(RE_C_ECDSA, RULE_C_ECDSA);\n add(RE_C_ECDH, RULE_C_ECDH);\n add(RE_C_DSA, RULE_C_DSA);\n add(RE_C_DH, RULE_C_DH);\n add(RE_C_EVP_KEYGEN, RULE_C_EVP_KEYGEN);\n // `EVP_PKEY_derive` is OpenSSL's entry point for BOTH (EC)DH key agreement and the\n // symmetric KDFs (HKDF/scrypt/TLS1-PRF). Real (EC)DH always sets a peer key via\n // `EVP_PKEY_derive_set_peer`; a KDF never does. So only treat it as classical key\n // agreement when a peer is set, or when no KDF context marker is present.\n const hasKdfCtx = /\\bEVP_PKEY_(?:HKDF|SCRYPT|TLS1_PRF)\\b/.test(content);\n if (content.includes(\"EVP_PKEY_derive_set_peer\") || !hasKdfCtx) {\n add(RE_C_EVP_DERIVE, RULE_C_EVP_DERIVE);\n }\n add(RE_C_EVP_CRYPT, RULE_C_EVP_CRYPT);\n // `EVP_DigestSign*` also drives HMAC/CMAC (a symmetric MAC keyed by\n // `EVP_PKEY_new_mac_key(EVP_PKEY_HMAC/CMAC, …)`), which is NOT a classical\n // asymmetric signature. Suppress a `DigestSign*` match ONLY when a MAC key setup\n // sits just before it — per-match, so a real RSA/ECDSA sign elsewhere in the same\n // file is still reported. `DigestVerify*` (no MAC form here) is never suppressed.\n eachMatch(RE_C_EVP_SIGN, content, (m) => {\n const isSign = m[0].includes(\"DigestSign\");\n if (isSign) {\n const back = content.slice(Math.max(0, m.index - 300), m.index);\n if (/EVP_PKEY_new_mac_key|EVP_PKEY_(?:HMAC|CMAC)\\b/.test(back)) return;\n }\n findings.push(\n findingFromRule(RULE_C_EVP_SIGN, {\n file,\n content,\n index: m.index,\n matchLength: m[0].length,\n }),\n );\n });\n add(RE_C_SODIUM_BOX, RULE_C_SODIUM_BOX);\n add(RE_C_SODIUM_SIGN, RULE_C_SODIUM_SIGN);\n add(RE_C_ECDSA_VERIFY, RULE_C_ECDSA_VERIFY);\n add(RE_C_RSA_VERIFY, RULE_C_RSA_VERIFY);\n add(RE_C_RSA_CRYPT, RULE_C_RSA_CRYPT);\n add(RE_C_TLS_VERSION, RULE_C_TLS_VERSION);\n add(RE_C_TLS_VERIFY_NONE, RULE_C_TLS_VERIFY_NONE);\n add(RE_C_MBEDTLS_RSA, RULE_C_MBEDTLS_RSA);\n add(RE_C_MBEDTLS_EC, RULE_C_MBEDTLS_EC);\n add(RE_C_MBEDTLS_ECDSA, RULE_C_MBEDTLS_ECDSA);\n add(RE_C_MBEDTLS_ECDH, RULE_C_MBEDTLS_ECDH);\n add(RE_C_MBEDTLS_DH, RULE_C_MBEDTLS_DH);\n add(RE_C_WOLF_RSA, RULE_C_WOLF_RSA);\n add(RE_C_WOLF_ECC, RULE_C_WOLF_ECC);\n add(RE_C_WOLF_ECDSA, RULE_C_WOLF_ECDSA);\n add(RE_C_WOLF_ECDH, RULE_C_WOLF_ECDH);\n add(RE_C_WOLF_DH, RULE_C_WOLF_DH);\n add(RE_C_WOLF_CURVE25519, RULE_C_WOLF_CURVE25519);\n add(RE_C_WOLF_ED25519, RULE_C_WOLF_ED25519);\n return findings;\n },\n};\n"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Config detector: classical signing of build artifacts and code in CI/CD
3
+ * pipelines (GitHub Actions, GitLab CI, Jenkins, Azure Pipelines, CircleCI).
4
+ *
5
+ * Artifact and code signatures are the signature-side analogue of "harvest now,
6
+ * decrypt later": a release signed today with a classical key is *forgeable* once
7
+ * a CRQC exists, and long-lived artifacts (container images, released binaries,
8
+ * SBOM attestations) keep verifying against that classical public key for years.
9
+ * So these are flagged `hndl:false` (a signature is not confidentiality — nothing
10
+ * to harvest) but remain real quantum-migration debt.
11
+ *
12
+ * Covered command invocations (distinctive enough inside a CI file that the
13
+ * false-positive risk is low):
14
+ * - `cosign sign|attest|generate-key-pair` → sigstore/cosign uses ECDSA P-256
15
+ * (both key-based and keyless/Fulcio).
16
+ * - `gpg --detach-sign|--clearsign|--sign` → GnuPG, classically RSA.
17
+ * - `jarsigner` → Java JAR signing (RSA/DSA/EC).
18
+ * - `codesign --sign|-s` → Apple code signing (RSA).
19
+ * - `minisign` → Ed25519 signatures.
20
+ *
21
+ * Gated to CI/CD pipeline files so `gpg`/`cosign` mentioned in a shell script or
22
+ * doc does not fire; the surface here is specifically the release pipeline.
23
+ */
24
+ import type { Detector } from "../types.js";
25
+ /** Detects classical artifact / code signing in CI/CD pipeline definitions. */
26
+ export declare const cicdDetector: Detector;
27
+ //# sourceMappingURL=cicd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cicd.d.ts","sourceRoot":"","sources":["../../src/detectors/cicd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,aAAa,CAAC;AA4H/D,+EAA+E;AAC/E,eAAO,MAAM,YAAY,EAAE,QAsB1B,CAAC"}