@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,218 @@
1
+ /**
2
+ * KEY.md §10.5.5 atomic identity-key rotation cascade.
3
+ *
4
+ * Revoking a device with reason `key_compromise` MUST be done in
5
+ * the same transaction as rotating to a new identity key plus a new
6
+ * encryption key — the compromised device held the shared identity
7
+ * private key, so the adversary holds it too. A partial cascade
8
+ * (device revoked but identity key not rotated) leaves the account
9
+ * vulnerable and is a specification violation.
10
+ *
11
+ * The bundle a revoking device produces:
12
+ *
13
+ * 1. {@link DeviceRevocation} for the compromised device, reason
14
+ * `key_compromise`, signed by the prior identity key.
15
+ * 2. {@link SuccessorRecord} linking the prior identity key to the
16
+ * new one, with `recovery_signature` and `new_key_signature`
17
+ * populated. The home server fills in `domain_signature` on
18
+ * receipt per RECOVERY.md §7.3.
19
+ * 3. New identity + new encryption public keys, fresh and ready to
20
+ * publish via the account's key endpoint.
21
+ * 4. {@link RevocationPublication} for the prior identity key,
22
+ * reason `key_compromise`, `replacement_key_id` pointing at the
23
+ * new identity key, signed by the prior identity key (which the
24
+ * revoking device still holds).
25
+ *
26
+ * The home server runs {@link verifyCompromiseRotation} on receipt,
27
+ * then commits all four artifacts atomically.
28
+ *
29
+ * @module
30
+ */
31
+ import { RecordVersion as RecoveryRecordVersion, SuccessorRecordType, prepareSuccessorSignatures, signSuccessorNewKey, signSuccessorRecovery, verifySuccessorTwoSignatures, } from "../recovery/index.js";
32
+ import { DeviceRecordVersion, DeviceRevocationType, signDeviceRevocation, verifyDeviceRevocation, } from "./device_records.js";
33
+ import { RevocationPublicationType, RevocationVersion, signRevocationPublication, verifyRevocationPublication, } from "./key_revocation.js";
34
+ /**
35
+ * Produce the four-artifact bundle a revoking device submits to the
36
+ * home server atomically.
37
+ *
38
+ * The successor record's `domain_signature` is left empty; the home
39
+ * server adds it on receipt per RECOVERY.md §7.3.
40
+ *
41
+ * Throws on missing input or signing failure.
42
+ */
43
+ export function buildCompromiseRotation(input) {
44
+ if (input.userId === "") {
45
+ throw new Error("keys: rotation input missing user_id");
46
+ }
47
+ if (input.compromisedDeviceId === "") {
48
+ throw new Error("keys: rotation input missing compromised_device_id");
49
+ }
50
+ if (input.revokingDeviceId === "") {
51
+ throw new Error("keys: rotation input missing revoking_device_id");
52
+ }
53
+ if (input.priorIdentitySeed.length === 0 || input.priorIdentityKeyId === "") {
54
+ throw new Error("keys: rotation input missing prior identity key");
55
+ }
56
+ if (input.newIdentitySeed.length === 0 ||
57
+ input.newIdentityPublicKey.length === 0 ||
58
+ input.newIdentityKeyId === "") {
59
+ throw new Error("keys: rotation input missing new identity key");
60
+ }
61
+ if (input.newEncryptionPublicKey.length === 0 ||
62
+ input.newEncryptionKeyId === "") {
63
+ throw new Error("keys: rotation input missing new encryption key");
64
+ }
65
+ if (input.recoverySeed.length === 0 || input.recoveryKeyId === "") {
66
+ throw new Error("keys: rotation input missing recovery signing key");
67
+ }
68
+ if (input.priorIdentityKeyId === input.newIdentityKeyId) {
69
+ throw new Error("keys: prior and new identity fingerprints must differ");
70
+ }
71
+ const isoNow = isoSecond(input.now ?? new Date());
72
+ // 1. Device revocation, reason key_compromise.
73
+ const dev = {
74
+ type: DeviceRevocationType,
75
+ version: DeviceRecordVersion,
76
+ user_id: input.userId,
77
+ device_id: input.compromisedDeviceId,
78
+ reason: "key_compromise",
79
+ revoked_at: isoNow,
80
+ revoked_by_device_id: input.revokingDeviceId,
81
+ replacement_device_id: null,
82
+ signature: { algorithm: "", key_id: "", value: "" },
83
+ };
84
+ signDeviceRevocation(dev, input.priorIdentitySeed, input.priorIdentityKeyId);
85
+ // 2. Successor record (recovery + new_key sigs); domain_signature
86
+ // slot's key_id is left empty for the home server to fill in.
87
+ const suc = {
88
+ type: SuccessorRecordType,
89
+ version: RecoveryRecordVersion,
90
+ user_id: input.userId,
91
+ prior_key_id: input.priorIdentityKeyId,
92
+ new_key_id: input.newIdentityKeyId,
93
+ new_public_key: base64Encode(input.newIdentityPublicKey),
94
+ recovered_at: isoNow,
95
+ recovery_signature: { algorithm: "", key_id: "", value: "" },
96
+ new_key_signature: { algorithm: "", key_id: "", value: "" },
97
+ domain_signature: { algorithm: "", key_id: "", value: "" },
98
+ };
99
+ prepareSuccessorSignatures(suc, input.recoveryKeyId, input.newIdentityKeyId, "");
100
+ signSuccessorRecovery(suc, input.recoverySeed, input.recoveryKeyId);
101
+ signSuccessorNewKey(suc, input.newIdentitySeed, input.newIdentityKeyId);
102
+ // 3. The new public keys travel alongside the cascade; publication
103
+ // via the key endpoint is the home server's job.
104
+ // 4. Prior-identity revocation, signed by the prior identity key
105
+ // with reason key_compromise and replacement_key_id pointing at the
106
+ // new identity key.
107
+ const priorEntry = {
108
+ key_id: input.priorIdentityKeyId,
109
+ address: input.userId,
110
+ reason: "key_compromise",
111
+ revoked_at: isoNow,
112
+ replacement_key_id: input.newIdentityKeyId,
113
+ };
114
+ const prior = {
115
+ type: RevocationPublicationType,
116
+ version: RevocationVersion,
117
+ revoked_keys: [priorEntry],
118
+ signature: { algorithm: "", key_id: "", value: "" },
119
+ };
120
+ signRevocationPublication(prior, input.priorIdentitySeed, input.priorIdentityKeyId);
121
+ return {
122
+ device_revocation: dev,
123
+ successor: suc,
124
+ new_identity_public_key: input.newIdentityPublicKey,
125
+ new_identity_key_id: input.newIdentityKeyId,
126
+ new_encryption_public_key: input.newEncryptionPublicKey,
127
+ new_encryption_key_id: input.newEncryptionKeyId,
128
+ prior_identity_revocation: prior,
129
+ };
130
+ }
131
+ /**
132
+ * Verify every device-side signature in the cascade. The home server
133
+ * runs this on receipt before committing the bundle, then adds its
134
+ * own `domain_signature` to the successor record per RECOVERY.md §7.3.
135
+ *
136
+ * Throws on the first violation.
137
+ *
138
+ * @param c - the bundle
139
+ * @param priorIdentityPub - published public half of the prior
140
+ * identity key (the home server resolves it from the account's
141
+ * now-revoked-but-historical key set)
142
+ * @param recoveryVerifyPub - the `recovery_verify_pk` that the prior
143
+ * identity key signed at bundle upload time per RECOVERY.md §7.5
144
+ * (the home server resolves it from the prior key record)
145
+ */
146
+ export function verifyCompromiseRotation(c, priorIdentityPub, recoveryVerifyPub) {
147
+ if (c.device_revocation === undefined || c.device_revocation === null) {
148
+ throw new Error("keys: rotation bundle missing device_revocation");
149
+ }
150
+ if (c.successor === undefined || c.successor === null) {
151
+ throw new Error("keys: rotation bundle missing successor record");
152
+ }
153
+ if (c.prior_identity_revocation === undefined ||
154
+ c.prior_identity_revocation === null) {
155
+ throw new Error("keys: rotation bundle missing prior_identity_revocation");
156
+ }
157
+ if (c.device_revocation.reason !== "key_compromise") {
158
+ throw new Error(`keys: rotation device revocation reason ${JSON.stringify(c.device_revocation.reason)}, want key_compromise`);
159
+ }
160
+ if (!verifyDeviceRevocation(c.device_revocation, priorIdentityPub)) {
161
+ throw new Error("keys: device revocation signature did not verify");
162
+ }
163
+ // Successor record: recovery_signature verifies under
164
+ // recoveryVerifyPub; new_key_signature verifies under the new
165
+ // identity public key carried inline in new_public_key;
166
+ // domain_signature is empty at this point.
167
+ let newPub;
168
+ try {
169
+ newPub = base64Decode(c.successor.new_public_key);
170
+ }
171
+ catch (err) {
172
+ throw new Error(`keys: decode successor new_public_key: ${err instanceof Error ? err.message : String(err)}`);
173
+ }
174
+ if (!verifySuccessorTwoSignatures(c.successor, recoveryVerifyPub, newPub)) {
175
+ throw new Error("keys: successor record two-signature verify failed");
176
+ }
177
+ if (!verifyRevocationPublication(c.prior_identity_revocation, priorIdentityPub)) {
178
+ throw new Error("keys: prior identity revocation signature did not verify");
179
+ }
180
+ // Cross-check: the revocation entry MUST name the prior identity
181
+ // key with reason key_compromise and replacement = new identity key
182
+ // carried inline.
183
+ if (c.prior_identity_revocation.revoked_keys.length !== 1) {
184
+ throw new Error(`keys: prior identity revocation MUST contain exactly one entry, got ${c.prior_identity_revocation.revoked_keys.length}`);
185
+ }
186
+ const entry = c.prior_identity_revocation.revoked_keys[0];
187
+ if (entry.reason !== "key_compromise") {
188
+ throw new Error(`keys: prior identity revocation entry reason ${JSON.stringify(entry.reason)}, want key_compromise`);
189
+ }
190
+ if (entry.replacement_key_id !== c.new_identity_key_id) {
191
+ throw new Error(`keys: prior identity revocation replacement ${JSON.stringify(entry.replacement_key_id)} does not match cascade new_identity_key_id ${JSON.stringify(c.new_identity_key_id)}`);
192
+ }
193
+ }
194
+ function isoSecond(d) {
195
+ return d.toISOString().replace(/\.\d{3}Z$/, "Z");
196
+ }
197
+ function base64Encode(b) {
198
+ if (typeof Buffer !== "undefined") {
199
+ return Buffer.from(b).toString("base64");
200
+ }
201
+ let bin = "";
202
+ for (let i = 0; i < b.length; i++) {
203
+ bin += String.fromCharCode(b[i] ?? 0);
204
+ }
205
+ return btoa(bin);
206
+ }
207
+ function base64Decode(s) {
208
+ if (typeof Buffer !== "undefined") {
209
+ return new Uint8Array(Buffer.from(s, "base64"));
210
+ }
211
+ const bin = atob(s);
212
+ const out = new Uint8Array(bin.length);
213
+ for (let i = 0; i < bin.length; i++) {
214
+ out[i] = bin.charCodeAt(i);
215
+ }
216
+ return out;
217
+ }
218
+ //# sourceMappingURL=compromise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compromise.js","sourceRoot":"","sources":["../../src/keys/compromise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Scoped device certificates per KEY.md §10.3.
3
+ *
4
+ * A `SEMP_DEVICE_CERTIFICATE` binds a delegated device's public key
5
+ * to a permission scope and is signed by an existing full-access
6
+ * device of the account (the issuer). The home server enforces the
7
+ * scope on every relevant operation by the delegated device.
8
+ *
9
+ * This module provides:
10
+ *
11
+ * - {@link DeviceCertificate} typed shape + the supporting
12
+ * {@link Scope}, {@link ScopeMatcher}, {@link ScopeResource},
13
+ * {@link ScopeEntry}, {@link RateLimitTier} types.
14
+ * - {@link signDeviceCertificate}: build + Ed25519-sign a certificate
15
+ * under the issuing device's signing seed (path
16
+ * `signature.value`, prefix `SEMP-DEVICE-AUTHORIZE:`).
17
+ * - {@link verifyDeviceCertificate}: Ed25519-verify against the
18
+ * issuer's published device public key.
19
+ * - {@link validateDeviceCertificate}: structural checks per
20
+ * §10.3.2 / §10.3.3 / §10.3.8 (lifetime cap, scope rules).
21
+ * - {@link scopeAllowsRecipient} / {@link scopeAllowsSender}:
22
+ * enforcement helpers that the home server invokes on each
23
+ * operation per §10.3.4.
24
+ *
25
+ * @module
26
+ */
27
+ /** `type` discriminator for a device certificate. */
28
+ export declare const DeviceCertificateType = "SEMP_DEVICE_CERTIFICATE";
29
+ /** Domain-separation prefix for the issuer signature, per ENVELOPE.md §4.3. */
30
+ export declare const DeviceAuthorizePrefix = "SEMP-DEVICE-AUTHORIZE:";
31
+ /** Combined cap on `allow + deny` size in a single matcher per §10.3.3.1. */
32
+ export declare const MaxScopeMatcherEntries = 10000;
33
+ /** Cap on rate-limit tiers per scope field per §10.3.3.3. */
34
+ export declare const MaxScopeRateLimitTiers = 16;
35
+ /** Cap on certificate lifetime per §10.3.8: 365 days, in milliseconds. */
36
+ export declare const MaxDeviceCertificateLifetimeMs: number;
37
+ /** Matcher modes per §10.3.3.1. */
38
+ export type MatcherMode = "unrestricted" | "restricted" | "denylist" | "none";
39
+ /** Entity types per DELIVERY.md §5.3, reused in scope entries. */
40
+ export type EntityType = "user" | "domain" | "server";
41
+ /** One entry in a matcher's `allow` or `deny` list. */
42
+ export interface ScopeEntry {
43
+ type: EntityType;
44
+ /** Required when `type === "user"`: full SEMP address. */
45
+ address?: string;
46
+ /** Required when `type === "domain"` or `type === "server"`. */
47
+ domain?: string;
48
+ /** Required when `type === "server"` (semp-go uses `domain`; this matches the spec). */
49
+ server?: string;
50
+ }
51
+ /** Rate-limit tier per §10.3.3.3. */
52
+ export interface RateLimitTier {
53
+ /** Rolling-window length, MUST be >= 1. */
54
+ period_seconds: number;
55
+ /** Max ops per window, MUST be >= 0. */
56
+ amount_allowed: number;
57
+ }
58
+ /** Matcher-shape permission per §10.3.3.1, used by `scope.send` and `scope.receive`. */
59
+ export interface ScopeMatcher {
60
+ mode: MatcherMode;
61
+ allow?: ScopeEntry[];
62
+ deny?: ScopeEntry[];
63
+ rate_limits: RateLimitTier[];
64
+ /** Present only on `scope.receive`. Positive integer, position in staged delivery. */
65
+ delivery_stage?: number;
66
+ }
67
+ /** Resource-shape permission per §10.3.3.2, used by blocklist/keys/devices. */
68
+ export interface ScopeResource {
69
+ read: boolean;
70
+ write: boolean;
71
+ rate_limits: RateLimitTier[];
72
+ }
73
+ /** Five-field scope object per §10.3.3. */
74
+ export interface Scope {
75
+ send: ScopeMatcher;
76
+ receive: ScopeMatcher;
77
+ blocklist: ScopeResource;
78
+ keys: ScopeResource;
79
+ devices: ScopeResource;
80
+ }
81
+ /** Issuer signature block. */
82
+ export interface CertificateSignature {
83
+ algorithm: string;
84
+ key_id: string;
85
+ value: string;
86
+ }
87
+ /** SEMP_DEVICE_CERTIFICATE record per §10.3.1. */
88
+ export interface DeviceCertificate {
89
+ type: typeof DeviceCertificateType;
90
+ version: string;
91
+ device_id: string;
92
+ device_public_key: string;
93
+ account: string;
94
+ issued_by: string;
95
+ issued_at: string;
96
+ expires_at: string;
97
+ scope: Scope;
98
+ signature: CertificateSignature;
99
+ }
100
+ /** Inputs to {@link signDeviceCertificate}. */
101
+ export interface SignDeviceCertificateInput {
102
+ /** Pre-sign certificate; `signature.value` will be replaced. */
103
+ certificate: DeviceCertificate;
104
+ /** 32-byte Ed25519 secret seed for the issuing device. */
105
+ issuerSigningSeed: Uint8Array;
106
+ /** Lowercase-hex SHA-256 fingerprint of the issuing device public key. */
107
+ issuerKeyId: string;
108
+ }
109
+ /** Result of a successful {@link signDeviceCertificate} call. */
110
+ export interface SignDeviceCertificateResult {
111
+ certificate: DeviceCertificate;
112
+ signatureB64: string;
113
+ }
114
+ /**
115
+ * Compute the issuer's signature over the canonical certificate
116
+ * bytes, then return a copy with `signature.{algorithm,key_id,value}`
117
+ * populated. Pre-populates the algorithm + key_id BEFORE
118
+ * canonicalization so the canonical bytes cover both — an attacker
119
+ * cannot downgrade the signing algorithm or forge a different
120
+ * issuer fingerprint.
121
+ */
122
+ export declare function signDeviceCertificate(input: SignDeviceCertificateInput): SignDeviceCertificateResult;
123
+ /**
124
+ * Ed25519-verify a certificate's signature under `issuerPub`. Returns
125
+ * true when the signature verifies. Does NOT cross-check that the
126
+ * issuer is currently a registered, non-revoked full-access device
127
+ * for the account — that requires a key directory store and is the
128
+ * caller's responsibility.
129
+ */
130
+ export declare function verifyDeviceCertificate(certificate: DeviceCertificate, issuerPub: Uint8Array): boolean;
131
+ /** Options for {@link validateDeviceCertificate}. */
132
+ export interface ValidateOptions {
133
+ /**
134
+ * When true, don't require `signature.value` to be a non-empty
135
+ * string. Used during the compose path before signing.
136
+ */
137
+ skipSignatureCheck?: boolean;
138
+ }
139
+ /**
140
+ * Structural validation per §10.3.2 / §10.3.3 / §10.3.8. Throws on
141
+ * the first violation. Does NOT verify the signature; pair with
142
+ * {@link verifyDeviceCertificate}.
143
+ */
144
+ export declare function validateDeviceCertificate(c: DeviceCertificate, opts?: ValidateOptions): void;
145
+ /** Structural validation of a {@link Scope} per §10.3.3. */
146
+ export declare function validateScope(scope: Scope): void;
147
+ /** Sender / recipient address inputs for matcher checks. */
148
+ export interface AddressIdentity {
149
+ /** Full SEMP address (e.g. `alice@example.com`). */
150
+ address: string;
151
+ /** Routing server hostname when known. */
152
+ server?: string;
153
+ }
154
+ /**
155
+ * Report whether `matcher` permits sending to `recipient` per
156
+ * §10.3.3.1. Does NOT evaluate rate limits — the caller applies
157
+ * rate-limit tiers separately per §10.3.4.
158
+ */
159
+ export declare function scopeAllowsRecipient(matcher: ScopeMatcher, recipient: AddressIdentity): boolean;
160
+ /**
161
+ * Report whether `matcher` permits receiving from `sender` per
162
+ * §10.3.3.1. Identical evaluation to {@link scopeAllowsRecipient};
163
+ * separate name reads clearly at call sites.
164
+ */
165
+ export declare function scopeAllowsSender(matcher: ScopeMatcher, sender: AddressIdentity): boolean;
166
+ //# sourceMappingURL=device_certificate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device_certificate.d.ts","sourceRoot":"","sources":["../../src/keys/device_certificate.ts"],"names":[],"mappings":"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"}