@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,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handshake server driver per HANDSHAKE.md §2.
|
|
3
|
+
*
|
|
4
|
+
* Mirror of {@link "./driver".runClient}: drives one transport
|
|
5
|
+
* through the v1 handshake from the server side, producing a
|
|
6
|
+
* Session on success.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
*
|
|
10
|
+
* 1. Receive INIT. Pull capabilities, transport identifier,
|
|
11
|
+
* client ephemeral key, client nonce.
|
|
12
|
+
* 2. Negotiate the encryption algorithm (server picks the
|
|
13
|
+
* strongest mutually supported suite per HANDSHAKE.md §3).
|
|
14
|
+
* 3. Generate a server ephemeral X25519 keypair and a 32-byte
|
|
15
|
+
* server nonce. Pick a session_id (ULID by convention).
|
|
16
|
+
* 4. Derive the five SEMP session keys + K_resumption via
|
|
17
|
+
* HKDF-SHA-512 over the X25519 shared secret with salt
|
|
18
|
+
* `client_nonce || server_nonce`.
|
|
19
|
+
* 5. Build and send a signed RESPONSE.
|
|
20
|
+
* 6. Receive CONFIRM. Verify the confirmation hash matches
|
|
21
|
+
* SHA-256(canonical(INIT) || canonical(RESPONSE)).
|
|
22
|
+
* 7. (Optional) Verify the identity proof via a caller-supplied
|
|
23
|
+
* hook. v1 driver: if no hook is supplied, skip; otherwise
|
|
24
|
+
* reject on hook rejection.
|
|
25
|
+
* 8. Build and send a signed ACCEPTED with permissions, TTL,
|
|
26
|
+
* and an optional resumption ticket.
|
|
27
|
+
*
|
|
28
|
+
* Errors close the transport so the peer's pending receive
|
|
29
|
+
* unblocks.
|
|
30
|
+
*
|
|
31
|
+
* @module
|
|
32
|
+
*/
|
|
33
|
+
import { type SessionKeys } from "../crypto/index.js";
|
|
34
|
+
import { Session } from "../session/index.js";
|
|
35
|
+
import type { Transport } from "../transport/index.js";
|
|
36
|
+
import { type ResumptionTicket } from "./messages.js";
|
|
37
|
+
/** Result the identity-proof hook returns. */
|
|
38
|
+
export interface IdentityProofVerdict {
|
|
39
|
+
/** True if the proof is acceptable. */
|
|
40
|
+
ok: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* On `ok=false`, the reason_code surfaced in the REJECTED
|
|
43
|
+
* message (default: "auth_failed").
|
|
44
|
+
*/
|
|
45
|
+
reasonCode?: string;
|
|
46
|
+
/** On `ok=false`, the optional human-readable reason. */
|
|
47
|
+
reason?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Configuration for the server side of a handshake. */
|
|
50
|
+
export interface ServerConfig {
|
|
51
|
+
/** 32-byte Ed25519 secret seed for the server's domain signing key. */
|
|
52
|
+
serverDomainSigningSeed: Uint8Array;
|
|
53
|
+
/** The server's domain, surfaced in `server_identity_proof.domain`. */
|
|
54
|
+
domain: string;
|
|
55
|
+
/**
|
|
56
|
+
* Suites this server accepts, in preference order. The server
|
|
57
|
+
* picks the first one that's also in the client's offered set.
|
|
58
|
+
*/
|
|
59
|
+
supportedSuites: ReadonlyArray<"x25519-chacha20-poly1305">;
|
|
60
|
+
/**
|
|
61
|
+
* Per-session identity-proof signature. The driver embeds this
|
|
62
|
+
* into RESPONSE.server_identity_proof. Production servers compute
|
|
63
|
+
* it per HANDSHAKE.md §2.3 over the agreed handshake parameters;
|
|
64
|
+
* v1 driver accepts a caller-supplied callback so the higher
|
|
65
|
+
* layer keeps the per-session signing key out of this module.
|
|
66
|
+
*/
|
|
67
|
+
identityProofSignature: (input: {
|
|
68
|
+
serverEphemeralKey: {
|
|
69
|
+
algorithm: string;
|
|
70
|
+
key: string;
|
|
71
|
+
key_id: string;
|
|
72
|
+
};
|
|
73
|
+
clientNonce: string;
|
|
74
|
+
serverNonce: string;
|
|
75
|
+
}) => string;
|
|
76
|
+
/**
|
|
77
|
+
* Optional verifier for the client's identity proof carried in
|
|
78
|
+
* CONFIRM. If omitted, the v1 driver accepts any non-empty
|
|
79
|
+
* proof (and an empty proof, since the v1 client driver leaves
|
|
80
|
+
* it empty).
|
|
81
|
+
*/
|
|
82
|
+
verifyIdentityProof?: (input: {
|
|
83
|
+
identityProofB64: string;
|
|
84
|
+
sessionKeys: SessionKeys;
|
|
85
|
+
}) => IdentityProofVerdict;
|
|
86
|
+
/**
|
|
87
|
+
* Permissions to grant on ACCEPTED. v1 driver does no
|
|
88
|
+
* authorization; the caller decides.
|
|
89
|
+
*/
|
|
90
|
+
permissions: ReadonlyArray<string>;
|
|
91
|
+
/** Session TTL in seconds. */
|
|
92
|
+
sessionTTL: number;
|
|
93
|
+
/** Optional resumption ticket builder; called once after CONFIRM. */
|
|
94
|
+
resumptionTicket?: (sessionKeys: SessionKeys) => ResumptionTicket;
|
|
95
|
+
/** Generator for session_id (ULID-shaped string). Required. */
|
|
96
|
+
generateSessionId: () => string;
|
|
97
|
+
/** Optional bytes for the server ephemeral private key (tests). */
|
|
98
|
+
serverEphemeralPriv?: Uint8Array;
|
|
99
|
+
/** Optional 32-byte server nonce (tests). */
|
|
100
|
+
serverNonce?: Uint8Array;
|
|
101
|
+
/** Optional extensions echoed back on ACCEPTED. */
|
|
102
|
+
acceptedExtensions?: Record<string, unknown>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Drive a handshake from the server side over `transport`. Resolves
|
|
106
|
+
* with a Session (role="server") that owns the transport on
|
|
107
|
+
* success. On rejection (suite mismatch, identity proof failure,
|
|
108
|
+
* confirmation hash mismatch) sends a signed REJECTED then closes
|
|
109
|
+
* the transport.
|
|
110
|
+
*/
|
|
111
|
+
export declare function runServer(transport: Transport, config: ServerConfig): Promise<Session>;
|
|
112
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/handshake/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAKL,KAAK,gBAAgB,EAKtB,MAAM,eAAe,CAAC;AAEvB,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,uBAAuB,EAAE,UAAU,CAAC;IACpC,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,eAAe,EAAE,aAAa,CAAC,0BAA0B,CAAC,CAAC;IAC3D;;;;;;OAMG;IACH,sBAAsB,EAAE,CAAC,KAAK,EAAE;QAC9B,kBAAkB,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACvE,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAK,MAAM,CAAC;IACb;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC5B,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,WAAW,CAAC;KAC1B,KAAK,oBAAoB,CAAC;IAC3B;;;OAGG;IACH,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,gBAAgB,CAAC;IAClE,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,UAAU,CAAC;IACjC,6CAA6C;IAC7C,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,OAAO,CAAC,CAWlB"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handshake server driver per HANDSHAKE.md §2.
|
|
3
|
+
*
|
|
4
|
+
* Mirror of {@link "./driver".runClient}: drives one transport
|
|
5
|
+
* through the v1 handshake from the server side, producing a
|
|
6
|
+
* Session on success.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
*
|
|
10
|
+
* 1. Receive INIT. Pull capabilities, transport identifier,
|
|
11
|
+
* client ephemeral key, client nonce.
|
|
12
|
+
* 2. Negotiate the encryption algorithm (server picks the
|
|
13
|
+
* strongest mutually supported suite per HANDSHAKE.md §3).
|
|
14
|
+
* 3. Generate a server ephemeral X25519 keypair and a 32-byte
|
|
15
|
+
* server nonce. Pick a session_id (ULID by convention).
|
|
16
|
+
* 4. Derive the five SEMP session keys + K_resumption via
|
|
17
|
+
* HKDF-SHA-512 over the X25519 shared secret with salt
|
|
18
|
+
* `client_nonce || server_nonce`.
|
|
19
|
+
* 5. Build and send a signed RESPONSE.
|
|
20
|
+
* 6. Receive CONFIRM. Verify the confirmation hash matches
|
|
21
|
+
* SHA-256(canonical(INIT) || canonical(RESPONSE)).
|
|
22
|
+
* 7. (Optional) Verify the identity proof via a caller-supplied
|
|
23
|
+
* hook. v1 driver: if no hook is supplied, skip; otherwise
|
|
24
|
+
* reject on hook rejection.
|
|
25
|
+
* 8. Build and send a signed ACCEPTED with permissions, TTL,
|
|
26
|
+
* and an optional resumption ticket.
|
|
27
|
+
*
|
|
28
|
+
* Errors close the transport so the peer's pending receive
|
|
29
|
+
* unblocks.
|
|
30
|
+
*
|
|
31
|
+
* @module
|
|
32
|
+
*/
|
|
33
|
+
import { marshal as canonicalMarshal } from "../canonical/index.js";
|
|
34
|
+
import { deriveSessionKeysWithResumption, newHKDFSHA512, x25519Agree, x25519PublicKey, } from "../crypto/index.js";
|
|
35
|
+
import { fingerprint, publicKeyFromSeed } from "../keys/index.js";
|
|
36
|
+
import { Session } from "../session/index.js";
|
|
37
|
+
import { confirmationHash } from "./confirm.js";
|
|
38
|
+
import { buildAccepted, buildRejected, buildResponse, } from "./messages.js";
|
|
39
|
+
/**
|
|
40
|
+
* Drive a handshake from the server side over `transport`. Resolves
|
|
41
|
+
* with a Session (role="server") that owns the transport on
|
|
42
|
+
* success. On rejection (suite mismatch, identity proof failure,
|
|
43
|
+
* confirmation hash mismatch) sends a signed REJECTED then closes
|
|
44
|
+
* the transport.
|
|
45
|
+
*/
|
|
46
|
+
export async function runServer(transport, config) {
|
|
47
|
+
try {
|
|
48
|
+
return await runServerInner(transport, config);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
try {
|
|
52
|
+
await transport.close();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// already closed
|
|
56
|
+
}
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function runServerInner(transport, config) {
|
|
61
|
+
// Step 1: receive INIT.
|
|
62
|
+
const initBytes = await receiveOrThrow(transport, "init");
|
|
63
|
+
const initMsg = parseHandshakeMessage(initBytes);
|
|
64
|
+
if (initMsg.step !== "init") {
|
|
65
|
+
throw new Error(`handshake: expected step="init", got "${initMsg.step}"`);
|
|
66
|
+
}
|
|
67
|
+
const init = JSON.parse(new TextDecoder().decode(initBytes));
|
|
68
|
+
// Step 2: negotiate.
|
|
69
|
+
const negotiated = pickSuite(init.capabilities.encryption_algorithms, config.supportedSuites);
|
|
70
|
+
const sessionId = config.generateSessionId();
|
|
71
|
+
if (negotiated === undefined) {
|
|
72
|
+
await sendRejected(transport, sessionId, "version_unsupported", config.serverDomainSigningSeed);
|
|
73
|
+
throw new Error("handshake: no mutually supported suite");
|
|
74
|
+
}
|
|
75
|
+
// Step 3: ephemeral + nonce + session_id.
|
|
76
|
+
const serverEphPriv = config.serverEphemeralPriv ?? randomBytes(32);
|
|
77
|
+
const serverEphPub = x25519PublicKey(serverEphPriv);
|
|
78
|
+
const serverEphKeyId = fingerprint(serverEphPub);
|
|
79
|
+
const serverNonce = config.serverNonce ?? randomBytes(32);
|
|
80
|
+
// Step 4: derive session keys.
|
|
81
|
+
const clientEphPub = base64Decode(init.client_ephemeral_key.key);
|
|
82
|
+
const clientNonce = base64Decode(init.nonce);
|
|
83
|
+
const sharedSecret = x25519Agree(serverEphPriv, clientEphPub);
|
|
84
|
+
const kdf = newHKDFSHA512();
|
|
85
|
+
const keys = deriveSessionKeysWithResumption(kdf, sharedSecret, clientNonce, serverNonce);
|
|
86
|
+
// Step 5: signed RESPONSE.
|
|
87
|
+
const serverIdentityProof = {
|
|
88
|
+
domain: config.domain,
|
|
89
|
+
key_id: fingerprint(publicKeyFromSeed(config.serverDomainSigningSeed)),
|
|
90
|
+
signature: config.identityProofSignature({
|
|
91
|
+
serverEphemeralKey: {
|
|
92
|
+
algorithm: negotiated,
|
|
93
|
+
key: base64Encode(serverEphPub),
|
|
94
|
+
key_id: serverEphKeyId,
|
|
95
|
+
},
|
|
96
|
+
clientNonce: init.nonce,
|
|
97
|
+
serverNonce: base64Encode(serverNonce),
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
const resp = buildResponse({
|
|
101
|
+
sessionId,
|
|
102
|
+
clientNonce: init.nonce,
|
|
103
|
+
serverNonce: base64Encode(serverNonce),
|
|
104
|
+
serverEphemeralKey: {
|
|
105
|
+
algorithm: negotiated,
|
|
106
|
+
key: base64Encode(serverEphPub),
|
|
107
|
+
key_id: serverEphKeyId,
|
|
108
|
+
},
|
|
109
|
+
serverIdentityProof,
|
|
110
|
+
negotiated: {
|
|
111
|
+
encryption_algorithm: negotiated,
|
|
112
|
+
extensions: [],
|
|
113
|
+
},
|
|
114
|
+
serverDomainSigningSeed: config.serverDomainSigningSeed,
|
|
115
|
+
});
|
|
116
|
+
await transport.send(canonicalMarshal(resp));
|
|
117
|
+
// Step 6: CONFIRM.
|
|
118
|
+
const confirmBytes = await receiveOrThrow(transport, "confirm");
|
|
119
|
+
const confirmMsg = parseHandshakeMessage(confirmBytes);
|
|
120
|
+
if (confirmMsg.step !== "confirm") {
|
|
121
|
+
throw new Error(`handshake: expected step="confirm", got "${confirmMsg.step}"`);
|
|
122
|
+
}
|
|
123
|
+
const confirm = JSON.parse(new TextDecoder().decode(confirmBytes));
|
|
124
|
+
// Verify confirmation_hash.
|
|
125
|
+
const wantHash = confirmationHash(initBytes, canonicalMarshal(resp));
|
|
126
|
+
const gotHash = base64Decode(confirm.confirmation_hash);
|
|
127
|
+
if (!constantTimeEqual(gotHash, wantHash)) {
|
|
128
|
+
await sendRejected(transport, sessionId, "handshake_invalid", config.serverDomainSigningSeed);
|
|
129
|
+
throw new Error("handshake: confirmation hash mismatch");
|
|
130
|
+
}
|
|
131
|
+
// Step 7: optional identity proof verification.
|
|
132
|
+
if (config.verifyIdentityProof !== undefined) {
|
|
133
|
+
const verdict = config.verifyIdentityProof({
|
|
134
|
+
identityProofB64: confirm.identity_proof,
|
|
135
|
+
sessionKeys: keys,
|
|
136
|
+
});
|
|
137
|
+
if (!verdict.ok) {
|
|
138
|
+
await sendRejected(transport, sessionId, verdict.reasonCode ?? "auth_failed", config.serverDomainSigningSeed, verdict.reason);
|
|
139
|
+
throw new Error(`handshake: identity proof rejected (${verdict.reasonCode ?? "auth_failed"})`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Step 8: signed ACCEPTED.
|
|
143
|
+
const ticket = config.resumptionTicket?.(keys);
|
|
144
|
+
const accepted = buildAccepted({
|
|
145
|
+
sessionId,
|
|
146
|
+
sessionTTL: config.sessionTTL,
|
|
147
|
+
permissions: [...config.permissions],
|
|
148
|
+
serverDomainSigningSeed: config.serverDomainSigningSeed,
|
|
149
|
+
...(ticket !== undefined ? { resumptionTicket: ticket } : {}),
|
|
150
|
+
...(config.acceptedExtensions !== undefined
|
|
151
|
+
? { extensions: config.acceptedExtensions }
|
|
152
|
+
: {}),
|
|
153
|
+
});
|
|
154
|
+
await transport.send(canonicalMarshal(accepted));
|
|
155
|
+
return new Session({
|
|
156
|
+
role: "server",
|
|
157
|
+
sessionId,
|
|
158
|
+
sessionTTL: config.sessionTTL,
|
|
159
|
+
establishedAt: new Date(),
|
|
160
|
+
permissions: [...config.permissions],
|
|
161
|
+
keys,
|
|
162
|
+
transport,
|
|
163
|
+
...(ticket !== undefined ? { resumptionTicket: ticket } : {}),
|
|
164
|
+
serverIdentityProofKeyId: serverIdentityProof.key_id,
|
|
165
|
+
serverIdentityProofSignature: serverIdentityProof.signature,
|
|
166
|
+
extensions: config.acceptedExtensions ?? {},
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// Internals
|
|
171
|
+
function pickSuite(clientOffers, serverSupports) {
|
|
172
|
+
for (const s of serverSupports) {
|
|
173
|
+
if (clientOffers.includes(s)) {
|
|
174
|
+
return s;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
async function sendRejected(transport, sessionId, reasonCode, serverDomainSigningSeed, reason) {
|
|
180
|
+
const r = buildRejected({
|
|
181
|
+
sessionId,
|
|
182
|
+
reasonCode,
|
|
183
|
+
serverDomainSigningSeed,
|
|
184
|
+
...(reason !== undefined ? { reason } : {}),
|
|
185
|
+
});
|
|
186
|
+
try {
|
|
187
|
+
await transport.send(canonicalMarshal(r));
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// peer may have already disconnected; ignore.
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function receiveOrThrow(transport, expected) {
|
|
194
|
+
const msg = await transport.receive();
|
|
195
|
+
if (msg === null) {
|
|
196
|
+
throw new Error(`handshake: connection closed waiting for ${expected}`);
|
|
197
|
+
}
|
|
198
|
+
return msg;
|
|
199
|
+
}
|
|
200
|
+
function parseHandshakeMessage(bytes) {
|
|
201
|
+
const text = new TextDecoder().decode(bytes);
|
|
202
|
+
const obj = JSON.parse(text);
|
|
203
|
+
if (obj.type !== "SEMP_HANDSHAKE") {
|
|
204
|
+
throw new Error(`handshake: expected type=SEMP_HANDSHAKE, got "${obj.type ?? "?"}"`);
|
|
205
|
+
}
|
|
206
|
+
if (typeof obj.step !== "string") {
|
|
207
|
+
throw new Error("handshake: missing step field");
|
|
208
|
+
}
|
|
209
|
+
return obj;
|
|
210
|
+
}
|
|
211
|
+
function constantTimeEqual(a, b) {
|
|
212
|
+
if (a.length !== b.length) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
let diff = 0;
|
|
216
|
+
for (let i = 0; i < a.length; i++) {
|
|
217
|
+
diff |= (a[i] ?? 0) ^ (b[i] ?? 0);
|
|
218
|
+
}
|
|
219
|
+
return diff === 0;
|
|
220
|
+
}
|
|
221
|
+
function randomBytes(n) {
|
|
222
|
+
const out = new Uint8Array(n);
|
|
223
|
+
globalThis.crypto.getRandomValues(out);
|
|
224
|
+
return out;
|
|
225
|
+
}
|
|
226
|
+
function base64Encode(b) {
|
|
227
|
+
if (typeof Buffer !== "undefined") {
|
|
228
|
+
return Buffer.from(b).toString("base64");
|
|
229
|
+
}
|
|
230
|
+
let bin = "";
|
|
231
|
+
for (let i = 0; i < b.length; i++) {
|
|
232
|
+
bin += String.fromCharCode(b[i] ?? 0);
|
|
233
|
+
}
|
|
234
|
+
return btoa(bin);
|
|
235
|
+
}
|
|
236
|
+
function base64Decode(s) {
|
|
237
|
+
if (typeof Buffer !== "undefined") {
|
|
238
|
+
return new Uint8Array(Buffer.from(s, "base64"));
|
|
239
|
+
}
|
|
240
|
+
const bin = atob(s);
|
|
241
|
+
const out = new Uint8Array(bin.length);
|
|
242
|
+
for (let i = 0; i < bin.length; i++) {
|
|
243
|
+
out[i] = bin.charCodeAt(i);
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/handshake/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateful handshake server per HANDSHAKE.md §2.
|
|
3
|
+
*
|
|
4
|
+
* Mirror of `semp-go/handshake.Server`: a state machine the caller
|
|
5
|
+
* drives over a transport. The class never performs network I/O
|
|
6
|
+
* directly — the caller moves bytes between this object and the
|
|
7
|
+
* underlying transport.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const s = new HandshakeServer({ ... });
|
|
13
|
+
* const initBytes = await transport.receive();
|
|
14
|
+
* const respBytes = s.onInit(initBytes);
|
|
15
|
+
* await transport.send(respBytes);
|
|
16
|
+
*
|
|
17
|
+
* const confirmBytes = await transport.receive();
|
|
18
|
+
* const acceptedBytes = s.onConfirm(confirmBytes);
|
|
19
|
+
* await transport.send(acceptedBytes);
|
|
20
|
+
*
|
|
21
|
+
* // s.session() now usable
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* The high-level {@link "./server".runServer} wraps this state
|
|
25
|
+
* machine with the transport plumbing for callers who don't want
|
|
26
|
+
* to manage step ordering manually.
|
|
27
|
+
*
|
|
28
|
+
* @module
|
|
29
|
+
*/
|
|
30
|
+
import { type SessionKeys } from "../crypto/index.js";
|
|
31
|
+
import { type ResumptionTicket } from "./messages.js";
|
|
32
|
+
import type { IdentityProofVerdict, ServerConfig } from "./server.js";
|
|
33
|
+
/**
|
|
34
|
+
* Configuration for a {@link HandshakeServer}. Same fields as
|
|
35
|
+
* {@link "./server".ServerConfig}; surfaced as a separate type so
|
|
36
|
+
* the stateful class lifecycle is independent of the high-level
|
|
37
|
+
* `runServer` orchestrator.
|
|
38
|
+
*/
|
|
39
|
+
export type HandshakeServerConfig = ServerConfig;
|
|
40
|
+
/** Outcome of a successful server-side handshake. */
|
|
41
|
+
export interface HandshakeServerSession {
|
|
42
|
+
sessionId: string;
|
|
43
|
+
sessionTTL: number;
|
|
44
|
+
permissions: string[];
|
|
45
|
+
keys: SessionKeys;
|
|
46
|
+
serverIdentityProofKeyId: string;
|
|
47
|
+
serverIdentityProofSignature: string;
|
|
48
|
+
extensions: Record<string, unknown>;
|
|
49
|
+
resumptionTicket?: ResumptionTicket;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Error thrown when a built-in policy check rejects the peer
|
|
53
|
+
* (suite mismatch, confirmation-hash mismatch, identity-proof
|
|
54
|
+
* verdict). The associated `step="rejected"` bytes have already
|
|
55
|
+
* been written to {@link HandshakeServer.lastRejectedBytes} so the
|
|
56
|
+
* caller can transmit them before closing the transport.
|
|
57
|
+
*/
|
|
58
|
+
export declare class HandshakeServerRejectionError extends Error {
|
|
59
|
+
readonly reasonCode: string;
|
|
60
|
+
readonly reason: string | undefined;
|
|
61
|
+
readonly rejectedBytes: Uint8Array;
|
|
62
|
+
readonly name = "HandshakeServerRejectionError";
|
|
63
|
+
constructor(reasonCode: string, reason: string | undefined, rejectedBytes: Uint8Array);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stateful handshake server. One instance handles exactly one
|
|
67
|
+
* handshake — discard after success or error. Re-using an instance
|
|
68
|
+
* is a programming error (the state machine is single-shot).
|
|
69
|
+
*/
|
|
70
|
+
export declare class HandshakeServer {
|
|
71
|
+
private readonly cfg;
|
|
72
|
+
private sessionId;
|
|
73
|
+
private serverEphPriv;
|
|
74
|
+
private serverNonce;
|
|
75
|
+
private initCanonical;
|
|
76
|
+
private respCanonical;
|
|
77
|
+
private sessionKeys;
|
|
78
|
+
private serverIdProof;
|
|
79
|
+
private finalSession;
|
|
80
|
+
constructor(cfg: HandshakeServerConfig);
|
|
81
|
+
/**
|
|
82
|
+
* Process the client's INIT and produce signed RESPONSE bytes per
|
|
83
|
+
* §2.2 / §2.3. Throws {@link HandshakeServerRejectionError} on
|
|
84
|
+
* suite mismatch — the rejection bytes are accessible on the
|
|
85
|
+
* thrown error for the caller to transmit before closing the
|
|
86
|
+
* transport.
|
|
87
|
+
*/
|
|
88
|
+
onInit(data: Uint8Array): Uint8Array;
|
|
89
|
+
/**
|
|
90
|
+
* Process the client's CONFIRM and produce signed ACCEPTED bytes
|
|
91
|
+
* per §2.4 / §2.5. Throws {@link HandshakeServerRejectionError}
|
|
92
|
+
* on confirmation-hash mismatch or identity-proof verdict
|
|
93
|
+
* failure.
|
|
94
|
+
*/
|
|
95
|
+
onConfirm(data: Uint8Array): Uint8Array;
|
|
96
|
+
/** Final session, populated by {@link onConfirm}. */
|
|
97
|
+
session(): HandshakeServerSession;
|
|
98
|
+
/** Wipe in-memory secret state. Idempotent. */
|
|
99
|
+
erase(): void;
|
|
100
|
+
}
|
|
101
|
+
export type { IdentityProofVerdict };
|
|
102
|
+
//# sourceMappingURL=server_state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server_state.d.ts","sourceRoot":"","sources":["../../src/handshake/server_state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAKL,KAAK,gBAAgB,EAKtB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAEjD,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,4BAA4B,EAAE,MAAM,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;;;;;GAMG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;aAGpC,UAAU,EAAE,MAAM;aAClB,MAAM,EAAE,MAAM,GAAG,SAAS;aAC1B,aAAa,EAAE,UAAU;IAJ3C,SAAkB,IAAI,mCAAmC;gBAEvC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,aAAa,EAAE,UAAU;CAM5C;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAE5C,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAAuC;gBAE/C,GAAG,EAAE,qBAAqB;IAatC;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU;IAkFpC;;;;;OAKG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU;IA+EvC,qDAAqD;IACrD,OAAO,IAAI,sBAAsB;IASjC,+CAA+C;IAC/C,KAAK,IAAI,IAAI;CAOd;AAsED,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
|