@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.
Files changed (299) hide show
  1. package/dist/api.js +68 -0
  2. package/dist/api.js.map +1 -0
  3. package/dist/auth.js +225 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/banner.js +35 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/cli-logger.js +72 -0
  8. package/dist/cli-logger.js.map +1 -0
  9. package/dist/cli.js +822 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/cmd/ai/capabilities/index.js +10 -0
  12. package/dist/cmd/ai/capabilities/index.js.map +1 -0
  13. package/dist/cmd/ai/capabilities/show.js +221 -0
  14. package/dist/cmd/ai/capabilities/show.js.map +1 -0
  15. package/dist/cmd/ai/index.js +11 -0
  16. package/dist/cmd/ai/index.js.map +1 -0
  17. package/dist/cmd/ai/prompt/index.js +10 -0
  18. package/dist/cmd/ai/prompt/index.js.map +1 -0
  19. package/dist/cmd/ai/prompt/llm.js +365 -0
  20. package/dist/cmd/ai/prompt/llm.js.map +1 -0
  21. package/dist/cmd/ai/schema/index.js +10 -0
  22. package/dist/cmd/ai/schema/index.js.map +1 -0
  23. package/dist/cmd/ai/schema/show.js +23 -0
  24. package/dist/cmd/ai/schema/show.js.map +1 -0
  25. package/dist/cmd/auth/api.js +85 -0
  26. package/dist/cmd/auth/api.js.map +1 -0
  27. package/dist/cmd/auth/index.js +13 -0
  28. package/dist/cmd/auth/index.js.map +1 -0
  29. package/dist/cmd/auth/login.js +84 -0
  30. package/dist/cmd/auth/login.js.map +1 -0
  31. package/dist/cmd/auth/logout.js +17 -0
  32. package/dist/cmd/auth/logout.js.map +1 -0
  33. package/dist/cmd/auth/signup.js +55 -0
  34. package/dist/cmd/auth/signup.js.map +1 -0
  35. package/dist/cmd/auth/ssh/add.js +239 -0
  36. package/dist/cmd/auth/ssh/add.js.map +1 -0
  37. package/dist/cmd/auth/ssh/api.js +53 -0
  38. package/dist/cmd/auth/ssh/api.js.map +1 -0
  39. package/dist/cmd/auth/ssh/delete.js +126 -0
  40. package/dist/cmd/auth/ssh/delete.js.map +1 -0
  41. package/dist/cmd/auth/ssh/index.js +11 -0
  42. package/dist/cmd/auth/ssh/index.js.map +1 -0
  43. package/dist/cmd/auth/ssh/list.js +70 -0
  44. package/dist/cmd/auth/ssh/list.js.map +1 -0
  45. package/dist/cmd/auth/whoami.js +68 -0
  46. package/dist/cmd/auth/whoami.js.map +1 -0
  47. package/dist/cmd/build/ast.js +608 -0
  48. package/dist/cmd/build/ast.js.map +1 -0
  49. package/dist/cmd/build/ast.test.js +389 -0
  50. package/dist/cmd/build/ast.test.js.map +1 -0
  51. package/dist/cmd/build/bundler.js +304 -0
  52. package/dist/cmd/build/bundler.js.map +1 -0
  53. package/dist/cmd/build/file.js +10 -0
  54. package/dist/cmd/build/file.js.map +1 -0
  55. package/dist/cmd/build/fix-duplicate-exports.js +167 -0
  56. package/dist/cmd/build/fix-duplicate-exports.js.map +1 -0
  57. package/dist/cmd/build/fix-duplicate-exports.test.js +300 -0
  58. package/dist/cmd/build/fix-duplicate-exports.test.js.map +1 -0
  59. package/dist/cmd/build/index.d.ts.map +1 -1
  60. package/dist/cmd/build/index.js +81 -0
  61. package/dist/cmd/build/index.js.map +1 -0
  62. package/dist/cmd/build/patch/_util.js +42 -0
  63. package/dist/cmd/build/patch/_util.js.map +1 -0
  64. package/dist/cmd/build/patch/aisdk.js +65 -0
  65. package/dist/cmd/build/patch/aisdk.js.map +1 -0
  66. package/dist/cmd/build/patch/index.js +97 -0
  67. package/dist/cmd/build/patch/index.js.map +1 -0
  68. package/dist/cmd/build/patch/llm.js +18 -0
  69. package/dist/cmd/build/patch/llm.js.map +1 -0
  70. package/dist/cmd/build/plugin.d.ts.map +1 -1
  71. package/dist/cmd/build/plugin.js +581 -0
  72. package/dist/cmd/build/plugin.js.map +1 -0
  73. package/dist/cmd/cloud/agents/index.js +133 -0
  74. package/dist/cmd/cloud/agents/index.js.map +1 -0
  75. package/dist/cmd/cloud/deploy.js +341 -0
  76. package/dist/cmd/cloud/deploy.js.map +1 -0
  77. package/dist/cmd/cloud/deployment/index.js +20 -0
  78. package/dist/cmd/cloud/deployment/index.js.map +1 -0
  79. package/dist/cmd/cloud/deployment/list.js +89 -0
  80. package/dist/cmd/cloud/deployment/list.js.map +1 -0
  81. package/dist/cmd/cloud/deployment/remove.js +60 -0
  82. package/dist/cmd/cloud/deployment/remove.js.map +1 -0
  83. package/dist/cmd/cloud/deployment/rollback.js +80 -0
  84. package/dist/cmd/cloud/deployment/rollback.js.map +1 -0
  85. package/dist/cmd/cloud/deployment/show.js +106 -0
  86. package/dist/cmd/cloud/deployment/show.js.map +1 -0
  87. package/dist/cmd/cloud/deployment/undeploy.js +45 -0
  88. package/dist/cmd/cloud/deployment/undeploy.js.map +1 -0
  89. package/dist/cmd/cloud/deployment/utils.js +10 -0
  90. package/dist/cmd/cloud/deployment/utils.js.map +1 -0
  91. package/dist/cmd/cloud/domain.js +77 -0
  92. package/dist/cmd/cloud/domain.js.map +1 -0
  93. package/dist/cmd/cloud/env/delete.js +50 -0
  94. package/dist/cmd/cloud/env/delete.js.map +1 -0
  95. package/dist/cmd/cloud/env/get.js +65 -0
  96. package/dist/cmd/cloud/env/get.js.map +1 -0
  97. package/dist/cmd/cloud/env/import.js +113 -0
  98. package/dist/cmd/cloud/env/import.js.map +1 -0
  99. package/dist/cmd/cloud/env/index.js +24 -0
  100. package/dist/cmd/cloud/env/index.js.map +1 -0
  101. package/dist/cmd/cloud/env/list.js +58 -0
  102. package/dist/cmd/cloud/env/list.js.map +1 -0
  103. package/dist/cmd/cloud/env/pull.js +81 -0
  104. package/dist/cmd/cloud/env/pull.js.map +1 -0
  105. package/dist/cmd/cloud/env/push.js +61 -0
  106. package/dist/cmd/cloud/env/push.js.map +1 -0
  107. package/dist/cmd/cloud/env/set.js +73 -0
  108. package/dist/cmd/cloud/env/set.js.map +1 -0
  109. package/dist/cmd/cloud/index.js +31 -0
  110. package/dist/cmd/cloud/index.js.map +1 -0
  111. package/dist/cmd/cloud/keyvalue/create-namespace.js +41 -0
  112. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -0
  113. package/dist/cmd/cloud/keyvalue/delete-namespace.js +64 -0
  114. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -0
  115. package/dist/cmd/cloud/keyvalue/delete.js +47 -0
  116. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -0
  117. package/dist/cmd/cloud/keyvalue/get.js +65 -0
  118. package/dist/cmd/cloud/keyvalue/get.js.map +1 -0
  119. package/dist/cmd/cloud/keyvalue/index.js +32 -0
  120. package/dist/cmd/cloud/keyvalue/index.js.map +1 -0
  121. package/dist/cmd/cloud/keyvalue/keys.js +50 -0
  122. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -0
  123. package/dist/cmd/cloud/keyvalue/list-namespaces.js +37 -0
  124. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -0
  125. package/dist/cmd/cloud/keyvalue/repl.js +277 -0
  126. package/dist/cmd/cloud/keyvalue/repl.js.map +1 -0
  127. package/dist/cmd/cloud/keyvalue/search.js +72 -0
  128. package/dist/cmd/cloud/keyvalue/search.js.map +1 -0
  129. package/dist/cmd/cloud/keyvalue/set.js +59 -0
  130. package/dist/cmd/cloud/keyvalue/set.js.map +1 -0
  131. package/dist/cmd/cloud/keyvalue/stats.js +82 -0
  132. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -0
  133. package/dist/cmd/cloud/keyvalue/util.js +19 -0
  134. package/dist/cmd/cloud/keyvalue/util.js.map +1 -0
  135. package/dist/cmd/cloud/objectstore/delete-bucket.js +66 -0
  136. package/dist/cmd/cloud/objectstore/delete-bucket.js.map +1 -0
  137. package/dist/cmd/cloud/objectstore/delete.js +56 -0
  138. package/dist/cmd/cloud/objectstore/delete.js.map +1 -0
  139. package/dist/cmd/cloud/objectstore/get.js +64 -0
  140. package/dist/cmd/cloud/objectstore/get.js.map +1 -0
  141. package/dist/cmd/cloud/objectstore/index.js +28 -0
  142. package/dist/cmd/cloud/objectstore/index.js.map +1 -0
  143. package/dist/cmd/cloud/objectstore/list-buckets.js +37 -0
  144. package/dist/cmd/cloud/objectstore/list-buckets.js.map +1 -0
  145. package/dist/cmd/cloud/objectstore/list-keys.js +52 -0
  146. package/dist/cmd/cloud/objectstore/list-keys.js.map +1 -0
  147. package/dist/cmd/cloud/objectstore/put.js +57 -0
  148. package/dist/cmd/cloud/objectstore/put.js.map +1 -0
  149. package/dist/cmd/cloud/objectstore/repl.js +219 -0
  150. package/dist/cmd/cloud/objectstore/repl.js.map +1 -0
  151. package/dist/cmd/cloud/objectstore/url.js +55 -0
  152. package/dist/cmd/cloud/objectstore/url.js.map +1 -0
  153. package/dist/cmd/cloud/objectstore/util.js +18 -0
  154. package/dist/cmd/cloud/objectstore/util.js.map +1 -0
  155. package/dist/cmd/cloud/resource/add.js +70 -0
  156. package/dist/cmd/cloud/resource/add.js.map +1 -0
  157. package/dist/cmd/cloud/resource/delete.js +126 -0
  158. package/dist/cmd/cloud/resource/delete.js.map +1 -0
  159. package/dist/cmd/cloud/resource/index.js +12 -0
  160. package/dist/cmd/cloud/resource/index.js.map +1 -0
  161. package/dist/cmd/cloud/resource/list.js +89 -0
  162. package/dist/cmd/cloud/resource/list.js.map +1 -0
  163. package/dist/cmd/cloud/scp/download.js +72 -0
  164. package/dist/cmd/cloud/scp/download.js.map +1 -0
  165. package/dist/cmd/cloud/scp/index.js +10 -0
  166. package/dist/cmd/cloud/scp/index.js.map +1 -0
  167. package/dist/cmd/cloud/scp/upload.js +75 -0
  168. package/dist/cmd/cloud/scp/upload.js.map +1 -0
  169. package/dist/cmd/cloud/secret/delete.js +50 -0
  170. package/dist/cmd/cloud/secret/delete.js.map +1 -0
  171. package/dist/cmd/cloud/secret/get.js +69 -0
  172. package/dist/cmd/cloud/secret/get.js.map +1 -0
  173. package/dist/cmd/cloud/secret/import.js +88 -0
  174. package/dist/cmd/cloud/secret/import.js.map +1 -0
  175. package/dist/cmd/cloud/secret/index.js +24 -0
  176. package/dist/cmd/cloud/secret/index.js.map +1 -0
  177. package/dist/cmd/cloud/secret/list.js +58 -0
  178. package/dist/cmd/cloud/secret/list.js.map +1 -0
  179. package/dist/cmd/cloud/secret/pull.js +81 -0
  180. package/dist/cmd/cloud/secret/pull.js.map +1 -0
  181. package/dist/cmd/cloud/secret/push.js +61 -0
  182. package/dist/cmd/cloud/secret/push.js.map +1 -0
  183. package/dist/cmd/cloud/secret/set.js +57 -0
  184. package/dist/cmd/cloud/secret/set.js.map +1 -0
  185. package/dist/cmd/cloud/session/get.d.ts.map +1 -1
  186. package/dist/cmd/cloud/session/get.js +155 -0
  187. package/dist/cmd/cloud/session/get.js.map +1 -0
  188. package/dist/cmd/cloud/session/index.js +11 -0
  189. package/dist/cmd/cloud/session/index.js.map +1 -0
  190. package/dist/cmd/cloud/session/list.js +132 -0
  191. package/dist/cmd/cloud/session/list.js.map +1 -0
  192. package/dist/cmd/cloud/session/logs.js +56 -0
  193. package/dist/cmd/cloud/session/logs.js.map +1 -0
  194. package/dist/cmd/cloud/ssh.js +67 -0
  195. package/dist/cmd/cloud/ssh.js.map +1 -0
  196. package/dist/cmd/dev/agents.js +103 -0
  197. package/dist/cmd/dev/agents.js.map +1 -0
  198. package/dist/cmd/dev/api.js +26 -0
  199. package/dist/cmd/dev/api.js.map +1 -0
  200. package/dist/cmd/dev/download.js +77 -0
  201. package/dist/cmd/dev/download.js.map +1 -0
  202. package/dist/cmd/dev/index.js +745 -0
  203. package/dist/cmd/dev/index.js.map +1 -0
  204. package/dist/cmd/dev/sync.js +229 -0
  205. package/dist/cmd/dev/sync.js.map +1 -0
  206. package/dist/cmd/dev/templates.js +75 -0
  207. package/dist/cmd/dev/templates.js.map +1 -0
  208. package/dist/cmd/index.js +49 -0
  209. package/dist/cmd/index.js.map +1 -0
  210. package/dist/cmd/profile/create.js +89 -0
  211. package/dist/cmd/profile/create.js.map +1 -0
  212. package/dist/cmd/profile/delete.js +63 -0
  213. package/dist/cmd/profile/delete.js.map +1 -0
  214. package/dist/cmd/profile/index.js +14 -0
  215. package/dist/cmd/profile/index.js.map +1 -0
  216. package/dist/cmd/profile/list.js +28 -0
  217. package/dist/cmd/profile/list.js.map +1 -0
  218. package/dist/cmd/profile/show.js +68 -0
  219. package/dist/cmd/profile/show.js.map +1 -0
  220. package/dist/cmd/profile/use.js +37 -0
  221. package/dist/cmd/profile/use.js.map +1 -0
  222. package/dist/cmd/project/create.js +92 -0
  223. package/dist/cmd/project/create.js.map +1 -0
  224. package/dist/cmd/project/delete.js +117 -0
  225. package/dist/cmd/project/delete.js.map +1 -0
  226. package/dist/cmd/project/download.js +217 -0
  227. package/dist/cmd/project/download.js.map +1 -0
  228. package/dist/cmd/project/index.js +12 -0
  229. package/dist/cmd/project/index.js.map +1 -0
  230. package/dist/cmd/project/list.js +51 -0
  231. package/dist/cmd/project/list.js.map +1 -0
  232. package/dist/cmd/project/show.js +54 -0
  233. package/dist/cmd/project/show.js.map +1 -0
  234. package/dist/cmd/project/template-flow.js +315 -0
  235. package/dist/cmd/project/template-flow.js.map +1 -0
  236. package/dist/cmd/project/templates.js +31 -0
  237. package/dist/cmd/project/templates.js.map +1 -0
  238. package/dist/cmd/repl/index.js +444 -0
  239. package/dist/cmd/repl/index.js.map +1 -0
  240. package/dist/cmd/version/index.js +29 -0
  241. package/dist/cmd/version/index.js.map +1 -0
  242. package/dist/command-prefix.js +37 -0
  243. package/dist/command-prefix.js.map +1 -0
  244. package/dist/config.js +536 -0
  245. package/dist/config.js.map +1 -0
  246. package/dist/crypto/box.js +382 -0
  247. package/dist/crypto/box.js.map +1 -0
  248. package/dist/crypto/box.test.js +317 -0
  249. package/dist/crypto/box.test.js.map +1 -0
  250. package/dist/download.js +64 -0
  251. package/dist/download.js.map +1 -0
  252. package/dist/env-util.js +219 -0
  253. package/dist/env-util.js.map +1 -0
  254. package/dist/env-util.test.js +146 -0
  255. package/dist/env-util.test.js.map +1 -0
  256. package/dist/errors.js +177 -0
  257. package/dist/errors.js.map +1 -0
  258. package/dist/explain.js +90 -0
  259. package/dist/explain.js.map +1 -0
  260. package/dist/index.js +23 -0
  261. package/dist/index.js.map +1 -0
  262. package/dist/json.js +29 -0
  263. package/dist/json.js.map +1 -0
  264. package/dist/legacy-check.js +104 -0
  265. package/dist/legacy-check.js.map +1 -0
  266. package/dist/output.js +207 -0
  267. package/dist/output.js.map +1 -0
  268. package/dist/repl.js +1176 -0
  269. package/dist/repl.js.map +1 -0
  270. package/dist/runtime.js +19 -0
  271. package/dist/runtime.js.map +1 -0
  272. package/dist/schema-generator.js +289 -0
  273. package/dist/schema-generator.js.map +1 -0
  274. package/dist/schema-parser.js +145 -0
  275. package/dist/schema-parser.js.map +1 -0
  276. package/dist/sound.js +44 -0
  277. package/dist/sound.js.map +1 -0
  278. package/dist/steps.js +293 -0
  279. package/dist/steps.js.map +1 -0
  280. package/dist/terminal.js +130 -0
  281. package/dist/terminal.js.map +1 -0
  282. package/dist/tui.js +1124 -0
  283. package/dist/tui.js.map +1 -0
  284. package/dist/types.js +163 -0
  285. package/dist/types.js.map +1 -0
  286. package/dist/utils/detectSubagent.js +25 -0
  287. package/dist/utils/detectSubagent.js.map +1 -0
  288. package/dist/utils/format.js +21 -0
  289. package/dist/utils/format.js.map +1 -0
  290. package/dist/utils/zip.js +33 -0
  291. package/dist/utils/zip.js.map +1 -0
  292. package/dist/version.js +24 -0
  293. package/dist/version.js.map +1 -0
  294. package/package.json +6 -6
  295. package/src/banner.ts +1 -1
  296. package/src/cmd/build/index.ts +18 -22
  297. package/src/cmd/build/plugin.ts +95 -64
  298. package/src/cmd/cloud/session/get.ts +20 -14
  299. 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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"}