@heossi/qnsi 0.5.6 → 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/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 +59 -0
- package/dist/kms.d.ts.map +1 -1
- package/dist/kms.js +41 -0
- package/dist/kms.js.map +1 -1
- package/package.json +5 -1
|
@@ -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"}
|
package/dist/kms.d.ts
CHANGED
|
@@ -14,6 +14,45 @@ export interface CreateKeyRequest {
|
|
|
14
14
|
readonly purpose?: string;
|
|
15
15
|
readonly metadata?: Record<string, unknown>;
|
|
16
16
|
}
|
|
17
|
+
/** A PQC private key sealed under an HSM RSA-OAEP custody key (HSPK). The caller
|
|
18
|
+
* stores this opaque object and passes it back to `hspkSign`. */
|
|
19
|
+
export interface SealedPqcKey {
|
|
20
|
+
readonly scheme: string;
|
|
21
|
+
readonly algorithm: string;
|
|
22
|
+
readonly hsmKeyId: string;
|
|
23
|
+
readonly wrappedCek: string;
|
|
24
|
+
readonly iv: string;
|
|
25
|
+
readonly ciphertext: string;
|
|
26
|
+
readonly authTag: string;
|
|
27
|
+
readonly publicKey: string;
|
|
28
|
+
readonly sealedAt: string;
|
|
29
|
+
}
|
|
30
|
+
export interface HspkSealRequest {
|
|
31
|
+
/** An active BYOHSM connection the tenant has provisioned. */
|
|
32
|
+
readonly connectionId: string;
|
|
33
|
+
/** keyId of an HSM RSA key with encrypt+decrypt usage (the custody root). */
|
|
34
|
+
readonly keyId: string;
|
|
35
|
+
/** PQC signature algorithm to generate + seal. Default: "ml-dsa-65". */
|
|
36
|
+
readonly algorithm?: "ml-dsa-44" | "ml-dsa-65" | "ml-dsa-87";
|
|
37
|
+
/** RSA-OAEP hash; default "sha256". Use "sha1" only for HSMs that require it. */
|
|
38
|
+
readonly oaepHash?: "sha1" | "sha256";
|
|
39
|
+
}
|
|
40
|
+
export interface HspkSealResponse {
|
|
41
|
+
readonly algorithm: string;
|
|
42
|
+
/** PQC public key, base64. */
|
|
43
|
+
readonly publicKey: string;
|
|
44
|
+
readonly sealedKey: SealedPqcKey;
|
|
45
|
+
readonly hsmKeyHandle: string;
|
|
46
|
+
}
|
|
47
|
+
export interface HspkSignRequest {
|
|
48
|
+
readonly connectionId: string;
|
|
49
|
+
/** The same HSM RSA custody key used to seal. */
|
|
50
|
+
readonly keyId: string;
|
|
51
|
+
/** The object returned by `hspkSeal`. */
|
|
52
|
+
readonly sealedKey: SealedPqcKey;
|
|
53
|
+
/** Must match the oaepHash used at seal time. Default: "sha256". */
|
|
54
|
+
readonly oaepHash?: "sha1" | "sha256";
|
|
55
|
+
}
|
|
17
56
|
export declare class KmsClient {
|
|
18
57
|
private readonly internal;
|
|
19
58
|
constructor(internal: Internal);
|
|
@@ -26,5 +65,25 @@ export declare class KmsClient {
|
|
|
26
65
|
verify(keyId: string, data: Uint8Array, signature: Uint8Array): Promise<boolean>;
|
|
27
66
|
wrap(keyId: string, plaintext: Uint8Array, opts?: Pick<RequestOptions, "idempotencyKey">): Promise<Uint8Array>;
|
|
28
67
|
unwrap(keyId: string, ciphertext: Uint8Array, opts?: Pick<RequestOptions, "idempotencyKey">): Promise<Uint8Array>;
|
|
68
|
+
/**
|
|
69
|
+
* HSM-Sealed Post-Quantum Keys (HSPK): generate a NIST PQC keypair and seal its
|
|
70
|
+
* private key under a non-extractable HSM RSA-OAEP custody key on your BYOHSM
|
|
71
|
+
* connection — giving the PQC key a FIPS hardware root of trust at rest. Stateless:
|
|
72
|
+
* store the returned `sealedKey` and pass it to `hspkSign`. Requires a customer-
|
|
73
|
+
* provisioned BYOHSM connection with an RSA encrypt/decrypt key.
|
|
74
|
+
*
|
|
75
|
+
* Wire contract: sealPqcSchema = { tenantId, connectionId, keyId, algorithm?,
|
|
76
|
+
* oaepHash? }; response { algorithm, publicKey, sealedKey, hsmKeyHandle }.
|
|
77
|
+
*/
|
|
78
|
+
hspkSeal(req: HspkSealRequest, opts?: Pick<RequestOptions, "idempotencyKey">): Promise<HspkSealResponse>;
|
|
79
|
+
/**
|
|
80
|
+
* HSPK: unseal a previously sealed PQC private key via the HSM (which RSA-OAEP-
|
|
81
|
+
* unwraps the content key) and sign `data`. The PQC private key exists in plaintext
|
|
82
|
+
* only transiently in memory during the signature.
|
|
83
|
+
*
|
|
84
|
+
* Wire contract: signPqcSchema = { tenantId, connectionId, keyId, sealedKey,
|
|
85
|
+
* data(base64), oaepHash? }; response { algorithm, signature(base64) }.
|
|
86
|
+
*/
|
|
87
|
+
hspkSign(req: HspkSignRequest, data: Uint8Array, opts?: Pick<RequestOptions, "idempotencyKey">): Promise<Uint8Array>;
|
|
29
88
|
}
|
|
30
89
|
//# sourceMappingURL=kms.d.ts.map
|
package/dist/kms.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kms.d.ts","sourceRoot":"","sources":["../src/kms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAK/D,MAAM,WAAW,gBAAgB;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IACvD,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAoBD,qBAAa,SAAS;IACT,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAE/C,SAAS,CAAC,GAAG,GAAE,gBAAqB,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC;IAkBnF,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC;IAIxC,MAAM,CAAC,KAAK,EAAE,MAAM;IAIpB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC;IAkBvF,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIpD,IAAI,CACT,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAC3C,OAAO,CAAC,UAAU,CAAC;IAgBhB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAYhF,IAAI,CACT,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,UAAU,EACrB,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAC3C,OAAO,CAAC,UAAU,CAAC;IAmBhB,MAAM,CACX,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,UAAU,EACtB,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAC3C,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"kms.d.ts","sourceRoot":"","sources":["../src/kms.ts"],"names":[],"mappings":"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"}
|
package/dist/kms.js
CHANGED
|
@@ -97,6 +97,47 @@ export class KmsClient {
|
|
|
97
97
|
}
|
|
98
98
|
return decodeB64(unwrapped);
|
|
99
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* HSM-Sealed Post-Quantum Keys (HSPK): generate a NIST PQC keypair and seal its
|
|
102
|
+
* private key under a non-extractable HSM RSA-OAEP custody key on your BYOHSM
|
|
103
|
+
* connection — giving the PQC key a FIPS hardware root of trust at rest. Stateless:
|
|
104
|
+
* store the returned `sealedKey` and pass it to `hspkSign`. Requires a customer-
|
|
105
|
+
* provisioned BYOHSM connection with an RSA encrypt/decrypt key.
|
|
106
|
+
*
|
|
107
|
+
* Wire contract: sealPqcSchema = { tenantId, connectionId, keyId, algorithm?,
|
|
108
|
+
* oaepHash? }; response { algorithm, publicKey, sealedKey, hsmKeyHandle }.
|
|
109
|
+
*/
|
|
110
|
+
hspkSeal(req, opts) {
|
|
111
|
+
const body = { connectionId: req.connectionId, keyId: req.keyId };
|
|
112
|
+
if (req.algorithm)
|
|
113
|
+
body["algorithm"] = req.algorithm;
|
|
114
|
+
if (req.oaepHash)
|
|
115
|
+
body["oaepHash"] = req.oaepHash;
|
|
116
|
+
return this.internal.request("POST", `${PATH_PREFIX}/byohsm/pqc/seal`, body, opts);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* HSPK: unseal a previously sealed PQC private key via the HSM (which RSA-OAEP-
|
|
120
|
+
* unwraps the content key) and sign `data`. The PQC private key exists in plaintext
|
|
121
|
+
* only transiently in memory during the signature.
|
|
122
|
+
*
|
|
123
|
+
* Wire contract: signPqcSchema = { tenantId, connectionId, keyId, sealedKey,
|
|
124
|
+
* data(base64), oaepHash? }; response { algorithm, signature(base64) }.
|
|
125
|
+
*/
|
|
126
|
+
async hspkSign(req, data, opts) {
|
|
127
|
+
const body = {
|
|
128
|
+
connectionId: req.connectionId,
|
|
129
|
+
keyId: req.keyId,
|
|
130
|
+
sealedKey: req.sealedKey,
|
|
131
|
+
data: encodeB64(data),
|
|
132
|
+
};
|
|
133
|
+
if (req.oaepHash)
|
|
134
|
+
body["oaepHash"] = req.oaepHash;
|
|
135
|
+
const resp = await this.internal.request("POST", `${PATH_PREFIX}/byohsm/pqc/sign`, body, opts);
|
|
136
|
+
if (!resp.signature) {
|
|
137
|
+
throw new QnsiApiError("kms.hspkSign: response missing signature", 200);
|
|
138
|
+
}
|
|
139
|
+
return decodeB64(resp.signature);
|
|
140
|
+
}
|
|
100
141
|
}
|
|
101
142
|
function encodeB64(bytes) {
|
|
102
143
|
return Buffer.from(bytes).toString("base64");
|
package/dist/kms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kms.js","sourceRoot":"","sources":["../src/kms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"kms.js","sourceRoot":"","sources":["../src/kms.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heossi/qnsi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
"types": "./dist/autogen/index.d.ts",
|
|
35
35
|
"import": "./dist/autogen/index.js"
|
|
36
36
|
},
|
|
37
|
+
"./code-scan": {
|
|
38
|
+
"types": "./dist/code-scan/index.d.ts",
|
|
39
|
+
"import": "./dist/code-scan/index.js"
|
|
40
|
+
},
|
|
37
41
|
"./package.json": "./package.json"
|
|
38
42
|
},
|
|
39
43
|
"bin": {
|