@agentuity/cli 0.0.51 → 0.0.53
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/api.js +68 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.js +225 -0
- package/dist/auth.js.map +1 -0
- package/dist/banner.js +35 -0
- package/dist/banner.js.map +1 -0
- package/dist/cli-logger.js +72 -0
- package/dist/cli-logger.js.map +1 -0
- package/dist/cli.js +822 -0
- package/dist/cli.js.map +1 -0
- package/dist/cmd/ai/capabilities/index.js +10 -0
- package/dist/cmd/ai/capabilities/index.js.map +1 -0
- package/dist/cmd/ai/capabilities/show.js +221 -0
- package/dist/cmd/ai/capabilities/show.js.map +1 -0
- package/dist/cmd/ai/index.js +11 -0
- package/dist/cmd/ai/index.js.map +1 -0
- package/dist/cmd/ai/prompt/index.js +10 -0
- package/dist/cmd/ai/prompt/index.js.map +1 -0
- package/dist/cmd/ai/prompt/llm.js +365 -0
- package/dist/cmd/ai/prompt/llm.js.map +1 -0
- package/dist/cmd/ai/schema/index.js +10 -0
- package/dist/cmd/ai/schema/index.js.map +1 -0
- package/dist/cmd/ai/schema/show.js +23 -0
- package/dist/cmd/ai/schema/show.js.map +1 -0
- package/dist/cmd/auth/api.js +85 -0
- package/dist/cmd/auth/api.js.map +1 -0
- package/dist/cmd/auth/index.js +13 -0
- package/dist/cmd/auth/index.js.map +1 -0
- package/dist/cmd/auth/login.js +84 -0
- package/dist/cmd/auth/login.js.map +1 -0
- package/dist/cmd/auth/logout.js +17 -0
- package/dist/cmd/auth/logout.js.map +1 -0
- package/dist/cmd/auth/signup.js +55 -0
- package/dist/cmd/auth/signup.js.map +1 -0
- package/dist/cmd/auth/ssh/add.js +239 -0
- package/dist/cmd/auth/ssh/add.js.map +1 -0
- package/dist/cmd/auth/ssh/api.js +53 -0
- package/dist/cmd/auth/ssh/api.js.map +1 -0
- package/dist/cmd/auth/ssh/delete.js +126 -0
- package/dist/cmd/auth/ssh/delete.js.map +1 -0
- package/dist/cmd/auth/ssh/index.js +11 -0
- package/dist/cmd/auth/ssh/index.js.map +1 -0
- package/dist/cmd/auth/ssh/list.js +70 -0
- package/dist/cmd/auth/ssh/list.js.map +1 -0
- package/dist/cmd/auth/whoami.js +68 -0
- package/dist/cmd/auth/whoami.js.map +1 -0
- package/dist/cmd/build/ast.js +608 -0
- package/dist/cmd/build/ast.js.map +1 -0
- package/dist/cmd/build/ast.test.js +389 -0
- package/dist/cmd/build/ast.test.js.map +1 -0
- package/dist/cmd/build/bundler.js +304 -0
- package/dist/cmd/build/bundler.js.map +1 -0
- package/dist/cmd/build/file.js +10 -0
- package/dist/cmd/build/file.js.map +1 -0
- package/dist/cmd/build/fix-duplicate-exports.js +167 -0
- package/dist/cmd/build/fix-duplicate-exports.js.map +1 -0
- package/dist/cmd/build/fix-duplicate-exports.test.js +300 -0
- package/dist/cmd/build/fix-duplicate-exports.test.js.map +1 -0
- package/dist/cmd/build/index.d.ts.map +1 -1
- package/dist/cmd/build/index.js +81 -0
- package/dist/cmd/build/index.js.map +1 -0
- package/dist/cmd/build/patch/_util.js +42 -0
- package/dist/cmd/build/patch/_util.js.map +1 -0
- package/dist/cmd/build/patch/aisdk.js +65 -0
- package/dist/cmd/build/patch/aisdk.js.map +1 -0
- package/dist/cmd/build/patch/index.js +97 -0
- package/dist/cmd/build/patch/index.js.map +1 -0
- package/dist/cmd/build/patch/llm.js +18 -0
- package/dist/cmd/build/patch/llm.js.map +1 -0
- package/dist/cmd/build/plugin.d.ts.map +1 -1
- package/dist/cmd/build/plugin.js +581 -0
- package/dist/cmd/build/plugin.js.map +1 -0
- package/dist/cmd/cloud/agents/index.js +133 -0
- package/dist/cmd/cloud/agents/index.js.map +1 -0
- package/dist/cmd/cloud/deploy.js +341 -0
- package/dist/cmd/cloud/deploy.js.map +1 -0
- package/dist/cmd/cloud/deployment/index.js +20 -0
- package/dist/cmd/cloud/deployment/index.js.map +1 -0
- package/dist/cmd/cloud/deployment/list.js +89 -0
- package/dist/cmd/cloud/deployment/list.js.map +1 -0
- package/dist/cmd/cloud/deployment/remove.js +60 -0
- package/dist/cmd/cloud/deployment/remove.js.map +1 -0
- package/dist/cmd/cloud/deployment/rollback.js +80 -0
- package/dist/cmd/cloud/deployment/rollback.js.map +1 -0
- package/dist/cmd/cloud/deployment/show.js +106 -0
- package/dist/cmd/cloud/deployment/show.js.map +1 -0
- package/dist/cmd/cloud/deployment/undeploy.js +45 -0
- package/dist/cmd/cloud/deployment/undeploy.js.map +1 -0
- package/dist/cmd/cloud/deployment/utils.js +10 -0
- package/dist/cmd/cloud/deployment/utils.js.map +1 -0
- package/dist/cmd/cloud/domain.js +77 -0
- package/dist/cmd/cloud/domain.js.map +1 -0
- package/dist/cmd/cloud/env/delete.js +50 -0
- package/dist/cmd/cloud/env/delete.js.map +1 -0
- package/dist/cmd/cloud/env/get.js +65 -0
- package/dist/cmd/cloud/env/get.js.map +1 -0
- package/dist/cmd/cloud/env/import.js +113 -0
- package/dist/cmd/cloud/env/import.js.map +1 -0
- package/dist/cmd/cloud/env/index.js +24 -0
- package/dist/cmd/cloud/env/index.js.map +1 -0
- package/dist/cmd/cloud/env/list.js +58 -0
- package/dist/cmd/cloud/env/list.js.map +1 -0
- package/dist/cmd/cloud/env/pull.js +81 -0
- package/dist/cmd/cloud/env/pull.js.map +1 -0
- package/dist/cmd/cloud/env/push.js +61 -0
- package/dist/cmd/cloud/env/push.js.map +1 -0
- package/dist/cmd/cloud/env/set.js +73 -0
- package/dist/cmd/cloud/env/set.js.map +1 -0
- package/dist/cmd/cloud/index.js +31 -0
- package/dist/cmd/cloud/index.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/create-namespace.js +41 -0
- package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/delete-namespace.js +64 -0
- package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/delete.js +47 -0
- package/dist/cmd/cloud/keyvalue/delete.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/get.js +65 -0
- package/dist/cmd/cloud/keyvalue/get.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/index.js +32 -0
- package/dist/cmd/cloud/keyvalue/index.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/keys.js +50 -0
- package/dist/cmd/cloud/keyvalue/keys.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/list-namespaces.js +37 -0
- package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/repl.js +277 -0
- package/dist/cmd/cloud/keyvalue/repl.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/search.js +72 -0
- package/dist/cmd/cloud/keyvalue/search.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/set.js +59 -0
- package/dist/cmd/cloud/keyvalue/set.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/stats.js +82 -0
- package/dist/cmd/cloud/keyvalue/stats.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/util.js +19 -0
- package/dist/cmd/cloud/keyvalue/util.js.map +1 -0
- package/dist/cmd/cloud/objectstore/delete-bucket.js +66 -0
- package/dist/cmd/cloud/objectstore/delete-bucket.js.map +1 -0
- package/dist/cmd/cloud/objectstore/delete.js +56 -0
- package/dist/cmd/cloud/objectstore/delete.js.map +1 -0
- package/dist/cmd/cloud/objectstore/get.js +64 -0
- package/dist/cmd/cloud/objectstore/get.js.map +1 -0
- package/dist/cmd/cloud/objectstore/index.js +28 -0
- package/dist/cmd/cloud/objectstore/index.js.map +1 -0
- package/dist/cmd/cloud/objectstore/list-buckets.js +37 -0
- package/dist/cmd/cloud/objectstore/list-buckets.js.map +1 -0
- package/dist/cmd/cloud/objectstore/list-keys.js +52 -0
- package/dist/cmd/cloud/objectstore/list-keys.js.map +1 -0
- package/dist/cmd/cloud/objectstore/put.js +57 -0
- package/dist/cmd/cloud/objectstore/put.js.map +1 -0
- package/dist/cmd/cloud/objectstore/repl.js +219 -0
- package/dist/cmd/cloud/objectstore/repl.js.map +1 -0
- package/dist/cmd/cloud/objectstore/url.js +55 -0
- package/dist/cmd/cloud/objectstore/url.js.map +1 -0
- package/dist/cmd/cloud/objectstore/util.js +18 -0
- package/dist/cmd/cloud/objectstore/util.js.map +1 -0
- package/dist/cmd/cloud/resource/add.js +70 -0
- package/dist/cmd/cloud/resource/add.js.map +1 -0
- package/dist/cmd/cloud/resource/delete.js +126 -0
- package/dist/cmd/cloud/resource/delete.js.map +1 -0
- package/dist/cmd/cloud/resource/index.js +12 -0
- package/dist/cmd/cloud/resource/index.js.map +1 -0
- package/dist/cmd/cloud/resource/list.js +89 -0
- package/dist/cmd/cloud/resource/list.js.map +1 -0
- package/dist/cmd/cloud/scp/download.js +72 -0
- package/dist/cmd/cloud/scp/download.js.map +1 -0
- package/dist/cmd/cloud/scp/index.js +10 -0
- package/dist/cmd/cloud/scp/index.js.map +1 -0
- package/dist/cmd/cloud/scp/upload.js +75 -0
- package/dist/cmd/cloud/scp/upload.js.map +1 -0
- package/dist/cmd/cloud/secret/delete.js +50 -0
- package/dist/cmd/cloud/secret/delete.js.map +1 -0
- package/dist/cmd/cloud/secret/get.js +69 -0
- package/dist/cmd/cloud/secret/get.js.map +1 -0
- package/dist/cmd/cloud/secret/import.js +88 -0
- package/dist/cmd/cloud/secret/import.js.map +1 -0
- package/dist/cmd/cloud/secret/index.js +24 -0
- package/dist/cmd/cloud/secret/index.js.map +1 -0
- package/dist/cmd/cloud/secret/list.js +58 -0
- package/dist/cmd/cloud/secret/list.js.map +1 -0
- package/dist/cmd/cloud/secret/pull.js +81 -0
- package/dist/cmd/cloud/secret/pull.js.map +1 -0
- package/dist/cmd/cloud/secret/push.js +61 -0
- package/dist/cmd/cloud/secret/push.js.map +1 -0
- package/dist/cmd/cloud/secret/set.js +57 -0
- package/dist/cmd/cloud/secret/set.js.map +1 -0
- package/dist/cmd/cloud/session/get.d.ts.map +1 -1
- package/dist/cmd/cloud/session/get.js +155 -0
- package/dist/cmd/cloud/session/get.js.map +1 -0
- package/dist/cmd/cloud/session/index.js +11 -0
- package/dist/cmd/cloud/session/index.js.map +1 -0
- package/dist/cmd/cloud/session/list.js +132 -0
- package/dist/cmd/cloud/session/list.js.map +1 -0
- package/dist/cmd/cloud/session/logs.js +56 -0
- package/dist/cmd/cloud/session/logs.js.map +1 -0
- package/dist/cmd/cloud/ssh.js +67 -0
- package/dist/cmd/cloud/ssh.js.map +1 -0
- package/dist/cmd/dev/agents.js +103 -0
- package/dist/cmd/dev/agents.js.map +1 -0
- package/dist/cmd/dev/api.js +26 -0
- package/dist/cmd/dev/api.js.map +1 -0
- package/dist/cmd/dev/download.js +77 -0
- package/dist/cmd/dev/download.js.map +1 -0
- package/dist/cmd/dev/index.js +745 -0
- package/dist/cmd/dev/index.js.map +1 -0
- package/dist/cmd/dev/sync.js +229 -0
- package/dist/cmd/dev/sync.js.map +1 -0
- package/dist/cmd/dev/templates.js +75 -0
- package/dist/cmd/dev/templates.js.map +1 -0
- package/dist/cmd/index.js +49 -0
- package/dist/cmd/index.js.map +1 -0
- package/dist/cmd/profile/create.js +89 -0
- package/dist/cmd/profile/create.js.map +1 -0
- package/dist/cmd/profile/delete.js +63 -0
- package/dist/cmd/profile/delete.js.map +1 -0
- package/dist/cmd/profile/index.js +14 -0
- package/dist/cmd/profile/index.js.map +1 -0
- package/dist/cmd/profile/list.js +28 -0
- package/dist/cmd/profile/list.js.map +1 -0
- package/dist/cmd/profile/show.js +68 -0
- package/dist/cmd/profile/show.js.map +1 -0
- package/dist/cmd/profile/use.js +37 -0
- package/dist/cmd/profile/use.js.map +1 -0
- package/dist/cmd/project/create.js +92 -0
- package/dist/cmd/project/create.js.map +1 -0
- package/dist/cmd/project/delete.js +117 -0
- package/dist/cmd/project/delete.js.map +1 -0
- package/dist/cmd/project/download.js +217 -0
- package/dist/cmd/project/download.js.map +1 -0
- package/dist/cmd/project/index.js +12 -0
- package/dist/cmd/project/index.js.map +1 -0
- package/dist/cmd/project/list.js +51 -0
- package/dist/cmd/project/list.js.map +1 -0
- package/dist/cmd/project/show.js +54 -0
- package/dist/cmd/project/show.js.map +1 -0
- package/dist/cmd/project/template-flow.js +315 -0
- package/dist/cmd/project/template-flow.js.map +1 -0
- package/dist/cmd/project/templates.js +31 -0
- package/dist/cmd/project/templates.js.map +1 -0
- package/dist/cmd/repl/index.js +444 -0
- package/dist/cmd/repl/index.js.map +1 -0
- package/dist/cmd/version/index.js +29 -0
- package/dist/cmd/version/index.js.map +1 -0
- package/dist/command-prefix.js +37 -0
- package/dist/command-prefix.js.map +1 -0
- package/dist/config.js +536 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/box.js +382 -0
- package/dist/crypto/box.js.map +1 -0
- package/dist/crypto/box.test.js +317 -0
- package/dist/crypto/box.test.js.map +1 -0
- package/dist/download.js +64 -0
- package/dist/download.js.map +1 -0
- package/dist/env-util.js +219 -0
- package/dist/env-util.js.map +1 -0
- package/dist/env-util.test.js +146 -0
- package/dist/env-util.test.js.map +1 -0
- package/dist/errors.js +177 -0
- package/dist/errors.js.map +1 -0
- package/dist/explain.js +90 -0
- package/dist/explain.js.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/json.js +29 -0
- package/dist/json.js.map +1 -0
- package/dist/legacy-check.js +104 -0
- package/dist/legacy-check.js.map +1 -0
- package/dist/output.js +207 -0
- package/dist/output.js.map +1 -0
- package/dist/repl.js +1176 -0
- package/dist/repl.js.map +1 -0
- package/dist/runtime.js +19 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema-generator.js +289 -0
- package/dist/schema-generator.js.map +1 -0
- package/dist/schema-parser.js +145 -0
- package/dist/schema-parser.js.map +1 -0
- package/dist/sound.js +44 -0
- package/dist/sound.js.map +1 -0
- package/dist/steps.js +293 -0
- package/dist/steps.js.map +1 -0
- package/dist/terminal.js +130 -0
- package/dist/terminal.js.map +1 -0
- package/dist/tui.js +1124 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.js +163 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/detectSubagent.js +25 -0
- package/dist/utils/detectSubagent.js.map +1 -0
- package/dist/utils/format.js +21 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/zip.js +33 -0
- package/dist/utils/zip.js.map +1 -0
- package/dist/version.js +24 -0
- package/dist/version.js.map +1 -0
- package/package.json +6 -6
- package/src/banner.ts +1 -1
- package/src/cmd/build/index.ts +18 -22
- package/src/cmd/build/plugin.ts +95 -64
- package/src/cmd/cloud/session/get.ts +20 -14
- package/src/cmd/cloud/session/list.ts +1 -1
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package crypto implements a **FIPS 140-3 compliant KEM-DEM envelope encryption scheme**
|
|
3
|
+
* suitable for multi-gigabyte streams using ECDH P-256 and AES-256-GCM.
|
|
4
|
+
* This design is compatible with the Go implementation and depends only on standard
|
|
5
|
+
* Node.js crypto packages.
|
|
6
|
+
*
|
|
7
|
+
* ────────────────────────── Design summary ─────────────────────────────
|
|
8
|
+
*
|
|
9
|
+
* ⚙ KEM (Key-Encapsulation Mechanism)
|
|
10
|
+
* • ECDH P-256 + AES-256-GCM for DEK wrapping
|
|
11
|
+
* • Output: variable-size encrypted DEK (48-byte DEK + 16-byte GCM tag + ephemeral pubkey)
|
|
12
|
+
* • Provides forward secrecy for each blob
|
|
13
|
+
*
|
|
14
|
+
* ⚙ DEM (Data-Encapsulation Mechanism)
|
|
15
|
+
* • AES-256-GCM in ~64 KiB framed chunks (65519 bytes max)
|
|
16
|
+
* • Nonce = 4-byte random prefix ∥ 8-byte little-endian counter
|
|
17
|
+
* • First frame authenticates header via associated data (prevents tampering)
|
|
18
|
+
* • Constant ~64 KiB RAM, O(1) header re-wrap for key rotation
|
|
19
|
+
*
|
|
20
|
+
* ⚙ Fleet key
|
|
21
|
+
* • Single ECDSA P-256 key-pair per customer
|
|
22
|
+
* • Public key used directly for ECDH operations
|
|
23
|
+
* • Private key stored in cloud secret store and fetched at boot
|
|
24
|
+
*
|
|
25
|
+
* File layout
|
|
26
|
+
* ┌─────────────────────────────────────────────────────────────────────────┐
|
|
27
|
+
* │ uint16 wrappedLen │ 125B wrapped DEK │ 12B base nonce │ frames... │
|
|
28
|
+
* └─────────────────────────────────────────────────────────────────────────┘
|
|
29
|
+
* ▲ ▲
|
|
30
|
+
* │ └─ AES-256-GCM frames
|
|
31
|
+
* └─ ECDH + AES-GCM wrapped DEK
|
|
32
|
+
*
|
|
33
|
+
* Security properties
|
|
34
|
+
* • Confidentiality & integrity: AES-256-GCM per frame
|
|
35
|
+
* • Header authentication: first frame includes header as associated data
|
|
36
|
+
* • Forward-secrecy per object: new ephemeral ECDH key each encryption
|
|
37
|
+
* • Key rotation: requires re-wrapping only the ~139-byte header
|
|
38
|
+
* • FIPS 140-3 compliant: uses only approved algorithms
|
|
39
|
+
*
|
|
40
|
+
* Typical workflow
|
|
41
|
+
* ────────────────
|
|
42
|
+
* Publisher:
|
|
43
|
+
* 1) generate DEK, encrypt stream → dst
|
|
44
|
+
* 2) ephemeral ECDH + AES-GCM wrap DEK with fleet public key
|
|
45
|
+
* 3) write header {len, wrapped DEK, nonce} - ~139 bytes total
|
|
46
|
+
* 4) first frame includes header as associated data for authentication
|
|
47
|
+
*
|
|
48
|
+
* Machine node:
|
|
49
|
+
* 1) read header, unwrap DEK with fleet private key via ECDH
|
|
50
|
+
* 2) stream-decrypt frames on the fly (first frame verifies header)
|
|
51
|
+
*
|
|
52
|
+
* Public API
|
|
53
|
+
* ──────────
|
|
54
|
+
*
|
|
55
|
+
* encryptFIPSKEMDEMStream(publicKey: KeyObject, src: Readable, dst: Writable): Promise<number>
|
|
56
|
+
* decryptFIPSKEMDEMStream(privateKey: KeyObject, src: Readable, dst: Writable): Promise<number>
|
|
57
|
+
*
|
|
58
|
+
* Both return the number of plaintext bytes processed and ensure that
|
|
59
|
+
* every error path is authenticated-failure-safe.
|
|
60
|
+
*/
|
|
61
|
+
import { createCipheriv, createDecipheriv, createECDH, randomBytes } from 'node:crypto';
|
|
62
|
+
import { createHash } from 'node:crypto';
|
|
63
|
+
const FRAME = 65519;
|
|
64
|
+
const DEK_SIZE = 32;
|
|
65
|
+
const GCM_TAG = 16;
|
|
66
|
+
const PUBKEY_LEN = 65;
|
|
67
|
+
function concatKDFSHA256(z, keyDataLen, ...otherInfo) {
|
|
68
|
+
const h = createHash('sha256');
|
|
69
|
+
h.update(Buffer.from([0x00, 0x00, 0x00, 0x01]));
|
|
70
|
+
h.update(z);
|
|
71
|
+
for (const info of otherInfo) {
|
|
72
|
+
h.update(info);
|
|
73
|
+
}
|
|
74
|
+
const keyDataLenBits = keyDataLen * 8;
|
|
75
|
+
h.update(Buffer.from([
|
|
76
|
+
(keyDataLenBits >> 24) & 0xff,
|
|
77
|
+
(keyDataLenBits >> 16) & 0xff,
|
|
78
|
+
(keyDataLenBits >> 8) & 0xff,
|
|
79
|
+
keyDataLenBits & 0xff,
|
|
80
|
+
]));
|
|
81
|
+
return h.digest();
|
|
82
|
+
}
|
|
83
|
+
function wrapDEKWithECDH(dek, recipientPub) {
|
|
84
|
+
const ephemeral = createECDH('prime256v1');
|
|
85
|
+
ephemeral.generateKeys();
|
|
86
|
+
const jwk = recipientPub.export({ format: 'jwk' });
|
|
87
|
+
if (!jwk.x || !jwk.y) {
|
|
88
|
+
throw new Error('Invalid EC public key');
|
|
89
|
+
}
|
|
90
|
+
const xBuf = Buffer.from(jwk.x, 'base64url');
|
|
91
|
+
const yBuf = Buffer.from(jwk.y, 'base64url');
|
|
92
|
+
const pubKeyPoint = Buffer.concat([Buffer.from([0x04]), xBuf, yBuf]);
|
|
93
|
+
const sharedSecret = ephemeral.computeSecret(pubKeyPoint);
|
|
94
|
+
const kek = concatKDFSHA256(sharedSecret, 32, Buffer.from('AES-256-GCM'));
|
|
95
|
+
sharedSecret.fill(0);
|
|
96
|
+
const nonce = randomBytes(12);
|
|
97
|
+
const cipher = createCipheriv('aes-256-gcm', kek, nonce);
|
|
98
|
+
const ciphertext = Buffer.concat([cipher.update(dek), cipher.final()]);
|
|
99
|
+
const tag = cipher.getAuthTag();
|
|
100
|
+
kek.fill(0);
|
|
101
|
+
const ephemeralPubBytes = ephemeral.getPublicKey(undefined, 'uncompressed');
|
|
102
|
+
return Buffer.concat([ephemeralPubBytes, nonce, ciphertext, tag]);
|
|
103
|
+
}
|
|
104
|
+
function unwrapDEKWithECDH(wrapped, recipientPriv) {
|
|
105
|
+
if (wrapped.length < PUBKEY_LEN + 12 + DEK_SIZE + GCM_TAG) {
|
|
106
|
+
throw new Error('wrapped DEK too short');
|
|
107
|
+
}
|
|
108
|
+
const ephemeralPubBytes = wrapped.subarray(0, PUBKEY_LEN);
|
|
109
|
+
const remaining = wrapped.subarray(PUBKEY_LEN);
|
|
110
|
+
const jwk = recipientPriv.export({ format: 'jwk' });
|
|
111
|
+
if (!jwk.d) {
|
|
112
|
+
throw new Error('Invalid EC private key');
|
|
113
|
+
}
|
|
114
|
+
const ecdh = createECDH('prime256v1');
|
|
115
|
+
const dBuf = Buffer.from(jwk.d, 'base64url');
|
|
116
|
+
try {
|
|
117
|
+
ecdh.setPrivateKey(dBuf);
|
|
118
|
+
const sharedSecret = ecdh.computeSecret(ephemeralPubBytes);
|
|
119
|
+
const kek = concatKDFSHA256(sharedSecret, 32, Buffer.from('AES-256-GCM'));
|
|
120
|
+
sharedSecret.fill(0);
|
|
121
|
+
const nonceSize = 12;
|
|
122
|
+
if (remaining.length < nonceSize) {
|
|
123
|
+
throw new Error('invalid wrapped DEK format');
|
|
124
|
+
}
|
|
125
|
+
const nonce = remaining.subarray(0, nonceSize);
|
|
126
|
+
const ciphertextAndTag = remaining.subarray(nonceSize);
|
|
127
|
+
if (ciphertextAndTag.length < GCM_TAG) {
|
|
128
|
+
throw new Error('invalid wrapped DEK format');
|
|
129
|
+
}
|
|
130
|
+
const ciphertext = ciphertextAndTag.subarray(0, ciphertextAndTag.length - GCM_TAG);
|
|
131
|
+
const tag = ciphertextAndTag.subarray(ciphertextAndTag.length - GCM_TAG);
|
|
132
|
+
const decipher = createDecipheriv('aes-256-gcm', kek, nonce);
|
|
133
|
+
decipher.setAuthTag(tag);
|
|
134
|
+
let plaintext;
|
|
135
|
+
try {
|
|
136
|
+
plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
137
|
+
}
|
|
138
|
+
catch (_err) {
|
|
139
|
+
throw new Error('DEK unwrap failed');
|
|
140
|
+
}
|
|
141
|
+
kek.fill(0);
|
|
142
|
+
return plaintext;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
dBuf.fill(0);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function makeNonce(prefix, counter) {
|
|
149
|
+
const nonce = Buffer.alloc(12);
|
|
150
|
+
prefix.copy(nonce, 0, 0, 4);
|
|
151
|
+
nonce.writeBigUInt64LE(counter, 4);
|
|
152
|
+
return nonce;
|
|
153
|
+
}
|
|
154
|
+
export async function encryptFIPSKEMDEMStream(pub, src, dst) {
|
|
155
|
+
if (pub.asymmetricKeyType !== 'ec') {
|
|
156
|
+
throw new Error('only EC keys supported');
|
|
157
|
+
}
|
|
158
|
+
const keyDetails = pub.asymmetricKeyDetails;
|
|
159
|
+
if (!keyDetails || keyDetails.namedCurve !== 'prime256v1') {
|
|
160
|
+
throw new Error('only P-256 keys supported');
|
|
161
|
+
}
|
|
162
|
+
const dek = randomBytes(DEK_SIZE);
|
|
163
|
+
let buf;
|
|
164
|
+
const it = src[Symbol.asyncIterator]();
|
|
165
|
+
try {
|
|
166
|
+
const wrapped = wrapDEKWithECDH(dek, pub);
|
|
167
|
+
const baseNonce = Buffer.alloc(12);
|
|
168
|
+
randomBytes(4).copy(baseNonce, 0);
|
|
169
|
+
const lenBuf = Buffer.alloc(2);
|
|
170
|
+
lenBuf.writeUInt16BE(wrapped.length, 0);
|
|
171
|
+
await writeAsync(dst, lenBuf);
|
|
172
|
+
await writeAsync(dst, wrapped);
|
|
173
|
+
await writeAsync(dst, baseNonce);
|
|
174
|
+
let counter = 0n;
|
|
175
|
+
let total = 0;
|
|
176
|
+
const headerAD = Buffer.alloc(2 + 12);
|
|
177
|
+
headerAD.writeUInt16BE(wrapped.length, 0);
|
|
178
|
+
baseNonce.copy(headerAD, 2);
|
|
179
|
+
buf = Buffer.alloc(FRAME);
|
|
180
|
+
while (true) {
|
|
181
|
+
const bytesRead = await readFull(it, src, buf);
|
|
182
|
+
if (bytesRead === 0) {
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
const plaintext = buf.subarray(0, bytesRead);
|
|
186
|
+
const nonce = makeNonce(baseNonce, counter);
|
|
187
|
+
const cipher = createCipheriv('aes-256-gcm', dek, nonce);
|
|
188
|
+
if (counter === 0n) {
|
|
189
|
+
cipher.setAAD(headerAD);
|
|
190
|
+
}
|
|
191
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
192
|
+
const tag = cipher.getAuthTag();
|
|
193
|
+
const ct = Buffer.concat([ciphertext, tag]);
|
|
194
|
+
if (ct.length > 0xffff) {
|
|
195
|
+
throw new Error('ciphertext length exceeds uint16 limit');
|
|
196
|
+
}
|
|
197
|
+
const ctLenBuf = Buffer.alloc(2);
|
|
198
|
+
ctLenBuf.writeUInt16BE(ct.length, 0);
|
|
199
|
+
await writeAsync(dst, ctLenBuf);
|
|
200
|
+
await writeAsync(dst, ct);
|
|
201
|
+
counter++;
|
|
202
|
+
total += bytesRead;
|
|
203
|
+
if (bytesRead < FRAME) {
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return total;
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
dek.fill(0);
|
|
211
|
+
if (buf)
|
|
212
|
+
buf.fill(0);
|
|
213
|
+
await it.return?.().catch(() => { });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
export async function decryptFIPSKEMDEMStream(priv, src, dst) {
|
|
217
|
+
if (priv.asymmetricKeyType !== 'ec') {
|
|
218
|
+
throw new Error('only EC keys supported');
|
|
219
|
+
}
|
|
220
|
+
const keyDetails = priv.asymmetricKeyDetails;
|
|
221
|
+
if (!keyDetails || keyDetails.namedCurve !== 'prime256v1') {
|
|
222
|
+
throw new Error('only P-256 keys supported');
|
|
223
|
+
}
|
|
224
|
+
const it = src[Symbol.asyncIterator]();
|
|
225
|
+
try {
|
|
226
|
+
const lenBuf = Buffer.alloc(2);
|
|
227
|
+
await readExact(it, src, lenBuf);
|
|
228
|
+
const wrappedLen = lenBuf.readUInt16BE(0);
|
|
229
|
+
if (wrappedLen === 0 || wrappedLen > 200) {
|
|
230
|
+
throw new Error('invalid wrapped DEK length');
|
|
231
|
+
}
|
|
232
|
+
const wrapped = Buffer.alloc(wrappedLen);
|
|
233
|
+
await readExact(it, src, wrapped);
|
|
234
|
+
const baseNonce = Buffer.alloc(12);
|
|
235
|
+
await readExact(it, src, baseNonce);
|
|
236
|
+
const dek = unwrapDEKWithECDH(wrapped, priv);
|
|
237
|
+
try {
|
|
238
|
+
let counter = 0n;
|
|
239
|
+
let total = 0;
|
|
240
|
+
const headerAD = Buffer.alloc(2 + 12);
|
|
241
|
+
headerAD.writeUInt16BE(wrappedLen, 0);
|
|
242
|
+
baseNonce.copy(headerAD, 2);
|
|
243
|
+
while (true) {
|
|
244
|
+
const chunkLenBuf = Buffer.alloc(2);
|
|
245
|
+
const chunkLenRead = await readUpTo(it, src, chunkLenBuf);
|
|
246
|
+
if (chunkLenRead === 0) {
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
if (chunkLenRead < 2) {
|
|
250
|
+
throw new Error('unexpected EOF reading chunk length');
|
|
251
|
+
}
|
|
252
|
+
const chunkLen = chunkLenBuf.readUInt16BE(0);
|
|
253
|
+
if (chunkLen > FRAME + GCM_TAG) {
|
|
254
|
+
throw new Error('chunk too large');
|
|
255
|
+
}
|
|
256
|
+
const cipherBuf = Buffer.alloc(chunkLen);
|
|
257
|
+
await readExact(it, src, cipherBuf);
|
|
258
|
+
if (cipherBuf.length < GCM_TAG) {
|
|
259
|
+
throw new Error('chunk too short for auth tag');
|
|
260
|
+
}
|
|
261
|
+
const ciphertext = cipherBuf.subarray(0, cipherBuf.length - GCM_TAG);
|
|
262
|
+
const tag = cipherBuf.subarray(cipherBuf.length - GCM_TAG);
|
|
263
|
+
const nonce = makeNonce(baseNonce, counter);
|
|
264
|
+
const decipher = createDecipheriv('aes-256-gcm', dek, nonce);
|
|
265
|
+
decipher.setAuthTag(tag);
|
|
266
|
+
if (counter === 0n) {
|
|
267
|
+
decipher.setAAD(headerAD);
|
|
268
|
+
}
|
|
269
|
+
let plain;
|
|
270
|
+
try {
|
|
271
|
+
plain = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
cipherBuf.fill(0);
|
|
275
|
+
throw err;
|
|
276
|
+
}
|
|
277
|
+
cipherBuf.fill(0);
|
|
278
|
+
await writeAsync(dst, plain);
|
|
279
|
+
counter++;
|
|
280
|
+
total += plain.length;
|
|
281
|
+
}
|
|
282
|
+
return total;
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
dek.fill(0);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
finally {
|
|
289
|
+
await it.return?.().catch(() => { });
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async function writeAsync(stream, chunk) {
|
|
293
|
+
return new Promise((resolve, reject) => {
|
|
294
|
+
let callbackCompleted = false;
|
|
295
|
+
let drainOccurred = false;
|
|
296
|
+
const cleanup = () => {
|
|
297
|
+
stream.off('drain', onDrain);
|
|
298
|
+
stream.off('error', onError);
|
|
299
|
+
};
|
|
300
|
+
const tryResolve = () => {
|
|
301
|
+
if (callbackCompleted && (canContinue || drainOccurred)) {
|
|
302
|
+
cleanup();
|
|
303
|
+
resolve();
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
const onDrain = () => {
|
|
307
|
+
drainOccurred = true;
|
|
308
|
+
tryResolve();
|
|
309
|
+
};
|
|
310
|
+
const onError = (err) => {
|
|
311
|
+
cleanup();
|
|
312
|
+
reject(err);
|
|
313
|
+
};
|
|
314
|
+
const canContinue = stream.write(chunk, (err) => {
|
|
315
|
+
callbackCompleted = true;
|
|
316
|
+
if (err) {
|
|
317
|
+
cleanup();
|
|
318
|
+
reject(err);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
tryResolve();
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
if (!canContinue) {
|
|
325
|
+
// Need to wait for drain - attach listeners
|
|
326
|
+
stream.once('drain', onDrain);
|
|
327
|
+
stream.once('error', onError);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
async function readFull(iterator, stream, buf) {
|
|
332
|
+
let offset = 0;
|
|
333
|
+
while (offset < buf.length) {
|
|
334
|
+
const result = await iterator.next();
|
|
335
|
+
if (result.done) {
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
const chunk = result.value;
|
|
339
|
+
const chunkBuf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
340
|
+
const toCopy = Math.min(chunkBuf.length, buf.length - offset);
|
|
341
|
+
chunkBuf.copy(buf, offset, 0, toCopy);
|
|
342
|
+
offset += toCopy;
|
|
343
|
+
if (offset >= buf.length && toCopy < chunkBuf.length) {
|
|
344
|
+
stream.unshift(chunkBuf.subarray(toCopy));
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return offset;
|
|
349
|
+
}
|
|
350
|
+
async function readExact(iterator, stream, buf) {
|
|
351
|
+
let offset = 0;
|
|
352
|
+
while (offset < buf.length) {
|
|
353
|
+
const result = await iterator.next();
|
|
354
|
+
if (result.done) {
|
|
355
|
+
throw new Error('unexpected EOF');
|
|
356
|
+
}
|
|
357
|
+
const chunk = result.value;
|
|
358
|
+
const chunkBuf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
359
|
+
const toCopy = Math.min(chunkBuf.length, buf.length - offset);
|
|
360
|
+
chunkBuf.copy(buf, offset, 0, toCopy);
|
|
361
|
+
offset += toCopy;
|
|
362
|
+
if (offset >= buf.length && toCopy < chunkBuf.length) {
|
|
363
|
+
stream.unshift(chunkBuf.subarray(toCopy));
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
async function readUpTo(iterator, stream, buf) {
|
|
369
|
+
const result = await iterator.next();
|
|
370
|
+
if (result.done) {
|
|
371
|
+
return 0;
|
|
372
|
+
}
|
|
373
|
+
const chunk = result.value;
|
|
374
|
+
const chunkBuf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
375
|
+
const toCopy = Math.min(chunkBuf.length, buf.length);
|
|
376
|
+
chunkBuf.copy(buf, 0, 0, toCopy);
|
|
377
|
+
if (toCopy < chunkBuf.length) {
|
|
378
|
+
stream.unshift(chunkBuf.subarray(toCopy));
|
|
379
|
+
}
|
|
380
|
+
return toCopy;
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=box.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/crypto/box.ts"],"names":[],"mappings":"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"}
|