@quantakrypto/core 0.2.2 → 0.4.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 (173) hide show
  1. package/dist/agent-types.d.ts +48 -0
  2. package/dist/agent-types.d.ts.map +1 -0
  3. package/dist/agent-types.js +2 -0
  4. package/dist/agent-types.js.map +1 -0
  5. package/dist/cache.d.ts +27 -0
  6. package/dist/cache.d.ts.map +1 -0
  7. package/dist/cache.js +93 -0
  8. package/dist/cache.js.map +1 -0
  9. package/dist/cbom.d.ts.map +1 -1
  10. package/dist/cbom.js +26 -1
  11. package/dist/cbom.js.map +1 -1
  12. package/dist/changed.d.ts.map +1 -1
  13. package/dist/changed.js +14 -2
  14. package/dist/changed.js.map +1 -1
  15. package/dist/codemods/config-toggle.d.ts +3 -0
  16. package/dist/codemods/config-toggle.d.ts.map +1 -0
  17. package/dist/codemods/config-toggle.js +26 -0
  18. package/dist/codemods/config-toggle.js.map +1 -0
  19. package/dist/codemods/registry.d.ts +26 -0
  20. package/dist/codemods/registry.d.ts.map +1 -0
  21. package/dist/codemods/registry.js +8 -0
  22. package/dist/codemods/registry.js.map +1 -0
  23. package/dist/comments.d.ts +45 -0
  24. package/dist/comments.d.ts.map +1 -0
  25. package/dist/comments.js +164 -0
  26. package/dist/comments.js.map +1 -0
  27. package/dist/config.d.ts +1 -1
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +7 -0
  30. package/dist/config.js.map +1 -1
  31. package/dist/dependencies.d.ts +31 -13
  32. package/dist/dependencies.d.ts.map +1 -1
  33. package/dist/dependencies.js +460 -40
  34. package/dist/dependencies.js.map +1 -1
  35. package/dist/detect-utils.d.ts +70 -2
  36. package/dist/detect-utils.d.ts.map +1 -1
  37. package/dist/detect-utils.js +139 -17
  38. package/dist/detect-utils.js.map +1 -1
  39. package/dist/detectors/c.d.ts +20 -0
  40. package/dist/detectors/c.d.ts.map +1 -0
  41. package/dist/detectors/c.js +104 -0
  42. package/dist/detectors/c.js.map +1 -0
  43. package/dist/detectors/csharp.d.ts +15 -0
  44. package/dist/detectors/csharp.d.ts.map +1 -0
  45. package/dist/detectors/csharp.js +76 -0
  46. package/dist/detectors/csharp.js.map +1 -0
  47. package/dist/detectors/go.d.ts +25 -0
  48. package/dist/detectors/go.d.ts.map +1 -0
  49. package/dist/detectors/go.js +132 -0
  50. package/dist/detectors/go.js.map +1 -0
  51. package/dist/detectors/java.d.ts +25 -0
  52. package/dist/detectors/java.d.ts.map +1 -0
  53. package/dist/detectors/java.js +200 -0
  54. package/dist/detectors/java.js.map +1 -0
  55. package/dist/detectors/pem.d.ts +4 -0
  56. package/dist/detectors/pem.d.ts.map +1 -1
  57. package/dist/detectors/pem.js +113 -91
  58. package/dist/detectors/pem.js.map +1 -1
  59. package/dist/detectors/python.d.ts +26 -0
  60. package/dist/detectors/python.d.ts.map +1 -0
  61. package/dist/detectors/python.js +171 -0
  62. package/dist/detectors/python.js.map +1 -0
  63. package/dist/detectors/ruby.d.ts +15 -0
  64. package/dist/detectors/ruby.d.ts.map +1 -0
  65. package/dist/detectors/ruby.js +75 -0
  66. package/dist/detectors/ruby.js.map +1 -0
  67. package/dist/detectors/rust.d.ts +13 -0
  68. package/dist/detectors/rust.d.ts.map +1 -0
  69. package/dist/detectors/rust.js +94 -0
  70. package/dist/detectors/rust.js.map +1 -0
  71. package/dist/detectors/source.d.ts +9 -2
  72. package/dist/detectors/source.d.ts.map +1 -1
  73. package/dist/detectors/source.js +435 -286
  74. package/dist/detectors/source.js.map +1 -1
  75. package/dist/index.d.ts +19 -1
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +16 -2
  78. package/dist/index.js.map +1 -1
  79. package/dist/parallel.d.ts +4 -0
  80. package/dist/parallel.d.ts.map +1 -1
  81. package/dist/parallel.js +61 -8
  82. package/dist/parallel.js.map +1 -1
  83. package/dist/patch-policy.d.ts +22 -0
  84. package/dist/patch-policy.d.ts.map +1 -0
  85. package/dist/patch-policy.js +21 -0
  86. package/dist/patch-policy.js.map +1 -0
  87. package/dist/redact.d.ts +19 -0
  88. package/dist/redact.d.ts.map +1 -0
  89. package/dist/redact.js +77 -0
  90. package/dist/redact.js.map +1 -0
  91. package/dist/registry.d.ts +29 -4
  92. package/dist/registry.d.ts.map +1 -1
  93. package/dist/registry.js +62 -4
  94. package/dist/registry.js.map +1 -1
  95. package/dist/remediate-pipeline.d.ts +41 -0
  96. package/dist/remediate-pipeline.d.ts.map +1 -0
  97. package/dist/remediate-pipeline.js +38 -0
  98. package/dist/remediate-pipeline.js.map +1 -0
  99. package/dist/remediate-request.d.ts +21 -0
  100. package/dist/remediate-request.d.ts.map +1 -0
  101. package/dist/remediate-request.js +28 -0
  102. package/dist/remediate-request.js.map +1 -0
  103. package/dist/remediation.d.ts +10 -0
  104. package/dist/remediation.d.ts.map +1 -1
  105. package/dist/remediation.js +21 -8
  106. package/dist/remediation.js.map +1 -1
  107. package/dist/report.d.ts +9 -1
  108. package/dist/report.d.ts.map +1 -1
  109. package/dist/report.js +72 -24
  110. package/dist/report.js.map +1 -1
  111. package/dist/scan-worker.js +7 -3
  112. package/dist/scan-worker.js.map +1 -1
  113. package/dist/scan.d.ts +6 -5
  114. package/dist/scan.d.ts.map +1 -1
  115. package/dist/scan.js +59 -30
  116. package/dist/scan.js.map +1 -1
  117. package/dist/triage.d.ts +27 -0
  118. package/dist/triage.d.ts.map +1 -0
  119. package/dist/triage.js +33 -0
  120. package/dist/triage.js.map +1 -0
  121. package/dist/types.d.ts +106 -3
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/verify.d.ts +30 -0
  124. package/dist/verify.d.ts.map +1 -0
  125. package/dist/verify.js +65 -0
  126. package/dist/verify.js.map +1 -0
  127. package/dist/version.d.ts +1 -1
  128. package/dist/version.js +1 -1
  129. package/dist/walk.d.ts +7 -0
  130. package/dist/walk.d.ts.map +1 -1
  131. package/dist/walk.js +85 -11
  132. package/dist/walk.js.map +1 -1
  133. package/dist/worktree.d.ts +6 -0
  134. package/dist/worktree.d.ts.map +1 -0
  135. package/dist/worktree.js +43 -0
  136. package/dist/worktree.js.map +1 -0
  137. package/package.json +1 -1
  138. package/src/agent-types.ts +52 -0
  139. package/src/cache.ts +120 -0
  140. package/src/cbom.ts +27 -1
  141. package/src/changed.ts +13 -4
  142. package/src/codemods/config-toggle.ts +35 -0
  143. package/src/codemods/registry.ts +31 -0
  144. package/src/comments.ts +180 -0
  145. package/src/config.ts +8 -0
  146. package/src/dependencies.ts +483 -51
  147. package/src/detect-utils.ts +180 -16
  148. package/src/detectors/c.ts +132 -0
  149. package/src/detectors/csharp.ts +98 -0
  150. package/src/detectors/go.ts +167 -0
  151. package/src/detectors/java.ts +235 -0
  152. package/src/detectors/pem.ts +124 -105
  153. package/src/detectors/python.ts +212 -0
  154. package/src/detectors/ruby.ts +97 -0
  155. package/src/detectors/rust.ts +112 -0
  156. package/src/detectors/source.ts +535 -364
  157. package/src/index.ts +47 -2
  158. package/src/parallel.ts +72 -7
  159. package/src/patch-policy.ts +42 -0
  160. package/src/redact.ts +92 -0
  161. package/src/registry.ts +71 -5
  162. package/src/remediate-pipeline.ts +81 -0
  163. package/src/remediate-request.ts +52 -0
  164. package/src/remediation.ts +27 -11
  165. package/src/report.ts +106 -24
  166. package/src/scan-worker.ts +18 -7
  167. package/src/scan.ts +74 -29
  168. package/src/triage.ts +58 -0
  169. package/src/types.ts +120 -3
  170. package/src/verify.ts +82 -0
  171. package/src/version.ts +1 -1
  172. package/src/walk.ts +81 -12
  173. package/src/worktree.ts +45 -0
