@quantakrypto/core 0.1.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/README.md +337 -0
- package/dist/baseline.d.ts +37 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +99 -0
- package/dist/baseline.js.map +1 -0
- package/dist/cbom.d.ts +25 -0
- package/dist/cbom.d.ts.map +1 -0
- package/dist/cbom.js +131 -0
- package/dist/cbom.js.map +1 -0
- package/dist/changed.d.ts +13 -0
- package/dist/changed.d.ts.map +1 -0
- package/dist/changed.js +67 -0
- package/dist/changed.js.map +1 -0
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +232 -0
- package/dist/config.js.map +1 -0
- package/dist/cwe.d.ts +16 -0
- package/dist/cwe.d.ts.map +1 -0
- package/dist/cwe.js +16 -0
- package/dist/cwe.js.map +1 -0
- package/dist/dependencies.d.ts +25 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +276 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/detect-utils.d.ts +63 -0
- package/dist/detect-utils.d.ts.map +1 -0
- package/dist/detect-utils.js +113 -0
- package/dist/detect-utils.js.map +1 -0
- package/dist/detectors/pem.d.ts +9 -0
- package/dist/detectors/pem.d.ts.map +1 -0
- package/dist/detectors/pem.js +137 -0
- package/dist/detectors/pem.js.map +1 -0
- package/dist/detectors/source.d.ts +25 -0
- package/dist/detectors/source.d.ts.map +1 -0
- package/dist/detectors/source.js +575 -0
- package/dist/detectors/source.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory.d.ts +15 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/inventory.js +74 -0
- package/dist/inventory.js.map +1 -0
- package/dist/parallel.d.ts +34 -0
- package/dist/parallel.d.ts.map +1 -0
- package/dist/parallel.js +237 -0
- package/dist/parallel.js.map +1 -0
- package/dist/registry.d.ts +42 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +51 -0
- package/dist/registry.js.map +1 -0
- package/dist/remediation.d.ts +42 -0
- package/dist/remediation.d.ts.map +1 -0
- package/dist/remediation.js +131 -0
- package/dist/remediation.js.map +1 -0
- package/dist/report.d.ts +24 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +286 -0
- package/dist/report.js.map +1 -0
- package/dist/scan-worker.d.ts +2 -0
- package/dist/scan-worker.d.ts.map +1 -0
- package/dist/scan-worker.js +63 -0
- package/dist/scan-worker.js.map +1 -0
- package/dist/scan.d.ts +27 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +168 -0
- package/dist/scan.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/dist/walk.d.ts +37 -0
- package/dist/walk.d.ts.map +1 -0
- package/dist/walk.js +260 -0
- package/dist/walk.js.map +1 -0
- package/package.json +40 -0
- package/src/baseline.ts +111 -0
- package/src/cbom.ts +166 -0
- package/src/changed.ts +76 -0
- package/src/config.ts +295 -0
- package/src/cwe.ts +20 -0
- package/src/dependencies.ts +299 -0
- package/src/detect-utils.ts +157 -0
- package/src/detectors/pem.ts +162 -0
- package/src/detectors/source.ts +733 -0
- package/src/index.ts +79 -0
- package/src/inventory.ts +94 -0
- package/src/parallel.ts +288 -0
- package/src/registry.ts +71 -0
- package/src/remediation.ts +173 -0
- package/src/report.ts +340 -0
- package/src/scan-worker.ts +80 -0
- package/src/scan.ts +187 -0
- package/src/types.ts +224 -0
- package/src/version.ts +6 -0
- package/src/walk.ts +289 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/detectors/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,aAAa,CAAC;AA+rBrD,0DAA0D;AAC1D,eAAO,MAAM,eAAe,EAAE,QAAQ,EAOrC,CAAC"}
|
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
import { JS_TS_EXTENSIONS, eachMatch, hasExtension, makeFinding, nearSortedCall, } from "../detect-utils.js";
|
|
2
|
+
import { CWE_BROKEN_CRYPTO, CWE_CERT_VALIDATION, CWE_WEAK_STRENGTH } from "../cwe.js";
|
|
3
|
+
/* -------------------------------------------------------------------------- */
|
|
4
|
+
/* Precompiled regexes (module scope — never recreated per file) */
|
|
5
|
+
/* -------------------------------------------------------------------------- */
|
|
6
|
+
const RE_GENERATE_KEYPAIR = /generateKeyPair(?:Sync)?\s*\(\s*['"`](rsa|ec|dsa|dh|x25519|x448|ed25519|ed448)['"`]/g;
|
|
7
|
+
const RE_CREATE_SIGN_VERIFY = /create(?:Sign|Verify)\s*\(/g;
|
|
8
|
+
// One-shot crypto.sign/verify(algorithm, data, key). Anchored so it doesn't
|
|
9
|
+
// fire inside identifiers like `assign(` or `createSign(` (which the dedicated
|
|
10
|
+
// createSign/createVerify rule handles).
|
|
11
|
+
const RE_ONESHOT_SIGN_VERIFY = /(?:^|[^.\w])(?:crypto\.)?(sign|verify)\s*\(\s*['"`][\w.-]+['"`]\s*,/g;
|
|
12
|
+
const RE_CREATE_DH = /createDiffieHellman(?:Group)?\s*\(/g;
|
|
13
|
+
const RE_GET_DH = /getDiffieHellman\s*\(\s*['"`](modp\d+)['"`]\s*\)/g;
|
|
14
|
+
const RE_CREATE_ECDH = /createECDH\s*\(/g;
|
|
15
|
+
const RE_RSA_ENCRYPT = /(?:crypto\.)?(?:publicEncrypt|privateDecrypt)\s*\(/g;
|
|
16
|
+
const RE_DH_KEYOBJECT = /(?:crypto\.)?diffieHellman\s*\(\s*\{/g;
|
|
17
|
+
// WebCrypto.
|
|
18
|
+
const RE_WEBCRYPTO_ALGO = /\b(RSA-OAEP|RSA-PSS|RSASSA-PKCS1-v1_5|ECDH|ECDSA)\b/gi;
|
|
19
|
+
const RE_SUBTLE_CALL = /subtle\s*\.\s*(generateKey|importKey|exportKey|deriveKey|deriveBits|sign|verify|encrypt|decrypt|wrapKey|unwrapKey)\s*\(/g;
|
|
20
|
+
// Libraries.
|
|
21
|
+
const RE_FORGE_RSA = /pki\.rsa\.generateKeyPair\s*\(/g;
|
|
22
|
+
const RE_FORGE_ED25519 = /forge\.ed25519\b/g;
|
|
23
|
+
const RE_ELLIPTIC_EC = /new\s+(?:elliptic\.)?ec\s*\(/gi;
|
|
24
|
+
const RE_JSRSASIGN_KEYGEN = /KEYUTIL\.generateKeypair\s*\(/g;
|
|
25
|
+
const RE_JSRSASIGN_SIGN = /KJUR\.crypto\.(?:Signature|ECDSA)\b/g;
|
|
26
|
+
const RE_NODE_RSA = /new\s+NodeRSA\s*\(/g;
|
|
27
|
+
// secp256k1 — direct @noble/secp256k1 / secp256k1-style API usage in source.
|
|
28
|
+
const RE_SECP256K1 = /\b(?:secp(?:256k1)?|secp)\s*\.\s*(?:sign|verify|getPublicKey|getSharedSecret|ecdh|recoverPublicKey)\s*\(/g;
|
|
29
|
+
// JWT/JOSE.
|
|
30
|
+
const RE_JWT_ALG = /['"`](RS(?:256|384|512)|PS(?:256|384|512)|ES(?:256|384|512|256K)|EdDSA)['"`]/g;
|
|
31
|
+
// JOSE ECDH-ES key agreement (HNDL) and COSE algorithm identifiers.
|
|
32
|
+
const RE_JOSE_ECDH = /['"`](ECDH-ES(?:\+A(?:128|192|256)KW)?)['"`]/g;
|
|
33
|
+
// TLS config.
|
|
34
|
+
const RE_TLS_LEGACY_VERSION = /(?:minVersion|maxVersion)\s*:\s*['"`]TLSv1(?:\.1)?['"`]|secureProtocol\s*:\s*['"`]TLSv1(?:_1)?_method['"`]/g;
|
|
35
|
+
const RE_TLS_REJECT = /rejectUnauthorized\s*:\s*false/g;
|
|
36
|
+
// Hardened cipher regex: bounded spans (no unbounded `[^'"`]*` straddling the
|
|
37
|
+
// alternation), single-quote-style anchoring removed in favour of {0,256} bounds
|
|
38
|
+
// so worst-case backtracking is linear in the bound, not the file (P0-6).
|
|
39
|
+
const RE_TLS_WEAK_CIPHER = /ciphers\s*:\s*['"`][^'"`\n]{0,256}?\b(RC4|DES|3DES|MD5|NULL|EXPORT|aNULL|eNULL)\b[^'"`\n]{0,256}?['"`]/gi;
|
|
40
|
+
/* -------------------------------------------------------------------------- */
|
|
41
|
+
/* Node.js `crypto` module */
|
|
42
|
+
/* -------------------------------------------------------------------------- */
|
|
43
|
+
/** Detects classical asymmetric usage from Node's built-in `crypto` module. */
|
|
44
|
+
const nodeCryptoDetector = {
|
|
45
|
+
id: "node-crypto",
|
|
46
|
+
description: "Classical asymmetric crypto via the Node.js `crypto` module",
|
|
47
|
+
scope: "source",
|
|
48
|
+
language: "js",
|
|
49
|
+
appliesTo: (f) => hasExtension(f, JS_TS_EXTENSIONS),
|
|
50
|
+
detect({ file, content }) {
|
|
51
|
+
const findings = [];
|
|
52
|
+
const push = (spec, m) => findings.push(makeFinding({ ...spec, file, content, index: m.index, matchLength: m[0].length }));
|
|
53
|
+
// generateKeyPair(Sync)('rsa' | 'ec' | 'dsa' | 'dh' | 'x25519' | 'ed25519', ...)
|
|
54
|
+
eachMatch(RE_GENERATE_KEYPAIR, content, (m) => {
|
|
55
|
+
const type = m[1].toLowerCase();
|
|
56
|
+
const map = {
|
|
57
|
+
rsa: { algo: "RSA", cat: "kem", sev: "high", hndl: true, label: "RSA" },
|
|
58
|
+
// EC keys feed BOTH ECDSA (sign) and ECDH (key agreement). ECDH is
|
|
59
|
+
// HNDL-exposed, so classify conservatively as key-exchange-capable and
|
|
60
|
+
// surface both concerns rather than asserting signature-only (P0-4).
|
|
61
|
+
ec: {
|
|
62
|
+
algo: "ECDH",
|
|
63
|
+
cat: "key-exchange",
|
|
64
|
+
sev: "high",
|
|
65
|
+
hndl: true,
|
|
66
|
+
label: "EC (ECDSA/ECDH)",
|
|
67
|
+
message: "Generates a classical EC key pair. EC keys feed BOTH ECDSA signatures " +
|
|
68
|
+
"and ECDH key agreement; the ECDH path is harvest-now-decrypt-later exposed.",
|
|
69
|
+
remediation: "For key agreement: hybrid X25519MLKEM768 (ML-KEM-768). For signatures: ML-DSA-65 (FIPS 204).",
|
|
70
|
+
},
|
|
71
|
+
dsa: { algo: "DSA", cat: "signature", sev: "high", hndl: false, label: "DSA" },
|
|
72
|
+
dh: { algo: "DH", cat: "key-exchange", sev: "high", hndl: true, label: "Diffie-Hellman" },
|
|
73
|
+
x25519: { algo: "X25519", cat: "key-exchange", sev: "low", hndl: true, label: "X25519" },
|
|
74
|
+
x448: { algo: "X448", cat: "key-exchange", sev: "low", hndl: true, label: "X448" },
|
|
75
|
+
ed25519: { algo: "EdDSA", cat: "signature", sev: "low", hndl: false, label: "Ed25519" },
|
|
76
|
+
ed448: { algo: "EdDSA", cat: "signature", sev: "low", hndl: false, label: "Ed448" },
|
|
77
|
+
};
|
|
78
|
+
const info = map[type];
|
|
79
|
+
push({
|
|
80
|
+
ruleId: "node-crypto-keygen",
|
|
81
|
+
title: `${info.label} key generation`,
|
|
82
|
+
category: info.cat,
|
|
83
|
+
severity: info.sev,
|
|
84
|
+
confidence: "high",
|
|
85
|
+
algorithm: info.algo,
|
|
86
|
+
hndl: info.hndl,
|
|
87
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
88
|
+
message: info.message ??
|
|
89
|
+
`Generates a classical ${info.label} key pair, which is not quantum-safe.`,
|
|
90
|
+
...(info.remediation ? { remediation: info.remediation } : {}),
|
|
91
|
+
}, m);
|
|
92
|
+
});
|
|
93
|
+
// createSign / createVerify — RSA / ECDSA / DSA signatures.
|
|
94
|
+
eachMatch(RE_CREATE_SIGN_VERIFY, content, (m) => {
|
|
95
|
+
push({
|
|
96
|
+
ruleId: "node-crypto-sign",
|
|
97
|
+
title: "Classical signature (createSign/createVerify)",
|
|
98
|
+
category: "signature",
|
|
99
|
+
severity: "high",
|
|
100
|
+
confidence: "medium",
|
|
101
|
+
algorithm: "unknown",
|
|
102
|
+
hndl: false,
|
|
103
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
104
|
+
message: "Uses createSign/createVerify, typically RSA, ECDSA or DSA — all forgeable by a quantum attacker.",
|
|
105
|
+
remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
|
|
106
|
+
}, m);
|
|
107
|
+
});
|
|
108
|
+
// One-shot crypto.sign(algorithm, data, key) / crypto.verify(...) (Node ≥ 12).
|
|
109
|
+
eachMatch(RE_ONESHOT_SIGN_VERIFY, content, (m) => {
|
|
110
|
+
push({
|
|
111
|
+
ruleId: "node-crypto-sign-oneshot",
|
|
112
|
+
title: "Classical one-shot signature (crypto.sign/verify)",
|
|
113
|
+
category: "signature",
|
|
114
|
+
severity: "high",
|
|
115
|
+
confidence: "medium",
|
|
116
|
+
algorithm: "unknown",
|
|
117
|
+
hndl: false,
|
|
118
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
119
|
+
message: "Uses the one-shot crypto.sign/crypto.verify API, typically RSA/ECDSA/EdDSA — forgeable by a quantum attacker.",
|
|
120
|
+
remediation: "ML-DSA-65 (FIPS 204) or SLH-DSA (FIPS 205)",
|
|
121
|
+
}, m);
|
|
122
|
+
});
|
|
123
|
+
// createDiffieHellman / createDiffieHellmanGroup — finite-field DH key exchange.
|
|
124
|
+
eachMatch(RE_CREATE_DH, content, (m) => {
|
|
125
|
+
push({
|
|
126
|
+
ruleId: "node-crypto-dh",
|
|
127
|
+
title: "Diffie-Hellman key exchange",
|
|
128
|
+
category: "key-exchange",
|
|
129
|
+
severity: "high",
|
|
130
|
+
confidence: "high",
|
|
131
|
+
algorithm: "DH",
|
|
132
|
+
hndl: true,
|
|
133
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
134
|
+
message: "Finite-field Diffie-Hellman is broken by Shor's algorithm (harvest-now-decrypt-later).",
|
|
135
|
+
}, m);
|
|
136
|
+
});
|
|
137
|
+
// getDiffieHellman('modpN') — named built-in finite-field MODP groups.
|
|
138
|
+
eachMatch(RE_GET_DH, content, (m) => {
|
|
139
|
+
push({
|
|
140
|
+
ruleId: "node-crypto-dh-modp",
|
|
141
|
+
title: `Diffie-Hellman MODP group (${m[1]})`,
|
|
142
|
+
category: "key-exchange",
|
|
143
|
+
severity: "high",
|
|
144
|
+
confidence: "high",
|
|
145
|
+
algorithm: "DH",
|
|
146
|
+
hndl: true,
|
|
147
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
148
|
+
message: `Named finite-field DH MODP group "${m[1]}" is broken by Shor's algorithm (harvest-now-decrypt-later).`,
|
|
149
|
+
}, m);
|
|
150
|
+
});
|
|
151
|
+
// createECDH — elliptic-curve Diffie-Hellman key exchange.
|
|
152
|
+
eachMatch(RE_CREATE_ECDH, content, (m) => {
|
|
153
|
+
push({
|
|
154
|
+
ruleId: "node-crypto-ecdh",
|
|
155
|
+
title: "ECDH key exchange",
|
|
156
|
+
category: "key-exchange",
|
|
157
|
+
severity: "high",
|
|
158
|
+
confidence: "high",
|
|
159
|
+
algorithm: "ECDH",
|
|
160
|
+
hndl: true,
|
|
161
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
162
|
+
message: "Elliptic-curve Diffie-Hellman is broken by Shor's algorithm (harvest-now-decrypt-later).",
|
|
163
|
+
}, m);
|
|
164
|
+
});
|
|
165
|
+
// publicEncrypt / privateDecrypt — RSA encryption (KEM-like confidentiality).
|
|
166
|
+
eachMatch(RE_RSA_ENCRYPT, content, (m) => {
|
|
167
|
+
push({
|
|
168
|
+
ruleId: "node-crypto-rsa-encrypt",
|
|
169
|
+
title: "RSA public-key encryption",
|
|
170
|
+
category: "kem",
|
|
171
|
+
severity: "high",
|
|
172
|
+
confidence: "high",
|
|
173
|
+
algorithm: "RSA",
|
|
174
|
+
hndl: true,
|
|
175
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
176
|
+
message: "RSA public-key encryption is broken by Shor's algorithm and exposed to harvest-now-decrypt-later.",
|
|
177
|
+
}, m);
|
|
178
|
+
});
|
|
179
|
+
// diffieHellman({ privateKey, publicKey }) — KeyObject-based DH/ECDH.
|
|
180
|
+
eachMatch(RE_DH_KEYOBJECT, content, (m) => {
|
|
181
|
+
push({
|
|
182
|
+
ruleId: "node-crypto-dh-keyobject",
|
|
183
|
+
title: "Diffie-Hellman (KeyObject) key exchange",
|
|
184
|
+
category: "key-exchange",
|
|
185
|
+
severity: "high",
|
|
186
|
+
confidence: "high",
|
|
187
|
+
algorithm: "ECDH",
|
|
188
|
+
hndl: true,
|
|
189
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
190
|
+
message: "crypto.diffieHellman() performs a classical (EC)DH agreement (harvest-now-decrypt-later).",
|
|
191
|
+
}, m);
|
|
192
|
+
});
|
|
193
|
+
return findings;
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
/* -------------------------------------------------------------------------- */
|
|
197
|
+
/* WebCrypto (SubtleCrypto) */
|
|
198
|
+
/* -------------------------------------------------------------------------- */
|
|
199
|
+
/**
|
|
200
|
+
* Detects classical algorithms passed to WebCrypto's SubtleCrypto methods. The
|
|
201
|
+
* algorithm name can appear as a bare string ("RSA-OAEP") or as
|
|
202
|
+
* `{ name: "ECDH" }`; we scan both forms within a window after a subtle call.
|
|
203
|
+
*/
|
|
204
|
+
const webCryptoDetector = {
|
|
205
|
+
id: "webcrypto",
|
|
206
|
+
description: "Classical asymmetric algorithms via WebCrypto SubtleCrypto",
|
|
207
|
+
scope: "source",
|
|
208
|
+
language: "js",
|
|
209
|
+
appliesTo: (f) => hasExtension(f, JS_TS_EXTENSIONS),
|
|
210
|
+
detect({ file, content }) {
|
|
211
|
+
const findings = [];
|
|
212
|
+
// Only consider names that appear near a subtle.* call to reduce noise.
|
|
213
|
+
// callIndexes is collected in ascending order (regex scans left→right), so
|
|
214
|
+
// proximity is resolved with a binary search instead of an O(M·C) scan.
|
|
215
|
+
const callIndexes = [];
|
|
216
|
+
eachMatch(RE_SUBTLE_CALL, content, (m) => callIndexes.push(m.index));
|
|
217
|
+
if (callIndexes.length === 0)
|
|
218
|
+
return findings;
|
|
219
|
+
eachMatch(RE_WEBCRYPTO_ALGO, content, (m) => {
|
|
220
|
+
if (!nearSortedCall(callIndexes, m.index, 400))
|
|
221
|
+
return;
|
|
222
|
+
const name = m[1].toUpperCase();
|
|
223
|
+
const isKem = name === "RSA-OAEP";
|
|
224
|
+
const isEcdh = name === "ECDH";
|
|
225
|
+
const algorithm = name.startsWith("RSA")
|
|
226
|
+
? "RSA"
|
|
227
|
+
: isEcdh
|
|
228
|
+
? "ECDH"
|
|
229
|
+
: "ECDSA";
|
|
230
|
+
const category = isEcdh ? "key-exchange" : isKem ? "kem" : "signature";
|
|
231
|
+
const hndl = isKem || isEcdh;
|
|
232
|
+
findings.push(makeFinding({
|
|
233
|
+
ruleId: "webcrypto-classical",
|
|
234
|
+
title: `WebCrypto ${m[1]}`,
|
|
235
|
+
category,
|
|
236
|
+
severity: "high",
|
|
237
|
+
confidence: "high",
|
|
238
|
+
algorithm,
|
|
239
|
+
hndl,
|
|
240
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
241
|
+
message: `WebCrypto algorithm "${m[1]}" is classical asymmetric crypto and not quantum-safe.`,
|
|
242
|
+
file,
|
|
243
|
+
content,
|
|
244
|
+
index: m.index,
|
|
245
|
+
matchLength: m[0].length,
|
|
246
|
+
}));
|
|
247
|
+
});
|
|
248
|
+
return findings;
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
/* -------------------------------------------------------------------------- */
|
|
252
|
+
/* Popular crypto libraries */
|
|
253
|
+
/* -------------------------------------------------------------------------- */
|
|
254
|
+
/** Detects classical crypto from popular npm libraries used in source. */
|
|
255
|
+
const libraryDetector = {
|
|
256
|
+
id: "crypto-libs",
|
|
257
|
+
description: "Classical asymmetric crypto via node-forge, elliptic, jsrsasign, node-rsa",
|
|
258
|
+
scope: "source",
|
|
259
|
+
language: "js",
|
|
260
|
+
appliesTo: (f) => hasExtension(f, JS_TS_EXTENSIONS),
|
|
261
|
+
detect({ file, content }) {
|
|
262
|
+
const findings = [];
|
|
263
|
+
const add = (re, spec) => eachMatch(re, content, (m) => findings.push(makeFinding({ ...spec, file, content, index: m.index, matchLength: m[0].length })));
|
|
264
|
+
// node-forge: pki.rsa.generateKeyPair(...)
|
|
265
|
+
add(RE_FORGE_RSA, {
|
|
266
|
+
ruleId: "forge-rsa-keygen",
|
|
267
|
+
title: "node-forge RSA key generation",
|
|
268
|
+
category: "kem",
|
|
269
|
+
severity: "high",
|
|
270
|
+
confidence: "high",
|
|
271
|
+
algorithm: "RSA",
|
|
272
|
+
hndl: true,
|
|
273
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
274
|
+
message: "node-forge generates a classical RSA key pair, which is not quantum-safe.",
|
|
275
|
+
});
|
|
276
|
+
// node-forge: forge.ed25519.* (classical EdDSA)
|
|
277
|
+
add(RE_FORGE_ED25519, {
|
|
278
|
+
ruleId: "forge-ed25519",
|
|
279
|
+
title: "node-forge Ed25519 usage",
|
|
280
|
+
category: "signature",
|
|
281
|
+
severity: "low",
|
|
282
|
+
confidence: "high",
|
|
283
|
+
algorithm: "EdDSA",
|
|
284
|
+
hndl: false,
|
|
285
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
286
|
+
message: "node-forge Ed25519 is a modern but still classical signature scheme.",
|
|
287
|
+
});
|
|
288
|
+
// elliptic: new EC('secp256k1') / new ec(...)
|
|
289
|
+
add(RE_ELLIPTIC_EC, {
|
|
290
|
+
ruleId: "elliptic-ec",
|
|
291
|
+
title: "elliptic curve instantiation",
|
|
292
|
+
category: "signature",
|
|
293
|
+
severity: "high",
|
|
294
|
+
confidence: "high",
|
|
295
|
+
algorithm: "ECDSA",
|
|
296
|
+
hndl: false,
|
|
297
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
298
|
+
message: "The `elliptic` library implements classical ECDSA/ECDH, both broken by Shor's algorithm.",
|
|
299
|
+
});
|
|
300
|
+
// Direct secp256k1 API usage: secp.sign / getPublicKey / getSharedSecret.
|
|
301
|
+
add(RE_SECP256K1, {
|
|
302
|
+
ruleId: "secp256k1-usage",
|
|
303
|
+
title: "secp256k1 ECDSA/ECDH usage",
|
|
304
|
+
category: "signature",
|
|
305
|
+
severity: "high",
|
|
306
|
+
confidence: "medium",
|
|
307
|
+
algorithm: "ECDSA",
|
|
308
|
+
hndl: false,
|
|
309
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
310
|
+
message: "Direct secp256k1 usage (ECDSA signatures / ECDH agreement) is classical and broken by Shor's algorithm.",
|
|
311
|
+
remediation: "ML-DSA-65 (FIPS 204) for signatures; hybrid X25519MLKEM768 for key agreement.",
|
|
312
|
+
});
|
|
313
|
+
// jsrsasign: KEYUTIL.generateKeypair('RSA'|'EC', ...) or KJUR.crypto.*
|
|
314
|
+
add(RE_JSRSASIGN_KEYGEN, {
|
|
315
|
+
ruleId: "jsrsasign-keygen",
|
|
316
|
+
title: "jsrsasign key generation",
|
|
317
|
+
category: "signature",
|
|
318
|
+
severity: "high",
|
|
319
|
+
confidence: "high",
|
|
320
|
+
algorithm: "unknown",
|
|
321
|
+
hndl: false,
|
|
322
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
323
|
+
message: "jsrsasign generates classical RSA/EC key pairs, which are not quantum-safe.",
|
|
324
|
+
remediation: "ML-KEM-768 (FIPS 203) / ML-DSA-65 (FIPS 204)",
|
|
325
|
+
});
|
|
326
|
+
add(RE_JSRSASIGN_SIGN, {
|
|
327
|
+
ruleId: "jsrsasign-sign",
|
|
328
|
+
title: "jsrsasign signature",
|
|
329
|
+
category: "signature",
|
|
330
|
+
severity: "high",
|
|
331
|
+
confidence: "high",
|
|
332
|
+
algorithm: "unknown",
|
|
333
|
+
hndl: false,
|
|
334
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
335
|
+
message: "jsrsasign signing uses classical RSA/ECDSA signatures, forgeable by a quantum attacker.",
|
|
336
|
+
remediation: "ML-DSA-65 (FIPS 204)",
|
|
337
|
+
});
|
|
338
|
+
// node-rsa: new NodeRSA(...)
|
|
339
|
+
add(RE_NODE_RSA, {
|
|
340
|
+
ruleId: "node-rsa",
|
|
341
|
+
title: "node-rsa key/usage",
|
|
342
|
+
category: "kem",
|
|
343
|
+
severity: "high",
|
|
344
|
+
confidence: "high",
|
|
345
|
+
algorithm: "RSA",
|
|
346
|
+
hndl: true,
|
|
347
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
348
|
+
message: "node-rsa wraps classical RSA encryption/signing, which is not quantum-safe.",
|
|
349
|
+
});
|
|
350
|
+
return findings;
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
/* -------------------------------------------------------------------------- */
|
|
354
|
+
/* JWT / JOSE / COSE algorithm strings */
|
|
355
|
+
/* -------------------------------------------------------------------------- */
|
|
356
|
+
/**
|
|
357
|
+
* Detects classical signature algorithm identifiers used by JWT/JOSE, plus
|
|
358
|
+
* ECDH-ES key-agreement identifiers (HNDL-exposed). These appear as string
|
|
359
|
+
* literals: `alg: "RS256"`, `algorithms: ["ES256"]`, `enc: "ECDH-ES+A256KW"`.
|
|
360
|
+
*/
|
|
361
|
+
const jwtDetector = {
|
|
362
|
+
id: "jwt-jose",
|
|
363
|
+
description: "Classical JWT/JOSE algorithms (RS/PS/ES/EdDSA) and ECDH-ES key agreement",
|
|
364
|
+
scope: "source",
|
|
365
|
+
language: "js",
|
|
366
|
+
appliesTo: (f) => hasExtension(f, JS_TS_EXTENSIONS),
|
|
367
|
+
detect({ file, content }) {
|
|
368
|
+
const findings = [];
|
|
369
|
+
// Classical JWS signature alg tokens. Anchored to quotes to avoid words.
|
|
370
|
+
eachMatch(RE_JWT_ALG, content, (m) => {
|
|
371
|
+
const alg = m[1];
|
|
372
|
+
let algorithm;
|
|
373
|
+
if (alg.startsWith("RS") || alg.startsWith("PS"))
|
|
374
|
+
algorithm = "RSA";
|
|
375
|
+
else if (alg === "EdDSA")
|
|
376
|
+
algorithm = "EdDSA";
|
|
377
|
+
else
|
|
378
|
+
algorithm = "ECDSA"; // ES*
|
|
379
|
+
findings.push(makeFinding({
|
|
380
|
+
ruleId: "jwt-classical-alg",
|
|
381
|
+
title: `JWT/JOSE algorithm ${alg}`,
|
|
382
|
+
category: "signature",
|
|
383
|
+
severity: "high",
|
|
384
|
+
confidence: "medium",
|
|
385
|
+
algorithm,
|
|
386
|
+
hndl: false,
|
|
387
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
388
|
+
message: `JWT/JOSE algorithm "${alg}" is a classical signature, forgeable by a quantum attacker.`,
|
|
389
|
+
remediation: "ML-DSA-65 (FIPS 204); track IETF PQC JOSE/COSE algorithms",
|
|
390
|
+
file,
|
|
391
|
+
content,
|
|
392
|
+
index: m.index,
|
|
393
|
+
matchLength: m[0].length,
|
|
394
|
+
}));
|
|
395
|
+
});
|
|
396
|
+
// JOSE ECDH-ES key agreement (and ECDH-ES+A*KW) — confidentiality, HNDL.
|
|
397
|
+
eachMatch(RE_JOSE_ECDH, content, (m) => {
|
|
398
|
+
findings.push(makeFinding({
|
|
399
|
+
ruleId: "jose-ecdh-es",
|
|
400
|
+
title: `JOSE key agreement ${m[1]}`,
|
|
401
|
+
category: "key-exchange",
|
|
402
|
+
severity: "high",
|
|
403
|
+
confidence: "medium",
|
|
404
|
+
algorithm: "ECDH",
|
|
405
|
+
hndl: true,
|
|
406
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
407
|
+
message: `JOSE "${m[1]}" performs classical ECDH key agreement — harvest-now-decrypt-later exposed.`,
|
|
408
|
+
remediation: "Track IETF PQC JOSE/COSE; adopt hybrid X25519MLKEM768 KEM-based encryption.",
|
|
409
|
+
file,
|
|
410
|
+
content,
|
|
411
|
+
index: m.index,
|
|
412
|
+
matchLength: m[0].length,
|
|
413
|
+
}));
|
|
414
|
+
});
|
|
415
|
+
return findings;
|
|
416
|
+
},
|
|
417
|
+
};
|
|
418
|
+
/* -------------------------------------------------------------------------- */
|
|
419
|
+
/* TLS legacy configuration */
|
|
420
|
+
/* -------------------------------------------------------------------------- */
|
|
421
|
+
/**
|
|
422
|
+
* Detects legacy / insecure TLS configuration expressed as JS object literals:
|
|
423
|
+
* forced TLS 1.0/1.1, disabled certificate verification, and weak ciphers.
|
|
424
|
+
* These aren't quantum-specific but materially weaken transport security and
|
|
425
|
+
* are squarely in qScan's "config" scope.
|
|
426
|
+
*/
|
|
427
|
+
const tlsDetector = {
|
|
428
|
+
id: "tls-config",
|
|
429
|
+
description: "Legacy / insecure TLS configuration in JS objects",
|
|
430
|
+
scope: "config",
|
|
431
|
+
language: "js",
|
|
432
|
+
appliesTo: (f) => hasExtension(f, JS_TS_EXTENSIONS),
|
|
433
|
+
detect({ file, content }) {
|
|
434
|
+
const findings = [];
|
|
435
|
+
// minVersion / maxVersion / secureProtocol pinned to TLS 1.0 or 1.1.
|
|
436
|
+
eachMatch(RE_TLS_LEGACY_VERSION, content, (m) => {
|
|
437
|
+
findings.push(makeFinding({
|
|
438
|
+
ruleId: "tls-legacy-version",
|
|
439
|
+
title: "Legacy TLS version pinned",
|
|
440
|
+
category: "tls",
|
|
441
|
+
severity: "medium",
|
|
442
|
+
confidence: "high",
|
|
443
|
+
hndl: false,
|
|
444
|
+
cwe: CWE_WEAK_STRENGTH,
|
|
445
|
+
message: "TLS 1.0/1.1 are deprecated and insecure; require TLS 1.3.",
|
|
446
|
+
remediation: "Set minVersion: 'TLSv1.3' and prefer PQC-hybrid key exchange.",
|
|
447
|
+
file,
|
|
448
|
+
content,
|
|
449
|
+
index: m.index,
|
|
450
|
+
matchLength: m[0].length,
|
|
451
|
+
}));
|
|
452
|
+
});
|
|
453
|
+
// rejectUnauthorized: false — disables certificate verification.
|
|
454
|
+
eachMatch(RE_TLS_REJECT, content, (m) => {
|
|
455
|
+
findings.push(makeFinding({
|
|
456
|
+
ruleId: "tls-reject-unauthorized",
|
|
457
|
+
title: "TLS certificate verification disabled",
|
|
458
|
+
category: "tls",
|
|
459
|
+
severity: "high",
|
|
460
|
+
confidence: "high",
|
|
461
|
+
hndl: false,
|
|
462
|
+
cwe: CWE_CERT_VALIDATION,
|
|
463
|
+
message: "rejectUnauthorized:false disables TLS certificate verification (MITM risk).",
|
|
464
|
+
remediation: "Remove rejectUnauthorized:false; verify certificates properly.",
|
|
465
|
+
file,
|
|
466
|
+
content,
|
|
467
|
+
index: m.index,
|
|
468
|
+
matchLength: m[0].length,
|
|
469
|
+
}));
|
|
470
|
+
});
|
|
471
|
+
// Weak / export ciphers referenced in a ciphers string (bounded regex).
|
|
472
|
+
eachMatch(RE_TLS_WEAK_CIPHER, content, (m) => {
|
|
473
|
+
findings.push(makeFinding({
|
|
474
|
+
ruleId: "tls-weak-cipher",
|
|
475
|
+
title: "Weak TLS cipher configured",
|
|
476
|
+
category: "tls",
|
|
477
|
+
severity: "medium",
|
|
478
|
+
confidence: "medium",
|
|
479
|
+
hndl: false,
|
|
480
|
+
cwe: CWE_WEAK_STRENGTH,
|
|
481
|
+
message: `Weak cipher (${m[1]}) configured in the TLS ciphers list.`,
|
|
482
|
+
remediation: "Use a modern AEAD cipher suite (TLS 1.3 defaults).",
|
|
483
|
+
file,
|
|
484
|
+
content,
|
|
485
|
+
index: m.index,
|
|
486
|
+
matchLength: m[0].length,
|
|
487
|
+
}));
|
|
488
|
+
});
|
|
489
|
+
return findings;
|
|
490
|
+
},
|
|
491
|
+
};
|
|
492
|
+
/* -------------------------------------------------------------------------- */
|
|
493
|
+
/* SSH public keys + TLS certificate signature algorithms (config scope) */
|
|
494
|
+
/* -------------------------------------------------------------------------- */
|
|
495
|
+
const RE_SSH_PUBKEY = /\b(ssh-rsa|ssh-ed25519|ssh-dss|ecdsa-sha2-nistp(?:256|384|521))\b/g;
|
|
496
|
+
const RE_CERT_SIG_ALG = /\b(sha(?:1|256|384|512)WithRSAEncryption|ecdsa-with-SHA(?:1|256|384|512)|rsassaPss|dsaWithSHA(?:1|256))\b/g;
|
|
497
|
+
/**
|
|
498
|
+
* Detects classical SSH public keys (`authorized_keys` / `known_hosts` lines)
|
|
499
|
+
* and X.509 certificate signature-algorithm identifiers in any text file. These
|
|
500
|
+
* are language-agnostic config surfaces — the SSH-key forgery surface and the
|
|
501
|
+
* PKI signature surface that lexical PEM detection misses.
|
|
502
|
+
*/
|
|
503
|
+
const sshCertDetector = {
|
|
504
|
+
id: "ssh-cert",
|
|
505
|
+
description: "SSH public keys and TLS/X.509 certificate signature algorithms in config",
|
|
506
|
+
scope: "config",
|
|
507
|
+
language: "any",
|
|
508
|
+
appliesTo: () => true,
|
|
509
|
+
detect({ file, content }) {
|
|
510
|
+
const findings = [];
|
|
511
|
+
// SSH public keys: ssh-rsa AAAA…, ecdsa-sha2-nistp256 …, ssh-ed25519 …
|
|
512
|
+
eachMatch(RE_SSH_PUBKEY, content, (m) => {
|
|
513
|
+
const tok = m[1];
|
|
514
|
+
const algorithm = tok.startsWith("ssh-rsa")
|
|
515
|
+
? "RSA"
|
|
516
|
+
: tok === "ssh-ed25519"
|
|
517
|
+
? "EdDSA"
|
|
518
|
+
: tok === "ssh-dss"
|
|
519
|
+
? "DSA"
|
|
520
|
+
: "ECDSA";
|
|
521
|
+
findings.push(makeFinding({
|
|
522
|
+
ruleId: "ssh-public-key",
|
|
523
|
+
title: `Classical SSH public key (${tok})`,
|
|
524
|
+
category: "certificate",
|
|
525
|
+
severity: "low",
|
|
526
|
+
confidence: "medium",
|
|
527
|
+
algorithm,
|
|
528
|
+
hndl: false,
|
|
529
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
530
|
+
message: `SSH public key type "${tok}" is a classical key forgeable by a quantum attacker.`,
|
|
531
|
+
remediation: "Plan migration to PQC-capable SSH (e.g. sntrup761x25519 KEX, PQC host keys).",
|
|
532
|
+
file,
|
|
533
|
+
content,
|
|
534
|
+
index: m.index,
|
|
535
|
+
matchLength: m[0].length,
|
|
536
|
+
}));
|
|
537
|
+
});
|
|
538
|
+
// X.509 / TLS certificate signature algorithm identifiers (forgery surface).
|
|
539
|
+
eachMatch(RE_CERT_SIG_ALG, content, (m) => {
|
|
540
|
+
const tok = m[1];
|
|
541
|
+
const algorithm = /RSA|rsassa/i.test(tok)
|
|
542
|
+
? "RSA"
|
|
543
|
+
: tok.startsWith("ecdsa")
|
|
544
|
+
? "ECDSA"
|
|
545
|
+
: "DSA";
|
|
546
|
+
findings.push(makeFinding({
|
|
547
|
+
ruleId: "cert-signature-algorithm",
|
|
548
|
+
title: `Classical certificate signature algorithm (${tok})`,
|
|
549
|
+
category: "certificate",
|
|
550
|
+
severity: "low",
|
|
551
|
+
confidence: "medium",
|
|
552
|
+
algorithm,
|
|
553
|
+
hndl: false,
|
|
554
|
+
cwe: CWE_BROKEN_CRYPTO,
|
|
555
|
+
message: `Certificate signature algorithm "${tok}" is classical (RSA/ECDSA/DSA) — a quantum forgery surface.`,
|
|
556
|
+
remediation: "Plan re-issuance with PQC-capable CAs as ML-DSA certificate profiles mature.",
|
|
557
|
+
file,
|
|
558
|
+
content,
|
|
559
|
+
index: m.index,
|
|
560
|
+
matchLength: m[0].length,
|
|
561
|
+
}));
|
|
562
|
+
});
|
|
563
|
+
return findings;
|
|
564
|
+
},
|
|
565
|
+
};
|
|
566
|
+
/** All built-in source/config detectors, in run order. */
|
|
567
|
+
export const sourceDetectors = [
|
|
568
|
+
nodeCryptoDetector,
|
|
569
|
+
webCryptoDetector,
|
|
570
|
+
libraryDetector,
|
|
571
|
+
jwtDetector,
|
|
572
|
+
tlsDetector,
|
|
573
|
+
sshCertDetector,
|
|
574
|
+
];
|
|
575
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/detectors/source.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @quantakrypto/core — public API (LOCKED CONTRACT).
|
|
3
|
+
*
|
|
4
|
+
* The exported NAMES and SIGNATURES below are the stable contract that
|
|
5
|
+
* @quantakrypto/qscan, @quantakrypto/mcp and the GitHub Action depend on — do not change
|
|
6
|
+
* them without updating all consumers. The implementations live in focused
|
|
7
|
+
* modules under src/ and are re-exported here; the public surface is identical
|
|
8
|
+
* to the original stub file.
|
|
9
|
+
*/
|
|
10
|
+
export * from "./types.js";
|
|
11
|
+
export { VERSION } from "./version.js";
|
|
12
|
+
export type { SarifLog } from "./report.js";
|
|
13
|
+
export { scan, detectors, detectFile, compareFindings } from "./scan.js";
|
|
14
|
+
export { scanParallel, mergeChunkResults, chunkByBytes } from "./parallel.js";
|
|
15
|
+
export type { ScanChunk, ChunkResult, SizedFile } from "./parallel.js";
|
|
16
|
+
export { DetectorRegistry, defaultRegistry, detectorScope } from "./registry.js";
|
|
17
|
+
export { fingerprintFinding, baselineFromFindings, applyBaseline, loadBaseline, saveBaseline, BASELINE_VERSION, } from "./baseline.js";
|
|
18
|
+
export type { Baseline } from "./baseline.js";
|
|
19
|
+
export { changedFiles } from "./changed.js";
|
|
20
|
+
export { loadConfig, ConfigError, CONFIG_FILENAME } from "./config.js";
|
|
21
|
+
export type { QuantakryptoFileConfig, LoadConfigResult } from "./config.js";
|
|
22
|
+
export { walkFiles, isBinaryPath, isGeneratedPath, looksMinified } from "./walk.js";
|
|
23
|
+
export { buildInventory } from "./inventory.js";
|
|
24
|
+
export { vulnerableDependencies } from "./dependencies.js";
|
|
25
|
+
export { toSarif, toJson, formatSummary } from "./report.js";
|
|
26
|
+
export { toCbom } from "./cbom.js";
|
|
27
|
+
export type { CycloneDxBom, CbomComponent } from "./cbom.js";
|
|
28
|
+
export { remediationFor, remediationForTier, TIER_PARAMS, STATEFUL_HBS_NOTE, statefulHbsApplies, } from "./remediation.js";
|
|
29
|
+
export type { SecurityTier } from "./remediation.js";
|
|
30
|
+
export { CWE_BROKEN_CRYPTO, CWE_WEAK_STRENGTH, CWE_CERT_VALIDATION, CWE_HARDCODED_KEY, CWE_RISKY_PRIMITIVE, } from "./cwe.js";
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9E,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGvE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGjF,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAGpF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,UAAU,CAAC"}
|