@sempdev/semp 0.4.3

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 (559) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/brief/address.d.ts +77 -0
  4. package/dist/brief/address.d.ts.map +1 -0
  5. package/dist/brief/address.js +217 -0
  6. package/dist/brief/address.js.map +1 -0
  7. package/dist/brief/brief.d.ts +75 -0
  8. package/dist/brief/brief.d.ts.map +1 -0
  9. package/dist/brief/brief.js +56 -0
  10. package/dist/brief/brief.js.map +1 -0
  11. package/dist/brief/index.d.ts +11 -0
  12. package/dist/brief/index.d.ts.map +1 -0
  13. package/dist/brief/index.js +11 -0
  14. package/dist/brief/index.js.map +1 -0
  15. package/dist/canonical/index.d.ts +8 -0
  16. package/dist/canonical/index.d.ts.map +1 -0
  17. package/dist/canonical/index.js +8 -0
  18. package/dist/canonical/index.js.map +1 -0
  19. package/dist/canonical/marshal.d.ts +35 -0
  20. package/dist/canonical/marshal.d.ts.map +1 -0
  21. package/dist/canonical/marshal.js +107 -0
  22. package/dist/canonical/marshal.js.map +1 -0
  23. package/dist/clockskew/index.d.ts +52 -0
  24. package/dist/clockskew/index.d.ts.map +1 -0
  25. package/dist/clockskew/index.js +62 -0
  26. package/dist/clockskew/index.js.map +1 -0
  27. package/dist/closure/closure.d.ts +106 -0
  28. package/dist/closure/closure.d.ts.map +1 -0
  29. package/dist/closure/closure.js +152 -0
  30. package/dist/closure/closure.js.map +1 -0
  31. package/dist/closure/driver.d.ts +103 -0
  32. package/dist/closure/driver.d.ts.map +1 -0
  33. package/dist/closure/driver.js +126 -0
  34. package/dist/closure/driver.js.map +1 -0
  35. package/dist/closure/index.d.ts +13 -0
  36. package/dist/closure/index.d.ts.map +1 -0
  37. package/dist/closure/index.js +13 -0
  38. package/dist/closure/index.js.map +1 -0
  39. package/dist/closure/store.d.ts +80 -0
  40. package/dist/closure/store.d.ts.map +1 -0
  41. package/dist/closure/store.js +89 -0
  42. package/dist/closure/store.js.map +1 -0
  43. package/dist/crypto/aead.d.ts +29 -0
  44. package/dist/crypto/aead.d.ts.map +1 -0
  45. package/dist/crypto/aead.js +48 -0
  46. package/dist/crypto/aead.js.map +1 -0
  47. package/dist/crypto/argon2.d.ts +20 -0
  48. package/dist/crypto/argon2.d.ts.map +1 -0
  49. package/dist/crypto/argon2.js +28 -0
  50. package/dist/crypto/argon2.js.map +1 -0
  51. package/dist/crypto/index.d.ts +14 -0
  52. package/dist/crypto/index.d.ts.map +1 -0
  53. package/dist/crypto/index.js +14 -0
  54. package/dist/crypto/index.js.map +1 -0
  55. package/dist/crypto/kdf.d.ts +96 -0
  56. package/dist/crypto/kdf.d.ts.map +1 -0
  57. package/dist/crypto/kdf.js +122 -0
  58. package/dist/crypto/kdf.js.map +1 -0
  59. package/dist/crypto/kem.d.ts +85 -0
  60. package/dist/crypto/kem.d.ts.map +1 -0
  61. package/dist/crypto/kem.js +130 -0
  62. package/dist/crypto/kem.js.map +1 -0
  63. package/dist/crypto/mac.d.ts +19 -0
  64. package/dist/crypto/mac.d.ts.map +1 -0
  65. package/dist/crypto/mac.js +32 -0
  66. package/dist/crypto/mac.js.map +1 -0
  67. package/dist/delivery/ack.d.ts +125 -0
  68. package/dist/delivery/ack.d.ts.map +1 -0
  69. package/dist/delivery/ack.js +141 -0
  70. package/dist/delivery/ack.js.map +1 -0
  71. package/dist/delivery/blocklist.d.ts +87 -0
  72. package/dist/delivery/blocklist.d.ts.map +1 -0
  73. package/dist/delivery/blocklist.js +107 -0
  74. package/dist/delivery/blocklist.js.map +1 -0
  75. package/dist/delivery/cancel.d.ts +60 -0
  76. package/dist/delivery/cancel.d.ts.map +1 -0
  77. package/dist/delivery/cancel.js +43 -0
  78. package/dist/delivery/cancel.js.map +1 -0
  79. package/dist/delivery/disposition.d.ts +106 -0
  80. package/dist/delivery/disposition.d.ts.map +1 -0
  81. package/dist/delivery/disposition.js +105 -0
  82. package/dist/delivery/disposition.js.map +1 -0
  83. package/dist/delivery/fetch.d.ts +59 -0
  84. package/dist/delivery/fetch.d.ts.map +1 -0
  85. package/dist/delivery/fetch.js +47 -0
  86. package/dist/delivery/fetch.js.map +1 -0
  87. package/dist/delivery/forwarder.d.ts +106 -0
  88. package/dist/delivery/forwarder.d.ts.map +1 -0
  89. package/dist/delivery/forwarder.js +251 -0
  90. package/dist/delivery/forwarder.js.map +1 -0
  91. package/dist/delivery/inbox.d.ts +42 -0
  92. package/dist/delivery/inbox.d.ts.map +1 -0
  93. package/dist/delivery/inbox.js +68 -0
  94. package/dist/delivery/inbox.js.map +1 -0
  95. package/dist/delivery/index.d.ts +31 -0
  96. package/dist/delivery/index.d.ts.map +1 -0
  97. package/dist/delivery/index.js +31 -0
  98. package/dist/delivery/index.js.map +1 -0
  99. package/dist/delivery/internalroute.d.ts +50 -0
  100. package/dist/delivery/internalroute.d.ts.map +1 -0
  101. package/dist/delivery/internalroute.js +23 -0
  102. package/dist/delivery/internalroute.js.map +1 -0
  103. package/dist/delivery/pipeline.d.ts +153 -0
  104. package/dist/delivery/pipeline.d.ts.map +1 -0
  105. package/dist/delivery/pipeline.js +356 -0
  106. package/dist/delivery/pipeline.js.map +1 -0
  107. package/dist/delivery/policy_state.d.ts +105 -0
  108. package/dist/delivery/policy_state.d.ts.map +1 -0
  109. package/dist/delivery/policy_state.js +293 -0
  110. package/dist/delivery/policy_state.js.map +1 -0
  111. package/dist/delivery/queue.d.ts +47 -0
  112. package/dist/delivery/queue.d.ts.map +1 -0
  113. package/dist/delivery/queue.js +33 -0
  114. package/dist/delivery/queue.js.map +1 -0
  115. package/dist/delivery/receipt.d.ts +137 -0
  116. package/dist/delivery/receipt.d.ts.map +1 -0
  117. package/dist/delivery/receipt.js +181 -0
  118. package/dist/delivery/receipt.js.map +1 -0
  119. package/dist/delivery/receipt_store.d.ts +81 -0
  120. package/dist/delivery/receipt_store.d.ts.map +1 -0
  121. package/dist/delivery/receipt_store.js +74 -0
  122. package/dist/delivery/receipt_store.js.map +1 -0
  123. package/dist/delivery/retry.d.ts +78 -0
  124. package/dist/delivery/retry.d.ts.map +1 -0
  125. package/dist/delivery/retry.js +132 -0
  126. package/dist/delivery/retry.js.map +1 -0
  127. package/dist/delivery/scheduler.d.ts +156 -0
  128. package/dist/delivery/scheduler.d.ts.map +1 -0
  129. package/dist/delivery/scheduler.js +349 -0
  130. package/dist/delivery/scheduler.js.map +1 -0
  131. package/dist/delivery/stage_partition.d.ts +87 -0
  132. package/dist/delivery/stage_partition.d.ts.map +1 -0
  133. package/dist/delivery/stage_partition.js +122 -0
  134. package/dist/delivery/stage_partition.js.map +1 -0
  135. package/dist/delivery/staged_runner.d.ts +100 -0
  136. package/dist/delivery/staged_runner.d.ts.map +1 -0
  137. package/dist/delivery/staged_runner.js +277 -0
  138. package/dist/delivery/staged_runner.js.map +1 -0
  139. package/dist/delivery/submission.d.ts +72 -0
  140. package/dist/delivery/submission.d.ts.map +1 -0
  141. package/dist/delivery/submission.js +58 -0
  142. package/dist/delivery/submission.js.map +1 -0
  143. package/dist/delivery/sync.d.ts +68 -0
  144. package/dist/delivery/sync.d.ts.map +1 -0
  145. package/dist/delivery/sync.js +99 -0
  146. package/dist/delivery/sync.js.map +1 -0
  147. package/dist/delivery/user_policy.d.ts +74 -0
  148. package/dist/delivery/user_policy.d.ts.map +1 -0
  149. package/dist/delivery/user_policy.js +140 -0
  150. package/dist/delivery/user_policy.js.map +1 -0
  151. package/dist/discovery/cache.d.ts +37 -0
  152. package/dist/discovery/cache.d.ts.map +1 -0
  153. package/dist/discovery/cache.js +45 -0
  154. package/dist/discovery/cache.js.map +1 -0
  155. package/dist/discovery/configuration.d.ts +97 -0
  156. package/dist/discovery/configuration.d.ts.map +1 -0
  157. package/dist/discovery/configuration.js +146 -0
  158. package/dist/discovery/configuration.js.map +1 -0
  159. package/dist/discovery/dns.d.ts +56 -0
  160. package/dist/discovery/dns.d.ts.map +1 -0
  161. package/dist/discovery/dns.js +120 -0
  162. package/dist/discovery/dns.js.map +1 -0
  163. package/dist/discovery/domain_keys.d.ts +62 -0
  164. package/dist/discovery/domain_keys.d.ts.map +1 -0
  165. package/dist/discovery/domain_keys.js +89 -0
  166. package/dist/discovery/domain_keys.js.map +1 -0
  167. package/dist/discovery/index.d.ts +19 -0
  168. package/dist/discovery/index.d.ts.map +1 -0
  169. package/dist/discovery/index.js +19 -0
  170. package/dist/discovery/index.js.map +1 -0
  171. package/dist/discovery/lookup.d.ts +72 -0
  172. package/dist/discovery/lookup.d.ts.map +1 -0
  173. package/dist/discovery/lookup.js +121 -0
  174. package/dist/discovery/lookup.js.map +1 -0
  175. package/dist/discovery/onion.d.ts +34 -0
  176. package/dist/discovery/onion.d.ts.map +1 -0
  177. package/dist/discovery/onion.js +61 -0
  178. package/dist/discovery/onion.js.map +1 -0
  179. package/dist/discovery/partition.d.ts +96 -0
  180. package/dist/discovery/partition.d.ts.map +1 -0
  181. package/dist/discovery/partition.js +247 -0
  182. package/dist/discovery/partition.js.map +1 -0
  183. package/dist/discovery/resolver.d.ts +113 -0
  184. package/dist/discovery/resolver.d.ts.map +1 -0
  185. package/dist/discovery/resolver.js +176 -0
  186. package/dist/discovery/resolver.js.map +1 -0
  187. package/dist/discovery/txt.d.ts +39 -0
  188. package/dist/discovery/txt.d.ts.map +1 -0
  189. package/dist/discovery/txt.js +71 -0
  190. package/dist/discovery/txt.js.map +1 -0
  191. package/dist/enclosure/forwarding.d.ts +128 -0
  192. package/dist/enclosure/forwarding.d.ts.map +1 -0
  193. package/dist/enclosure/forwarding.js +119 -0
  194. package/dist/enclosure/forwarding.js.map +1 -0
  195. package/dist/enclosure/index.d.ts +11 -0
  196. package/dist/enclosure/index.d.ts.map +1 -0
  197. package/dist/enclosure/index.js +11 -0
  198. package/dist/enclosure/index.js.map +1 -0
  199. package/dist/envelope/buckets.d.ts +38 -0
  200. package/dist/envelope/buckets.d.ts.map +1 -0
  201. package/dist/envelope/buckets.js +73 -0
  202. package/dist/envelope/buckets.js.map +1 -0
  203. package/dist/envelope/canonical.d.ts +28 -0
  204. package/dist/envelope/canonical.d.ts.map +1 -0
  205. package/dist/envelope/canonical.js +54 -0
  206. package/dist/envelope/canonical.js.map +1 -0
  207. package/dist/envelope/compose.d.ts +171 -0
  208. package/dist/envelope/compose.d.ts.map +1 -0
  209. package/dist/envelope/compose.js +237 -0
  210. package/dist/envelope/compose.js.map +1 -0
  211. package/dist/envelope/encode.d.ts +41 -0
  212. package/dist/envelope/encode.d.ts.map +1 -0
  213. package/dist/envelope/encode.js +69 -0
  214. package/dist/envelope/encode.js.map +1 -0
  215. package/dist/envelope/index.d.ts +20 -0
  216. package/dist/envelope/index.d.ts.map +1 -0
  217. package/dist/envelope/index.js +20 -0
  218. package/dist/envelope/index.js.map +1 -0
  219. package/dist/envelope/open_any.d.ts +48 -0
  220. package/dist/envelope/open_any.d.ts.map +1 -0
  221. package/dist/envelope/open_any.js +81 -0
  222. package/dist/envelope/open_any.js.map +1 -0
  223. package/dist/envelope/open_verified.d.ts +59 -0
  224. package/dist/envelope/open_verified.d.ts.map +1 -0
  225. package/dist/envelope/open_verified.js +67 -0
  226. package/dist/envelope/open_verified.js.map +1 -0
  227. package/dist/envelope/padding.d.ts +55 -0
  228. package/dist/envelope/padding.d.ts.map +1 -0
  229. package/dist/envelope/padding.js +162 -0
  230. package/dist/envelope/padding.js.map +1 -0
  231. package/dist/envelope/rejection.d.ts +22 -0
  232. package/dist/envelope/rejection.d.ts.map +1 -0
  233. package/dist/envelope/rejection.js +30 -0
  234. package/dist/envelope/rejection.js.map +1 -0
  235. package/dist/envelope/sendtime.d.ts +49 -0
  236. package/dist/envelope/sendtime.d.ts.map +1 -0
  237. package/dist/envelope/sendtime.js +87 -0
  238. package/dist/envelope/sendtime.js.map +1 -0
  239. package/dist/envelope/verify.d.ts +29 -0
  240. package/dist/envelope/verify.d.ts.map +1 -0
  241. package/dist/envelope/verify.js +90 -0
  242. package/dist/envelope/verify.js.map +1 -0
  243. package/dist/extensions/index.d.ts +7 -0
  244. package/dist/extensions/index.d.ts.map +1 -0
  245. package/dist/extensions/index.js +7 -0
  246. package/dist/extensions/index.js.map +1 -0
  247. package/dist/extensions/limits.d.ts +101 -0
  248. package/dist/extensions/limits.d.ts.map +1 -0
  249. package/dist/extensions/limits.js +175 -0
  250. package/dist/extensions/limits.js.map +1 -0
  251. package/dist/handshake/abort.d.ts +49 -0
  252. package/dist/handshake/abort.d.ts.map +1 -0
  253. package/dist/handshake/abort.js +82 -0
  254. package/dist/handshake/abort.js.map +1 -0
  255. package/dist/handshake/capabilities.d.ts +46 -0
  256. package/dist/handshake/capabilities.d.ts.map +1 -0
  257. package/dist/handshake/capabilities.js +114 -0
  258. package/dist/handshake/capabilities.js.map +1 -0
  259. package/dist/handshake/client_state.d.ts +186 -0
  260. package/dist/handshake/client_state.d.ts.map +1 -0
  261. package/dist/handshake/client_state.js +520 -0
  262. package/dist/handshake/client_state.js.map +1 -0
  263. package/dist/handshake/confirm.d.ts +21 -0
  264. package/dist/handshake/confirm.d.ts.map +1 -0
  265. package/dist/handshake/confirm.js +27 -0
  266. package/dist/handshake/confirm.js.map +1 -0
  267. package/dist/handshake/driver.d.ts +126 -0
  268. package/dist/handshake/driver.d.ts.map +1 -0
  269. package/dist/handshake/driver.js +251 -0
  270. package/dist/handshake/driver.js.map +1 -0
  271. package/dist/handshake/federation.d.ts +365 -0
  272. package/dist/handshake/federation.d.ts.map +1 -0
  273. package/dist/handshake/federation.js +664 -0
  274. package/dist/handshake/federation.js.map +1 -0
  275. package/dist/handshake/first_contact.d.ts +57 -0
  276. package/dist/handshake/first_contact.d.ts.map +1 -0
  277. package/dist/handshake/first_contact.js +124 -0
  278. package/dist/handshake/first_contact.js.map +1 -0
  279. package/dist/handshake/identity.d.ts +101 -0
  280. package/dist/handshake/identity.d.ts.map +1 -0
  281. package/dist/handshake/identity.js +117 -0
  282. package/dist/handshake/identity.js.map +1 -0
  283. package/dist/handshake/index.d.ts +21 -0
  284. package/dist/handshake/index.d.ts.map +1 -0
  285. package/dist/handshake/index.js +21 -0
  286. package/dist/handshake/index.js.map +1 -0
  287. package/dist/handshake/messages.d.ts +176 -0
  288. package/dist/handshake/messages.d.ts.map +1 -0
  289. package/dist/handshake/messages.js +125 -0
  290. package/dist/handshake/messages.js.map +1 -0
  291. package/dist/handshake/pow.d.ts +53 -0
  292. package/dist/handshake/pow.d.ts.map +1 -0
  293. package/dist/handshake/pow.js +142 -0
  294. package/dist/handshake/pow.js.map +1 -0
  295. package/dist/handshake/resume_driver.d.ts +56 -0
  296. package/dist/handshake/resume_driver.d.ts.map +1 -0
  297. package/dist/handshake/resume_driver.js +75 -0
  298. package/dist/handshake/resume_driver.js.map +1 -0
  299. package/dist/handshake/server.d.ts +112 -0
  300. package/dist/handshake/server.d.ts.map +1 -0
  301. package/dist/handshake/server.js +247 -0
  302. package/dist/handshake/server.js.map +1 -0
  303. package/dist/handshake/server_state.d.ts +102 -0
  304. package/dist/handshake/server_state.d.ts.map +1 -0
  305. package/dist/handshake/server_state.js +278 -0
  306. package/dist/handshake/server_state.js.map +1 -0
  307. package/dist/index.d.ts +33 -0
  308. package/dist/index.d.ts.map +1 -0
  309. package/dist/index.js +33 -0
  310. package/dist/index.js.map +1 -0
  311. package/dist/keys/compromise.d.ts +118 -0
  312. package/dist/keys/compromise.d.ts.map +1 -0
  313. package/dist/keys/compromise.js +218 -0
  314. package/dist/keys/compromise.js.map +1 -0
  315. package/dist/keys/device_certificate.d.ts +166 -0
  316. package/dist/keys/device_certificate.d.ts.map +1 -0
  317. package/dist/keys/device_certificate.js +328 -0
  318. package/dist/keys/device_certificate.js.map +1 -0
  319. package/dist/keys/device_records.d.ts +175 -0
  320. package/dist/keys/device_records.d.ts.map +1 -0
  321. package/dist/keys/device_records.js +418 -0
  322. package/dist/keys/device_records.js.map +1 -0
  323. package/dist/keys/directory_cache.d.ts +64 -0
  324. package/dist/keys/directory_cache.d.ts.map +1 -0
  325. package/dist/keys/directory_cache.js +98 -0
  326. package/dist/keys/directory_cache.js.map +1 -0
  327. package/dist/keys/directory_state.d.ts +79 -0
  328. package/dist/keys/directory_state.d.ts.map +1 -0
  329. package/dist/keys/directory_state.js +155 -0
  330. package/dist/keys/directory_state.js.map +1 -0
  331. package/dist/keys/index.d.ts +18 -0
  332. package/dist/keys/index.d.ts.map +1 -0
  333. package/dist/keys/index.js +18 -0
  334. package/dist/keys/index.js.map +1 -0
  335. package/dist/keys/key_revocation.d.ts +61 -0
  336. package/dist/keys/key_revocation.d.ts.map +1 -0
  337. package/dist/keys/key_revocation.js +88 -0
  338. package/dist/keys/key_revocation.js.map +1 -0
  339. package/dist/keys/request.d.ts +124 -0
  340. package/dist/keys/request.d.ts.map +1 -0
  341. package/dist/keys/request.js +130 -0
  342. package/dist/keys/request.js.map +1 -0
  343. package/dist/keys/sign.d.ts +49 -0
  344. package/dist/keys/sign.d.ts.map +1 -0
  345. package/dist/keys/sign.js +80 -0
  346. package/dist/keys/sign.js.map +1 -0
  347. package/dist/keys/signed.d.ts +80 -0
  348. package/dist/keys/signed.d.ts.map +1 -0
  349. package/dist/keys/signed.js +138 -0
  350. package/dist/keys/signed.js.map +1 -0
  351. package/dist/keys/store.d.ts +138 -0
  352. package/dist/keys/store.d.ts.map +1 -0
  353. package/dist/keys/store.js +107 -0
  354. package/dist/keys/store.js.map +1 -0
  355. package/dist/largeattachment/crypto.d.ts +47 -0
  356. package/dist/largeattachment/crypto.d.ts.map +1 -0
  357. package/dist/largeattachment/crypto.js +235 -0
  358. package/dist/largeattachment/crypto.js.map +1 -0
  359. package/dist/largeattachment/enclosure.d.ts +48 -0
  360. package/dist/largeattachment/enclosure.d.ts.map +1 -0
  361. package/dist/largeattachment/enclosure.js +102 -0
  362. package/dist/largeattachment/enclosure.js.map +1 -0
  363. package/dist/largeattachment/index.d.ts +15 -0
  364. package/dist/largeattachment/index.d.ts.map +1 -0
  365. package/dist/largeattachment/index.js +15 -0
  366. package/dist/largeattachment/index.js.map +1 -0
  367. package/dist/largeattachment/store.d.ts +36 -0
  368. package/dist/largeattachment/store.d.ts.map +1 -0
  369. package/dist/largeattachment/store.js +37 -0
  370. package/dist/largeattachment/store.js.map +1 -0
  371. package/dist/largeattachment/types.d.ts +56 -0
  372. package/dist/largeattachment/types.d.ts.map +1 -0
  373. package/dist/largeattachment/types.js +31 -0
  374. package/dist/largeattachment/types.js.map +1 -0
  375. package/dist/largeattachment/upload.d.ts +62 -0
  376. package/dist/largeattachment/upload.d.ts.map +1 -0
  377. package/dist/largeattachment/upload.js +166 -0
  378. package/dist/largeattachment/upload.js.map +1 -0
  379. package/dist/migration/index.d.ts +17 -0
  380. package/dist/migration/index.d.ts.map +1 -0
  381. package/dist/migration/index.js +17 -0
  382. package/dist/migration/index.js.map +1 -0
  383. package/dist/migration/lockout.d.ts +48 -0
  384. package/dist/migration/lockout.d.ts.map +1 -0
  385. package/dist/migration/lockout.js +57 -0
  386. package/dist/migration/lockout.js.map +1 -0
  387. package/dist/migration/migration.d.ts +48 -0
  388. package/dist/migration/migration.d.ts.map +1 -0
  389. package/dist/migration/migration.js +58 -0
  390. package/dist/migration/migration.js.map +1 -0
  391. package/dist/migration/notice.d.ts +33 -0
  392. package/dist/migration/notice.d.ts.map +1 -0
  393. package/dist/migration/notice.js +85 -0
  394. package/dist/migration/notice.js.map +1 -0
  395. package/dist/migration/orchestrate.d.ts +109 -0
  396. package/dist/migration/orchestrate.d.ts.map +1 -0
  397. package/dist/migration/orchestrate.js +212 -0
  398. package/dist/migration/orchestrate.js.map +1 -0
  399. package/dist/migration/publication_store.d.ts +34 -0
  400. package/dist/migration/publication_store.d.ts.map +1 -0
  401. package/dist/migration/publication_store.js +44 -0
  402. package/dist/migration/publication_store.js.map +1 -0
  403. package/dist/migration/sign.d.ts +65 -0
  404. package/dist/migration/sign.d.ts.map +1 -0
  405. package/dist/migration/sign.js +331 -0
  406. package/dist/migration/sign.js.map +1 -0
  407. package/dist/migration/types.d.ts +92 -0
  408. package/dist/migration/types.d.ts.map +1 -0
  409. package/dist/migration/types.js +26 -0
  410. package/dist/migration/types.js.map +1 -0
  411. package/dist/reasoncodes.d.ts +42 -0
  412. package/dist/reasoncodes.d.ts.map +1 -0
  413. package/dist/reasoncodes.js +80 -0
  414. package/dist/reasoncodes.js.map +1 -0
  415. package/dist/recovery/bundle.d.ts +34 -0
  416. package/dist/recovery/bundle.d.ts.map +1 -0
  417. package/dist/recovery/bundle.js +144 -0
  418. package/dist/recovery/bundle.js.map +1 -0
  419. package/dist/recovery/bundle_crypto.d.ts +60 -0
  420. package/dist/recovery/bundle_crypto.d.ts.map +1 -0
  421. package/dist/recovery/bundle_crypto.js +179 -0
  422. package/dist/recovery/bundle_crypto.js.map +1 -0
  423. package/dist/recovery/bundle_store.d.ts +57 -0
  424. package/dist/recovery/bundle_store.d.ts.map +1 -0
  425. package/dist/recovery/bundle_store.js +104 -0
  426. package/dist/recovery/bundle_store.js.map +1 -0
  427. package/dist/recovery/index.d.ts +19 -0
  428. package/dist/recovery/index.d.ts.map +1 -0
  429. package/dist/recovery/index.js +19 -0
  430. package/dist/recovery/index.js.map +1 -0
  431. package/dist/recovery/manifest_crosscheck.d.ts +59 -0
  432. package/dist/recovery/manifest_crosscheck.d.ts.map +1 -0
  433. package/dist/recovery/manifest_crosscheck.js +59 -0
  434. package/dist/recovery/manifest_crosscheck.js.map +1 -0
  435. package/dist/recovery/shamir.d.ts +51 -0
  436. package/dist/recovery/shamir.d.ts.map +1 -0
  437. package/dist/recovery/shamir.js +181 -0
  438. package/dist/recovery/shamir.js.map +1 -0
  439. package/dist/recovery/sign.d.ts +61 -0
  440. package/dist/recovery/sign.d.ts.map +1 -0
  441. package/dist/recovery/sign.js +359 -0
  442. package/dist/recovery/sign.js.map +1 -0
  443. package/dist/recovery/types.d.ts +180 -0
  444. package/dist/recovery/types.d.ts.map +1 -0
  445. package/dist/recovery/types.js +31 -0
  446. package/dist/recovery/types.js.map +1 -0
  447. package/dist/reputation/abuse_report.d.ts +62 -0
  448. package/dist/reputation/abuse_report.d.ts.map +1 -0
  449. package/dist/reputation/abuse_report.js +111 -0
  450. package/dist/reputation/abuse_report.js.map +1 -0
  451. package/dist/reputation/bucketize.d.ts +31 -0
  452. package/dist/reputation/bucketize.d.ts.map +1 -0
  453. package/dist/reputation/bucketize.js +77 -0
  454. package/dist/reputation/bucketize.js.map +1 -0
  455. package/dist/reputation/gossip.d.ts +24 -0
  456. package/dist/reputation/gossip.d.ts.map +1 -0
  457. package/dist/reputation/gossip.js +64 -0
  458. package/dist/reputation/gossip.js.map +1 -0
  459. package/dist/reputation/gossip_fetch.d.ts +64 -0
  460. package/dist/reputation/gossip_fetch.d.ts.map +1 -0
  461. package/dist/reputation/gossip_fetch.js +114 -0
  462. package/dist/reputation/gossip_fetch.js.map +1 -0
  463. package/dist/reputation/index.d.ts +20 -0
  464. package/dist/reputation/index.d.ts.map +1 -0
  465. package/dist/reputation/index.js +20 -0
  466. package/dist/reputation/index.js.map +1 -0
  467. package/dist/reputation/observation_store.d.ts +67 -0
  468. package/dist/reputation/observation_store.d.ts.map +1 -0
  469. package/dist/reputation/observation_store.js +171 -0
  470. package/dist/reputation/observation_store.js.map +1 -0
  471. package/dist/reputation/pow.d.ts +91 -0
  472. package/dist/reputation/pow.d.ts.map +1 -0
  473. package/dist/reputation/pow.js +209 -0
  474. package/dist/reputation/pow.js.map +1 -0
  475. package/dist/reputation/sign.d.ts +40 -0
  476. package/dist/reputation/sign.d.ts.map +1 -0
  477. package/dist/reputation/sign.js +202 -0
  478. package/dist/reputation/sign.js.map +1 -0
  479. package/dist/reputation/types.d.ts +133 -0
  480. package/dist/reputation/types.d.ts.map +1 -0
  481. package/dist/reputation/types.js +33 -0
  482. package/dist/reputation/types.js.map +1 -0
  483. package/dist/reputation/whois.d.ts +25 -0
  484. package/dist/reputation/whois.d.ts.map +1 -0
  485. package/dist/reputation/whois.js +20 -0
  486. package/dist/reputation/whois.js.map +1 -0
  487. package/dist/seal/index.d.ts +8 -0
  488. package/dist/seal/index.d.ts.map +1 -0
  489. package/dist/seal/index.js +8 -0
  490. package/dist/seal/index.js.map +1 -0
  491. package/dist/seal/wrap.d.ts +74 -0
  492. package/dist/seal/wrap.d.ts.map +1 -0
  493. package/dist/seal/wrap.js +213 -0
  494. package/dist/seal/wrap.js.map +1 -0
  495. package/dist/session/dispatcher.d.ts +65 -0
  496. package/dist/session/dispatcher.d.ts.map +1 -0
  497. package/dist/session/dispatcher.js +96 -0
  498. package/dist/session/dispatcher.js.map +1 -0
  499. package/dist/session/index.d.ts +15 -0
  500. package/dist/session/index.d.ts.map +1 -0
  501. package/dist/session/index.js +15 -0
  502. package/dist/session/index.js.map +1 -0
  503. package/dist/session/rekey.d.ts +108 -0
  504. package/dist/session/rekey.d.ts.map +1 -0
  505. package/dist/session/rekey.js +207 -0
  506. package/dist/session/rekey.js.map +1 -0
  507. package/dist/session/rekey_seal.d.ts +66 -0
  508. package/dist/session/rekey_seal.d.ts.map +1 -0
  509. package/dist/session/rekey_seal.js +153 -0
  510. package/dist/session/rekey_seal.js.map +1 -0
  511. package/dist/session/resume.d.ts +125 -0
  512. package/dist/session/resume.d.ts.map +1 -0
  513. package/dist/session/resume.js +263 -0
  514. package/dist/session/resume.js.map +1 -0
  515. package/dist/session/session.d.ts +136 -0
  516. package/dist/session/session.d.ts.map +1 -0
  517. package/dist/session/session.js +188 -0
  518. package/dist/session/session.js.map +1 -0
  519. package/dist/transparency/index.d.ts +13 -0
  520. package/dist/transparency/index.d.ts.map +1 -0
  521. package/dist/transparency/index.js +13 -0
  522. package/dist/transparency/index.js.map +1 -0
  523. package/dist/transparency/log.d.ts +61 -0
  524. package/dist/transparency/log.d.ts.map +1 -0
  525. package/dist/transparency/log.js +133 -0
  526. package/dist/transparency/log.js.map +1 -0
  527. package/dist/transparency/merkle.d.ts +59 -0
  528. package/dist/transparency/merkle.d.ts.map +1 -0
  529. package/dist/transparency/merkle.js +314 -0
  530. package/dist/transparency/merkle.js.map +1 -0
  531. package/dist/transparency/sign.d.ts +48 -0
  532. package/dist/transparency/sign.d.ts.map +1 -0
  533. package/dist/transparency/sign.js +140 -0
  534. package/dist/transparency/sign.js.map +1 -0
  535. package/dist/transparency/types.d.ts +97 -0
  536. package/dist/transparency/types.d.ts.map +1 -0
  537. package/dist/transparency/types.js +25 -0
  538. package/dist/transparency/types.js.map +1 -0
  539. package/dist/transport/h2.d.ts +163 -0
  540. package/dist/transport/h2.d.ts.map +1 -0
  541. package/dist/transport/h2.js +397 -0
  542. package/dist/transport/h2.js.map +1 -0
  543. package/dist/transport/index.d.ts +15 -0
  544. package/dist/transport/index.d.ts.map +1 -0
  545. package/dist/transport/index.js +15 -0
  546. package/dist/transport/index.js.map +1 -0
  547. package/dist/transport/memory.d.ts +21 -0
  548. package/dist/transport/memory.d.ts.map +1 -0
  549. package/dist/transport/memory.js +112 -0
  550. package/dist/transport/memory.js.map +1 -0
  551. package/dist/transport/transport.d.ts +54 -0
  552. package/dist/transport/transport.d.ts.map +1 -0
  553. package/dist/transport/transport.js +20 -0
  554. package/dist/transport/transport.js.map +1 -0
  555. package/dist/transport/ws.d.ts +40 -0
  556. package/dist/transport/ws.d.ts.map +1 -0
  557. package/dist/transport/ws.js +204 -0
  558. package/dist/transport/ws.js.map +1 -0
  559. package/package.json +147 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Reason-code registry per VECTORS.md §8 / HANDSHAKE.md §4.1 /
