postquant 0.1.1 → 0.2.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 (75) hide show
  1. package/README.md +67 -12
  2. package/dist/commands/analyze.d.ts +9 -0
  3. package/dist/commands/analyze.d.ts.map +1 -0
  4. package/dist/commands/analyze.js +119 -0
  5. package/dist/commands/analyze.js.map +1 -0
  6. package/dist/commands/scan.d.ts.map +1 -1
  7. package/dist/commands/scan.js +1 -1
  8. package/dist/commands/scan.js.map +1 -1
  9. package/dist/index.js +45 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/output/cbom.d.ts +3 -0
  12. package/dist/output/cbom.d.ts.map +1 -0
  13. package/dist/output/cbom.js +235 -0
  14. package/dist/output/cbom.js.map +1 -0
  15. package/dist/output/json-code.d.ts +3 -0
  16. package/dist/output/json-code.d.ts.map +1 -0
  17. package/dist/output/json-code.js +29 -0
  18. package/dist/output/json-code.js.map +1 -0
  19. package/dist/output/json.d.ts.map +1 -1
  20. package/dist/output/json.js +2 -0
  21. package/dist/output/json.js.map +1 -1
  22. package/dist/output/sarif.d.ts +3 -0
  23. package/dist/output/sarif.d.ts.map +1 -0
  24. package/dist/output/sarif.js +240 -0
  25. package/dist/output/sarif.js.map +1 -0
  26. package/dist/output/terminal-code.d.ts +7 -0
  27. package/dist/output/terminal-code.d.ts.map +1 -0
  28. package/dist/output/terminal-code.js +95 -0
  29. package/dist/output/terminal-code.js.map +1 -0
  30. package/dist/output/terminal.d.ts.map +1 -1
  31. package/dist/output/terminal.js +20 -14
  32. package/dist/output/terminal.js.map +1 -1
  33. package/dist/scanner/code/classifier.d.ts +9 -0
  34. package/dist/scanner/code/classifier.d.ts.map +1 -0
  35. package/dist/scanner/code/classifier.js +19 -0
  36. package/dist/scanner/code/classifier.js.map +1 -0
  37. package/dist/scanner/code/discovery.d.ts +17 -0
  38. package/dist/scanner/code/discovery.d.ts.map +1 -0
  39. package/dist/scanner/code/discovery.js +167 -0
  40. package/dist/scanner/code/discovery.js.map +1 -0
  41. package/dist/scanner/code/grader.d.ts +27 -0
  42. package/dist/scanner/code/grader.d.ts.map +1 -0
  43. package/dist/scanner/code/grader.js +115 -0
  44. package/dist/scanner/code/grader.js.map +1 -0
  45. package/dist/scanner/code/matcher.d.ts +11 -0
  46. package/dist/scanner/code/matcher.d.ts.map +1 -0
  47. package/dist/scanner/code/matcher.js +208 -0
  48. package/dist/scanner/code/matcher.js.map +1 -0
  49. package/dist/scanner/code/patterns/go.d.ts +3 -0
  50. package/dist/scanner/code/patterns/go.d.ts.map +1 -0
  51. package/dist/scanner/code/patterns/go.js +226 -0
  52. package/dist/scanner/code/patterns/go.js.map +1 -0
  53. package/dist/scanner/code/patterns/index.d.ts +11 -0
  54. package/dist/scanner/code/patterns/index.d.ts.map +1 -0
  55. package/dist/scanner/code/patterns/index.js +20 -0
  56. package/dist/scanner/code/patterns/index.js.map +1 -0
  57. package/dist/scanner/code/patterns/java.d.ts +3 -0
  58. package/dist/scanner/code/patterns/java.d.ts.map +1 -0
  59. package/dist/scanner/code/patterns/java.js +239 -0
  60. package/dist/scanner/code/patterns/java.js.map +1 -0
  61. package/dist/scanner/code/patterns/javascript.d.ts +3 -0
  62. package/dist/scanner/code/patterns/javascript.d.ts.map +1 -0
  63. package/dist/scanner/code/patterns/javascript.js +243 -0
  64. package/dist/scanner/code/patterns/javascript.js.map +1 -0
  65. package/dist/scanner/code/patterns/python.d.ts +3 -0
  66. package/dist/scanner/code/patterns/python.d.ts.map +1 -0
  67. package/dist/scanner/code/patterns/python.js +255 -0
  68. package/dist/scanner/code/patterns/python.js.map +1 -0
  69. package/dist/scanner/grader.d.ts +2 -2
  70. package/dist/scanner/grader.d.ts.map +1 -1
  71. package/dist/scanner/grader.js +23 -10
  72. package/dist/scanner/grader.js.map +1 -1
  73. package/dist/types/index.d.ts +124 -2
  74. package/dist/types/index.d.ts.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,243 @@