@@ -0,0 +1,132 @@
1
+ import { GO_EXTENSIONS, eachMatch, findingFromRule, hasExtension } from "../detect-utils.js";
2
+ import { CWE_BROKEN_CRYPTO } from "../cwe.js";
3
+ /* -------------------------------------------------------------------------- */
4
+ /* Precompiled regexes (module scope) */
5
+ /* -------------------------------------------------------------------------- */
6
+ const RE_GO_RSA_KEYGEN = /\brsa\.GenerateKey\s*\(|\brsa\.GenerateMultiPrimeKey\s*\(/g;
7
+ const RE_GO_RSA_ENCRYPT = /\brsa\.EncryptOAEP\s*\(|\brsa\.EncryptPKCS1v15\s*\(/g;
8
+ const RE_GO_RSA_SIGN = /\brsa\.SignPKCS1v15\s*\(|\brsa\.SignPSS\s*\(/g;
9
+ const RE_GO_ECDSA = /\becdsa\.GenerateKey\s*\(|\becdsa\.SignASN1\s*\(|\becdsa\.Sign\s*\(/g;
10
+ const RE_GO_ECDH = /\becdh\.(?:P256|P384|P521|X25519)\s*\(/g;
11
+ const RE_GO_ED25519 = /\bed25519\.GenerateKey\s*\(|\bed25519\.Sign\s*\(/g;
12
+ const RE_GO_DSA = /\bdsa\.GenerateKey\s*\(|\bdsa\.GenerateParameters\s*\(/g;
13
+ /* -------------------------------------------------------------------------- */
14
+ /* Rule catalog */
15
+ /* -------------------------------------------------------------------------- */
16
+ const RULE_GO_RSA_KEYGEN = {
17
+ id: "go-rsa-keygen",
18
+ title: "Go RSA key generation",
19
+ description: "crypto/rsa GenerateKey / GenerateMultiPrimeKey",
20
+ category: "kem",
21
+ severity: "high",
22
+ confidence: "high",
23
+ algorithm: "RSA",
24
+ hndl: true,
25
+ cwe: CWE_BROKEN_CRYPTO,
26
+ message: "Generates a classical RSA key pair (Go), which is not quantum-safe.",
27
+ };
28
+ const RULE_GO_RSA_ENCRYPT = {
29
+ id: "go-rsa-encrypt",
30
+ title: "Go RSA public-key encryption",
31
+ description: "crypto/rsa EncryptOAEP / EncryptPKCS1v15",
32
+ category: "kem",
33
+ severity: "high",
34
+ confidence: "high",
35
+ algorithm: "RSA",
36
+ hndl: true,
37
+ cwe: CWE_BROKEN_CRYPTO,
38
+ message: "RSA public-key encryption (Go) is broken by Shor's algorithm and exposed to harvest-now-decrypt-later.",
39
+ };
40
+ const RULE_GO_RSA_SIGN = {
41
+ id: "go-rsa-sign",
42
+ title: "Go RSA signature",
43
+ description: "crypto/rsa SignPKCS1v15 / SignPSS",
44
+ category: "signature",
45
+ severity: "high",
46
+ confidence: "high",
47
+ algorithm: "RSA",
48
+ hndl: false,
49
+ cwe: CWE_BROKEN_CRYPTO,
50
+ message: "Classical RSA signing (Go) is forgeable by a quantum attacker.",
51
+ remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
52
+ };
53
+ const RULE_GO_ECDSA = {
54
+ id: "go-ecdsa",
55
+ title: "Go ECDSA key/signature",
56
+ description: "crypto/ecdsa GenerateKey / Sign / SignASN1",
57
+ category: "signature",
58
+ severity: "high",
59
+ confidence: "high",
60
+ algorithm: "ECDSA",
61
+ hndl: false,
62
+ cwe: CWE_BROKEN_CRYPTO,
63
+ message: "Classical ECDSA (Go) is forgeable by a quantum attacker.",
64
+ remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
65
+ };
66
+ const RULE_GO_ECDH = {
67
+ id: "go-ecdh",
68
+ title: "Go ECDH key exchange",
69
+ description: "crypto/ecdh P256/P384/P521/X25519 key agreement",
70
+ category: "key-exchange",
71
+ severity: "high",
72
+ confidence: "high",
73
+ algorithm: "ECDH",
74
+ hndl: true,
75
+ cwe: CWE_BROKEN_CRYPTO,
76
+ message: "Elliptic-curve Diffie-Hellman (Go crypto/ecdh) is broken by Shor's algorithm (harvest-now-decrypt-later).",
77
+ };
78
+ const RULE_GO_ED25519 = {
79
+ id: "go-ed25519",
80
+ title: "Go Ed25519 signature",
81
+ description: "crypto/ed25519 GenerateKey / Sign",
82
+ category: "signature",
83
+ severity: "low",
84
+ confidence: "high",
85
+ algorithm: "EdDSA",
86
+ hndl: false,
87
+ cwe: CWE_BROKEN_CRYPTO,
88
+ message: "Ed25519 (Go) is a modern but still classical signature scheme.",
89
+ };
90
+ const RULE_GO_DSA = {
91
+ id: "go-dsa",
92
+ title: "Go DSA key/usage",
93
+ description: "crypto/dsa GenerateKey / GenerateParameters",
94
+ category: "signature",
95
+ severity: "high",
96
+ confidence: "high",
97
+ algorithm: "DSA",
98
+ hndl: false,
99
+ cwe: CWE_BROKEN_CRYPTO,
100
+ message: "Classical DSA (Go) is deprecated and forgeable by a quantum attacker.",
101
+ remediation: "Rotate off DSA and migrate to ML-DSA-65 (FIPS 204).",
102
+ };
103
+ /** Detects classical asymmetric crypto in Go source (crypto/* standard library). */
104
+ export const goDetector = {
105
+ id: "go-crypto",
106
+ description: "Classical asymmetric crypto in Go (crypto/rsa, ecdsa, ecdh, ed25519, dsa)",
107
+ scope: "source",
108
+ language: "go",
109
+ rules: [
110
+ RULE_GO_RSA_KEYGEN,
111
+ RULE_GO_RSA_ENCRYPT,
112
+ RULE_GO_RSA_SIGN,
113
+ RULE_GO_ECDSA,
114
+ RULE_GO_ECDH,
115
+ RULE_GO_ED25519,
116
+ RULE_GO_DSA,
117
+ ],
118
+ appliesTo: (f) => hasExtension(f, GO_EXTENSIONS),
119
+ detect({ file, content }) {
120
+ const findings = [];
121
+ const add = (re, rule) => eachMatch(re, content, (m) => findings.push(findingFromRule(rule, { file, content, index: m.index, matchLength: m[0].length })));
122
+ add(RE_GO_RSA_KEYGEN, RULE_GO_RSA_KEYGEN);
123
+ add(RE_GO_RSA_ENCRYPT, RULE_GO_RSA_ENCRYPT);
124
+ add(RE_GO_RSA_SIGN, RULE_GO_RSA_SIGN);
125
+ add(RE_GO_ECDSA, RULE_GO_ECDSA);
126
+ add(RE_GO_ECDH, RULE_GO_ECDH);
127
+ add(RE_GO_ED25519, RULE_GO_ED25519);
128
+ add(RE_GO_DSA, RULE_GO_DSA);
129
+ return findings;
130
+ },
131
+ };
132
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/detectors/go.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Source-code detector for classical, non-quantum-safe asymmetric cryptography
3
+ * in Java / Kotlin (the JCA — Java Cryptography Architecture). Same lexical
4
+ * strategy as the other language packs.
5
+ *
6
+ * The JCA funnels almost everything through a handful of factory methods keyed
7
+ * by an ALGORITHM STRING: `KeyPairGenerator.getInstance("RSA")`,
8
+ * `Signature.getInstance("SHA256withECDSA")`, `Cipher.getInstance("RSA/ECB/…")`,
9
+ * `KeyAgreement.getInstance("ECDH")`. So detection here is two steps: match the
10
+ * `<Factory>.getInstance("<alg>")` call, then classify the (factory, alg) pair
11
+ * into a rule. Symmetric / hashing algorithms ("AES", "HmacSHA256", …) classify
12
+ * to nothing and are ignored. A small set of BouncyCastle lightweight-API class
13
+ * names (`new ECDSASigner()`, `new X25519Agreement()`, …) is matched directly.
14
+ *
15
+ * HNDL policy mirrors the other detectors: KEM / key agreement (RSA encryption,
16
+ * (EC)DH, X25519/X448) is harvest-now-decrypt-later exposed (hndl:true);
17
+ * signatures (RSA/ECDSA/DSA/EdDSA) are hndl:false but forgeable by a quantum
18
+ * attacker. `KeyPairGenerator.getInstance("EC")` is ambiguous (an EC key feeds
19
+ * both ECDSA and ECDH), so it is classified conservatively as
20
+ * key-exchange-capable (hndl:true), exactly as the Node/Python EC keygen rules.
21
+ */
22
+ import type { Detector } from "../types.js";
23
+ /** Detects classical asymmetric crypto in Java / Kotlin (JCA + BouncyCastle). */
24
+ export declare const javaDetector: Detector;
25
+ //# sourceMappingURL=java.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../src/detectors/java.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,aAAa,CAAC;AA8K/D,iFAAiF;AACjF,eAAO,MAAM,YAAY,EAAE,QAsC1B,CAAC"}
@@ -0,0 +1,200 @@
1
+ import { JAVA_EXTENSIONS, eachMatch, findingFromRule, hasExtension } from "../detect-utils.js";
2
+ import { CWE_BROKEN_CRYPTO } from "../cwe.js";
3
+ /* -------------------------------------------------------------------------- */
4
+ /* Regexes */
5
+ /* -------------------------------------------------------------------------- */
6
+ // <Factory>.getInstance("<alg>") — the JCA entry points that carry asymmetric
7
+ // algorithms. KeyGenerator/MessageDigest/Mac are intentionally excluded (they
8
+ // are symmetric / hashing only).
9
+ const RE_JAVA_GETINSTANCE = /\b(KeyPairGenerator|Signature|Cipher|KeyAgreement|KeyFactory)\s*\.\s*getInstance\s*\(\s*"([^"]+)"/g;
10
+ // BouncyCastle lightweight-API class instantiations.
11
+ const RE_JAVA_BC = /\bnew\s+(RSAKeyPairGenerator|DSAKeyPairGenerator|ECKeyPairGenerator|ECDSASigner|Ed25519Signer|Ed448Signer|X25519Agreement|X448Agreement)\s*\(/g;
12
+ /* -------------------------------------------------------------------------- */
13
+ /* Rule catalog */
14
+ /* -------------------------------------------------------------------------- */
15
+ const RULE_JAVA_RSA = {
16
+ id: "java-rsa",
17
+ title: "Java RSA key/encryption",
18
+ description: "JCA RSA KeyPairGenerator / Cipher / KeyFactory",
19
+ category: "kem",
20
+ severity: "high",
21
+ confidence: "high",
22
+ algorithm: "RSA",
23
+ hndl: true,
24
+ cwe: CWE_BROKEN_CRYPTO,
25
+ message: "Classical RSA (Java/JCA) is not quantum-safe and RSA encryption is HNDL-exposed.",
26
+ };
27
+ const RULE_JAVA_RSA_SIGN = {
28
+ id: "java-rsa-sign",
29
+ title: "Java RSA signature",
30
+ description: 'JCA Signature.getInstance("…withRSA")',
31
+ category: "signature",
32
+ severity: "high",
33
+ confidence: "high",
34
+ algorithm: "RSA",
35
+ hndl: false,
36
+ cwe: CWE_BROKEN_CRYPTO,
37
+ message: "Classical RSA signing (Java/JCA) is forgeable by a quantum attacker.",
38
+ remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
39
+ };
40
+ const RULE_JAVA_EC_KEYGEN = {
41
+ id: "java-ec-keygen",
42
+ title: "Java EC key generation",
43
+ description: 'JCA KeyPairGenerator.getInstance("EC")',
44
+ category: "key-exchange",
45
+ severity: "high",
46
+ confidence: "high",
47
+ algorithm: "ECDH",
48
+ hndl: true,
49
+ cwe: CWE_BROKEN_CRYPTO,
50
+ message: "Generates a classical EC key pair (Java/JCA). EC keys feed BOTH ECDSA signatures and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.",
51
+ remediation: "For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).",
52
+ };
53
+ const RULE_JAVA_ECDSA_SIGN = {
54
+ id: "java-ecdsa-sign",
55
+ title: "Java ECDSA signature",
56
+ description: 'JCA Signature.getInstance("…withECDSA")',
57
+ category: "signature",
58
+ severity: "high",
59
+ confidence: "high",
60
+ algorithm: "ECDSA",
61
+ hndl: false,
62
+ cwe: CWE_BROKEN_CRYPTO,
63
+ message: "Classical ECDSA signing (Java/JCA) is forgeable by a quantum attacker.",
64
+ remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
65
+ };
66
+ const RULE_JAVA_ECDH = {
67
+ id: "java-ecdh",
68
+ title: "Java ECDH key agreement",
69
+ description: 'JCA KeyAgreement.getInstance("ECDH")',
70
+ category: "key-exchange",
71
+ severity: "high",
72
+ confidence: "high",
73
+ algorithm: "ECDH",
74
+ hndl: true,
75
+ cwe: CWE_BROKEN_CRYPTO,
76
+ message: "Elliptic-curve Diffie-Hellman (Java/JCA) is broken by Shor's algorithm (harvest-now-decrypt-later).",
77
+ };
78
+ const RULE_JAVA_DSA = {
79
+ id: "java-dsa",
80
+ title: "Java DSA key/signature",
81
+ description: "JCA DSA KeyPairGenerator / Signature",
82
+ category: "signature",
83
+ severity: "high",
84
+ confidence: "high",
85
+ algorithm: "DSA",
86
+ hndl: false,
87
+ cwe: CWE_BROKEN_CRYPTO,
88
+ message: "Classical DSA (Java/JCA) is deprecated and forgeable by a quantum attacker.",
89
+ remediation: "Rotate off DSA and migrate to ML-DSA-65 (FIPS 204).",
90
+ };
91
+ const RULE_JAVA_DH = {
92
+ id: "java-dh",
93
+ title: "Java Diffie-Hellman key exchange",
94
+ description: "JCA DiffieHellman KeyPairGenerator / KeyAgreement",
95
+ category: "key-exchange",
96
+ severity: "high",
97
+ confidence: "high",
98
+ algorithm: "DH",
99
+ hndl: true,
100
+ cwe: CWE_BROKEN_CRYPTO,
101
+ message: "Finite-field Diffie-Hellman (Java/JCA) is broken by Shor's algorithm (harvest-now-decrypt-later).",
102
+ };
103
+ const RULE_JAVA_XDH = {
104
+ id: "java-xdh",
105
+ title: "Java X25519/X448 key agreement",
106
+ description: "JCA XDH / X25519 / X448 (KeyPairGenerator / KeyAgreement)",
107
+ category: "key-exchange",
108
+ severity: "low",
109
+ confidence: "high",
110
+ algorithm: "X25519",
111
+ hndl: true,
112
+ cwe: CWE_BROKEN_CRYPTO,
113
+ message: "X25519/X448 (Java/JCA) is modern but still classical key agreement — harvest-now-decrypt-later.",
114
+ };
115
+ const RULE_JAVA_EDDSA = {
116
+ id: "java-eddsa",
117
+ title: "Java Ed25519/Ed448 signature",
118
+ description: "JCA EdDSA / Ed25519 / Ed448",
119
+ category: "signature",
120
+ severity: "low",
121
+ confidence: "high",
122
+ algorithm: "EdDSA",
123
+ hndl: false,
124
+ cwe: CWE_BROKEN_CRYPTO,
125
+ message: "Ed25519/Ed448 (Java/JCA) is a modern but still classical signature scheme.",
126
+ };
127
+ /**
128
+ * Classify a `<factory>.getInstance("<alg>")` pair into a rule, or null when the
129
+ * algorithm is not classical asymmetric crypto (AES, HMAC, PBKDF2, hashes, …).
130
+ * `alg` is normalised to upper-case with any Cipher transformation suffix
131
+ * (`RSA/ECB/OAEPPadding` → `RSA`) stripped.
132
+ */
133
+ function classifyGetInstance(factory, rawAlg) {
134
+ const alg = rawAlg.split("/")[0].trim().toUpperCase();
135
+ const isSignature = factory === "Signature";
136
+ if (alg.includes("ECDSA"))
137
+ return RULE_JAVA_ECDSA_SIGN;
138
+ if (alg.includes("ECDH"))
139
+ return RULE_JAVA_ECDH;
140
+ if (alg === "EC")
141
+ return isSignature ? RULE_JAVA_ECDSA_SIGN : RULE_JAVA_EC_KEYGEN;
142
+ if (alg.includes("ED25519") || alg.includes("ED448") || alg.includes("EDDSA"))
143
+ return RULE_JAVA_EDDSA;
144
+ if (alg.includes("X25519") || alg.includes("X448") || alg === "XDH")
145
+ return RULE_JAVA_XDH;
146
+ if (alg.includes("RSA"))
147
+ return isSignature ? RULE_JAVA_RSA_SIGN : RULE_JAVA_RSA;
148
+ if (alg.includes("DSA"))
149
+ return RULE_JAVA_DSA; // ECDSA already handled above
150
+ if (alg.includes("DH") || alg.includes("DIFFIEHELLMAN"))
151
+ return RULE_JAVA_DH;
152
+ return null;
153
+ }
154
+ /** BouncyCastle lightweight-API class name → rule. */
155
+ const BC_CLASS_RULES = {
156
+ RSAKeyPairGenerator: RULE_JAVA_RSA,
157
+ DSAKeyPairGenerator: RULE_JAVA_DSA,
158
+ ECKeyPairGenerator: RULE_JAVA_EC_KEYGEN,
159
+ ECDSASigner: RULE_JAVA_ECDSA_SIGN,
160
+ Ed25519Signer: RULE_JAVA_EDDSA,
161
+ Ed448Signer: RULE_JAVA_EDDSA,
162
+ X25519Agreement: RULE_JAVA_XDH,
163
+ X448Agreement: RULE_JAVA_XDH,
164
+ };
165
+ /** Detects classical asymmetric crypto in Java / Kotlin (JCA + BouncyCastle). */
166
+ export const javaDetector = {
167
+ id: "java-crypto",
168
+ description: "Classical asymmetric crypto in Java/Kotlin (JCA getInstance + BouncyCastle)",
169
+ scope: "source",
170
+ language: "java",
171
+ rules: [
172
+ RULE_JAVA_RSA,
173
+ RULE_JAVA_RSA_SIGN,
174
+ RULE_JAVA_EC_KEYGEN,
175
+ RULE_JAVA_ECDSA_SIGN,
176
+ RULE_JAVA_ECDH,
177
+ RULE_JAVA_DSA,
178
+ RULE_JAVA_DH,
179
+ RULE_JAVA_XDH,
180
+ RULE_JAVA_EDDSA,
181
+ ],
182
+ appliesTo: (f) => hasExtension(f, JAVA_EXTENSIONS),
183
+ detect({ file, content }) {
184
+ const findings = [];
185
+ eachMatch(RE_JAVA_GETINSTANCE, content, (m) => {
186
+ const rule = classifyGetInstance(m[1], m[2]);
187
+ if (!rule)
188
+ return; // symmetric / hashing algorithm — not our concern.
189
+ findings.push(findingFromRule(rule, { file, content, index: m.index, matchLength: m[0].length }));
190
+ });
191
+ eachMatch(RE_JAVA_BC, content, (m) => {
192
+ const rule = BC_CLASS_RULES[m[1]];
193
+ if (!rule)
194
+ return;
195
+ findings.push(findingFromRule(rule, { file, content, index: m.index, matchLength: m[0].length }));
196
+ });
197
+ return findings;
198
+ },
199
+ };
200
+ //# sourceMappingURL=java.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.js","sourceRoot":"","sources":["../../src/detectors/java.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,10 @@
2
2
  * Config / certificate detector: finds PEM-encoded cryptographic material in
3
3
  * any text file (source, config, .pem, .key, .crt, .env, …). This catches
4
4
  * embedded private keys and X.509 certificates regardless of language.
5
+ *
6
+ * Every rule's metadata lives in the {@link RuleMeta} declaration below (the
7
+ * catalog entry); `detect()` builds findings straight from it via
8
+ * `findingFromRule`. All PEM findings are high-confidence exact-marker matches.
5
9
  */
6
10
  import type { Detector } from "../types.js";
7
11
  /** Detects PEM key/certificate material in arbitrary files. */
@@ -1 +1 @@
1
- {"version":3,"file":"pem.d.ts","sourceRoot":"","sources":["../../src/detectors/pem.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,aAAa,CAAC;AA+HrD,+DAA+D;AAC/D,eAAO,MAAM,WAAW,EAAE,QAqCzB,CAAC"}
1
+ {"version":3,"file":"pem.d.ts","sourceRoot":"","sources":["../../src/detectors/pem.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,aAAa,CAAC;AAwJ/D,+DAA+D;AAC/D,eAAO,MAAM,WAAW,EAAE,QA2BzB,CAAC"}
@@ -1,107 +1,139 @@
1
- import { eachMatch, makeFinding } from "../detect-utils.js";
1
+ import { eachMatch, findingFromRule } from "../detect-utils.js";
2
2
  import { CWE_BROKEN_CRYPTO, CWE_HARDCODED_KEY } from "../cwe.js";
3
3
  const PEM_RULES = [
4
4
  {
5
5
  re: /-----BEGIN RSA PRIVATE KEY-----/g,
6
- ruleId: "pem-rsa-private-key",
7
- title: "RSA private key (PEM)",
8
- category: "certificate",
9
- severity: "critical",
10
- algorithm: "RSA",
11
- hndl: true,
12
- cwe: CWE_HARDCODED_KEY,
13
- sensitive: true,
14
- message: "Embedded RSA private key (PKCS#1 PEM); classical and not quantum-safe.",
15
- remediation: "Migrate to ML-DSA / ML-KEM keys and remove embedded private keys from source.",
6
+ meta: {
7
+ id: "pem-rsa-private-key",
8
+ title: "RSA private key (PEM)",
9
+ description: "PKCS#1 RSA private key block",
10
+ category: "certificate",
11
+ severity: "critical",
12
+ confidence: "high",
13
+ algorithm: "RSA",
14
+ hndl: true,
15
+ cwe: CWE_HARDCODED_KEY,
16
+ sensitive: true,
17
+ message: "Embedded RSA private key (PKCS#1 PEM); classical and not quantum-safe.",
18
+ remediation: "Migrate to ML-DSA / ML-KEM keys and remove embedded private keys from source.",
19
+ },
16
20
  },
17
21
  {
18
22
  re: /-----BEGIN EC PRIVATE KEY-----/g,
19
- ruleId: "pem-ec-private-key",
20
- title: "EC private key (PEM)",
21
- category: "certificate",
22
- severity: "critical",
23
- algorithm: "ECDSA",
24
- hndl: true,
25
- cwe: CWE_HARDCODED_KEY,
26
- sensitive: true,
27
- message: "Embedded EC private key (SEC1 PEM); classical ECDSA/ECDH key, not quantum-safe.",
28
- remediation: "Migrate to ML-DSA (FIPS 204) keys and remove embedded private keys from source.",
23
+ meta: {
24
+ id: "pem-ec-private-key",
25
+ title: "EC private key (PEM)",
26
+ description: "SEC1 EC private key block",
27
+ category: "certificate",
28
+ severity: "critical",
29
+ confidence: "high",
30
+ algorithm: "ECDSA",
31
+ hndl: true,
32
+ cwe: CWE_HARDCODED_KEY,
33
+ sensitive: true,
34
+ message: "Embedded EC private key (SEC1 PEM); classical ECDSA/ECDH key, not quantum-safe.",
35
+ remediation: "Migrate to ML-DSA (FIPS 204) keys and remove embedded private keys from source.",
36
+ },
29
37
  },
30
38
  {
31
39
  re: /-----BEGIN DSA PRIVATE KEY-----/g,
32
- ruleId: "pem-dsa-private-key",
33
- title: "DSA private key (PEM)",
34
- category: "certificate",
35
- severity: "critical",
36
- algorithm: "DSA",
37
- hndl: false,
38
- cwe: CWE_HARDCODED_KEY,
39
- sensitive: true,
40
- message: "Embedded DSA private key (PEM); classical, already deprecated, and not quantum-safe.",
41
- remediation: "Rotate immediately (DSA is deprecated) and migrate to ML-DSA-65 (FIPS 204).",
40
+ meta: {
41
+ id: "pem-dsa-private-key",
42
+ title: "DSA private key (PEM)",
43
+ description: "DSA private key block",
44
+ category: "certificate",
45
+ severity: "critical",
46
+ confidence: "high",
47
+ algorithm: "DSA",
48
+ hndl: false,
49
+ cwe: CWE_HARDCODED_KEY,
50
+ sensitive: true,
51
+ message: "Embedded DSA private key (PEM); classical, already deprecated, and not quantum-safe.",
52
+ remediation: "Rotate immediately (DSA is deprecated) and migrate to ML-DSA-65 (FIPS 204).",
53
+ },
42
54
  },
43
55
  {
44
56
  re: /-----BEGIN OPENSSH PRIVATE KEY-----/g,
45
- ruleId: "pem-openssh-private-key",
46
- title: "OpenSSH private key",
47
- category: "certificate",
48
- severity: "critical",
49
- algorithm: "unknown",
50
- hndl: true,
51
- cwe: CWE_HARDCODED_KEY,
52
- sensitive: true,
53
- message: "Embedded OpenSSH private key (RSA/ECDSA/Ed25519); classical and not quantum-safe.",
54
- remediation: "Rotate the key; plan migration to PQC-capable SSH (e.g. sntrup761x25519).",
57
+ meta: {
58
+ id: "pem-openssh-private-key",
59
+ title: "OpenSSH private key",
60
+ description: "OpenSSH private key block",
61
+ category: "certificate",
62
+ severity: "critical",
63
+ confidence: "high",
64
+ algorithm: "unknown",
65
+ hndl: true,
66
+ cwe: CWE_HARDCODED_KEY,
67
+ sensitive: true,
68
+ message: "Embedded OpenSSH private key (RSA/ECDSA/Ed25519); classical and not quantum-safe.",
69
+ remediation: "Rotate the key; plan migration to PQC-capable SSH (e.g. sntrup761x25519).",
70
+ },
55
71
  },
56
72
  {
57
73
  re: /-----BEGIN PGP PRIVATE KEY BLOCK-----/g,
58
- ruleId: "pem-pgp-private-key",
59
- title: "PGP/GPG private key block",
60
- category: "certificate",
61
- severity: "critical",
62
- algorithm: "unknown",
63
- hndl: true,
64
- cwe: CWE_HARDCODED_KEY,
65
- sensitive: true,
66
- message: "Embedded PGP/GPG private key block (RSA/ECDSA/EdDSA/ElGamal); classical and not quantum-safe.",
67
- remediation: "Rotate the key; track OpenPGP PQC drafts for migration.",
74
+ meta: {
75
+ id: "pem-pgp-private-key",
76
+ title: "PGP/GPG private key block",
77
+ description: "OpenPGP private key block",
78
+ category: "certificate",
79
+ severity: "critical",
80
+ confidence: "high",
81
+ algorithm: "unknown",
82
+ hndl: true,
83
+ cwe: CWE_HARDCODED_KEY,
84
+ sensitive: true,
85
+ message: "Embedded PGP/GPG private key block (RSA/ECDSA/EdDSA/ElGamal); classical and not quantum-safe.",
86
+ remediation: "Rotate the key; track OpenPGP PQC drafts for migration.",
87
+ },
68
88
  },
69
89
  {
70
90
  re: /-----BEGIN PGP MESSAGE-----/g,
71
- ruleId: "pem-pgp-message",
72
- title: "PGP/GPG encrypted message",
73
- category: "certificate",
74
- severity: "low",
75
- algorithm: "unknown",
76
- hndl: true,
77
- cwe: CWE_BROKEN_CRYPTO,
78
- message: "Embedded PGP/GPG message; likely encrypted with classical RSA/ElGamal (harvest-now-decrypt-later).",
79
- remediation: "Re-encrypt with PQC-capable tooling as OpenPGP PQC profiles mature.",
91
+ meta: {
92
+ id: "pem-pgp-message",
93
+ title: "PGP/GPG encrypted message",
94
+ description: "OpenPGP encrypted message block",
95
+ category: "certificate",
96
+ severity: "low",
97
+ confidence: "high",
98
+ algorithm: "unknown",
99
+ hndl: true,
100
+ cwe: CWE_BROKEN_CRYPTO,
101
+ message: "Embedded PGP/GPG message; likely encrypted with classical RSA/ElGamal (harvest-now-decrypt-later).",
102
+ remediation: "Re-encrypt with PQC-capable tooling as OpenPGP PQC profiles mature.",
103
+ },
80
104
  },
81
105
  {
82
106
  re: /-----BEGIN (?:ENCRYPTED )?PRIVATE KEY-----/g,
83
- ruleId: "pem-pkcs8-private-key",
84
- title: "Private key (PKCS#8 PEM)",
85
- category: "certificate",
86
- severity: "critical",
87
- algorithm: "unknown",
88
- hndl: true,
89
- cwe: CWE_HARDCODED_KEY,
90
- sensitive: true,
91
- message: "Embedded PKCS#8 private key; likely classical RSA/EC, not quantum-safe.",
92
- remediation: "Migrate to PQC keys and remove embedded private keys from source.",
107
+ meta: {
108
+ id: "pem-pkcs8-private-key",
109
+ title: "Private key (PKCS#8 PEM)",
110
+ description: "PKCS#8 private key block",
111
+ category: "certificate",
112
+ severity: "critical",
113
+ confidence: "high",
114
+ algorithm: "unknown",
115
+ hndl: true,
116
+ cwe: CWE_HARDCODED_KEY,
117
+ sensitive: true,
118
+ message: "Embedded PKCS#8 private key; likely classical RSA/EC, not quantum-safe.",
119
+ remediation: "Migrate to PQC keys and remove embedded private keys from source.",
120
+ },
93
121
  },
94
122
  {
95
123
  re: /-----BEGIN CERTIFICATE-----/g,
96
- ruleId: "pem-certificate",
97
- title: "X.509 certificate (PEM)",
98
- category: "certificate",
99
- severity: "low",
100
- algorithm: "unknown",
101
- hndl: false,
102
- cwe: CWE_BROKEN_CRYPTO,
103
- message: "Embedded X.509 certificate; almost certainly signed with classical RSA/ECDSA.",
104
- remediation: "Plan re-issuance with PQC-capable CAs as ML-DSA certificate profiles mature.",
124
+ meta: {
125
+ id: "pem-certificate",
126
+ title: "X.509 certificate (PEM)",
127
+ description: "X.509 certificate block",
128
+ category: "certificate",
129
+ severity: "low",
130
+ confidence: "high",
131
+ algorithm: "unknown",
132
+ hndl: false,
133
+ cwe: CWE_BROKEN_CRYPTO,
134
+ message: "Embedded X.509 certificate; almost certainly signed with classical RSA/ECDSA.",
135
+ remediation: "Plan re-issuance with PQC-capable CAs as ML-DSA certificate profiles mature.",
136
+ },
105
137
  },
106
138
  ];
107
139
  /** Detects PEM key/certificate material in arbitrary files. */
@@ -110,6 +142,7 @@ export const pemDetector = {
110
142
  description: "PEM-encoded private keys and X.509 certificates in any file",
111
143
  scope: "config",
112
144
  language: "any",
145
+ rules: PEM_RULES.map((r) => r.meta),
113
146
  // Applies to every text file; the walker already filters out binaries.
114
147
  appliesTo: () => true,
115
148
  detect({ file, content }) {
@@ -119,18 +152,7 @@ export const pemDetector = {
119
152
  const findings = [];
120
153
  for (const rule of PEM_RULES) {
121
154
  eachMatch(rule.re, content, (m) => {
122
- findings.push(makeFinding({
123
- ruleId: rule.ruleId,
124
- title: rule.title,
125
- category: rule.category,
126
- severity: rule.severity,
127
- confidence: "high",
128
- algorithm: rule.algorithm,
129
- hndl: rule.hndl,
130
- cwe: rule.cwe,
131
- sensitive: rule.sensitive,
132
- message: rule.message,
133
- remediation: rule.remediation,
155
+ findings.push(findingFromRule(rule.meta, {
134
156
  file,
135
157
  content,
136
158
  index: m.index,