@heossi/qnsi 0.5.5 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/crypto-scan.d.ts +13 -0
- package/dist/cli/commands/crypto-scan.d.ts.map +1 -0
- package/dist/cli/commands/crypto-scan.js +247 -0
- package/dist/cli/commands/crypto-scan.js.map +1 -0
- package/dist/cli/config.js +1 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/code-scan/canonical.d.ts +25 -0
- package/dist/code-scan/canonical.d.ts.map +1 -0
- package/dist/code-scan/canonical.js +80 -0
- package/dist/code-scan/canonical.js.map +1 -0
- package/dist/code-scan/index.d.ts +6 -0
- package/dist/code-scan/index.d.ts.map +1 -0
- package/dist/code-scan/index.js +5 -0
- package/dist/code-scan/index.js.map +1 -0
- package/dist/code-scan/rules/artifacts.d.ts +7 -0
- package/dist/code-scan/rules/artifacts.d.ts.map +1 -0
- package/dist/code-scan/rules/artifacts.js +83 -0
- package/dist/code-scan/rules/artifacts.js.map +1 -0
- package/dist/code-scan/rules/c.d.ts +6 -0
- package/dist/code-scan/rules/c.d.ts.map +1 -0
- package/dist/code-scan/rules/c.js +77 -0
- package/dist/code-scan/rules/c.js.map +1 -0
- package/dist/code-scan/rules/csharp.d.ts +6 -0
- package/dist/code-scan/rules/csharp.d.ts.map +1 -0
- package/dist/code-scan/rules/csharp.js +67 -0
- package/dist/code-scan/rules/csharp.js.map +1 -0
- package/dist/code-scan/rules/go.d.ts +8 -0
- package/dist/code-scan/rules/go.d.ts.map +1 -0
- package/dist/code-scan/rules/go.js +93 -0
- package/dist/code-scan/rules/go.js.map +1 -0
- package/dist/code-scan/rules/index.d.ts +8 -0
- package/dist/code-scan/rules/index.d.ts.map +1 -0
- package/dist/code-scan/rules/index.js +24 -0
- package/dist/code-scan/rules/index.js.map +1 -0
- package/dist/code-scan/rules/java.d.ts +8 -0
- package/dist/code-scan/rules/java.d.ts.map +1 -0
- package/dist/code-scan/rules/java.js +160 -0
- package/dist/code-scan/rules/java.js.map +1 -0
- package/dist/code-scan/rules/javascript.d.ts +7 -0
- package/dist/code-scan/rules/javascript.d.ts.map +1 -0
- package/dist/code-scan/rules/javascript.js +179 -0
- package/dist/code-scan/rules/javascript.js.map +1 -0
- package/dist/code-scan/rules/python.d.ts +6 -0
- package/dist/code-scan/rules/python.d.ts.map +1 -0
- package/dist/code-scan/rules/python.js +133 -0
- package/dist/code-scan/rules/python.js.map +1 -0
- package/dist/code-scan/rules/rust.d.ts +8 -0
- package/dist/code-scan/rules/rust.d.ts.map +1 -0
- package/dist/code-scan/rules/rust.js +86 -0
- package/dist/code-scan/rules/rust.js.map +1 -0
- package/dist/code-scan/scanner.d.ts +18 -0
- package/dist/code-scan/scanner.d.ts.map +1 -0
- package/dist/code-scan/scanner.js +254 -0
- package/dist/code-scan/scanner.js.map +1 -0
- package/dist/code-scan/strip.d.ts +25 -0
- package/dist/code-scan/strip.d.ts.map +1 -0
- package/dist/code-scan/strip.js +150 -0
- package/dist/code-scan/strip.js.map +1 -0
- package/dist/code-scan/types.d.ts +76 -0
- package/dist/code-scan/types.d.ts.map +1 -0
- package/dist/code-scan/types.js +9 -0
- package/dist/code-scan/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kms.d.ts +60 -1
- package/dist/kms.d.ts.map +1 -1
- package/dist/kms.js +58 -2
- package/dist/kms.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File walker + rule matcher. Parse-only: files are read as text, comments
|
|
3
|
+
* are stripped, rules are matched line-by-line. Nothing is executed and no
|
|
4
|
+
* network is touched — scanning an untrusted repository is safe by
|
|
5
|
+
* construction.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
9
|
+
import { join, relative, sep } from "node:path";
|
|
10
|
+
import { canonicalRsa, findKeySizeNear } from "./canonical.js";
|
|
11
|
+
import { ALL_RULES } from "./rules/index.js";
|
|
12
|
+
import { stripComments } from "./strip.js";
|
|
13
|
+
const DEFAULT_MAX_FILE_BYTES = 2 * 1024 * 1024;
|
|
14
|
+
const DEFAULT_MAX_FINDINGS = 50_000;
|
|
15
|
+
const BINARY_SNIFF_BYTES = 8 * 1024;
|
|
16
|
+
/** Directories never worth scanning (build output, VCS, dependencies). */
|
|
17
|
+
const SKIP_DIRS = new Set([
|
|
18
|
+
".git",
|
|
19
|
+
".hg",
|
|
20
|
+
".svn",
|
|
21
|
+
"node_modules",
|
|
22
|
+
"vendor",
|
|
23
|
+
"dist",
|
|
24
|
+
"build",
|
|
25
|
+
"out",
|
|
26
|
+
"target",
|
|
27
|
+
"bin",
|
|
28
|
+
"obj",
|
|
29
|
+
".next",
|
|
30
|
+
".turbo",
|
|
31
|
+
"coverage",
|
|
32
|
+
"__pycache__",
|
|
33
|
+
".venv",
|
|
34
|
+
"venv",
|
|
35
|
+
".terraform",
|
|
36
|
+
]);
|
|
37
|
+
const SKIP_FILES = new Set([
|
|
38
|
+
"pnpm-lock.yaml",
|
|
39
|
+
"package-lock.json",
|
|
40
|
+
"yarn.lock",
|
|
41
|
+
"Cargo.lock",
|
|
42
|
+
"go.sum",
|
|
43
|
+
"poetry.lock",
|
|
44
|
+
"uv.lock",
|
|
45
|
+
]);
|
|
46
|
+
const EXTENSION_LANGUAGE = {
|
|
47
|
+
".js": "javascript",
|
|
48
|
+
".mjs": "javascript",
|
|
49
|
+
".cjs": "javascript",
|
|
50
|
+
".jsx": "javascript",
|
|
51
|
+
".ts": "typescript",
|
|
52
|
+
".mts": "typescript",
|
|
53
|
+
".cts": "typescript",
|
|
54
|
+
".tsx": "typescript",
|
|
55
|
+
".py": "python",
|
|
56
|
+
".java": "java",
|
|
57
|
+
".kt": "kotlin",
|
|
58
|
+
".kts": "kotlin",
|
|
59
|
+
".go": "go",
|
|
60
|
+
".c": "c",
|
|
61
|
+
".h": "c",
|
|
62
|
+
".cc": "cpp",
|
|
63
|
+
".cpp": "cpp",
|
|
64
|
+
".cxx": "cpp",
|
|
65
|
+
".hpp": "cpp",
|
|
66
|
+
".hh": "cpp",
|
|
67
|
+
".cs": "csharp",
|
|
68
|
+
".rs": "rust",
|
|
69
|
+
".yaml": "config",
|
|
70
|
+
".yml": "config",
|
|
71
|
+
".toml": "config",
|
|
72
|
+
".json": "config",
|
|
73
|
+
".conf": "config",
|
|
74
|
+
".cfg": "config",
|
|
75
|
+
".ini": "config",
|
|
76
|
+
".properties": "config",
|
|
77
|
+
".pem": "config",
|
|
78
|
+
".crt": "config",
|
|
79
|
+
".cer": "config",
|
|
80
|
+
".pub": "config",
|
|
81
|
+
};
|
|
82
|
+
const TEST_PATH_SEGMENTS = ["test", "tests", "__tests__", "spec", "specs", "testdata", "fixtures"];
|
|
83
|
+
const TEST_FILE_PATTERN = /(\.test\.|\.spec\.|_test\.(?:go|py|rb)$|Tests?\.(?:java|kt|cs)$)/;
|
|
84
|
+
export function detectLanguage(fileName) {
|
|
85
|
+
const lower = fileName.toLowerCase();
|
|
86
|
+
if (lower.endsWith(".min.js") || lower.endsWith(".min.mjs")) {
|
|
87
|
+
return null; // minified bundles: line-based findings are meaningless
|
|
88
|
+
}
|
|
89
|
+
const dot = lower.lastIndexOf(".");
|
|
90
|
+
if (dot === -1) {
|
|
91
|
+
return fileName === "Dockerfile" ? "config" : null;
|
|
92
|
+
}
|
|
93
|
+
return EXTENSION_LANGUAGE[lower.slice(dot)] ?? null;
|
|
94
|
+
}
|
|
95
|
+
export function isTestPath(relativePath) {
|
|
96
|
+
const posixPath = relativePath.split(sep).join("/");
|
|
97
|
+
const segments = posixPath.toLowerCase().split("/");
|
|
98
|
+
if (segments.some((segment) => TEST_PATH_SEGMENTS.includes(segment))) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
const base = segments[segments.length - 1] ?? "";
|
|
102
|
+
return TEST_FILE_PATTERN.test(base);
|
|
103
|
+
}
|
|
104
|
+
function looksBinary(buffer) {
|
|
105
|
+
const limit = Math.min(buffer.length, BINARY_SNIFF_BYTES);
|
|
106
|
+
for (let i = 0; i < limit; i++) {
|
|
107
|
+
if (buffer[i] === 0) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
export function hashLine(line) {
|
|
114
|
+
const normalized = line.trim().replace(/\s+/g, " ");
|
|
115
|
+
return createHash("sha256").update(normalized).digest("hex");
|
|
116
|
+
}
|
|
117
|
+
function resolveAlgorithm(rule, match, line, strippedLines, lineIndex) {
|
|
118
|
+
const base = typeof rule.algorithm === "function" ? rule.algorithm(match, line) : rule.algorithm;
|
|
119
|
+
if (base === null || base.length === 0) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (!rule.wantsKeySize) {
|
|
123
|
+
return { algorithm: base, keySize: null };
|
|
124
|
+
}
|
|
125
|
+
const keySize = findKeySizeNear(strippedLines, lineIndex);
|
|
126
|
+
if (base.startsWith("rsa")) {
|
|
127
|
+
return { algorithm: canonicalRsa(keySize), keySize };
|
|
128
|
+
}
|
|
129
|
+
if (base.startsWith("dsa") && keySize === 1024) {
|
|
130
|
+
return { algorithm: "dsa-1024", keySize };
|
|
131
|
+
}
|
|
132
|
+
return { algorithm: base, keySize };
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Scan a single file's content. Exported for tests, the CLI's single-file
|
|
136
|
+
* mode, and future host integrations (qnsp-agent).
|
|
137
|
+
*/
|
|
138
|
+
export function scanFileContent(relativePath, content, language) {
|
|
139
|
+
const rules = ALL_RULES.filter((rule) => rule.languages.includes(language));
|
|
140
|
+
if (rules.length === 0) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
const strippedLines = stripComments(content, language);
|
|
144
|
+
const findings = [];
|
|
145
|
+
const testContext = isTestPath(relativePath);
|
|
146
|
+
const seen = new Set();
|
|
147
|
+
for (let i = 0; i < strippedLines.length; i++) {
|
|
148
|
+
const line = strippedLines[i] ?? "";
|
|
149
|
+
if (line.length === 0) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
for (const rule of rules) {
|
|
153
|
+
// Fresh exec per line: rule patterns are not /g, so lastIndex is 0.
|
|
154
|
+
const match = rule.pattern.exec(line);
|
|
155
|
+
if (!match) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const resolved = resolveAlgorithm(rule, match, line, strippedLines, i);
|
|
159
|
+
if (!resolved) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const dedupKey = `${rule.id}:${i}`;
|
|
163
|
+
if (seen.has(dedupKey)) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
seen.add(dedupKey);
|
|
167
|
+
findings.push({
|
|
168
|
+
path: relativePath.split(sep).join("/"),
|
|
169
|
+
line: i + 1,
|
|
170
|
+
language,
|
|
171
|
+
ruleId: rule.id,
|
|
172
|
+
library: rule.library,
|
|
173
|
+
algorithm: resolved.algorithm,
|
|
174
|
+
category: rule.category,
|
|
175
|
+
classification: rule.classification,
|
|
176
|
+
confidence: rule.confidence,
|
|
177
|
+
lineHash: hashLine(line),
|
|
178
|
+
...(resolved.keySize !== null ? { keySize: resolved.keySize } : {}),
|
|
179
|
+
...(testContext ? { testContext: true } : {}),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return findings;
|
|
184
|
+
}
|
|
185
|
+
/** Recursively scan a directory tree. */
|
|
186
|
+
export async function scanDirectory(options) {
|
|
187
|
+
const maxFileBytes = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;
|
|
188
|
+
const maxFindings = options.maxFindings ?? DEFAULT_MAX_FINDINGS;
|
|
189
|
+
const skipDirs = new Set([...SKIP_DIRS, ...(options.excludeDirs ?? [])]);
|
|
190
|
+
const findings = [];
|
|
191
|
+
let filesScanned = 0;
|
|
192
|
+
let filesSkipped = 0;
|
|
193
|
+
let truncated = false;
|
|
194
|
+
async function walk(dir) {
|
|
195
|
+
if (truncated) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
199
|
+
// Deterministic order — identical trees produce identical summaries.
|
|
200
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
201
|
+
for (const entry of entries) {
|
|
202
|
+
if (truncated) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const fullPath = join(dir, entry.name);
|
|
206
|
+
if (entry.isSymbolicLink()) {
|
|
207
|
+
filesSkipped++;
|
|
208
|
+
continue; // never follow symlinks out of the scan root
|
|
209
|
+
}
|
|
210
|
+
if (entry.isDirectory()) {
|
|
211
|
+
if (skipDirs.has(entry.name)) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
await walk(fullPath);
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (!entry.isFile()) {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (SKIP_FILES.has(entry.name)) {
|
|
221
|
+
filesSkipped++;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const language = detectLanguage(entry.name);
|
|
225
|
+
if (!language) {
|
|
226
|
+
filesSkipped++;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const info = await stat(fullPath);
|
|
230
|
+
if (info.size > maxFileBytes) {
|
|
231
|
+
filesSkipped++;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const buffer = await readFile(fullPath);
|
|
235
|
+
if (looksBinary(buffer)) {
|
|
236
|
+
filesSkipped++;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
filesScanned++;
|
|
240
|
+
const relPath = relative(options.rootDir, fullPath);
|
|
241
|
+
const fileFindings = scanFileContent(relPath, buffer.toString("utf8"), language);
|
|
242
|
+
for (const finding of fileFindings) {
|
|
243
|
+
if (findings.length >= maxFindings) {
|
|
244
|
+
truncated = true;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
findings.push(finding);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
await walk(options.rootDir);
|
|
252
|
+
return { filesScanned, filesSkipped, findings, truncated };
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/code-scan/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAS3C,MAAM,sBAAsB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;AAEpC,0EAA0E;AAC1E,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC;IAC9C,MAAM;IACN,KAAK;IACL,MAAM;IACN,cAAc;IACd,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;IACL,QAAQ;IACR,KAAK;IACL,KAAK;IACL,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,OAAO;IACP,MAAM;IACN,YAAY;CACZ,CAAC,CAAC;AAEH,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC;IAC/C,gBAAgB;IAChB,mBAAmB;IACnB,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,aAAa;IACb,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAA6B;IACpD,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,aAAa,EAAE,QAAQ;IACvB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CAChB,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACnG,MAAM,iBAAiB,GAAG,kEAAkE,CAAC;AAE7F,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,CAAC,wDAAwD;IACtE,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,YAAoB;IAC9C,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CACxB,IAAyB,EACzB,KAAsB,EACtB,IAAY,EACZ,aAAgC,EAChC,SAAiB;IAEjB,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;IACjG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC9B,YAAoB,EACpB,OAAe,EACf,QAAkB;IAElB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,SAAS;QACV,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,oEAAoE;YACpE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxB,SAAS;YACV,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACvC,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,QAAQ;gBACR,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC;gBACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAoB;IACvD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,sBAAsB,CAAC;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzE,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,UAAU,IAAI,CAAC,GAAW;QAC9B,IAAI,SAAS,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,qEAAqE;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAErD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,SAAS,EAAE,CAAC;gBACf,OAAO;YACR,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC5B,YAAY,EAAE,CAAC;gBACf,SAAS,CAAC,6CAA6C;YACxD,CAAC;YACD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9B,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrB,SAAS;YACV,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrB,SAAS;YACV,CAAC;YACD,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,YAAY,EAAE,CAAC;gBACf,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;gBACf,SAAS;YACV,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;gBAC9B,YAAY,EAAE,CAAC;gBACf,SAAS;YACV,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,YAAY,EAAE,CAAC;gBACf,SAAS;YACV,CAAC;YAED,YAAY,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;YACjF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACpC,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;oBACpC,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;gBACP,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;IACF,CAAC;IAED,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment stripping — string-aware, per language family.
|
|
3
|
+
*
|
|
4
|
+
* Comments are removed BEFORE rule matching so a migration note that merely
|
|
5
|
+
* mentions a crypto API can never become a finding (the
|
|
6
|
+
* guard-that-reads-its-own-comment failure class, see
|
|
7
|
+
* .claude/rules/toolchain-single-source.md). String literals are KEPT:
|
|
8
|
+
* crypto APIs take algorithm names as string arguments
|
|
9
|
+
* (`Cipher.getInstance("RSA")`), so rules anchor on API context instead.
|
|
10
|
+
*/
|
|
11
|
+
import type { Language } from "./types.js";
|
|
12
|
+
interface StripState {
|
|
13
|
+
/** Inside a C-style block comment. */
|
|
14
|
+
inBlockComment: boolean;
|
|
15
|
+
/** Python triple-quote delimiter currently open, or null. */
|
|
16
|
+
inTripleQuote: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare function createStripState(): StripState;
|
|
19
|
+
/**
|
|
20
|
+
* Strip comments from a full file, returning one entry per original line so
|
|
21
|
+
* finding line numbers stay 1:1 with the source.
|
|
22
|
+
*/
|
|
23
|
+
export declare function stripComments(content: string, language: Language): string[];
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=strip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip.d.ts","sourceRoot":"","sources":["../../src/code-scan/strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkB3C,UAAU,UAAU;IACnB,sCAAsC;IACtC,cAAc,EAAE,OAAO,CAAC;IACxB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C;AA0HD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CAiB3E"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment stripping — string-aware, per language family.
|
|
3
|
+
*
|
|
4
|
+
* Comments are removed BEFORE rule matching so a migration note that merely
|
|
5
|
+
* mentions a crypto API can never become a finding (the
|
|
6
|
+
* guard-that-reads-its-own-comment failure class, see
|
|
7
|
+
* .claude/rules/toolchain-single-source.md). String literals are KEPT:
|
|
8
|
+
* crypto APIs take algorithm names as string arguments
|
|
9
|
+
* (`Cipher.getInstance("RSA")`), so rules anchor on API context instead.
|
|
10
|
+
*/
|
|
11
|
+
const COMMENT_STYLE = {
|
|
12
|
+
javascript: "c",
|
|
13
|
+
typescript: "c",
|
|
14
|
+
java: "c",
|
|
15
|
+
kotlin: "c",
|
|
16
|
+
go: "c",
|
|
17
|
+
c: "c",
|
|
18
|
+
cpp: "c",
|
|
19
|
+
csharp: "c",
|
|
20
|
+
rust: "c",
|
|
21
|
+
python: "hash",
|
|
22
|
+
config: "hash",
|
|
23
|
+
};
|
|
24
|
+
export function createStripState() {
|
|
25
|
+
return { inBlockComment: false, inTripleQuote: null };
|
|
26
|
+
}
|
|
27
|
+
function isEscaped(line, index) {
|
|
28
|
+
let backslashes = 0;
|
|
29
|
+
for (let i = index - 1; i >= 0 && line[i] === "\\"; i--) {
|
|
30
|
+
backslashes++;
|
|
31
|
+
}
|
|
32
|
+
return backslashes % 2 === 1;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Strip C-family comments from one line, tracking block-comment state across
|
|
36
|
+
* lines and skipping comment tokens that appear inside string literals.
|
|
37
|
+
*/
|
|
38
|
+
function stripCFamilyLine(line, state) {
|
|
39
|
+
let out = "";
|
|
40
|
+
let inString = null;
|
|
41
|
+
let i = 0;
|
|
42
|
+
while (i < line.length) {
|
|
43
|
+
const ch = line[i] ?? "";
|
|
44
|
+
const next = line[i + 1] ?? "";
|
|
45
|
+
if (state.inBlockComment) {
|
|
46
|
+
if (ch === "*" && next === "/") {
|
|
47
|
+
state.inBlockComment = false;
|
|
48
|
+
i += 2;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
i++;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (inString !== null) {
|
|
55
|
+
out += ch;
|
|
56
|
+
if (ch === inString && !isEscaped(line, i)) {
|
|
57
|
+
inString = null;
|
|
58
|
+
}
|
|
59
|
+
i++;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (ch === '"' || ch === "'" || ch === "`") {
|
|
63
|
+
inString = ch;
|
|
64
|
+
out += ch;
|
|
65
|
+
i++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (ch === "/" && next === "/") {
|
|
69
|
+
break; // line comment — drop the rest
|
|
70
|
+
}
|
|
71
|
+
if (ch === "/" && next === "*") {
|
|
72
|
+
state.inBlockComment = true;
|
|
73
|
+
i += 2;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
out += ch;
|
|
77
|
+
i++;
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Strip hash-family comments (Python, YAML, TOML, shell-style configs) from
|
|
83
|
+
* one line, tracking Python triple-quoted blocks across lines and skipping
|
|
84
|
+
* `#` characters that appear inside string literals.
|
|
85
|
+
*/
|
|
86
|
+
function stripHashFamilyLine(line, state) {
|
|
87
|
+
let out = "";
|
|
88
|
+
let inString = null;
|
|
89
|
+
let i = 0;
|
|
90
|
+
while (i < line.length) {
|
|
91
|
+
const ch = line[i] ?? "";
|
|
92
|
+
if (state.inTripleQuote !== null) {
|
|
93
|
+
if (line.startsWith(state.inTripleQuote, i)) {
|
|
94
|
+
state.inTripleQuote = null;
|
|
95
|
+
i += 3;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
i++;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (inString !== null) {
|
|
102
|
+
out += ch;
|
|
103
|
+
if (ch === inString && !isEscaped(line, i)) {
|
|
104
|
+
inString = null;
|
|
105
|
+
}
|
|
106
|
+
i++;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (line.startsWith('"""', i) || line.startsWith("'''", i)) {
|
|
110
|
+
state.inTripleQuote = line.slice(i, i + 3);
|
|
111
|
+
i += 3;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (ch === '"' || ch === "'") {
|
|
115
|
+
inString = ch;
|
|
116
|
+
out += ch;
|
|
117
|
+
i++;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (ch === "#") {
|
|
121
|
+
break; // comment — drop the rest
|
|
122
|
+
}
|
|
123
|
+
out += ch;
|
|
124
|
+
i++;
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Strip comments from a full file, returning one entry per original line so
|
|
130
|
+
* finding line numbers stay 1:1 with the source.
|
|
131
|
+
*/
|
|
132
|
+
export function stripComments(content, language) {
|
|
133
|
+
const style = COMMENT_STYLE[language];
|
|
134
|
+
const lines = content.split(/\r?\n/);
|
|
135
|
+
if (style === "none") {
|
|
136
|
+
return lines;
|
|
137
|
+
}
|
|
138
|
+
const state = createStripState();
|
|
139
|
+
const stripped = [];
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
if (style === "c") {
|
|
142
|
+
stripped.push(stripCFamilyLine(line, state));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
stripped.push(stripHashFamilyLine(line, state));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return stripped;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=strip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip.js","sourceRoot":"","sources":["../../src/code-scan/strip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for the source-code cryptography scanner.
|
|
3
|
+
*
|
|
4
|
+
* Design: docs/design/code-crypto-scanner.md. Findings are transport-shaped
|
|
5
|
+
* for the crypto-inventory ingest path: no source-code content beyond the
|
|
6
|
+
* matched rule id and a hash of the matched line ever leaves the scan host.
|
|
7
|
+
*/
|
|
8
|
+
export type Language = "javascript" | "typescript" | "python" | "java" | "kotlin" | "go" | "c" | "cpp" | "csharp" | "rust" | "config";
|
|
9
|
+
export type FindingCategory = "asymmetric" | "symmetric" | "hash" | "protocol" | "artifact";
|
|
10
|
+
/** Whether the detected primitive is quantum-vulnerable, PQC, or a hybrid. */
|
|
11
|
+
export type FindingClassification = "classical" | "pqc" | "hybrid";
|
|
12
|
+
export type Confidence = "high" | "medium";
|
|
13
|
+
export interface CryptoDetectionRule {
|
|
14
|
+
/** Stable rule id, e.g. "js-node-crypto-generate-keypair-rsa". */
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly languages: readonly Language[];
|
|
17
|
+
/**
|
|
18
|
+
* Matched against a single comment-stripped line. Patterns MUST anchor on
|
|
19
|
+
* API/import context (e.g. `Cipher.getInstance("RSA`), never on a bare
|
|
20
|
+
* algorithm word — bare words in prose strings are not usage evidence.
|
|
21
|
+
*/
|
|
22
|
+
readonly pattern: RegExp;
|
|
23
|
+
/**
|
|
24
|
+
* Canonical algorithm id (matching the crypto-inventory assessor keys,
|
|
25
|
+
* e.g. "rsa-2048", "ecdsa-p256", "md5"), or an extractor deriving it from
|
|
26
|
+
* the regex match. Extractors may return null to veto a match.
|
|
27
|
+
*/
|
|
28
|
+
readonly algorithm: string | ((match: RegExpExecArray, line: string) => string | null);
|
|
29
|
+
readonly category: FindingCategory;
|
|
30
|
+
readonly classification: FindingClassification;
|
|
31
|
+
readonly confidence: Confidence;
|
|
32
|
+
/** Library/API family the rule targets, e.g. "node:crypto", "JCA". */
|
|
33
|
+
readonly library: string;
|
|
34
|
+
/**
|
|
35
|
+
* When true and the canonical algorithm is size-parameterized (rsa/dsa),
|
|
36
|
+
* the scanner searches a few adjacent lines for a key-size literal.
|
|
37
|
+
*/
|
|
38
|
+
readonly wantsKeySize?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface CodeCryptoFinding {
|
|
41
|
+
/** Repo-relative POSIX path of the file. */
|
|
42
|
+
readonly path: string;
|
|
43
|
+
/** 1-indexed line of the match. */
|
|
44
|
+
readonly line: number;
|
|
45
|
+
readonly language: Language;
|
|
46
|
+
readonly ruleId: string;
|
|
47
|
+
readonly library: string;
|
|
48
|
+
/** Canonical algorithm id, e.g. "rsa-2048", "rsa-unknown", "ml-kem-768". */
|
|
49
|
+
readonly algorithm: string;
|
|
50
|
+
readonly category: FindingCategory;
|
|
51
|
+
readonly classification: FindingClassification;
|
|
52
|
+
readonly confidence: Confidence;
|
|
53
|
+
/** SHA-256 (hex) of the whitespace-normalized matched line. */
|
|
54
|
+
readonly lineHash: string;
|
|
55
|
+
readonly keySize?: number;
|
|
56
|
+
/** True when the file path looks like test code. */
|
|
57
|
+
readonly testContext?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface ScanOptions {
|
|
60
|
+
/** Absolute directory to scan. */
|
|
61
|
+
readonly rootDir: string;
|
|
62
|
+
/** Additional directory names to skip (merged with built-in skip list). */
|
|
63
|
+
readonly excludeDirs?: readonly string[];
|
|
64
|
+
/** Per-file size cap in bytes (default 2 MiB). */
|
|
65
|
+
readonly maxFileBytes?: number;
|
|
66
|
+
/** Cap on total findings (default 50_000) — the scan stops at the cap. */
|
|
67
|
+
readonly maxFindings?: number;
|
|
68
|
+
}
|
|
69
|
+
export interface ScanSummary {
|
|
70
|
+
readonly filesScanned: number;
|
|
71
|
+
readonly filesSkipped: number;
|
|
72
|
+
readonly findings: readonly CodeCryptoFinding[];
|
|
73
|
+
/** True when maxFindings stopped the scan early (never silently). */
|
|
74
|
+
readonly truncated: boolean;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/code-scan/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,QAAQ,GACjB,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,IAAI,GACJ,GAAG,GACH,KAAK,GACL,QAAQ,GACR,MAAM,GACN,QAAQ,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5F,8EAA8E;AAC9E,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEnE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IACnC,kEAAkE;IAClE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;IACvF,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,kDAAkD;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for the source-code cryptography scanner.
|
|
3
|
+
*
|
|
4
|
+
* Design: docs/design/code-crypto-scanner.md. Findings are transport-shaped
|
|
5
|
+
* for the crypto-inventory ingest path: no source-code content beyond the
|
|
6
|
+
* matched rule id and a hash of the matched line ever leaves the scan host.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/code-scan/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/index.d.ts
CHANGED
|
@@ -55,7 +55,7 @@ QnsiError as QnspError, QnsiNetworkError,
|
|
|
55
55
|
QnsiNetworkError as QnspNetworkError, QnsiWebhookError,
|
|
56
56
|
/** @deprecated Use `QnsiWebhookError`. */
|
|
57
57
|
QnsiWebhookError as QnspWebhookError, } from "./errors.js";
|
|
58
|
-
export { type CreateKeyRequest, KmsClient } from "./kms.js";
|
|
58
|
+
export { type CreateKeyRequest, type HspkSealRequest, type HspkSealResponse, type HspkSignRequest, KmsClient, type SealedPqcKey, } from "./kms.js";
|
|
59
59
|
export { type CreateIndexRequest, type QueryRequest, SearchClient, type Vector, } from "./search.js";
|
|
60
60
|
export { type PutObjectInput, StorageClient } from "./storage.js";
|
|
61
61
|
export { type CreateTenantRequest, TenantClient } from "./tenant.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EACN,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,QAAQ,EACR,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC1B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGtE,OAAO,EACN,UAAU;AACV,oEAAoE;AACpE,UAAU,IAAI,UAAU,EACxB,KAAK,iBAAiB;AACtB,2CAA2C;AAC3C,KAAK,iBAAiB,IAAI,iBAAiB,GAC3C,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACN,YAAY;AACZ,sCAAsC;AACtC,YAAY,IAAI,YAAY,EAC5B,aAAa;AACb,uCAAuC;AACvC,aAAa,IAAI,aAAa,EAC9B,SAAS;AACT,mCAAmC;AACnC,SAAS,IAAI,SAAS,EACtB,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,EACpC,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,GACpC,MAAM,aAAa,CAAC;AACrB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EACN,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,QAAQ,EACR,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,GAC1B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGtE,OAAO,EACN,UAAU;AACV,oEAAoE;AACpE,UAAU,IAAI,UAAU,EACxB,KAAK,iBAAiB;AACtB,2CAA2C;AAC3C,KAAK,iBAAiB,IAAI,iBAAiB,GAC3C,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACN,YAAY;AACZ,sCAAsC;AACtC,YAAY,IAAI,YAAY,EAC5B,aAAa;AACb,uCAAuC;AACvC,aAAa,IAAI,aAAa,EAC9B,SAAS;AACT,mCAAmC;AACnC,SAAS,IAAI,SAAS,EACtB,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,EACpC,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,GACpC,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,SAAS,EACT,KAAK,YAAY,GACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,YAAY,EACZ,KAAK,MAAM,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,KAAK,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EAAE,KAAK,mBAAmB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EACN,mBAAmB,EACnB,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,EACpC,KAAK,gBAAgB;AACrB,0CAA0C;AAC1C,KAAK,gBAAgB,IAAI,gBAAgB,EACzC,0BAA0B;AAC1B,oDAAoD;AACpD,0BAA0B,IAAI,0BAA0B,GACxD,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -55,7 +55,7 @@ QnsiError as QnspError, QnsiNetworkError,
|
|
|
55
55
|
QnsiNetworkError as QnspNetworkError, QnsiWebhookError,
|
|
56
56
|
/** @deprecated Use `QnsiWebhookError`. */
|
|
57
57
|
QnsiWebhookError as QnspWebhookError, } from "./errors.js";
|
|
58
|
-
export { KmsClient } from "./kms.js";
|
|
58
|
+
export { KmsClient, } from "./kms.js";
|
|
59
59
|
export { SearchClient, } from "./search.js";
|
|
60
60
|
export { StorageClient } from "./storage.js";
|
|
61
61
|
export { TenantClient } from "./tenant.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EACN,YAAY,GAIZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,QAAQ,GAKR,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAwB,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAqB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAA2B,MAAM,cAAc,CAAC;AACtE,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,EACN,UAAU;AACV,oEAAoE;AACpE,UAAU,IAAI,UAAU,GAIxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAA8B,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACN,YAAY;AACZ,sCAAsC;AACtC,YAAY,IAAI,YAAY,EAC5B,aAAa;AACb,uCAAuC;AACvC,aAAa,IAAI,aAAa,EAC9B,SAAS;AACT,mCAAmC;AACnC,SAAS,IAAI,SAAS,EACtB,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,EACpC,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,GACpC,MAAM,aAAa,CAAC;AACrB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EACN,YAAY,GAIZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,QAAQ,GAKR,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAwB,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAqB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAA2B,MAAM,cAAc,CAAC;AACtE,8EAA8E;AAC9E,uEAAuE;AACvE,OAAO,EACN,UAAU;AACV,oEAAoE;AACpE,UAAU,IAAI,UAAU,GAIxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAA8B,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EACN,YAAY;AACZ,sCAAsC;AACtC,YAAY,IAAI,YAAY,EAC5B,aAAa;AACb,uCAAuC;AACvC,aAAa,IAAI,aAAa,EAC9B,SAAS;AACT,mCAAmC;AACnC,SAAS,IAAI,SAAS,EACtB,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,EACpC,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,GACpC,MAAM,aAAa,CAAC;AACrB,OAAO,EAKN,SAAS,GAET,MAAM,UAAU,CAAC;AAClB,OAAO,EAGN,YAAY,GAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAuB,aAAa,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAA4B,YAAY,EAAE,MAAM,aAAa,CAAC;AACrE,yEAAyE;AACzE,OAAO,EAA4B,WAAW,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EACN,mBAAmB,EACnB,gBAAgB;AAChB,0CAA0C;AAC1C,gBAAgB,IAAI,gBAAgB,EAIpC,0BAA0B;AAC1B,oDAAoD;AACpD,0BAA0B,IAAI,0BAA0B,GACxD,MAAM,eAAe,CAAC"}
|