@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,418 @@
1
+ /**
2
+ * Multi-device record primitives per KEY.md §10.1, §10.5, §10.6.
3
+ *
4
+ * Three record kinds share an account-identity-key signature on the
5
+ * outer envelope so a home server or correspondent can verify
6
+ * "this record was authored by the account's current identity key"
7
+ * without knowing the device graph in advance:
8
+ *
9
+ * - {@link DeviceRegistration} (`SEMP_DEVICE`, step="register"):
10
+ * announces a new device. Carries device pubkey, role, and an
11
+ * INNER authorization signature from an existing full-access
12
+ * device that authorized the enrollment (§10.2).
13
+ * - {@link DeviceRevocation} (`SEMP_DEVICE_REVOCATION`): removes
14
+ * a device from the active set per §10.5.
15
+ * - {@link DeviceDirectory} (`SEMP_DEVICE_DIRECTORY`): the
16
+ * home server's signed list of currently active devices, with
17
+ * a monotonically increasing revision so correspondents can
18
+ * detect rollback per §10.6.
19
+ *
20
+ * The SEMP_DEVICE_CERTIFICATE (scoped delegation) lives in
21
+ * {@link "./device_certificate"}.
22
+ *
23
+ * @module
24
+ */
25
+ import { sign as ed25519Sign, verify as ed25519Verify } from "./sign.js";
26
+ import { signSignedDoc, verifySignedDoc } from "./signed.js";
27
+ /** Wire-level type discriminators. */
28
+ export const DeviceRegistrationType = "SEMP_DEVICE";
29
+ export const DeviceRegistrationStep = "register";
30
+ export const DeviceRevocationType = "SEMP_DEVICE_REVOCATION";
31
+ export const DeviceDirectoryType = "SEMP_DEVICE_DIRECTORY";
32
+ export const DeviceRecordVersion = "1.0.0";
33
+ /** Domain-separation prefixes per ENVELOPE.md §4.3. */
34
+ export const DeviceRegisterPrefix = "SEMP-DEVICE-REGISTER:";
35
+ export const DeviceAuthorizeRecordPrefix = "SEMP-DEVICE-AUTHORIZE:";
36
+ export const DeviceRevocationPrefix = "SEMP-DEVICE-REVOCATION:";
37
+ export const DeviceDirectoryPrefix = "SEMP-DEVICE-DIRECTORY:";
38
+ /**
39
+ * Report whether `r` is the kind of revocation that triggers
40
+ * mandatory identity-key rotation per §10.5.5.
41
+ */
42
+ export function requiresIdentityRotation(r) {
43
+ return r === "key_compromise";
44
+ }
45
+ /**
46
+ * Sign the inner authorization block and place it on
47
+ * `registration.authorization`. The caller MUST have populated
48
+ * `registration.device_id`, `device_public_key`, `enrolled_at`
49
+ * before calling.
50
+ */
51
+ export function signDeviceAuthorization(input) {
52
+ const reg = input.registration;
53
+ if (input.enrollNonce.length === 0) {
54
+ throw new Error("keys: empty enroll nonce");
55
+ }
56
+ if (input.authorizingDeviceId === "") {
57
+ throw new Error("keys: empty authorizing_device_id");
58
+ }
59
+ if (input.authorizingDeviceKeyId === "") {
60
+ throw new Error("keys: empty authorizing key_id");
61
+ }
62
+ if (reg.device_id === "" || reg.device_public_key === "" || reg.enrolled_at === "") {
63
+ throw new Error("keys: device registration missing device_id / device_public_key / enrolled_at");
64
+ }
65
+ const authBytes = authorizationCanonicalBytes(reg.device_id, reg.device_public_key, reg.enrolled_at, input.enrollNonce);
66
+ const prefixed = concat(new TextEncoder().encode(DeviceAuthorizeRecordPrefix), authBytes);
67
+ const sig = ed25519Sign(input.authorizingDeviceSeed, prefixed);
68
+ reg.authorization = {
69
+ method: input.method,
70
+ authorizing_device_id: input.authorizingDeviceId,
71
+ authorizing_signature: {
72
+ algorithm: "ed25519",
73
+ key_id: input.authorizingDeviceKeyId,
74
+ value: base64Encode(sig),
75
+ },
76
+ };
77
+ }
78
+ /**
79
+ * Verify the inner authorizing-device signature on `registration`
80
+ * using the supplied authorizing-device public key and the SAME
81
+ * `enrollNonce` that was used at sign time. Returns true on success.
82
+ */
83
+ export function verifyDeviceAuthorization(registration, authorizingDevicePub, enrollNonce) {
84
+ const sigB64 = registration.authorization?.authorizing_signature?.value;
85
+ if (typeof sigB64 !== "string" || sigB64 === "") {
86
+ return false;
87
+ }
88
+ let sig;
89
+ try {
90
+ sig = base64Decode(sigB64);
91
+ }
92
+ catch {
93
+ return false;
94
+ }
95
+ const authBytes = authorizationCanonicalBytes(registration.device_id, registration.device_public_key, registration.enrolled_at, enrollNonce);
96
+ const prefixed = concat(new TextEncoder().encode(DeviceAuthorizeRecordPrefix), authBytes);
97
+ return ed25519Verify(authorizingDevicePub, sig, prefixed);
98
+ }
99
+ function authorizationCanonicalBytes(deviceId, devicePublicKey, enrolledAt, enrollNonce) {
100
+ // Per semp-go: NUL-separated concatenation. Boundaries are
101
+ // unambiguous because none of the three string components can
102
+ // contain a NUL byte under SEMP rules.
103
+ const parts = [
104
+ new TextEncoder().encode(deviceId),
105
+ new Uint8Array([0]),
106
+ new TextEncoder().encode(devicePublicKey),
107
+ new Uint8Array([0]),
108
+ new TextEncoder().encode(enrolledAt),
109
+ new Uint8Array([0]),
110
+ enrollNonce,
111
+ ];
112
+ let total = 0;
113
+ for (const p of parts) {
114
+ total += p.length;
115
+ }
116
+ const out = new Uint8Array(total);
117
+ let off = 0;
118
+ for (const p of parts) {
119
+ out.set(p, off);
120
+ off += p.length;
121
+ }
122
+ return out;
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // Outer registration signature (canonical JSON)
126
+ /** Sign the outer identity-key signature on a registration record. */
127
+ export function signDeviceRegistration(reg, identityPriv, identityKeyId) {
128
+ if (identityKeyId === "") {
129
+ throw new Error("keys: empty identity key_id");
130
+ }
131
+ validateDeviceRegistration(reg, { skipSignatureCheck: true });
132
+ reg.signature.algorithm = "ed25519";
133
+ reg.signature.key_id = identityKeyId;
134
+ reg.signature.value = "";
135
+ const { signedJSON, signatureB64 } = signSignedDoc({
136
+ preSignJSON: reg,
137
+ seed: identityPriv,
138
+ signaturePath: "signature.value",
139
+ prefix: DeviceRegisterPrefix,
140
+ });
141
+ reg.signature.value = signedJSON.signature.value;
142
+ return signatureB64;
143
+ }
144
+ /** Verify the outer identity-key signature on a registration record. */
145
+ export function verifyDeviceRegistration(reg, identityPub) {
146
+ validateDeviceRegistration(reg);
147
+ if (reg.signature.value === "") {
148
+ return false;
149
+ }
150
+ const { ok } = verifySignedDoc({
151
+ signedJSON: reg,
152
+ publicKey: identityPub,
153
+ signaturePath: "signature.value",
154
+ prefix: DeviceRegisterPrefix,
155
+ });
156
+ return ok;
157
+ }
158
+ /** Structural validation per §10.1. Throws on first violation. */
159
+ export function validateDeviceRegistration(reg, opts = {}) {
160
+ if (reg.type !== DeviceRegistrationType) {
161
+ throw new Error(`keys: device registration type ${JSON.stringify(reg.type)}, want ${DeviceRegistrationType}`);
162
+ }
163
+ if (reg.step !== DeviceRegistrationStep) {
164
+ throw new Error(`keys: device registration step ${JSON.stringify(reg.step)}, want ${DeviceRegistrationStep}`);
165
+ }
166
+ for (const f of [
167
+ "version",
168
+ "user_id",
169
+ "device_id",
170
+ "device_name",
171
+ "device_type",
172
+ "device_public_key",
173
+ "device_identity_pubkey_algorithm",
174
+ "enrolled_at",
175
+ ]) {
176
+ if (typeof reg[f] !== "string" || reg[f] === "") {
177
+ throw new Error(`keys: device registration missing ${f}`);
178
+ }
179
+ }
180
+ if (Number.isNaN(Date.parse(reg.enrolled_at))) {
181
+ throw new Error("keys: device registration enrolled_at is not ISO 8601");
182
+ }
183
+ if (reg.role !== "full_access" && reg.role !== "delegated") {
184
+ throw new Error(`keys: device registration role ${JSON.stringify(reg.role)} is invalid`);
185
+ }
186
+ if (reg.role === "full_access" && reg.certificate_id !== null) {
187
+ throw new Error("keys: device registration role=full_access requires certificate_id=null");
188
+ }
189
+ if (reg.role === "delegated") {
190
+ if (reg.certificate_id === null || reg.certificate_id === "") {
191
+ throw new Error("keys: device registration role=delegated requires non-empty certificate_id");
192
+ }
193
+ }
194
+ if (reg.authorization === undefined || reg.authorization === null) {
195
+ throw new Error("keys: device registration missing authorization");
196
+ }
197
+ if (reg.authorization.method !== "qr_scan" &&
198
+ reg.authorization.method !== "numeric_code") {
199
+ throw new Error(`keys: device registration authorization.method ${JSON.stringify(reg.authorization.method)} is invalid`);
200
+ }
201
+ if (typeof reg.authorization.authorizing_device_id !== "string" ||
202
+ reg.authorization.authorizing_device_id === "") {
203
+ throw new Error("keys: device registration missing authorization.authorizing_device_id");
204
+ }
205
+ if (typeof reg.authorization.authorizing_signature?.value !== "string") {
206
+ throw new Error("keys: device registration missing authorization.authorizing_signature.value");
207
+ }
208
+ if (typeof reg.signature?.algorithm !== "string") {
209
+ throw new Error("keys: device registration missing signature.algorithm");
210
+ }
211
+ if (typeof reg.signature?.key_id !== "string") {
212
+ throw new Error("keys: device registration missing signature.key_id");
213
+ }
214
+ if (typeof reg.signature?.value !== "string") {
215
+ throw new Error("keys: device registration signature.value must be a string");
216
+ }
217
+ if (!opts.skipSignatureCheck && reg.signature.value === "") {
218
+ throw new Error("keys: device registration is unsigned");
219
+ }
220
+ }
221
+ // ---------------------------------------------------------------------------
222
+ // DeviceRevocation
223
+ /** Sign the identity-key signature on a device revocation record. */
224
+ export function signDeviceRevocation(rev, identityPriv, identityKeyId) {
225
+ if (identityKeyId === "") {
226
+ throw new Error("keys: empty identity key_id");
227
+ }
228
+ validateDeviceRevocation(rev, { skipSignatureCheck: true });
229
+ rev.signature.algorithm = "ed25519";
230
+ rev.signature.key_id = identityKeyId;
231
+ rev.signature.value = "";
232
+ const { signedJSON, signatureB64 } = signSignedDoc({
233
+ preSignJSON: rev,
234
+ seed: identityPriv,
235
+ signaturePath: "signature.value",
236
+ prefix: DeviceRevocationPrefix,
237
+ });
238
+ rev.signature.value = signedJSON.signature.value;
239
+ return signatureB64;
240
+ }
241
+ /** Verify a device revocation record. */
242
+ export function verifyDeviceRevocation(rev, identityPub) {
243
+ validateDeviceRevocation(rev);
244
+ if (rev.signature.value === "") {
245
+ return false;
246
+ }
247
+ const { ok } = verifySignedDoc({
248
+ signedJSON: rev,
249
+ publicKey: identityPub,
250
+ signaturePath: "signature.value",
251
+ prefix: DeviceRevocationPrefix,
252
+ });
253
+ return ok;
254
+ }
255
+ /** Structural validation per §10.5.1. Throws on first violation. */
256
+ export function validateDeviceRevocation(rev, opts = {}) {
257
+ if (rev.type !== DeviceRevocationType) {
258
+ throw new Error(`keys: device revocation type ${JSON.stringify(rev.type)}, want ${DeviceRevocationType}`);
259
+ }
260
+ for (const f of ["version", "user_id", "device_id", "revoked_at", "revoked_by_device_id"]) {
261
+ if (typeof rev[f] !== "string" || rev[f] === "") {
262
+ throw new Error(`keys: device revocation missing ${f}`);
263
+ }
264
+ }
265
+ if (Number.isNaN(Date.parse(rev.revoked_at))) {
266
+ throw new Error("keys: device revocation revoked_at is not ISO 8601");
267
+ }
268
+ if (rev.reason !== "key_compromise" &&
269
+ rev.reason !== "lost" &&
270
+ rev.reason !== "retired" &&
271
+ rev.reason !== "superseded") {
272
+ throw new Error(`keys: device revocation reason ${JSON.stringify(rev.reason)} is invalid`);
273
+ }
274
+ if (rev.reason === "superseded") {
275
+ if (rev.replacement_device_id === null || rev.replacement_device_id === "") {
276
+ throw new Error("keys: device revocation reason=superseded requires replacement_device_id");
277
+ }
278
+ }
279
+ else if (rev.replacement_device_id !== null) {
280
+ throw new Error(`keys: device revocation reason=${rev.reason} forbids replacement_device_id`);
281
+ }
282
+ if (typeof rev.signature?.value !== "string") {
283
+ throw new Error("keys: device revocation signature.value must be a string");
284
+ }
285
+ if (!opts.skipSignatureCheck && rev.signature.value === "") {
286
+ throw new Error("keys: device revocation is unsigned");
287
+ }
288
+ }
289
+ // ---------------------------------------------------------------------------
290
+ // DeviceDirectory
291
+ /** Sign the identity-key signature on a device directory record. */
292
+ export function signDeviceDirectory(dir, identityPriv, identityKeyId) {
293
+ if (identityKeyId === "") {
294
+ throw new Error("keys: empty identity key_id");
295
+ }
296
+ validateDeviceDirectory(dir, { skipSignatureCheck: true });
297
+ dir.signature.algorithm = "ed25519";
298
+ dir.signature.key_id = identityKeyId;
299
+ dir.signature.value = "";
300
+ const { signedJSON, signatureB64 } = signSignedDoc({
301
+ preSignJSON: dir,
302
+ seed: identityPriv,
303
+ signaturePath: "signature.value",
304
+ prefix: DeviceDirectoryPrefix,
305
+ });
306
+ dir.signature.value = signedJSON.signature.value;
307
+ return signatureB64;
308
+ }
309
+ /** Verify a device directory record. */
310
+ export function verifyDeviceDirectory(dir, identityPub) {
311
+ validateDeviceDirectory(dir);
312
+ if (dir.signature.value === "") {
313
+ return false;
314
+ }
315
+ const { ok } = verifySignedDoc({
316
+ signedJSON: dir,
317
+ publicKey: identityPub,
318
+ signaturePath: "signature.value",
319
+ prefix: DeviceDirectoryPrefix,
320
+ });
321
+ return ok;
322
+ }
323
+ /** Structural validation per §10.6.1. Throws on first violation. */
324
+ export function validateDeviceDirectory(dir, opts = {}) {
325
+ if (dir.type !== DeviceDirectoryType) {
326
+ throw new Error(`keys: device directory type ${JSON.stringify(dir.type)}, want ${DeviceDirectoryType}`);
327
+ }
328
+ for (const f of ["version", "user_id", "issued_at"]) {
329
+ if (typeof dir[f] !== "string" || dir[f] === "") {
330
+ throw new Error(`keys: device directory missing ${f}`);
331
+ }
332
+ }
333
+ if (!Number.isInteger(dir.revision) || dir.revision < 0) {
334
+ throw new Error(`keys: device directory revision ${dir.revision} MUST be >= 0`);
335
+ }
336
+ if (Number.isNaN(Date.parse(dir.issued_at))) {
337
+ throw new Error("keys: device directory issued_at is not ISO 8601");
338
+ }
339
+ if (!Array.isArray(dir.devices)) {
340
+ throw new Error("keys: device directory devices must be an array");
341
+ }
342
+ const seenIds = new Set();
343
+ for (let i = 0; i < dir.devices.length; i++) {
344
+ const d = dir.devices[i];
345
+ for (const f of [
346
+ "device_id",
347
+ "device_public_key",
348
+ "device_identity_pubkey_algorithm",
349
+ "enrolled_at",
350
+ "device_name",
351
+ "device_type",
352
+ ]) {
353
+ if (typeof d[f] !== "string" || d[f] === "") {
354
+ throw new Error(`keys: device directory devices[${i}] missing ${f}`);
355
+ }
356
+ }
357
+ if (seenIds.has(d.device_id)) {
358
+ throw new Error(`keys: device directory device_id ${JSON.stringify(d.device_id)} appears more than once`);
359
+ }
360
+ seenIds.add(d.device_id);
361
+ if (d.role !== "full_access" && d.role !== "delegated") {
362
+ throw new Error(`keys: device directory devices[${i}] role ${JSON.stringify(d.role)} is invalid`);
363
+ }
364
+ if (d.role === "full_access" && d.certificate_id !== null) {
365
+ throw new Error(`keys: device directory devices[${i}] role=full_access requires certificate_id=null`);
366
+ }
367
+ if (d.role === "delegated") {
368
+ if (d.certificate_id === null || d.certificate_id === "") {
369
+ throw new Error(`keys: device directory devices[${i}] role=delegated requires non-empty certificate_id`);
370
+ }
371
+ }
372
+ }
373
+ if (typeof dir.signature?.value !== "string") {
374
+ throw new Error("keys: device directory signature.value must be a string");
375
+ }
376
+ if (!opts.skipSignatureCheck && dir.signature.value === "") {
377
+ throw new Error("keys: device directory is unsigned");
378
+ }
379
+ }
380
+ /** Look up a device entry by id. Returns null when not found. */
381
+ export function findDevice(dir, deviceId) {
382
+ for (const d of dir.devices) {
383
+ if (d.device_id === deviceId) {
384
+ return d;
385
+ }
386
+ }
387
+ return null;
388
+ }
389
+ // ---------------------------------------------------------------------------
390
+ // Helpers
391
+ function concat(a, b) {
392
+ const out = new Uint8Array(a.length + b.length);
393
+ out.set(a, 0);
394
+ out.set(b, a.length);
395
+ return out;
396
+ }
397
+ function base64Encode(b) {
398
+ if (typeof Buffer !== "undefined") {
399
+ return Buffer.from(b).toString("base64");
400
+ }
401
+ let bin = "";
402
+ for (let i = 0; i < b.length; i++) {
403
+ bin += String.fromCharCode(b[i] ?? 0);
404
+ }
405
+ return btoa(bin);
406
+ }
407
+ function base64Decode(s) {
408
+ if (typeof Buffer !== "undefined") {
409
+ return new Uint8Array(Buffer.from(s, "base64"));
410
+ }
411
+ const bin = atob(s);
412
+ const out = new Uint8Array(bin.length);
413
+ for (let i = 0; i < bin.length; i++) {
414
+ out[i] = bin.charCodeAt(i);
415
+ }
416
+ return out;
417
+ }
418
+ //# sourceMappingURL=device_records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device_records.js","sourceRoot":"","sources":["../../src/keys/device_records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Consumer-side device directory cache per KEY.md §10.6.2 / §10.6.3.
3
+ *
4
+ * A consumer that fetches a {@link DeviceDirectory} for `user_id` MUST
5
+ * record the highest `revision` it has accepted. Any later fetch
6
+ * whose `revision` is strictly less than the cached value MUST be
7
+ * treated with the same suspicion as a key-substitution attempt
8
+ * (rollback).
9
+ *
10
+ * @module
11
+ */
12
+ import { type DeviceDirectory } from "./device_records.js";
13
+ /**
14
+ * Optional callback invoked on each `delegated` directory entry to
15
+ * confirm the entry's scoped certificate is published and unexpired
16
+ * per §10.6.3 / §10.3.8. May be `undefined`; passing nothing disables
17
+ * the check.
18
+ */
19
+ export type CertificateCheck = (certificateId: string) => void;
20
+ /** A typed error subclass for rollback detection failures. */
21
+ export declare class DirectoryRollbackError extends Error {
22
+ readonly userId: string;
23
+ readonly fetchedRevision: number;
24
+ readonly cachedRevision: number;
25
+ readonly name = "DirectoryRollbackError";
26
+ constructor(userId: string, fetchedRevision: number, cachedRevision: number);
27
+ }
28
+ /**
29
+ * Per-user highest accepted revision tracker. Concurrent verifiers
30
+ * see each other's updates because every mutation goes through the
31
+ * same Map.
32
+ */
33
+ export declare class DirectoryCache {
34
+ private highest;
35
+ /**
36
+ * Run every §10.6.3 consumer rule against `dir` and, on success,
37
+ * advance the cached revision for `dir.user_id`. Throws on the
38
+ * first violation; returns nothing on success.
39
+ *
40
+ * Steps run in order so the most-fundamental failures surface
41
+ * first:
42
+ *
43
+ * 1. Schema validation (every device_id unique, every entry's
44
+ * role/certificate_id consistent, revision >= 0).
45
+ * 2. Identity-key signature verification under `userIdentityPub`.
46
+ * 3. Rollback check against the cached highest revision.
47
+ * 4. Optional certificate-presence callback per delegated entry.
48
+ *
49
+ * @param dir - directory to verify
50
+ * @param userIdentityPub - account's currently active identity public key
51
+ * @param certCheck - per-delegated-entry certificate presence check; optional
52
+ */
53
+ verifyAndCache(dir: DeviceDirectory, userIdentityPub: Uint8Array, certCheck?: CertificateCheck): void;
54
+ /** Highest accepted revision for `userId`, or 0 if none cached. */
55
+ highestRevision(userId: string): number;
56
+ /**
57
+ * Forget the cached revision for `userId`. Intended for tests and
58
+ * operator-driven manual overrides; production consumers MUST NOT
59
+ * reset cached revisions absent strong evidence the prior cache
60
+ * was poisoned.
61
+ */
62
+ reset(userId: string): void;
63
+ }
64
+ //# sourceMappingURL=directory_cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory_cache.d.ts","sourceRoot":"","sources":["../../src/keys/directory_cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,qBAAqB,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;AAE/D,8DAA8D;AAC9D,qBAAa,sBAAuB,SAAQ,KAAK;aAG7B,MAAM,EAAE,MAAM;aACd,eAAe,EAAE,MAAM;aACvB,cAAc,EAAE,MAAM;IAJxC,SAAkB,IAAI,4BAA4B;gBAEhC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM;CAMzC;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA6B;IAE5C;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CACZ,GAAG,EAAE,eAAe,EACpB,eAAe,EAAE,UAAU,EAC3B,SAAS,CAAC,EAAE,gBAAgB,GAC3B,IAAI;IAqCP,mEAAmE;IACnE,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIvC;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAG5B"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Consumer-side device directory cache per KEY.md §10.6.2 / §10.6.3.
3
+ *
4
+ * A consumer that fetches a {@link DeviceDirectory} for `user_id` MUST
5
+ * record the highest `revision` it has accepted. Any later fetch
6
+ * whose `revision` is strictly less than the cached value MUST be
7
+ * treated with the same suspicion as a key-substitution attempt
8
+ * (rollback).
9
+ *
10
+ * @module
11
+ */
12
+ import { validateDeviceDirectory, verifyDeviceDirectory, } from "./device_records.js";
13
+ /** A typed error subclass for rollback detection failures. */
14
+ export class DirectoryRollbackError extends Error {
15
+ userId;
16
+ fetchedRevision;
17
+ cachedRevision;
18
+ name = "DirectoryRollbackError";
19
+ constructor(userId, fetchedRevision, cachedRevision) {
20
+ super(`keys: directory revision ${fetchedRevision} for ${userId} is less than cached revision ${cachedRevision} (rollback suspected per KEY.md §10.6.2)`);
21
+ this.userId = userId;
22
+ this.fetchedRevision = fetchedRevision;
23
+ this.cachedRevision = cachedRevision;
24
+ }
25
+ }
26
+ /**
27
+ * Per-user highest accepted revision tracker. Concurrent verifiers
28
+ * see each other's updates because every mutation goes through the
29
+ * same Map.
30
+ */
31
+ export class DirectoryCache {
32
+ highest = new Map();
33
+ /**
34
+ * Run every §10.6.3 consumer rule against `dir` and, on success,
35
+ * advance the cached revision for `dir.user_id`. Throws on the
36
+ * first violation; returns nothing on success.
37
+ *
38
+ * Steps run in order so the most-fundamental failures surface
39
+ * first:
40
+ *
41
+ * 1. Schema validation (every device_id unique, every entry's
42
+ * role/certificate_id consistent, revision >= 0).
43
+ * 2. Identity-key signature verification under `userIdentityPub`.
44
+ * 3. Rollback check against the cached highest revision.
45
+ * 4. Optional certificate-presence callback per delegated entry.
46
+ *
47
+ * @param dir - directory to verify
48
+ * @param userIdentityPub - account's currently active identity public key
49
+ * @param certCheck - per-delegated-entry certificate presence check; optional
50
+ */
51
+ verifyAndCache(dir, userIdentityPub, certCheck) {
52
+ if (dir === undefined || dir === null) {
53
+ throw new Error("keys: directory cache verify nil directory");
54
+ }
55
+ validateDeviceDirectory(dir);
56
+ if (userIdentityPub.length === 0) {
57
+ throw new Error("keys: directory cache verify missing identity public key");
58
+ }
59
+ if (!verifyDeviceDirectory(dir, userIdentityPub)) {
60
+ throw new Error("keys: device directory signature did not verify");
61
+ }
62
+ const cached = this.highest.get(dir.user_id);
63
+ if (cached !== undefined && dir.revision < cached) {
64
+ throw new DirectoryRollbackError(dir.user_id, dir.revision, cached);
65
+ }
66
+ if (certCheck !== undefined) {
67
+ for (const entry of dir.devices) {
68
+ if (entry.role !== "delegated") {
69
+ continue;
70
+ }
71
+ if (entry.certificate_id === null) {
72
+ continue;
73
+ }
74
+ try {
75
+ certCheck(entry.certificate_id);
76
+ }
77
+ catch (err) {
78
+ throw new Error(`keys: directory delegated entry ${entry.device_id}: ${err instanceof Error ? err.message : String(err)}`);
79
+ }
80
+ }
81
+ }
82
+ this.highest.set(dir.user_id, dir.revision);
83
+ }
84
+ /** Highest accepted revision for `userId`, or 0 if none cached. */
85
+ highestRevision(userId) {
86
+ return this.highest.get(userId) ?? 0;
87
+ }
88
+ /**
89
+ * Forget the cached revision for `userId`. Intended for tests and
90
+ * operator-driven manual overrides; production consumers MUST NOT
91
+ * reset cached revisions absent strong evidence the prior cache
92
+ * was poisoned.
93
+ */
94
+ reset(userId) {
95
+ this.highest.delete(userId);
96
+ }
97
+ }
98
+ //# sourceMappingURL=directory_cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory_cache.js","sourceRoot":"","sources":["../../src/keys/directory_cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAU7B,8DAA8D;AAC9D,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAG7B;IACA;IACA;IAJA,IAAI,GAAG,wBAAwB,CAAC;IAClD,YACkB,MAAc,EACd,eAAuB,EACvB,cAAsB;QAEtC,KAAK,CACH,4BAA4B,eAAe,QAAQ,MAAM,iCAAiC,cAAc,0CAA0C,CACnJ,CAAC;QANc,WAAM,GAAN,MAAM,CAAQ;QACd,oBAAe,GAAf,eAAe,CAAQ;QACvB,mBAAc,GAAd,cAAc,CAAQ;IAKxC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CACZ,GAAoB,EACpB,eAA2B,EAC3B,SAA4B;QAE5B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC;YAClD,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC/B,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;oBAClC,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC;oBACH,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CACb,mCAAmC,KAAK,CAAC,SAAS,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC1G,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,mEAAmE;IACnE,eAAe,CAAC,MAAc;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAc;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;CACF"}