3
+ * ENVELOPE.md §9.3 / ERRORS.md.
4
+ *
5
+ * @module
6
+ */
7
+ /** The full set of recognized ReasonCode values. */
8
+ export const KnownReasonCodes = new Set([
9
+ "blocked",
10
+ "auth_failed",
11
+ "policy_forbidden",
12
+ "handshake_expired",
13
+ "handshake_invalid",
14
+ "no_session",
15
+ "rate_limited",
16
+ "challenge",
17
+ "challenge_failed",
18
+ "challenge_invalid",
19
+ "server_at_capacity",
20
+ "resumption_failed",
21
+ "version_unsupported",
22
+ "seal_invalid",
23
+ "session_mac_invalid",
24
+ "envelope_expired",
25
+ "envelope_size_exceeded",
26
+ "extension_unsupported",
27
+ "extension_size_exceeded",
28
+ "scope_exceeded",
29
+ "scope_invalid",
30
+ "certificate_expired",
31
+ "server_unavailable",
32
+ "session_expired",
33
+ "rekey_unsupported",
34
+ "policy_kind_unsupported",
35
+ "policy_op_invalid",
36
+ "policy_version_stale",
37
+ ]);
38
+ /** Type guard: is this string one of the recognized codes? */
39
+ export function isKnownReasonCode(code) {
40
+ return KnownReasonCodes.has(code);
41
+ }
42
+ /**
43
+ * Reports whether automated retry is appropriate for this reason.
44
+ *
45
+ * Recoverable codes signal a transient or transport condition the
46
+ * sender SHOULD retry after a back-off, OR a state-staleness
47
+ * condition (handshake_expired, no_session, policy_version_stale)
48
+ * the sender resolves with a fresh handshake / refresh and a single
49
+ * retry. Non-recoverable codes signal a permanent condition (blocked,
50
+ * auth_failed, policy_forbidden, scope_invalid, etc.) where the
51
+ * sender MUST NOT retry without operator intervention.
52
+ *
53
+ * Notes on edge cases:
54
+ *
55
+ * - `session_expired` and `rekey_unsupported` are NOT recoverable
56
+ * here because they require a fresh handshake rather than an
57
+ * automated retry on the rekey path.
58
+ * - `challenge_invalid`, `version_unsupported`, `resumption_failed`,
59
+ * `envelope_size_exceeded`, `scope_invalid`, and
60
+ * `certificate_expired` are non-recoverable per ERRORS.md.
61
+ *
62
+ * Mirrors semp-go's `ReasonCode.Recoverable()` byte-for-byte; the
63
+ * vectors at `vectors/v1.0.0/rejection-codes.json` cross-check both.
64
+ */
65
+ export function isRecoverable(code) {
66
+ switch (code) {
67
+ case "handshake_expired":
68
+ case "handshake_invalid":
69
+ case "no_session":
70
+ case "rate_limited":
71
+ case "challenge":
72
+ case "challenge_failed":
73
+ case "server_at_capacity":
74
+ case "policy_version_stale":
75
+ return true;
76
+ default:
77
+ return false;
78
+ }
79
+ }
80
+ //# sourceMappingURL=reasoncodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoncodes.js","sourceRoot":"","sources":["../src/reasoncodes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwCH,oDAAoD;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAa;IACvE,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,YAAY;IACZ,cAAc;IACd,WAAW;IACX,kBAAkB;IAClB,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,cAAc;IACd,qBAAqB;IACrB,kBAAkB;IAClB,wBAAwB;IACxB,uBAAuB;IACvB,yBAAyB;IACzB,gBAAgB;IAChB,eAAe;IACf,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,mBAAmB;IACnB,yBAAyB;IACzB,mBAAmB;IACnB,sBAAsB;CACvB,CAAC,CAAC;AAEH,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,mBAAmB,CAAC;QACzB,KAAK,mBAAmB,CAAC;QACzB,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc,CAAC;QACpB,KAAK,WAAW,CAAC;QACjB,KAAK,kBAAkB,CAAC;QACxB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,sBAAsB;YACzB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * SEMP_BACKUP_BUNDLE sign / verify primitives per RECOVERY.md §2.
3
+ *
4
+ * Covers the wire shape and identity-key signature over the bundle.
5
+ * Payload encryption (Argon2id-derived key + XChaCha20-Poly1305) is
6
+ * the next layer up; this module ships the record-level primitives
7
+ * the higher-level flow plugs into.
8
+ *
9
+ * @module
10
+ */
11
+ import { type BackupBundle } from "./types.js";
12
+ /**
13
+ * Sign `b.signature` with the user's currently active identity
14
+ * private key per §2.4.
15
+ */
16
+ export declare function signBundle(b: BackupBundle, identityPriv: Uint8Array, identityKeyId: string): string;
17
+ /** Verify `b.signature` against `identityPub`. */
18
+ export declare function verifyBundle(b: BackupBundle, identityPub: Uint8Array): boolean;
19
+ /**
20
+ * Structural validation per §2.1 + §2.5. Throws on the first
21
+ * violation. Enforces:
22
+ *
23
+ * - Required string fields present.
24
+ * - `kdf.algorithm === "argon2id"` (the only KDF currently spec'd).
25
+ * - Argon2id parameter floors: memory_kb >= 65536, iterations >= 2,
26
+ * parallelism >= 1, salt >= 16 bytes (after base64 decode).
27
+ * - `payload_algorithm === "xchacha20-poly1305"`.
28
+ * - `signature.{algorithm,key_id,value}` present (value optional
29
+ * when `skipSignatureCheck`).
30
+ */
31
+ export declare function validateBundle(b: BackupBundle, opts?: {
32
+ skipSignatureCheck?: boolean;
33
+ }): void;
34
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/recovery/bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,KAAK,YAAY,EAQlB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,wBAAgB,UAAU,CACxB,CAAC,EAAE,YAAY,EACf,YAAY,EAAE,UAAU,EACxB,aAAa,EAAE,MAAM,GACpB,MAAM,CAgBR;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAC1B,CAAC,EAAE,YAAY,EACf,WAAW,EAAE,UAAU,GACtB,OAAO,CAYT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,YAAY,EACf,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,IAAI,CAgGN"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * SEMP_BACKUP_BUNDLE sign / verify primitives per RECOVERY.md §2.
3
+ *
4
+ * Covers the wire shape and identity-key signature over the bundle.
5
+ * Payload encryption (Argon2id-derived key + XChaCha20-Poly1305) is
6
+ * the next layer up; this module ships the record-level primitives
7
+ * the higher-level flow plugs into.
8
+ *
9
+ * @module
10
+ */
11
+ import { signSignedDoc, verifySignedDoc } from "../keys/index.js";
12
+ import { KDFAlgorithmArgon2id, MinKDFIterations, MinKDFMemoryKB, MinKDFParallelism, MinKDFSaltBytes, RecoveryBundlePrefix, SignatureAlgorithmEd25519, } from "./types.js";
13
+ /**
14
+ * Sign `b.signature` with the user's currently active identity
15
+ * private key per §2.4.
16
+ */
17
+ export function signBundle(b, identityPriv, identityKeyId) {
18
+ if (identityKeyId === "") {
19
+ throw new Error("recovery: empty identity key_id");
20
+ }
21
+ validateBundle(b, { skipSignatureCheck: true });
22
+ b.signature.algorithm = SignatureAlgorithmEd25519;
23
+ b.signature.key_id = identityKeyId;
24
+ b.signature.value = "";
25
+ const { signedJSON, signatureB64 } = signSignedDoc({
26
+ preSignJSON: b,
27
+ seed: identityPriv,
28
+ signaturePath: "signature.value",
29
+ prefix: RecoveryBundlePrefix,
30
+ });
31
+ b.signature.value = signedJSON.signature.value;
32
+ return signatureB64;
33
+ }
34
+ /** Verify `b.signature` against `identityPub`. */
35
+ export function verifyBundle(b, identityPub) {
36
+ validateBundle(b);
37
+ if (b.signature.value === "") {
38
+ return false;
39
+ }
40
+ const { ok } = verifySignedDoc({
41
+ signedJSON: b,
42
+ publicKey: identityPub,
43
+ signaturePath: "signature.value",
44
+ prefix: RecoveryBundlePrefix,
45
+ });
46
+ return ok;
47
+ }
48
+ /**
49
+ * Structural validation per §2.1 + §2.5. Throws on the first
50
+ * violation. Enforces:
51
+ *
52
+ * - Required string fields present.
53
+ * - `kdf.algorithm === "argon2id"` (the only KDF currently spec'd).
54
+ * - Argon2id parameter floors: memory_kb >= 65536, iterations >= 2,
55
+ * parallelism >= 1, salt >= 16 bytes (after base64 decode).
56
+ * - `payload_algorithm === "xchacha20-poly1305"`.
57
+ * - `signature.{algorithm,key_id,value}` present (value optional
58
+ * when `skipSignatureCheck`).
59
+ */
60
+ export function validateBundle(b, opts = {}) {
61
+ if (b.type !== "SEMP_BACKUP_BUNDLE") {
62
+ throw new Error(`recovery: bundle type ${JSON.stringify(b.type)}, want SEMP_BACKUP_BUNDLE`);
63
+ }
64
+ for (const f of [
65
+ "version",
66
+ "user_id",
67
+ "bundle_id",
68
+ "created_at",
69
+ "payload_algorithm",
70
+ "payload_nonce",
71
+ "encrypted_payload",
72
+ ]) {
73
+ if (typeof b[f] !== "string" || b[f] === "") {
74
+ throw new Error(`recovery: bundle missing ${f}`);
75
+ }
76
+ }
77
+ if (Number.isNaN(Date.parse(b.created_at))) {
78
+ throw new Error("recovery: bundle created_at is not ISO 8601");
79
+ }
80
+ if (b.payload_algorithm !== "xchacha20-poly1305") {
81
+ throw new Error(`recovery: bundle payload_algorithm ${JSON.stringify(b.payload_algorithm)}, want xchacha20-poly1305`);
82
+ }
83
+ if (b.kdf === undefined || b.kdf === null) {
84
+ throw new Error("recovery: bundle missing kdf");
85
+ }
86
+ if (b.kdf.algorithm !== KDFAlgorithmArgon2id) {
87
+ throw new Error(`recovery: bundle kdf.algorithm ${JSON.stringify(b.kdf.algorithm)}, want ${KDFAlgorithmArgon2id}`);
88
+ }
89
+ if (typeof b.kdf.salt !== "string" || b.kdf.salt === "") {
90
+ throw new Error("recovery: bundle kdf.salt missing");
91
+ }
92
+ // Decode the salt to enforce the 16-byte floor.
93
+ const saltBytes = base64Decode(b.kdf.salt);
94
+ if (saltBytes.length < MinKDFSaltBytes) {
95
+ throw new Error(`recovery: bundle kdf.salt ${saltBytes.length} bytes below minimum ${MinKDFSaltBytes}`);
96
+ }
97
+ if (!Number.isInteger(b.kdf.memory_kb) ||
98
+ b.kdf.memory_kb < MinKDFMemoryKB) {
99
+ throw new Error(`recovery: bundle kdf.memory_kb ${b.kdf.memory_kb} below minimum ${MinKDFMemoryKB}`);
100
+ }
101
+ if (!Number.isInteger(b.kdf.iterations) ||
102
+ b.kdf.iterations < MinKDFIterations) {
103
+ throw new Error(`recovery: bundle kdf.iterations ${b.kdf.iterations} below minimum ${MinKDFIterations}`);
104
+ }
105
+ if (!Number.isInteger(b.kdf.parallelism) ||
106
+ b.kdf.parallelism < MinKDFParallelism) {
107
+ throw new Error(`recovery: bundle kdf.parallelism ${b.kdf.parallelism} below minimum ${MinKDFParallelism}`);
108
+ }
109
+ if (b.recovery_verify_pk === undefined ||
110
+ typeof b.recovery_verify_pk?.public_key !== "string" ||
111
+ b.recovery_verify_pk.public_key === "") {
112
+ throw new Error("recovery: bundle recovery_verify_pk.public_key missing");
113
+ }
114
+ if (typeof b.recovery_verify_pk.algorithm !== "string" || b.recovery_verify_pk.algorithm === "") {
115
+ throw new Error("recovery: bundle recovery_verify_pk.algorithm missing");
116
+ }
117
+ if (b.supersedes !== null && (typeof b.supersedes !== "string" || b.supersedes === "")) {
118
+ throw new Error("recovery: bundle supersedes must be a non-empty string or null");
119
+ }
120
+ if (typeof b.signature?.algorithm !== "string") {
121
+ throw new Error("recovery: bundle signature.algorithm missing");
122
+ }
123
+ if (typeof b.signature?.key_id !== "string") {
124
+ throw new Error("recovery: bundle signature.key_id missing");
125
+ }
126
+ if (typeof b.signature?.value !== "string") {
127
+ throw new Error("recovery: bundle signature.value must be a string");
128
+ }
129
+ if (!opts.skipSignatureCheck && b.signature.value === "") {
130
+ throw new Error("recovery: bundle is unsigned");
131
+ }
132
+ }
133
+ function base64Decode(s) {
134
+ if (typeof Buffer !== "undefined") {
135
+ return new Uint8Array(Buffer.from(s, "base64"));
136
+ }
137
+ const bin = atob(s);
138
+ const out = new Uint8Array(bin.length);
139
+ for (let i = 0; i < bin.length; i++) {
140
+ out[i] = bin.charCodeAt(i);
141
+ }
142
+ return out;
143
+ }
144
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/recovery/bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Bundle-payload encryption + recovery key derivation per
3
+ * RECOVERY.md §2.5 + §3.2 + §3.3.
4
+ *
5
+ * - {@link normalizeRecoverySecret}: NFKC for passphrases /
6
+ * lower+space-join for recovery codes per §3.2.
7
+ * - {@link deriveBundleKey}: Argon2id over the normalized secret
8
+ * yields the 32-byte K_bundle per §2.5.
9
+ * - {@link deriveRecoverySignKey}: HKDF-Expand(K_bundle, ...) →
10
+ * Ed25519 (recovery_sign_sk, recovery_verify_pk) per §3.3.
11
+ * - {@link encryptBundlePayload} / {@link decryptBundlePayload}:
12
+ * XChaCha20-Poly1305 per §2.5.
13
+ *
14
+ * @module
15
+ */
16
+ import { type BundleKDF } from "./types.js";
17
+ /** Recovery secret encoding per §3.1. */
18
+ export type SecretForm = "passphrase" | "recovery_code";
19
+ /** Hard minimum on a passphrase secret's UTF-8 byte length per §3.1. */
20
+ export declare const MinPassphraseBytes = 12;
21
+ /** HKDF info string for the recovery signing-key seed per §3.3. */
22
+ export declare const RecoverySignKeyInfo = "SEMP-RECOVERY-SIGN-KEY-v1";
23
+ /**
24
+ * Return the UTF-8 byte representation of `raw` after applying the
25
+ * §3.2 normalization rules for `form`:
26
+ *
27
+ * - `passphrase`: NFKC, trimmed of leading/trailing whitespace.
28
+ * - `recovery_code`: split on whitespace, lowercase each token,
29
+ * join with single ASCII space.
30
+ */
31
+ export declare function normalizeRecoverySecret(form: SecretForm, raw: string): Uint8Array;
32
+ /**
33
+ * Run Argon2id over `secretBytes` with the parameters in `kdf` and
34
+ * return the 32-byte K_bundle per §2.5. Validates that `kdf` meets
35
+ * the §2.5 minima before computing.
36
+ */
37
+ export declare function deriveBundleKey(secretBytes: Uint8Array, kdf: BundleKDF): Uint8Array;
38
+ /**
39
+ * Derive the (recovery_sign_seed, recovery_verify_pk) Ed25519 key
40
+ * pair per §3.3:
41
+ *
42
+ * seed = HKDF-Expand(K_bundle, "SEMP-RECOVERY-SIGN-KEY-v1", 32)
43
+ *
44
+ * Returns the 32-byte Ed25519 seed (used directly as the secret
45
+ * key per @noble/curves) and the corresponding 32-byte public key.
46
+ */
47
+ export declare function deriveRecoverySignKey(bundleKey: Uint8Array): {
48
+ signSeed: Uint8Array;
49
+ verifyPub: Uint8Array;
50
+ };
51
+ /**
52
+ * XChaCha20-Poly1305-encrypt the JSON-encoded `payload` under
53
+ * `bundleKey` with a 24-byte `nonce`. AAD is empty per §2.5.
54
+ *
55
+ * Returns the ciphertext (with the 16-byte AEAD tag appended).
56
+ */
57
+ export declare function encryptBundlePayload(bundleKey: Uint8Array, nonce: Uint8Array, payload: unknown): Uint8Array;
58
+ /** Reverse {@link encryptBundlePayload}. */
59
+ export declare function decryptBundlePayload<T = unknown>(bundleKey: Uint8Array, nonce: Uint8Array, ciphertext: Uint8Array): T;
60
+ //# sourceMappingURL=bundle_crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle_crypto.d.ts","sourceRoot":"","sources":["../../src/recovery/bundle_crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,EACL,KAAK,SAAS,EAMf,MAAM,YAAY,CAAC;AAEpB,yCAAyC;AACzC,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,eAAe,CAAC;AAExD,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAE/D;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,GACV,UAAU,CAuBZ;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,UAAU,EACvB,GAAG,EAAE,SAAS,GACb,UAAU,CAiBZ;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,UAAU,GAAG;IAC5D,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;CACvB,CAQA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,OAAO,GACf,UAAU,CAWZ;AAED,4CAA4C;AAC5C,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAC9C,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,UAAU,GACrB,CAAC,CAWH"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Bundle-payload encryption + recovery key derivation per
3
+ * RECOVERY.md §2.5 + §3.2 + §3.3.
4
+ *
5
+ * - {@link normalizeRecoverySecret}: NFKC for passphrases /
6
+ * lower+space-join for recovery codes per §3.2.
7
+ * - {@link deriveBundleKey}: Argon2id over the normalized secret
8
+ * yields the 32-byte K_bundle per §2.5.
9
+ * - {@link deriveRecoverySignKey}: HKDF-Expand(K_bundle, ...) →
10
+ * Ed25519 (recovery_sign_sk, recovery_verify_pk) per §3.3.
11
+ * - {@link encryptBundlePayload} / {@link decryptBundlePayload}:
12
+ * XChaCha20-Poly1305 per §2.5.
13
+ *
14
+ * @module
15
+ */
16
+ import { argon2id } from "@noble/hashes/argon2.js";
17
+ import { xchacha20poly1305 } from "@noble/ciphers/chacha.js";
18
+ import { hmac } from "@noble/hashes/hmac.js";
19
+ import { sha512 } from "@noble/hashes/sha2.js";
20
+ import { publicKeyFromSeed } from "../keys/index.js";
21
+ import { KDFAlgorithmArgon2id, MinKDFIterations, MinKDFMemoryKB, MinKDFParallelism, MinKDFSaltBytes, } from "./types.js";
22
+ /** Hard minimum on a passphrase secret's UTF-8 byte length per §3.1. */
23
+ export const MinPassphraseBytes = 12;
24
+ /** HKDF info string for the recovery signing-key seed per §3.3. */
25
+ export const RecoverySignKeyInfo = "SEMP-RECOVERY-SIGN-KEY-v1";
26
+ /**
27
+ * Return the UTF-8 byte representation of `raw` after applying the
28
+ * §3.2 normalization rules for `form`:
29
+ *
30
+ * - `passphrase`: NFKC, trimmed of leading/trailing whitespace.
31
+ * - `recovery_code`: split on whitespace, lowercase each token,
32
+ * join with single ASCII space.
33
+ */
34
+ export function normalizeRecoverySecret(form, raw) {
35
+ switch (form) {
36
+ case "passphrase": {
37
+ const s = raw.normalize("NFKC").trim();
38
+ const bytes = new TextEncoder().encode(s);
39
+ if (bytes.length < MinPassphraseBytes) {
40
+ throw new Error(`recovery: passphrase length ${bytes.length} below ${MinPassphraseBytes}-byte minimum`);
41
+ }
42
+ return bytes;
43
+ }
44
+ case "recovery_code": {
45
+ const fields = raw.trim().split(/\s+/).filter((s) => s !== "");
46
+ if (fields.length === 0) {
47
+ throw new Error("recovery: recovery code is empty");
48
+ }
49
+ const joined = fields.map((w) => w.toLowerCase()).join(" ");
50
+ return new TextEncoder().encode(joined);
51
+ }
52
+ default:
53
+ throw new Error(`recovery: unsupported secret form ${JSON.stringify(form)}`);
54
+ }
55
+ }
56
+ /**
57
+ * Run Argon2id over `secretBytes` with the parameters in `kdf` and
58
+ * return the 32-byte K_bundle per §2.5. Validates that `kdf` meets
59
+ * the §2.5 minima before computing.
60
+ */
61
+ export function deriveBundleKey(secretBytes, kdf) {
62
+ if (secretBytes.length === 0) {
63
+ throw new Error("recovery: empty recovery secret bytes");
64
+ }
65
+ validateKDFParams(kdf);
66
+ const salt = base64Decode(kdf.salt);
67
+ if (salt.length < MinKDFSaltBytes) {
68
+ throw new Error(`recovery: kdf salt length ${salt.length} below ${MinKDFSaltBytes}-byte minimum`);
69
+ }
70
+ return argon2id(secretBytes, salt, {
71
+ t: kdf.iterations,
72
+ m: kdf.memory_kb,
73
+ p: kdf.parallelism,
74
+ dkLen: 32,
75
+ });
76
+ }
77
+ /**
78
+ * Derive the (recovery_sign_seed, recovery_verify_pk) Ed25519 key
79
+ * pair per §3.3:
80
+ *
81
+ * seed = HKDF-Expand(K_bundle, "SEMP-RECOVERY-SIGN-KEY-v1", 32)
82
+ *
83
+ * Returns the 32-byte Ed25519 seed (used directly as the secret
84
+ * key per @noble/curves) and the corresponding 32-byte public key.
85
+ */
86
+ export function deriveRecoverySignKey(bundleKey) {
87
+ if (bundleKey.length === 0) {
88
+ throw new Error("recovery: empty bundle key");
89
+ }
90
+ const info = new TextEncoder().encode(RecoverySignKeyInfo);
91
+ const seed = hkdfExpandSHA512(bundleKey, info, 32);
92
+ const verifyPub = publicKeyFromSeed(seed);
93
+ return { signSeed: seed, verifyPub };
94
+ }
95
+ /**
96
+ * XChaCha20-Poly1305-encrypt the JSON-encoded `payload` under
97
+ * `bundleKey` with a 24-byte `nonce`. AAD is empty per §2.5.
98
+ *
99
+ * Returns the ciphertext (with the 16-byte AEAD tag appended).
100
+ */
101
+ export function encryptBundlePayload(bundleKey, nonce, payload) {
102
+ if (bundleKey.length !== 32) {
103
+ throw new Error(`recovery: bundle key length ${bundleKey.length}, want 32`);
104
+ }
105
+ if (nonce.length !== 24) {
106
+ throw new Error(`recovery: payload nonce length ${nonce.length}, want 24`);
107
+ }
108
+ const plaintext = new TextEncoder().encode(JSON.stringify(payload));
109
+ return xchacha20poly1305(bundleKey, nonce).encrypt(plaintext);
110
+ }
111
+ /** Reverse {@link encryptBundlePayload}. */
112
+ export function decryptBundlePayload(bundleKey, nonce, ciphertext) {
113
+ if (bundleKey.length !== 32) {
114
+ throw new Error(`recovery: bundle key length ${bundleKey.length}, want 32`);
115
+ }
116
+ if (nonce.length !== 24) {
117
+ throw new Error(`recovery: payload nonce length ${nonce.length}, want 24`);
118
+ }
119
+ const plaintext = xchacha20poly1305(bundleKey, nonce).decrypt(ciphertext);
120
+ return JSON.parse(new TextDecoder().decode(plaintext));
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // Helpers
124
+ function validateKDFParams(kdf) {
125
+ if (kdf.algorithm !== KDFAlgorithmArgon2id) {
126
+ throw new Error(`recovery: kdf.algorithm ${JSON.stringify(kdf.algorithm)}, want ${KDFAlgorithmArgon2id}`);
127
+ }
128
+ if (typeof kdf.salt !== "string" || kdf.salt === "") {
129
+ throw new Error("recovery: kdf.salt missing");
130
+ }
131
+ if (!Number.isInteger(kdf.memory_kb) || kdf.memory_kb < MinKDFMemoryKB) {
132
+ throw new Error(`recovery: kdf.memory_kb ${kdf.memory_kb} below ${MinKDFMemoryKB} minimum`);
133
+ }
134
+ if (!Number.isInteger(kdf.iterations) || kdf.iterations < MinKDFIterations) {
135
+ throw new Error(`recovery: kdf.iterations ${kdf.iterations} below ${MinKDFIterations} minimum`);
136
+ }
137
+ if (!Number.isInteger(kdf.parallelism) ||
138
+ kdf.parallelism < MinKDFParallelism) {
139
+ throw new Error(`recovery: kdf.parallelism ${kdf.parallelism} below ${MinKDFParallelism} minimum`);
140
+ }
141
+ }
142
+ /**
143
+ * RFC 5869 HKDF-Expand with HMAC-SHA-512. Permits PRK shorter than
144
+ * HashLen (§3.3 passes 32-byte K_bundle as the PRK).
145
+ */
146
+ function hkdfExpandSHA512(prk, info, length) {
147
+ const hashLen = 64;
148
+ const N = Math.ceil(length / hashLen);
149
+ if (N > 255) {
150
+ throw new Error("recovery: HKDF-Expand requested length too large");
151
+ }
152
+ let prev = new Uint8Array(0);
153
+ const out = new Uint8Array(length);
154
+ let written = 0;
155
+ for (let i = 1; i <= N; i++) {
156
+ const buf = new Uint8Array(prev.length + info.length + 1);
157
+ buf.set(prev, 0);
158
+ buf.set(info, prev.length);
159
+ buf[prev.length + info.length] = i;
160
+ const t = hmac(sha512, prk, buf);
161
+ const take = Math.min(hashLen, length - written);
162
+ out.set(t.slice(0, take), written);
163
+ written += take;
164
+ prev = t;
165
+ }
166
+ return out;
167
+ }
168
+ function base64Decode(s) {
169
+ if (typeof Buffer !== "undefined") {
170
+ return new Uint8Array(Buffer.from(s, "base64"));
171
+ }
172
+ const bin = atob(s);
173
+ const out = new Uint8Array(bin.length);
174
+ for (let i = 0; i < bin.length; i++) {
175
+ out[i] = bin.charCodeAt(i);
176
+ }
177
+ return out;
178
+ }
179
+ //# sourceMappingURL=bundle_crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle_crypto.js","sourceRoot":"","sources":["../../src/recovery/bundle_crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Backup-bundle persistence per RECOVERY.md §2.6.
3
+ *
4
+ * The home server retains the user's most recent bundle plus the
5
+ * recent superseded chain (so a client recovering after a long
6
+ * offline period can fetch the bundle that matches whichever
7
+ * recovery secret the user remembers). Pruning honors the §2.6
8
+ * floor of 30 days for superseded entries.
9
+ *
10
+ * @module
11
+ */
12
+ import type { BackupBundle } from "./types.js";
13
+ /**
14
+ * Spec-mandated retention floor for superseded bundles per §2.6:
15
+ * at least 30 days. Operators MAY use a larger value; smaller
16
+ * values are clamped up by {@link InMemoryBundleStore.pruneSuperseded}.
17
+ */
18
+ export declare const MinSupersededRetentionMs: number;
19
+ /** Persistence interface for backup bundles. */
20
+ export interface BundleStore {
21
+ /**
22
+ * Replace the current bundle for `userId`. The previous current
23
+ * bundle (if any) becomes superseded as of `supersededAt`.
24
+ * Throws when the new bundle's `supersedes` field doesn't point
25
+ * at the existing current bundle's id (or when the existing
26
+ * record's user_id doesn't match).
27
+ */
28
+ putCurrent(userId: string, bundle: BackupBundle, supersededAt: Date): Promise<void>;
29
+ /** Fetch the current bundle for `userId`, or null when none. */
30
+ getCurrent(userId: string): Promise<BackupBundle | null>;
31
+ /**
32
+ * Return every bundle (current + superseded) for `userId` in
33
+ * descending order by created_at. Empty list when no bundles.
34
+ */
35
+ history(userId: string): Promise<BackupBundle[]>;
36
+ /** Remove every bundle for `userId`. */
37
+ deleteAll(userId: string): Promise<void>;
38
+ /**
39
+ * Drop superseded bundles whose `supersededAt` is older than
40
+ * `now - retainForMs`. Values smaller than
41
+ * {@link MinSupersededRetentionMs} are clamped up. Returns the
42
+ * number pruned.
43
+ */
44
+ pruneSuperseded(retainForMs: number, now?: Date): Promise<number>;
45
+ }
46
+ /** Reference {@link BundleStore}. Single-process only. */
47
+ export declare class InMemoryBundleStore implements BundleStore {
48
+ private readonly byUser;
49
+ private readonly nowFn;
50
+ constructor(nowFn?: () => Date);
51
+ putCurrent(userId: string, bundle: BackupBundle, supersededAt: Date): Promise<void>;
52
+ getCurrent(userId: string): Promise<BackupBundle | null>;
53
+ history(userId: string): Promise<BackupBundle[]>;
54
+ deleteAll(userId: string): Promise<void>;
55
+ pruneSuperseded(retainForMs: number, now?: Date): Promise<number>;
56
+ }
57
+ //# sourceMappingURL=bundle_store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle_store.d.ts","sourceRoot":"","sources":["../../src/recovery/bundle_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAA2B,CAAC;AAQjE,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,UAAU,CACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,IAAI,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,gEAAgE;IAChE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAEzD;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEjD,wCAAwC;IACxC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;;;OAKG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE;AAED,0DAA0D;AAC1D,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAEvB,KAAK,GAAE,MAAM,IAAuB;IAI1C,UAAU,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,IAAI,GACjB,OAAO,CAAC,IAAI,CAAC;IA8BV,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IASxD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAWhD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,IAAI,GACT,OAAO,CAAC,MAAM,CAAC;CA6BnB"}