1
+ export const javascriptPatterns = [
2
+ {
3
+ id: 'js-rsa-keygen',
4
+ language: 'javascript',
5
+ category: 'asymmetric-encryption',
6
+ algorithm: 'RSA',
7
+ risk: 'critical',
8
+ confidence: 'high',
9
+ importPatterns: [
10
+ /import\s+\{[^}]*generateKeyPair(?:Sync)?\s*[^}]*\}\s+from\s+['"](?:node:)?crypto['"]/,
11
+ /(?:const|let|var)\s+\{[^}]*generateKeyPair(?:Sync)?\s*[^}]*\}\s*=\s*require\s*\(\s*['"]crypto['"]\s*\)/,
12
+ ],
13
+ callPatterns: [
14
+ /generateKeyPairSync\s*\(\s*['"]rsa['"]/,
15
+ /generateKeyPairSync\s*\(\s*['"]rsa-pss['"]/,
16
+ /generateKeyPair\s*\(\s*['"]rsa['"]/,
17
+ ],
18
+ keySizeExtractor: /modulusLength\s*:\s*(\d+)/,
19
+ description: "RSA key generation is vulnerable to quantum attacks via Shor's algorithm",
20
+ migration: 'Migrate to ML-KEM (FIPS 203) for encryption or ML-DSA (FIPS 204) for signatures',
21
+ nistRef: 'FIPS 203/204',
22
+ cweId: 'CWE-327',
23
+ },
24
+ {
25
+ id: 'js-ec-keygen',
26
+ language: 'javascript',
27
+ category: 'asymmetric-encryption',
28
+ algorithm: 'ECDSA',
29
+ risk: 'critical',
30
+ confidence: 'high',
31
+ callPatterns: [
32
+ /generateKeyPairSync\s*\(\s*['"]ec['"]/,
33
+ /generateKeyPair\s*\(\s*['"]ec['"]/,
34
+ ],
35
+ contextPatterns: [/namedCurve\s*:\s*['"](?:P-256|P-384|P-521|secp256k1)['"]/],
36
+ description: "EC key generation is vulnerable to quantum attacks via Shor's algorithm",
37
+ migration: 'Migrate to ML-DSA (FIPS 204) for signatures or ML-KEM (FIPS 203) for key exchange',
38
+ nistRef: 'FIPS 203/204',
39
+ cweId: 'CWE-327',
40
+ },
41
+ {
42
+ id: 'js-ed25519-keygen',
43
+ language: 'javascript',
44
+ category: 'digital-signature',
45
+ algorithm: 'Ed25519',
46
+ risk: 'critical',
47
+ confidence: 'high',
48
+ callPatterns: [
49
+ /generateKeyPairSync\s*\(\s*['"]ed25519['"]\s*\)/,
50
+ /generateKeyPairSync\s*\(\s*['"]ed448['"]\s*\)/,
51
+ /generateKeyPairSync\s*\(\s*['"]x25519['"]\s*\)/,
52
+ /generateKeyPairSync\s*\(\s*['"]x448['"]\s*\)/,
53
+ ],
54
+ description: "Ed25519/X25519 key generation is vulnerable to quantum attacks via Shor's algorithm",
55
+ migration: 'Migrate to ML-DSA (FIPS 204) for signatures or ML-KEM (FIPS 203) for key exchange',
56
+ nistRef: 'FIPS 203/204',
57
+ cweId: 'CWE-327',
58
+ },
59
+ {
60
+ id: 'js-dsa-keygen',
61
+ language: 'javascript',
62
+ category: 'digital-signature',
63
+ algorithm: 'DSA',
64
+ risk: 'critical',
65
+ confidence: 'high',
66
+ callPatterns: [
67
+ /generateKeyPairSync\s*\(\s*['"]dsa['"]/,
68
+ /generateKeyPair\s*\(\s*['"]dsa['"]/,
69
+ ],
70
+ description: "DSA key generation is vulnerable to quantum attacks via Shor's algorithm",
71
+ migration: 'Migrate to ML-DSA (FIPS 204) for digital signatures',
72
+ nistRef: 'FIPS 204',
73
+ cweId: 'CWE-327',
74
+ },
75
+ {
76
+ id: 'js-dh-exchange',
77
+ language: 'javascript',
78
+ category: 'key-exchange',
79
+ algorithm: 'DH',
80
+ risk: 'critical',
81
+ confidence: 'high',
82
+ importPatterns: [
83
+ /import\s+\{[^}]*createDiffieHellman[^}]*\}\s+from\s+['"](?:node:)?crypto['"]/,
84
+ /(?:const|let|var)\s+\{[^}]*createDiffieHellman[^}]*\}\s*=\s*require\s*\(\s*['"]crypto['"]\s*\)/,
85
+ ],
86
+ callPatterns: [/createDiffieHellman\s*\(/],
87
+ description: "Diffie-Hellman key exchange is vulnerable to quantum attacks via Shor's algorithm",
88
+ migration: 'Migrate to ML-KEM (FIPS 203) for key encapsulation',
89
+ nistRef: 'FIPS 203',
90
+ cweId: 'CWE-327',
91
+ },
92
+ {
93
+ id: 'js-ecdh-exchange',
94
+ language: 'javascript',
95
+ category: 'key-exchange',
96
+ algorithm: 'ECDH',
97
+ risk: 'critical',
98
+ confidence: 'high',
99
+ callPatterns: [/createECDH\s*\(/],
100
+ description: "ECDH key exchange is vulnerable to quantum attacks via Shor's algorithm",
101
+ migration: 'Migrate to ML-KEM (FIPS 203) for key encapsulation',
102
+ nistRef: 'FIPS 203',
103
+ cweId: 'CWE-327',
104
+ },
105
+ {
106
+ id: 'js-md5-hash',
107
+ language: 'javascript',
108
+ category: 'weak-hash',
109
+ algorithm: 'MD5',
110
+ risk: 'critical',
111
+ confidence: 'high',
112
+ callPatterns: [
113
+ /createHash\s*\(\s*['"]md5['"]\s*\)/,
114
+ /crypto\.subtle\.digest\s*\(\s*['"]MD5['"]/,
115
+ ],
116
+ description: 'MD5 is cryptographically broken and unsuitable for any security use',
117
+ migration: 'Migrate to SHA-256 or SHA-3 for hashing',
118
+ cweId: 'CWE-328',
119
+ },
120
+ {
121
+ id: 'js-sha1-hash',
122
+ language: 'javascript',
123
+ category: 'weak-hash',
124
+ algorithm: 'SHA-1',
125
+ risk: 'critical',
126
+ confidence: 'high',
127
+ callPatterns: [
128
+ /createHash\s*\(\s*['"]sha1['"]\s*\)/,
129
+ /crypto\.subtle\.digest\s*\(\s*['"]SHA-1['"]/,
130
+ ],
131
+ description: 'SHA-1 is cryptographically broken with practical collision attacks',
132
+ migration: 'Migrate to SHA-256 or SHA-3 for hashing',
133
+ cweId: 'CWE-328',
134
+ },
135
+ {
136
+ id: 'js-sha256-hash',
137
+ language: 'javascript',
138
+ category: 'safe-hash',
139
+ algorithm: 'SHA-256',
140
+ risk: 'safe',
141
+ confidence: 'high',
142
+ callPatterns: [
143
+ /createHash\s*\(\s*['"]sha256['"]\s*\)/,
144
+ /createHash\s*\(\s*['"]sha384['"]\s*\)/,
145
+ /createHash\s*\(\s*['"]sha512['"]\s*\)/,
146
+ /crypto\.subtle\.digest\s*\(\s*['"]SHA-256['"]/,
147
+ /crypto\.subtle\.digest\s*\(\s*['"]SHA-384['"]/,
148
+ /crypto\.subtle\.digest\s*\(\s*['"]SHA-512['"]/,
149
+ ],
150
+ description: 'SHA-256/384/512 are quantum-resistant hash functions',
151
+ migration: 'No migration needed — already quantum-safe',
152
+ },
153
+ {
154
+ id: 'js-aes',
155
+ language: 'javascript',
156
+ category: 'weak-symmetric',
157
+ algorithm: 'AES',
158
+ risk: 'moderate',
159
+ confidence: 'medium',
160
+ callPatterns: [
161
+ /createCipheriv\s*\(\s*['"]aes-\d+-/,
162
+ /createDecipheriv\s*\(\s*['"]aes-\d+-/,
163
+ ],
164
+ keySizeExtractor: /aes-(\d+)/,
165
+ keySizeRisk: (size) => (size >= 256 ? 'safe' : 'moderate'),
166
+ description: "AES-128 provides reduced security against quantum attacks (Grover's algorithm)",
167
+ migration: 'Use AES-256 for quantum-resistant symmetric encryption',
168
+ },
169
+ {
170
+ id: 'js-3des',
171
+ language: 'javascript',
172
+ category: 'broken-cipher',
173
+ algorithm: '3DES',
174
+ risk: 'critical',
175
+ confidence: 'high',
176
+ callPatterns: [
177
+ /createCipheriv\s*\(\s*['"]des-ede3-/,
178
+ /createDecipheriv\s*\(\s*['"]des-ede3-/,
179
+ ],
180
+ description: '3DES is deprecated with inadequate security margins',
181
+ migration: 'Migrate to AES-256-GCM for symmetric encryption',
182
+ cweId: 'CWE-327',
183
+ },
184
+ {
185
+ id: 'js-webcrypto-rsa',
186
+ language: 'javascript',
187
+ category: 'asymmetric-encryption',
188
+ algorithm: 'RSA',
189
+ risk: 'critical',
190
+ confidence: 'high',
191
+ callPatterns: [
192
+ /subtle\.generateKey\s*\(\s*\{[^}]*name\s*:\s*['"]RSA-OAEP['"]/,
193
+ /subtle\.generateKey\s*\(\s*\{[^}]*name\s*:\s*['"]RSA-PSS['"]/,
194
+ /subtle\.generateKey\s*\(\s*\{[^}]*name\s*:\s*['"]RSASSA-PKCS1-v1_5['"]/,
195
+ /subtle\.importKey\s*\([^)]*['"]RSA-OAEP['"]/,
196
+ ],
197
+ description: "WebCrypto RSA operations are vulnerable to quantum attacks via Shor's algorithm",
198
+ migration: 'Migrate to ML-KEM (FIPS 203) or ML-DSA (FIPS 204) when WebCrypto supports PQC',
199
+ nistRef: 'FIPS 203/204',
200
+ cweId: 'CWE-327',
201
+ },
202
+ {
203
+ id: 'js-webcrypto-ec',
204
+ language: 'javascript',
205
+ category: 'asymmetric-encryption',
206
+ algorithm: 'ECDSA',
207
+ risk: 'critical',
208
+ confidence: 'high',
209
+ callPatterns: [
210
+ /subtle\.generateKey\s*\(\s*\{[^}]*name\s*:\s*['"]ECDSA['"]/,
211
+ /subtle\.generateKey\s*\(\s*\{[^}]*name\s*:\s*['"]ECDH['"]/,
212
+ /subtle\.sign\s*\(\s*\{[^}]*name\s*:\s*['"]ECDSA['"]/,
213
+ ],
214
+ description: "WebCrypto EC operations are vulnerable to quantum attacks via Shor's algorithm",
215
+ migration: 'Migrate to ML-DSA (FIPS 204) for signatures or ML-KEM (FIPS 203) for key exchange',
216
+ nistRef: 'FIPS 203/204',
217
+ cweId: 'CWE-327',
218
+ },
219
+ {
220
+ id: 'js-jwt-sign',
221
+ language: 'javascript',
222
+ category: 'digital-signature',
223
+ algorithm: 'RSA/ECDSA',
224
+ risk: 'critical',
225
+ confidence: 'high',
226
+ importPatterns: [
227
+ /import\s+.*from\s+['"]jsonwebtoken['"]/,
228
+ /import\s+\{[^}]*SignJWT[^}]*\}\s+from\s+['"]jose['"]/,
229
+ /require\s*\(\s*['"]jsonwebtoken['"]\s*\)/,
230
+ ],
231
+ callPatterns: [
232
+ /jwt\.sign\s*\([^)]*algorithm\s*:\s*['"](?:RS|ES|PS)\d{3}['"]/,
233
+ /jwt\.sign\s*\([^)]*algorithm\s*:\s*['"]EdDSA['"]/,
234
+ /SignJWT\s*\([^)]*\).*setProtectedHeader\s*\(\s*\{[^}]*alg\s*:\s*['"](?:RS|ES|PS)\d{3}['"]/,
235
+ /SignJWT\s*\([^)]*\).*setProtectedHeader\s*\(\s*\{[^}]*alg\s*:\s*['"]EdDSA['"]/,
236
+ /generateKeyPair\s*\(\s*['"](?:RS|ES)\d{3}['"]\s*\)/,
237
+ ],
238
+ description: 'JWT signing with RSA/ECDSA/EdDSA uses quantum-vulnerable algorithms',
239
+ migration: 'Use HMAC-based JWT (HS256) for symmetric signing, or await PQC JWT standards',
240
+ cweId: 'CWE-327',
241
+ },
242
+ ];
243
+ //# sourceMappingURL=javascript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../../src/scanner/code/patterns/javascript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CryptoPattern } from '../../../types/index.js';
2
+ export declare const pythonPatterns: CryptoPattern[];
3
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../../src/scanner/code/patterns/python.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,yBAAyB,CAAC;AAExE,eAAO,MAAM,cAAc,EAAE,aAAa,EA6PzC,CAAC"}
@@ -0,0 +1,255 @@
1
+ export const pythonPatterns = [
2
+ {
3
+ id: 'python-rsa-keygen',
4
+ language: 'python',
5
+ category: 'asymmetric-encryption',
6
+ algorithm: 'RSA',
7
+ risk: 'critical',
8
+ confidence: 'high',
9
+ importPatterns: [
10
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+rsa/,
11
+ /from\s+Crypto\.PublicKey\s+import\s+RSA/,
12
+ ],
13
+ callPatterns: [
14
+ /rsa\.generate_private_key\s*\(/,
15
+ /RSA\.generate\s*\(/,
16
+ ],
17
+ keySizeExtractor: /key_size\s*=\s*(\d+)|RSA\.generate\s*\(\s*(\d+)/,
18
+ description: "RSA key generation is vulnerable to quantum attacks via Shor's algorithm",
19
+ migration: 'Migrate to ML-KEM (FIPS 203) for encryption or ML-DSA (FIPS 204) for signatures',
20
+ nistRef: 'FIPS 203/204',
21
+ cweId: 'CWE-327',
22
+ },
23
+ {
24
+ id: 'python-rsa-sign',
25
+ language: 'python',
26
+ category: 'digital-signature',
27
+ algorithm: 'RSA',
28
+ risk: 'critical',
29
+ confidence: 'high',
30
+ importPatterns: [
31
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+padding/,
32
+ /from\s+Crypto\.Signature\s+import/,
33
+ ],
34
+ callPatterns: [
35
+ /\.sign\s*\(.*padding\.(PSS|PKCS1v15)\s*\(/,
36
+ /pkcs1_15\.new\s*\(/,
37
+ /pss\.new\s*\(/,
38
+ ],
39
+ description: "RSA digital signatures are vulnerable to quantum attacks via Shor's algorithm",
40
+ migration: 'Migrate to ML-DSA (FIPS 204) for digital signatures',
41
+ nistRef: 'FIPS 204',
42
+ cweId: 'CWE-327',
43
+ },
44
+ {
45
+ id: 'python-ec-keygen',
46
+ language: 'python',
47
+ category: 'asymmetric-encryption',
48
+ algorithm: 'ECDSA',
49
+ risk: 'critical',
50
+ confidence: 'high',
51
+ importPatterns: [
52
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+ec/,
53
+ /from\s+Crypto\.PublicKey\s+import\s+ECC/,
54
+ ],
55
+ callPatterns: [
56
+ /ec\.generate_private_key\s*\(/,
57
+ /ECC\.generate\s*\(/,
58
+ ],
59
+ contextPatterns: [/SECP256R1|SECP384R1|SECP521R1|P-256|P-384|P-521/],
60
+ description: "Elliptic curve key generation is vulnerable to quantum attacks via Shor's algorithm",
61
+ migration: 'Migrate to ML-DSA (FIPS 204) for signatures or ML-KEM (FIPS 203) for key exchange',
62
+ nistRef: 'FIPS 203/204',
63
+ cweId: 'CWE-327',
64
+ },
65
+ {
66
+ id: 'python-ecdsa-sign',
67
+ language: 'python',
68
+ category: 'digital-signature',
69
+ algorithm: 'ECDSA',
70
+ risk: 'critical',
71
+ confidence: 'high',
72
+ callPatterns: [
73
+ /\.sign\s*\(.*ec\.ECDSA\s*\(/,
74
+ /DSS\.new\s*\(/,
75
+ ],
76
+ description: "ECDSA digital signatures are vulnerable to quantum attacks via Shor's algorithm",
77
+ migration: 'Migrate to ML-DSA (FIPS 204) for digital signatures',
78
+ nistRef: 'FIPS 204',
79
+ cweId: 'CWE-327',
80
+ },
81
+ {
82
+ id: 'python-ecdh-exchange',
83
+ language: 'python',
84
+ category: 'key-exchange',
85
+ algorithm: 'ECDH',
86
+ risk: 'critical',
87
+ confidence: 'high',
88
+ callPatterns: [/\.exchange\s*\(\s*ec\.ECDH\s*\(\)/],
89
+ description: "ECDH key exchange is vulnerable to quantum attacks via Shor's algorithm",
90
+ migration: 'Migrate to ML-KEM (FIPS 203) for key encapsulation',
91
+ nistRef: 'FIPS 203',
92
+ cweId: 'CWE-327',
93
+ },
94
+ {
95
+ id: 'python-x25519',
96
+ language: 'python',
97
+ category: 'key-exchange',
98
+ algorithm: 'X25519',
99
+ risk: 'critical',
100
+ confidence: 'high',
101
+ importPatterns: [
102
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\.x25519\s+import/,
103
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\.x448\s+import/,
104
+ ],
105
+ callPatterns: [
106
+ /X25519PrivateKey\.generate\s*\(/,
107
+ /X448PrivateKey\.generate\s*\(/,
108
+ ],
109
+ description: "X25519/X448 key exchange is vulnerable to quantum attacks via Shor's algorithm",
110
+ migration: 'Migrate to ML-KEM (FIPS 203) for key encapsulation',
111
+ nistRef: 'FIPS 203',
112
+ cweId: 'CWE-327',
113
+ },
114
+ {
115
+ id: 'python-ed25519',
116
+ language: 'python',
117
+ category: 'digital-signature',
118
+ algorithm: 'Ed25519',
119
+ risk: 'critical',
120
+ confidence: 'high',
121
+ importPatterns: [
122
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\.ed25519\s+import/,
123
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\.ed448\s+import/,
124
+ ],
125
+ callPatterns: [
126
+ /Ed25519PrivateKey\.generate\s*\(/,
127
+ /Ed448PrivateKey\.generate\s*\(/,
128
+ ],
129
+ description: "Ed25519/Ed448 signatures are vulnerable to quantum attacks via Shor's algorithm",
130
+ migration: 'Migrate to ML-DSA (FIPS 204) for digital signatures',
131
+ nistRef: 'FIPS 204',
132
+ cweId: 'CWE-327',
133
+ },
134
+ {
135
+ id: 'python-dsa-keygen',
136
+ language: 'python',
137
+ category: 'digital-signature',
138
+ algorithm: 'DSA',
139
+ risk: 'critical',
140
+ confidence: 'high',
141
+ importPatterns: [
142
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+dsa/,
143
+ /from\s+Crypto\.PublicKey\s+import\s+DSA/,
144
+ ],
145
+ callPatterns: [
146
+ /dsa\.generate_private_key\s*\(/,
147
+ /DSA\.generate\s*\(/,
148
+ ],
149
+ description: "DSA key generation is vulnerable to quantum attacks via Shor's algorithm",
150
+ migration: 'Migrate to ML-DSA (FIPS 204) for digital signatures',
151
+ nistRef: 'FIPS 204',
152
+ cweId: 'CWE-327',
153
+ },
154
+ {
155
+ id: 'python-dh-keygen',
156
+ language: 'python',
157
+ category: 'key-exchange',
158
+ algorithm: 'DH',
159
+ risk: 'critical',
160
+ confidence: 'high',
161
+ importPatterns: [
162
+ /from\s+cryptography\.hazmat\.primitives\.asymmetric\s+import\s+dh/,
163
+ ],
164
+ callPatterns: [/dh\.generate_parameters\s*\(/],
165
+ description: "Diffie-Hellman key exchange is vulnerable to quantum attacks via Shor's algorithm",
166
+ migration: 'Migrate to ML-KEM (FIPS 203) for key encapsulation',
167
+ nistRef: 'FIPS 203',
168
+ cweId: 'CWE-327',
169
+ },
170
+ {
171
+ id: 'python-md5',
172
+ language: 'python',
173
+ category: 'weak-hash',
174
+ algorithm: 'MD5',
175
+ risk: 'critical',
176
+ confidence: 'high',
177
+ importPatterns: [
178
+ /import\s+hashlib/,
179
+ /from\s+Crypto\.Hash\s+import\s+MD5/,
180
+ ],
181
+ callPatterns: [
182
+ /hashlib\.md5\s*\(/,
183
+ /hashlib\.new\s*\(\s*['"]md5['"]/,
184
+ /hashes\.MD5\s*\(/,
185
+ /MD5\.new\s*\(/,
186
+ ],
187
+ description: 'MD5 is cryptographically broken and unsuitable for any security use',
188
+ migration: 'Migrate to SHA-256 or SHA-3 for hashing',
189
+ cweId: 'CWE-328',
190
+ },
191
+ {
192
+ id: 'python-sha1',
193
+ language: 'python',
194
+ category: 'weak-hash',
195
+ algorithm: 'SHA-1',
196
+ risk: 'critical',
197
+ confidence: 'high',
198
+ importPatterns: [
199
+ /import\s+hashlib/,
200
+ /from\s+Crypto\.Hash\s+import\s+SHA1/,
201
+ ],
202
+ callPatterns: [
203
+ /hashlib\.sha1\s*\(/,
204
+ /hashlib\.new\s*\(\s*['"]sha1['"]/,
205
+ /hashes\.SHA1\s*\(/,
206
+ /SHA1\.new\s*\(/,
207
+ ],
208
+ description: 'SHA-1 is cryptographically broken with practical collision attacks',
209
+ migration: 'Migrate to SHA-256 or SHA-3 for hashing',
210
+ cweId: 'CWE-328',
211
+ },
212
+ {
213
+ id: 'python-sha256',
214
+ language: 'python',
215
+ category: 'safe-hash',
216
+ algorithm: 'SHA-256',
217
+ risk: 'safe',
218
+ confidence: 'high',
219
+ callPatterns: [
220
+ /hashlib\.sha256\s*\(/,
221
+ /hashlib\.sha384\s*\(/,
222
+ /hashlib\.sha512\s*\(/,
223
+ /hashlib\.sha3_256\s*\(/,
224
+ /hashlib\.sha3_384\s*\(/,
225
+ /hashlib\.sha3_512\s*\(/,
226
+ /hashes\.SHA256\s*\(/,
227
+ /hashes\.SHA384\s*\(/,
228
+ /hashes\.SHA512\s*\(/,
229
+ /hashes\.SHA3_256\s*\(/,
230
+ ],
231
+ description: 'SHA-256/384/512/SHA-3 are quantum-resistant hash functions',
232
+ migration: 'No migration needed — already quantum-safe',
233
+ },
234
+ {
235
+ id: 'python-aes',
236
+ language: 'python',
237
+ category: 'weak-symmetric',
238
+ algorithm: 'AES',
239
+ risk: 'moderate',
240
+ confidence: 'medium',
241
+ importPatterns: [
242
+ /from\s+cryptography\.hazmat\.primitives\.ciphers\s+import/,
243
+ /from\s+Crypto\.Cipher\s+import\s+AES/,
244
+ ],
245
+ callPatterns: [
246
+ /algorithms\.AES\s*\(/,
247
+ /AES\.new\s*\(/,
248
+ ],
249
+ keySizeExtractor: /AES(\d+)|key_size\s*=\s*(\d+)/,
250
+ keySizeRisk: (size) => (size >= 256 ? 'safe' : 'moderate'),
251
+ description: "AES-128 provides reduced security against quantum attacks (Grover's algorithm)",
252
+ migration: 'Use AES-256 for quantum-resistant symmetric encryption',
253
+ },
254
+ ];
255
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../../src/scanner/code/patterns/python.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C;QACE,EAAE,EAAE,mBAAmB;QACvB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,uBAAuB;QACjC,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,oEAAoE;YACpE,yCAAyC;SAC1C;QACD,YAAY,EAAE;YACZ,gCAAgC;YAChC,oBAAoB;SACrB;QACD,gBAAgB,EAAE,iDAAiD;QACnE,WAAW,EAAE,0EAA0E;QACvF,SAAS,EAAE,iFAAiF;QAC5F,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,mBAAmB;QAC7B,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,wEAAwE;YACxE,mCAAmC;SACpC;QACD,YAAY,EAAE;YACZ,2CAA2C;YAC3C,oBAAoB;YACpB,eAAe;SAChB;QACD,WAAW,EAAE,+EAA+E;QAC5F,SAAS,EAAE,qDAAqD;QAChE,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,uBAAuB;QACjC,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,mEAAmE;YACnE,yCAAyC;SAC1C;QACD,YAAY,EAAE;YACZ,+BAA+B;YAC/B,oBAAoB;SACrB;QACD,eAAe,EAAE,CAAC,iDAAiD,CAAC;QACpE,WAAW,EAAE,qFAAqF;QAClG,SAAS,EAAE,mFAAmF;QAC9F,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,mBAAmB;QAC7B,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE;YACZ,6BAA6B;YAC7B,eAAe;SAChB;QACD,WAAW,EAAE,iFAAiF;QAC9F,SAAS,EAAE,qDAAqD;QAChE,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,sBAAsB;QAC1B,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,cAAc;QACxB,SAAS,EAAE,MAAM;QACjB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,CAAC,mCAAmC,CAAC;QACnD,WAAW,EAAE,yEAAyE;QACtF,SAAS,EAAE,oDAAoD;QAC/D,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,eAAe;QACnB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,cAAc;QACxB,SAAS,EAAE,QAAQ;QACnB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,sEAAsE;YACtE,oEAAoE;SACrE;QACD,YAAY,EAAE;YACZ,iCAAiC;YACjC,+BAA+B;SAChC;QACD,WAAW,EAAE,gFAAgF;QAC7F,SAAS,EAAE,oDAAoD;QAC/D,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,mBAAmB;QAC7B,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,uEAAuE;YACvE,qEAAqE;SACtE;QACD,YAAY,EAAE;YACZ,kCAAkC;YAClC,gCAAgC;SACjC;QACD,WAAW,EAAE,iFAAiF;QAC9F,SAAS,EAAE,qDAAqD;QAChE,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,mBAAmB;QAC7B,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,oEAAoE;YACpE,yCAAyC;SAC1C;QACD,YAAY,EAAE;YACZ,gCAAgC;YAChC,oBAAoB;SACrB;QACD,WAAW,EAAE,0EAA0E;QACvF,SAAS,EAAE,qDAAqD;QAChE,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,cAAc;QACxB,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,mEAAmE;SACpE;QACD,YAAY,EAAE,CAAC,8BAA8B,CAAC;QAC9C,WAAW,EAAE,mFAAmF;QAChG,SAAS,EAAE,oDAAoD;QAC/D,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,YAAY;QAChB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,kBAAkB;YAClB,oCAAoC;SACrC;QACD,YAAY,EAAE;YACZ,mBAAmB;YACnB,iCAAiC;YACjC,kBAAkB;YAClB,eAAe;SAChB;QACD,WAAW,EAAE,qEAAqE;QAClF,SAAS,EAAE,yCAAyC;QACpD,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,aAAa;QACjB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,MAAM;QAClB,cAAc,EAAE;YACd,kBAAkB;YAClB,qCAAqC;SACtC;QACD,YAAY,EAAE;YACZ,oBAAoB;YACpB,kCAAkC;YAClC,mBAAmB;YACnB,gBAAgB;SACjB;QACD,WAAW,EAAE,oEAAoE;QACjF,SAAS,EAAE,yCAAyC;QACpD,KAAK,EAAE,SAAS;KACjB;IACD;QACE,EAAE,EAAE,eAAe;QACnB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE;YACZ,sBAAsB;YACtB,sBAAsB;YACtB,sBAAsB;YACtB,wBAAwB;YACxB,wBAAwB;YACxB,wBAAwB;YACxB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,uBAAuB;SACxB;QACD,WAAW,EAAE,4DAA4D;QACzE,SAAS,EAAE,4CAA4C;KACxD;IACD;QACE,EAAE,EAAE,YAAY;QAChB,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,gBAAgB;QAC1B,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE;YACd,2DAA2D;YAC3D,sCAAsC;SACvC;QACD,YAAY,EAAE;YACZ,sBAAsB;YACtB,eAAe;SAChB;QACD,gBAAgB,EAAE,+BAA+B;QACjD,WAAW,EAAE,CAAC,IAAY,EAAa,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7E,WAAW,EAAE,gFAAgF;QAC7F,SAAS,EAAE,wDAAwD;KACpE;CACF,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ClassifiedResult, GradedResult, Grade } from '../types/index.js';
1
+ import type { ClassifiedResult, GradedResult, BaseGrade } from '../types/index.js';
2
2
  export declare function grade(classified: ClassifiedResult): GradedResult;
3
- export declare function shouldFailForGrade(actual: Grade, threshold: Grade): boolean;
3
+ export declare function shouldFailForGrade(actual: BaseGrade, threshold: BaseGrade): boolean;
4
4
  //# sourceMappingURL=grader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grader.d.ts","sourceRoot":"","sources":["../../src/scanner/grader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACN,MAAM,mBAAmB,CAAC;AAM3B,wBAAgB,KAAK,CAAC,UAAU,EAAE,gBAAgB,GAAG,YAAY,CA4ChE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,OAAO,CAI3E"}
1
+ {"version":3,"file":"grader.d.ts","sourceRoot":"","sources":["../../src/scanner/grader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEZ,SAAS,EAEV,MAAM,mBAAmB,CAAC;AAM3B,wBAAgB,KAAK,CAAC,UAAU,EAAE,gBAAgB,GAAG,YAAY,CA0DhE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAInF"}
@@ -1,5 +1,5 @@
1
1
  const PQC_KEYWORDS = ['KYBER', 'MLKEM', 'ML-KEM', 'ML-DSA', 'SLH-DSA', 'HQC'];
2
- const GRADE_ORDER = ['A+', 'A', 'B', 'C', 'D', 'F'];
2
+ const BASE_GRADE_ORDER = ['A+', 'A', 'B', 'C', 'D', 'F'];
3
3
  export function grade(classified) {
4
4
  const { findings } = classified;
5
5
  const critical = findings.filter((f) => f.risk === 'critical');
@@ -7,30 +7,43 @@ export function grade(classified) {
7
7
  const safe = findings.filter((f) => f.risk === 'safe');
8
8
  const protocolFinding = findings.find((f) => f.component === 'protocol');
9
9
  const hashFinding = findings.find((f) => f.component === 'hash');
10
- let computedGrade;
10
+ let baseGrade;
11
11
  if (protocolFinding?.risk === 'critical' || hashFinding?.risk === 'critical') {
12
- computedGrade = 'F';
12
+ baseGrade = 'F';
13
13
  }
14
14
  else if (critical.length >= 3) {
15
- computedGrade = 'D';
15
+ baseGrade = 'D';
16
16
  }
17
17
  else if (critical.length >= 1) {
18
- computedGrade = 'C';
18
+ baseGrade = 'C';
19
19
  }
20
20
  else if (moderate.length >= 1) {
21
- computedGrade = 'B';
21
+ baseGrade = 'B';
22
22
  }
23
23
  else {
24
24
  const hasPqc = findings.some((f) => PQC_KEYWORDS.some((kw) => f.algorithm.toUpperCase().includes(kw)));
25
- computedGrade = hasPqc ? 'A+' : 'A';
25
+ baseGrade = hasPqc ? 'A+' : 'A';
26
26
  }
27
+ // Compute modifier: A+, A, and F get no modifier
28
+ let modifier = '';
29
+ if (baseGrade !== 'A+' && baseGrade !== 'A' && baseGrade !== 'F') {
30
+ if (moderate.length === 0) {
31
+ modifier = '+';
32
+ }
33
+ else if (moderate.length >= 2) {
34
+ modifier = '-';
35
+ }
36
+ }
37
+ const displayGrade = (baseGrade + modifier);
27
38
  const migrationNotes = findings
28
39
  .filter((f) => f.migration)
29
40
  .map((f) => f.migration);
30
41
  return {
31
42
  host: classified.host,
32
43
  port: classified.port,
33
- grade: computedGrade,
44
+ grade: displayGrade,
45
+ baseGrade,
46
+ modifier,
34
47
  findings,
35
48
  migrationNotes,
36
49
  summary: {
@@ -42,8 +55,8 @@ export function grade(classified) {
42
55
  };
43
56
  }
44
57
  export function shouldFailForGrade(actual, threshold) {
45
- const actualIndex = GRADE_ORDER.indexOf(actual);
46
- const thresholdIndex = GRADE_ORDER.indexOf(threshold);
58
+ const actualIndex = BASE_GRADE_ORDER.indexOf(actual);
59
+ const thresholdIndex = BASE_GRADE_ORDER.indexOf(threshold);
47
60
  return actualIndex >= thresholdIndex;
48
61
  }
49
62
  //# sourceMappingURL=grader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grader.js","sourceRoot":"","sources":["../../src/scanner/grader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grader.js","sourceRoot":"","sources":["../../src/scanner/grader.ts"],"names":[],"mappings":"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"}