@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.
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/brief/address.d.ts +77 -0
- package/dist/brief/address.d.ts.map +1 -0
- package/dist/brief/address.js +217 -0
- package/dist/brief/address.js.map +1 -0
- package/dist/brief/brief.d.ts +75 -0
- package/dist/brief/brief.d.ts.map +1 -0
- package/dist/brief/brief.js +56 -0
- package/dist/brief/brief.js.map +1 -0
- package/dist/brief/index.d.ts +11 -0
- package/dist/brief/index.d.ts.map +1 -0
- package/dist/brief/index.js +11 -0
- package/dist/brief/index.js.map +1 -0
- package/dist/canonical/index.d.ts +8 -0
- package/dist/canonical/index.d.ts.map +1 -0
- package/dist/canonical/index.js +8 -0
- package/dist/canonical/index.js.map +1 -0
- package/dist/canonical/marshal.d.ts +35 -0
- package/dist/canonical/marshal.d.ts.map +1 -0
- package/dist/canonical/marshal.js +107 -0
- package/dist/canonical/marshal.js.map +1 -0
- package/dist/clockskew/index.d.ts +52 -0
- package/dist/clockskew/index.d.ts.map +1 -0
- package/dist/clockskew/index.js +62 -0
- package/dist/clockskew/index.js.map +1 -0
- package/dist/closure/closure.d.ts +106 -0
- package/dist/closure/closure.d.ts.map +1 -0
- package/dist/closure/closure.js +152 -0
- package/dist/closure/closure.js.map +1 -0
- package/dist/closure/driver.d.ts +103 -0
- package/dist/closure/driver.d.ts.map +1 -0
- package/dist/closure/driver.js +126 -0
- package/dist/closure/driver.js.map +1 -0
- package/dist/closure/index.d.ts +13 -0
- package/dist/closure/index.d.ts.map +1 -0
- package/dist/closure/index.js +13 -0
- package/dist/closure/index.js.map +1 -0
- package/dist/closure/store.d.ts +80 -0
- package/dist/closure/store.d.ts.map +1 -0
- package/dist/closure/store.js +89 -0
- package/dist/closure/store.js.map +1 -0
- package/dist/crypto/aead.d.ts +29 -0
- package/dist/crypto/aead.d.ts.map +1 -0
- package/dist/crypto/aead.js +48 -0
- package/dist/crypto/aead.js.map +1 -0
- package/dist/crypto/argon2.d.ts +20 -0
- package/dist/crypto/argon2.d.ts.map +1 -0
- package/dist/crypto/argon2.js +28 -0
- package/dist/crypto/argon2.js.map +1 -0
- package/dist/crypto/index.d.ts +14 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +14 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/kdf.d.ts +96 -0
- package/dist/crypto/kdf.d.ts.map +1 -0
- package/dist/crypto/kdf.js +122 -0
- package/dist/crypto/kdf.js.map +1 -0
- package/dist/crypto/kem.d.ts +85 -0
- package/dist/crypto/kem.d.ts.map +1 -0
- package/dist/crypto/kem.js +130 -0
- package/dist/crypto/kem.js.map +1 -0
- package/dist/crypto/mac.d.ts +19 -0
- package/dist/crypto/mac.d.ts.map +1 -0
- package/dist/crypto/mac.js +32 -0
- package/dist/crypto/mac.js.map +1 -0
- package/dist/delivery/ack.d.ts +125 -0
- package/dist/delivery/ack.d.ts.map +1 -0
- package/dist/delivery/ack.js +141 -0
- package/dist/delivery/ack.js.map +1 -0
- package/dist/delivery/blocklist.d.ts +87 -0
- package/dist/delivery/blocklist.d.ts.map +1 -0
- package/dist/delivery/blocklist.js +107 -0
- package/dist/delivery/blocklist.js.map +1 -0
- package/dist/delivery/cancel.d.ts +60 -0
- package/dist/delivery/cancel.d.ts.map +1 -0
- package/dist/delivery/cancel.js +43 -0
- package/dist/delivery/cancel.js.map +1 -0
- package/dist/delivery/disposition.d.ts +106 -0
- package/dist/delivery/disposition.d.ts.map +1 -0
- package/dist/delivery/disposition.js +105 -0
- package/dist/delivery/disposition.js.map +1 -0
- package/dist/delivery/fetch.d.ts +59 -0
- package/dist/delivery/fetch.d.ts.map +1 -0
- package/dist/delivery/fetch.js +47 -0
- package/dist/delivery/fetch.js.map +1 -0
- package/dist/delivery/forwarder.d.ts +106 -0
- package/dist/delivery/forwarder.d.ts.map +1 -0
- package/dist/delivery/forwarder.js +251 -0
- package/dist/delivery/forwarder.js.map +1 -0
- package/dist/delivery/inbox.d.ts +42 -0
- package/dist/delivery/inbox.d.ts.map +1 -0
- package/dist/delivery/inbox.js +68 -0
- package/dist/delivery/inbox.js.map +1 -0
- package/dist/delivery/index.d.ts +31 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +31 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/internalroute.d.ts +50 -0
- package/dist/delivery/internalroute.d.ts.map +1 -0
- package/dist/delivery/internalroute.js +23 -0
- package/dist/delivery/internalroute.js.map +1 -0
- package/dist/delivery/pipeline.d.ts +153 -0
- package/dist/delivery/pipeline.d.ts.map +1 -0
- package/dist/delivery/pipeline.js +356 -0
- package/dist/delivery/pipeline.js.map +1 -0
- package/dist/delivery/policy_state.d.ts +105 -0
- package/dist/delivery/policy_state.d.ts.map +1 -0
- package/dist/delivery/policy_state.js +293 -0
- package/dist/delivery/policy_state.js.map +1 -0
- package/dist/delivery/queue.d.ts +47 -0
- package/dist/delivery/queue.d.ts.map +1 -0
- package/dist/delivery/queue.js +33 -0
- package/dist/delivery/queue.js.map +1 -0
- package/dist/delivery/receipt.d.ts +137 -0
- package/dist/delivery/receipt.d.ts.map +1 -0
- package/dist/delivery/receipt.js +181 -0
- package/dist/delivery/receipt.js.map +1 -0
- package/dist/delivery/receipt_store.d.ts +81 -0
- package/dist/delivery/receipt_store.d.ts.map +1 -0
- package/dist/delivery/receipt_store.js +74 -0
- package/dist/delivery/receipt_store.js.map +1 -0
- package/dist/delivery/retry.d.ts +78 -0
- package/dist/delivery/retry.d.ts.map +1 -0
- package/dist/delivery/retry.js +132 -0
- package/dist/delivery/retry.js.map +1 -0
- package/dist/delivery/scheduler.d.ts +156 -0
- package/dist/delivery/scheduler.d.ts.map +1 -0
- package/dist/delivery/scheduler.js +349 -0
- package/dist/delivery/scheduler.js.map +1 -0
- package/dist/delivery/stage_partition.d.ts +87 -0
- package/dist/delivery/stage_partition.d.ts.map +1 -0
- package/dist/delivery/stage_partition.js +122 -0
- package/dist/delivery/stage_partition.js.map +1 -0
- package/dist/delivery/staged_runner.d.ts +100 -0
- package/dist/delivery/staged_runner.d.ts.map +1 -0
- package/dist/delivery/staged_runner.js +277 -0
- package/dist/delivery/staged_runner.js.map +1 -0
- package/dist/delivery/submission.d.ts +72 -0
- package/dist/delivery/submission.d.ts.map +1 -0
- package/dist/delivery/submission.js +58 -0
- package/dist/delivery/submission.js.map +1 -0
- package/dist/delivery/sync.d.ts +68 -0
- package/dist/delivery/sync.d.ts.map +1 -0
- package/dist/delivery/sync.js +99 -0
- package/dist/delivery/sync.js.map +1 -0
- package/dist/delivery/user_policy.d.ts +74 -0
- package/dist/delivery/user_policy.d.ts.map +1 -0
- package/dist/delivery/user_policy.js +140 -0
- package/dist/delivery/user_policy.js.map +1 -0
- package/dist/discovery/cache.d.ts +37 -0
- package/dist/discovery/cache.d.ts.map +1 -0
- package/dist/discovery/cache.js +45 -0
- package/dist/discovery/cache.js.map +1 -0
- package/dist/discovery/configuration.d.ts +97 -0
- package/dist/discovery/configuration.d.ts.map +1 -0
- package/dist/discovery/configuration.js +146 -0
- package/dist/discovery/configuration.js.map +1 -0
- package/dist/discovery/dns.d.ts +56 -0
- package/dist/discovery/dns.d.ts.map +1 -0
- package/dist/discovery/dns.js +120 -0
- package/dist/discovery/dns.js.map +1 -0
- package/dist/discovery/domain_keys.d.ts +62 -0
- package/dist/discovery/domain_keys.d.ts.map +1 -0
- package/dist/discovery/domain_keys.js +89 -0
- package/dist/discovery/domain_keys.js.map +1 -0
- package/dist/discovery/index.d.ts +19 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +19 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/lookup.d.ts +72 -0
- package/dist/discovery/lookup.d.ts.map +1 -0
- package/dist/discovery/lookup.js +121 -0
- package/dist/discovery/lookup.js.map +1 -0
- package/dist/discovery/onion.d.ts +34 -0
- package/dist/discovery/onion.d.ts.map +1 -0
- package/dist/discovery/onion.js +61 -0
- package/dist/discovery/onion.js.map +1 -0
- package/dist/discovery/partition.d.ts +96 -0
- package/dist/discovery/partition.d.ts.map +1 -0
- package/dist/discovery/partition.js +247 -0
- package/dist/discovery/partition.js.map +1 -0
- package/dist/discovery/resolver.d.ts +113 -0
- package/dist/discovery/resolver.d.ts.map +1 -0
- package/dist/discovery/resolver.js +176 -0
- package/dist/discovery/resolver.js.map +1 -0
- package/dist/discovery/txt.d.ts +39 -0
- package/dist/discovery/txt.d.ts.map +1 -0
- package/dist/discovery/txt.js +71 -0
- package/dist/discovery/txt.js.map +1 -0
- package/dist/enclosure/forwarding.d.ts +128 -0
- package/dist/enclosure/forwarding.d.ts.map +1 -0
- package/dist/enclosure/forwarding.js +119 -0
- package/dist/enclosure/forwarding.js.map +1 -0
- package/dist/enclosure/index.d.ts +11 -0
- package/dist/enclosure/index.d.ts.map +1 -0
- package/dist/enclosure/index.js +11 -0
- package/dist/enclosure/index.js.map +1 -0
- package/dist/envelope/buckets.d.ts +38 -0
- package/dist/envelope/buckets.d.ts.map +1 -0
- package/dist/envelope/buckets.js +73 -0
- package/dist/envelope/buckets.js.map +1 -0
- package/dist/envelope/canonical.d.ts +28 -0
- package/dist/envelope/canonical.d.ts.map +1 -0
- package/dist/envelope/canonical.js +54 -0
- package/dist/envelope/canonical.js.map +1 -0
- package/dist/envelope/compose.d.ts +171 -0
- package/dist/envelope/compose.d.ts.map +1 -0
- package/dist/envelope/compose.js +237 -0
- package/dist/envelope/compose.js.map +1 -0
- package/dist/envelope/encode.d.ts +41 -0
- package/dist/envelope/encode.d.ts.map +1 -0
- package/dist/envelope/encode.js +69 -0
- package/dist/envelope/encode.js.map +1 -0
- package/dist/envelope/index.d.ts +20 -0
- package/dist/envelope/index.d.ts.map +1 -0
- package/dist/envelope/index.js +20 -0
- package/dist/envelope/index.js.map +1 -0
- package/dist/envelope/open_any.d.ts +48 -0
- package/dist/envelope/open_any.d.ts.map +1 -0
- package/dist/envelope/open_any.js +81 -0
- package/dist/envelope/open_any.js.map +1 -0
- package/dist/envelope/open_verified.d.ts +59 -0
- package/dist/envelope/open_verified.d.ts.map +1 -0
- package/dist/envelope/open_verified.js +67 -0
- package/dist/envelope/open_verified.js.map +1 -0
- package/dist/envelope/padding.d.ts +55 -0
- package/dist/envelope/padding.d.ts.map +1 -0
- package/dist/envelope/padding.js +162 -0
- package/dist/envelope/padding.js.map +1 -0
- package/dist/envelope/rejection.d.ts +22 -0
- package/dist/envelope/rejection.d.ts.map +1 -0
- package/dist/envelope/rejection.js +30 -0
- package/dist/envelope/rejection.js.map +1 -0
- package/dist/envelope/sendtime.d.ts +49 -0
- package/dist/envelope/sendtime.d.ts.map +1 -0
- package/dist/envelope/sendtime.js +87 -0
- package/dist/envelope/sendtime.js.map +1 -0
- package/dist/envelope/verify.d.ts +29 -0
- package/dist/envelope/verify.d.ts.map +1 -0
- package/dist/envelope/verify.js +90 -0
- package/dist/envelope/verify.js.map +1 -0
- package/dist/extensions/index.d.ts +7 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +7 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/limits.d.ts +101 -0
- package/dist/extensions/limits.d.ts.map +1 -0
- package/dist/extensions/limits.js +175 -0
- package/dist/extensions/limits.js.map +1 -0
- package/dist/handshake/abort.d.ts +49 -0
- package/dist/handshake/abort.d.ts.map +1 -0
- package/dist/handshake/abort.js +82 -0
- package/dist/handshake/abort.js.map +1 -0
- package/dist/handshake/capabilities.d.ts +46 -0
- package/dist/handshake/capabilities.d.ts.map +1 -0
- package/dist/handshake/capabilities.js +114 -0
- package/dist/handshake/capabilities.js.map +1 -0
- package/dist/handshake/client_state.d.ts +186 -0
- package/dist/handshake/client_state.d.ts.map +1 -0
- package/dist/handshake/client_state.js +520 -0
- package/dist/handshake/client_state.js.map +1 -0
- package/dist/handshake/confirm.d.ts +21 -0
- package/dist/handshake/confirm.d.ts.map +1 -0
- package/dist/handshake/confirm.js +27 -0
- package/dist/handshake/confirm.js.map +1 -0
- package/dist/handshake/driver.d.ts +126 -0
- package/dist/handshake/driver.d.ts.map +1 -0
- package/dist/handshake/driver.js +251 -0
- package/dist/handshake/driver.js.map +1 -0
- package/dist/handshake/federation.d.ts +365 -0
- package/dist/handshake/federation.d.ts.map +1 -0
- package/dist/handshake/federation.js +664 -0
- package/dist/handshake/federation.js.map +1 -0
- package/dist/handshake/first_contact.d.ts +57 -0
- package/dist/handshake/first_contact.d.ts.map +1 -0
- package/dist/handshake/first_contact.js +124 -0
- package/dist/handshake/first_contact.js.map +1 -0
- package/dist/handshake/identity.d.ts +101 -0
- package/dist/handshake/identity.d.ts.map +1 -0
- package/dist/handshake/identity.js +117 -0
- package/dist/handshake/identity.js.map +1 -0
- package/dist/handshake/index.d.ts +21 -0
- package/dist/handshake/index.d.ts.map +1 -0
- package/dist/handshake/index.js +21 -0
- package/dist/handshake/index.js.map +1 -0
- package/dist/handshake/messages.d.ts +176 -0
- package/dist/handshake/messages.d.ts.map +1 -0
- package/dist/handshake/messages.js +125 -0
- package/dist/handshake/messages.js.map +1 -0
- package/dist/handshake/pow.d.ts +53 -0
- package/dist/handshake/pow.d.ts.map +1 -0
- package/dist/handshake/pow.js +142 -0
- package/dist/handshake/pow.js.map +1 -0
- package/dist/handshake/resume_driver.d.ts +56 -0
- package/dist/handshake/resume_driver.d.ts.map +1 -0
- package/dist/handshake/resume_driver.js +75 -0
- package/dist/handshake/resume_driver.js.map +1 -0
- package/dist/handshake/server.d.ts +112 -0
- package/dist/handshake/server.d.ts.map +1 -0
- package/dist/handshake/server.js +247 -0
- package/dist/handshake/server.js.map +1 -0
- package/dist/handshake/server_state.d.ts +102 -0
- package/dist/handshake/server_state.d.ts.map +1 -0
- package/dist/handshake/server_state.js +278 -0
- package/dist/handshake/server_state.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/keys/compromise.d.ts +118 -0
- package/dist/keys/compromise.d.ts.map +1 -0
- package/dist/keys/compromise.js +218 -0
- package/dist/keys/compromise.js.map +1 -0
- package/dist/keys/device_certificate.d.ts +166 -0
- package/dist/keys/device_certificate.d.ts.map +1 -0
- package/dist/keys/device_certificate.js +328 -0
- package/dist/keys/device_certificate.js.map +1 -0
- package/dist/keys/device_records.d.ts +175 -0
- package/dist/keys/device_records.d.ts.map +1 -0
- package/dist/keys/device_records.js +418 -0
- package/dist/keys/device_records.js.map +1 -0
- package/dist/keys/directory_cache.d.ts +64 -0
- package/dist/keys/directory_cache.d.ts.map +1 -0
- package/dist/keys/directory_cache.js +98 -0
- package/dist/keys/directory_cache.js.map +1 -0
- package/dist/keys/directory_state.d.ts +79 -0
- package/dist/keys/directory_state.d.ts.map +1 -0
- package/dist/keys/directory_state.js +155 -0
- package/dist/keys/directory_state.js.map +1 -0
- package/dist/keys/index.d.ts +18 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +18 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/keys/key_revocation.d.ts +61 -0
- package/dist/keys/key_revocation.d.ts.map +1 -0
- package/dist/keys/key_revocation.js +88 -0
- package/dist/keys/key_revocation.js.map +1 -0
- package/dist/keys/request.d.ts +124 -0
- package/dist/keys/request.d.ts.map +1 -0
- package/dist/keys/request.js +130 -0
- package/dist/keys/request.js.map +1 -0
- package/dist/keys/sign.d.ts +49 -0
- package/dist/keys/sign.d.ts.map +1 -0
- package/dist/keys/sign.js +80 -0
- package/dist/keys/sign.js.map +1 -0
- package/dist/keys/signed.d.ts +80 -0
- package/dist/keys/signed.d.ts.map +1 -0
- package/dist/keys/signed.js +138 -0
- package/dist/keys/signed.js.map +1 -0
- package/dist/keys/store.d.ts +138 -0
- package/dist/keys/store.d.ts.map +1 -0
- package/dist/keys/store.js +107 -0
- package/dist/keys/store.js.map +1 -0
- package/dist/largeattachment/crypto.d.ts +47 -0
- package/dist/largeattachment/crypto.d.ts.map +1 -0
- package/dist/largeattachment/crypto.js +235 -0
- package/dist/largeattachment/crypto.js.map +1 -0
- package/dist/largeattachment/enclosure.d.ts +48 -0
- package/dist/largeattachment/enclosure.d.ts.map +1 -0
- package/dist/largeattachment/enclosure.js +102 -0
- package/dist/largeattachment/enclosure.js.map +1 -0
- package/dist/largeattachment/index.d.ts +15 -0
- package/dist/largeattachment/index.d.ts.map +1 -0
- package/dist/largeattachment/index.js +15 -0
- package/dist/largeattachment/index.js.map +1 -0
- package/dist/largeattachment/store.d.ts +36 -0
- package/dist/largeattachment/store.d.ts.map +1 -0
- package/dist/largeattachment/store.js +37 -0
- package/dist/largeattachment/store.js.map +1 -0
- package/dist/largeattachment/types.d.ts +56 -0
- package/dist/largeattachment/types.d.ts.map +1 -0
- package/dist/largeattachment/types.js +31 -0
- package/dist/largeattachment/types.js.map +1 -0
- package/dist/largeattachment/upload.d.ts +62 -0
- package/dist/largeattachment/upload.d.ts.map +1 -0
- package/dist/largeattachment/upload.js +166 -0
- package/dist/largeattachment/upload.js.map +1 -0
- package/dist/migration/index.d.ts +17 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +17 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/lockout.d.ts +48 -0
- package/dist/migration/lockout.d.ts.map +1 -0
- package/dist/migration/lockout.js +57 -0
- package/dist/migration/lockout.js.map +1 -0
- package/dist/migration/migration.d.ts +48 -0
- package/dist/migration/migration.d.ts.map +1 -0
- package/dist/migration/migration.js +58 -0
- package/dist/migration/migration.js.map +1 -0
- package/dist/migration/notice.d.ts +33 -0
- package/dist/migration/notice.d.ts.map +1 -0
- package/dist/migration/notice.js +85 -0
- package/dist/migration/notice.js.map +1 -0
- package/dist/migration/orchestrate.d.ts +109 -0
- package/dist/migration/orchestrate.d.ts.map +1 -0
- package/dist/migration/orchestrate.js +212 -0
- package/dist/migration/orchestrate.js.map +1 -0
- package/dist/migration/publication_store.d.ts +34 -0
- package/dist/migration/publication_store.d.ts.map +1 -0
- package/dist/migration/publication_store.js +44 -0
- package/dist/migration/publication_store.js.map +1 -0
- package/dist/migration/sign.d.ts +65 -0
- package/dist/migration/sign.d.ts.map +1 -0
- package/dist/migration/sign.js +331 -0
- package/dist/migration/sign.js.map +1 -0
- package/dist/migration/types.d.ts +92 -0
- package/dist/migration/types.d.ts.map +1 -0
- package/dist/migration/types.js +26 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/reasoncodes.d.ts +42 -0
- package/dist/reasoncodes.d.ts.map +1 -0
- package/dist/reasoncodes.js +80 -0
- package/dist/reasoncodes.js.map +1 -0
- package/dist/recovery/bundle.d.ts +34 -0
- package/dist/recovery/bundle.d.ts.map +1 -0
- package/dist/recovery/bundle.js +144 -0
- package/dist/recovery/bundle.js.map +1 -0
- package/dist/recovery/bundle_crypto.d.ts +60 -0
- package/dist/recovery/bundle_crypto.d.ts.map +1 -0
- package/dist/recovery/bundle_crypto.js +179 -0
- package/dist/recovery/bundle_crypto.js.map +1 -0
- package/dist/recovery/bundle_store.d.ts +57 -0
- package/dist/recovery/bundle_store.d.ts.map +1 -0
- package/dist/recovery/bundle_store.js +104 -0
- package/dist/recovery/bundle_store.js.map +1 -0
- package/dist/recovery/index.d.ts +19 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +19 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/recovery/manifest_crosscheck.d.ts +59 -0
- package/dist/recovery/manifest_crosscheck.d.ts.map +1 -0
- package/dist/recovery/manifest_crosscheck.js +59 -0
- package/dist/recovery/manifest_crosscheck.js.map +1 -0
- package/dist/recovery/shamir.d.ts +51 -0
- package/dist/recovery/shamir.d.ts.map +1 -0
- package/dist/recovery/shamir.js +181 -0
- package/dist/recovery/shamir.js.map +1 -0
- package/dist/recovery/sign.d.ts +61 -0
- package/dist/recovery/sign.d.ts.map +1 -0
- package/dist/recovery/sign.js +359 -0
- package/dist/recovery/sign.js.map +1 -0
- package/dist/recovery/types.d.ts +180 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/recovery/types.js +31 -0
- package/dist/recovery/types.js.map +1 -0
- package/dist/reputation/abuse_report.d.ts +62 -0
- package/dist/reputation/abuse_report.d.ts.map +1 -0
- package/dist/reputation/abuse_report.js +111 -0
- package/dist/reputation/abuse_report.js.map +1 -0
- package/dist/reputation/bucketize.d.ts +31 -0
- package/dist/reputation/bucketize.d.ts.map +1 -0
- package/dist/reputation/bucketize.js +77 -0
- package/dist/reputation/bucketize.js.map +1 -0
- package/dist/reputation/gossip.d.ts +24 -0
- package/dist/reputation/gossip.d.ts.map +1 -0
- package/dist/reputation/gossip.js +64 -0
- package/dist/reputation/gossip.js.map +1 -0
- package/dist/reputation/gossip_fetch.d.ts +64 -0
- package/dist/reputation/gossip_fetch.d.ts.map +1 -0
- package/dist/reputation/gossip_fetch.js +114 -0
- package/dist/reputation/gossip_fetch.js.map +1 -0
- package/dist/reputation/index.d.ts +20 -0
- package/dist/reputation/index.d.ts.map +1 -0
- package/dist/reputation/index.js +20 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/observation_store.d.ts +67 -0
- package/dist/reputation/observation_store.d.ts.map +1 -0
- package/dist/reputation/observation_store.js +171 -0
- package/dist/reputation/observation_store.js.map +1 -0
- package/dist/reputation/pow.d.ts +91 -0
- package/dist/reputation/pow.d.ts.map +1 -0
- package/dist/reputation/pow.js +209 -0
- package/dist/reputation/pow.js.map +1 -0
- package/dist/reputation/sign.d.ts +40 -0
- package/dist/reputation/sign.d.ts.map +1 -0
- package/dist/reputation/sign.js +202 -0
- package/dist/reputation/sign.js.map +1 -0
- package/dist/reputation/types.d.ts +133 -0
- package/dist/reputation/types.d.ts.map +1 -0
- package/dist/reputation/types.js +33 -0
- package/dist/reputation/types.js.map +1 -0
- package/dist/reputation/whois.d.ts +25 -0
- package/dist/reputation/whois.d.ts.map +1 -0
- package/dist/reputation/whois.js +20 -0
- package/dist/reputation/whois.js.map +1 -0
- package/dist/seal/index.d.ts +8 -0
- package/dist/seal/index.d.ts.map +1 -0
- package/dist/seal/index.js +8 -0
- package/dist/seal/index.js.map +1 -0
- package/dist/seal/wrap.d.ts +74 -0
- package/dist/seal/wrap.d.ts.map +1 -0
- package/dist/seal/wrap.js +213 -0
- package/dist/seal/wrap.js.map +1 -0
- package/dist/session/dispatcher.d.ts +65 -0
- package/dist/session/dispatcher.d.ts.map +1 -0
- package/dist/session/dispatcher.js +96 -0
- package/dist/session/dispatcher.js.map +1 -0
- package/dist/session/index.d.ts +15 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +15 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/rekey.d.ts +108 -0
- package/dist/session/rekey.d.ts.map +1 -0
- package/dist/session/rekey.js +207 -0
- package/dist/session/rekey.js.map +1 -0
- package/dist/session/rekey_seal.d.ts +66 -0
- package/dist/session/rekey_seal.d.ts.map +1 -0
- package/dist/session/rekey_seal.js +153 -0
- package/dist/session/rekey_seal.js.map +1 -0
- package/dist/session/resume.d.ts +125 -0
- package/dist/session/resume.d.ts.map +1 -0
- package/dist/session/resume.js +263 -0
- package/dist/session/resume.js.map +1 -0
- package/dist/session/session.d.ts +136 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +188 -0
- package/dist/session/session.js.map +1 -0
- package/dist/transparency/index.d.ts +13 -0
- package/dist/transparency/index.d.ts.map +1 -0
- package/dist/transparency/index.js +13 -0
- package/dist/transparency/index.js.map +1 -0
- package/dist/transparency/log.d.ts +61 -0
- package/dist/transparency/log.d.ts.map +1 -0
- package/dist/transparency/log.js +133 -0
- package/dist/transparency/log.js.map +1 -0
- package/dist/transparency/merkle.d.ts +59 -0
- package/dist/transparency/merkle.d.ts.map +1 -0
- package/dist/transparency/merkle.js +314 -0
- package/dist/transparency/merkle.js.map +1 -0
- package/dist/transparency/sign.d.ts +48 -0
- package/dist/transparency/sign.d.ts.map +1 -0
- package/dist/transparency/sign.js +140 -0
- package/dist/transparency/sign.js.map +1 -0
- package/dist/transparency/types.d.ts +97 -0
- package/dist/transparency/types.d.ts.map +1 -0
- package/dist/transparency/types.js +25 -0
- package/dist/transparency/types.js.map +1 -0
- package/dist/transport/h2.d.ts +163 -0
- package/dist/transport/h2.d.ts.map +1 -0
- package/dist/transport/h2.js +397 -0
- package/dist/transport/h2.js.map +1 -0
- package/dist/transport/index.d.ts +15 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +15 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/memory.d.ts +21 -0
- package/dist/transport/memory.d.ts.map +1 -0
- package/dist/transport/memory.js +112 -0
- package/dist/transport/memory.js.map +1 -0
- package/dist/transport/transport.d.ts +54 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +20 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/transport/ws.d.ts +40 -0
- package/dist/transport/ws.d.ts.map +1 -0
- package/dist/transport/ws.js +204 -0
- package/dist/transport/ws.js.map +1 -0
- 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"}
|