@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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backup-bundle persistence per RECOVERY.md §2.6.
|
|
3
|
+
*
|
|
4
|
+
* The home server retains the user's most recent bundle plus the
|
|
5
|
+
* recent superseded chain (so a client recovering after a long
|
|
6
|
+
* offline period can fetch the bundle that matches whichever
|
|
7
|
+
* recovery secret the user remembers). Pruning honors the §2.6
|
|
8
|
+
* floor of 30 days for superseded entries.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Spec-mandated retention floor for superseded bundles per §2.6:
|
|
14
|
+
* at least 30 days. Operators MAY use a larger value; smaller
|
|
15
|
+
* values are clamped up by {@link InMemoryBundleStore.pruneSuperseded}.
|
|
16
|
+
*/
|
|
17
|
+
export const MinSupersededRetentionMs = 30 * 24 * 60 * 60 * 1000;
|
|
18
|
+
/** Reference {@link BundleStore}. Single-process only. */
|
|
19
|
+
export class InMemoryBundleStore {
|
|
20
|
+
byUser = new Map();
|
|
21
|
+
nowFn;
|
|
22
|
+
constructor(nowFn = () => new Date()) {
|
|
23
|
+
this.nowFn = nowFn;
|
|
24
|
+
}
|
|
25
|
+
async putCurrent(userId, bundle, supersededAt) {
|
|
26
|
+
if (userId === "") {
|
|
27
|
+
throw new Error("recovery: empty userId");
|
|
28
|
+
}
|
|
29
|
+
if (bundle.user_id !== userId) {
|
|
30
|
+
throw new Error(`recovery: bundle.user_id ${JSON.stringify(bundle.user_id)} does not match ${JSON.stringify(userId)}`);
|
|
31
|
+
}
|
|
32
|
+
const existing = this.byUser.get(userId) ?? [];
|
|
33
|
+
const current = existing.find((r) => r.supersededAt === "");
|
|
34
|
+
if (current === undefined) {
|
|
35
|
+
// First put for this user. supersedes MUST be null.
|
|
36
|
+
if (bundle.supersedes !== null && bundle.supersedes !== "") {
|
|
37
|
+
throw new Error(`recovery: initial bundle for ${userId} sets supersedes=${JSON.stringify(bundle.supersedes)}; expected null`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
if (bundle.supersedes !== current.bundle.bundle_id) {
|
|
42
|
+
throw new Error(`recovery: bundle.supersedes ${JSON.stringify(bundle.supersedes)} does not match current bundle id ${JSON.stringify(current.bundle.bundle_id)}`);
|
|
43
|
+
}
|
|
44
|
+
current.supersededAt = supersededAt.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
45
|
+
}
|
|
46
|
+
existing.push({ bundle: deepClone(bundle), supersededAt: "" });
|
|
47
|
+
this.byUser.set(userId, existing);
|
|
48
|
+
}
|
|
49
|
+
async getCurrent(userId) {
|
|
50
|
+
const list = this.byUser.get(userId);
|
|
51
|
+
if (list === undefined) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const cur = list.find((r) => r.supersededAt === "");
|
|
55
|
+
return cur === undefined ? null : deepClone(cur.bundle);
|
|
56
|
+
}
|
|
57
|
+
async history(userId) {
|
|
58
|
+
const list = this.byUser.get(userId) ?? [];
|
|
59
|
+
return [...list]
|
|
60
|
+
.sort((a, b) => {
|
|
61
|
+
const ax = Date.parse(a.bundle.created_at);
|
|
62
|
+
const bx = Date.parse(b.bundle.created_at);
|
|
63
|
+
return bx - ax;
|
|
64
|
+
})
|
|
65
|
+
.map((r) => deepClone(r.bundle));
|
|
66
|
+
}
|
|
67
|
+
async deleteAll(userId) {
|
|
68
|
+
this.byUser.delete(userId);
|
|
69
|
+
}
|
|
70
|
+
async pruneSuperseded(retainForMs, now) {
|
|
71
|
+
if (retainForMs < MinSupersededRetentionMs) {
|
|
72
|
+
retainForMs = MinSupersededRetentionMs;
|
|
73
|
+
}
|
|
74
|
+
const cutoff = (now ?? this.nowFn()).getTime() - retainForMs;
|
|
75
|
+
let pruned = 0;
|
|
76
|
+
for (const [user, list] of this.byUser) {
|
|
77
|
+
const next = list.filter((r) => {
|
|
78
|
+
if (r.supersededAt === "") {
|
|
79
|
+
return true; // current bundle: always retain
|
|
80
|
+
}
|
|
81
|
+
const ts = Date.parse(r.supersededAt);
|
|
82
|
+
if (Number.isNaN(ts)) {
|
|
83
|
+
return true; // malformed — be conservative
|
|
84
|
+
}
|
|
85
|
+
if (ts < cutoff) {
|
|
86
|
+
pruned++;
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
});
|
|
91
|
+
if (next.length === 0) {
|
|
92
|
+
this.byUser.delete(user);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.byUser.set(user, next);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return pruned;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function deepClone(x) {
|
|
102
|
+
return JSON.parse(JSON.stringify(x));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=bundle_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle_store.js","sourceRoot":"","sources":["../../src/recovery/bundle_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery layer per RECOVERY.md.
|
|
3
|
+
*
|
|
4
|
+
* Wire records (successor, recovery-set manifest, share record,
|
|
5
|
+
* backup bundle), Shamir secret splitting + recombination, full
|
|
6
|
+
* sign / verify primitives, manifest cross-check, Argon2id-derived
|
|
7
|
+
* bundle-payload encryption + decryption, recovery key derivation,
|
|
8
|
+
* and a reference {@link BundleStore}.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
export { type BackupBundle, type BundleKDF, type BundlePayload, type DeviceIdentityPubkey, type EncryptionKey, type IdentityKey, type RecoveryContributor, type RecoverySetManifest, type RecoveryShareRecord, type RecoverySignatureBlock, type RecoveryVerifyPK, type SuccessorRecord, BundlePayloadAEAD, BundleType, KDFAlgorithmArgon2id, MinKDFIterations, MinKDFMemoryKB, MinKDFParallelism, MinKDFSaltBytes, RecommendedKDFIterations, RecommendedKDFMemoryKB, RecommendedKDFParallelism, RecordVersion, RecoveryBundlePrefix, RecoveryManifestPrefix, RecoverySetManifestType, RecoveryShareRecordType, RecoveryShareSignaturePrefix, SignatureAlgorithmEd25519, SuccessorRecordPrefix, SuccessorRecordType, } from "./types.js";
|
|
13
|
+
export { type RandSource, type ShamirShare, MaxShamirTotalShares, MinShamirThreshold, combineShares, splitSecret, } from "./shamir.js";
|
|
14
|
+
export { checkShareMatchesManifest, prepareSuccessorSignatures, signManifest, signShareRecord, signSuccessorDomain, signSuccessorNewKey, signSuccessorRecovery, validateManifest, validateShareRecord, validateSuccessorRecord, verifyManifest, verifyShareRecord, verifySuccessorRecord, verifySuccessorTwoSignatures, } from "./sign.js";
|
|
15
|
+
export { signBundle, validateBundle, verifyBundle } from "./bundle.js";
|
|
16
|
+
export { type SecretForm, MinPassphraseBytes, RecoverySignKeyInfo, decryptBundlePayload, deriveBundleKey, deriveRecoverySignKey, encryptBundlePayload, normalizeRecoverySecret, } from "./bundle_crypto.js";
|
|
17
|
+
export { type BundleStore, InMemoryBundleStore, MinSupersededRetentionMs, } from "./bundle_store.js";
|
|
18
|
+
export { type CrossCheckReason, type DirectoryView, ManifestCrossCheckError, crossCheckManifestContributors, } from "./manifest_crosscheck.js";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,EACzB,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EACL,KAAK,UAAU,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,KAAK,WAAW,EAChB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery layer per RECOVERY.md.
|
|
3
|
+
*
|
|
4
|
+
* Wire records (successor, recovery-set manifest, share record,
|
|
5
|
+
* backup bundle), Shamir secret splitting + recombination, full
|
|
6
|
+
* sign / verify primitives, manifest cross-check, Argon2id-derived
|
|
7
|
+
* bundle-payload encryption + decryption, recovery key derivation,
|
|
8
|
+
* and a reference {@link BundleStore}.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
export { BundlePayloadAEAD, BundleType, KDFAlgorithmArgon2id, MinKDFIterations, MinKDFMemoryKB, MinKDFParallelism, MinKDFSaltBytes, RecommendedKDFIterations, RecommendedKDFMemoryKB, RecommendedKDFParallelism, RecordVersion, RecoveryBundlePrefix, RecoveryManifestPrefix, RecoverySetManifestType, RecoveryShareRecordType, RecoveryShareSignaturePrefix, SignatureAlgorithmEd25519, SuccessorRecordPrefix, SuccessorRecordType, } from "./types.js";
|
|
13
|
+
export { MaxShamirTotalShares, MinShamirThreshold, combineShares, splitSecret, } from "./shamir.js";
|
|
14
|
+
export { checkShareMatchesManifest, prepareSuccessorSignatures, signManifest, signShareRecord, signSuccessorDomain, signSuccessorNewKey, signSuccessorRecovery, validateManifest, validateShareRecord, validateSuccessorRecord, verifyManifest, verifyShareRecord, verifySuccessorRecord, verifySuccessorTwoSignatures, } from "./sign.js";
|
|
15
|
+
export { signBundle, validateBundle, verifyBundle } from "./bundle.js";
|
|
16
|
+
export { MinPassphraseBytes, RecoverySignKeyInfo, decryptBundlePayload, deriveBundleKey, deriveRecoverySignKey, encryptBundlePayload, normalizeRecoverySecret, } from "./bundle_crypto.js";
|
|
17
|
+
export { InMemoryBundleStore, MinSupersededRetentionMs, } from "./bundle_store.js";
|
|
18
|
+
export { ManifestCrossCheckError, crossCheckManifestContributors, } from "./manifest_crosscheck.js";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAaL,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,EACzB,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAGL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAGL,uBAAuB,EACvB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest-contributors cross-check per RECOVERY.md §5.2.
|
|
3
|
+
*
|
|
4
|
+
* Before trusting a fetched recovery-set manifest, a verifier MUST
|
|
5
|
+
* confirm that each contributor's `device_identity_pubkey` matches
|
|
6
|
+
* the user's currently-published device directory. The
|
|
7
|
+
* {@link DirectoryView} interface lets recovery code consult the
|
|
8
|
+
* device directory without depending on the keys package.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { RecoverySetManifest } from "./types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Minimal device-directory read surface needed by the cross-check.
|
|
15
|
+
* The concrete `DeviceDirectory` type in `keys/` exposes a
|
|
16
|
+
* `findDevice` helper that satisfies this shape.
|
|
17
|
+
*/
|
|
18
|
+
export interface DirectoryView {
|
|
19
|
+
/** The user this directory belongs to. */
|
|
20
|
+
userId(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Look up `deviceId`. Returns `(algorithm, public_key, true)`
|
|
23
|
+
* when present; `("", "", false)` when absent.
|
|
24
|
+
*/
|
|
25
|
+
findDevice(deviceId: string): {
|
|
26
|
+
algorithm: string;
|
|
27
|
+
publicKey: string;
|
|
28
|
+
found: boolean;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Why a contributor cross-check failed. */
|
|
32
|
+
export type CrossCheckReason = "user_mismatch" | "device_missing" | "pubkey_mismatch" | "algorithm_mismatch";
|
|
33
|
+
/**
|
|
34
|
+
* Error thrown by {@link crossCheckManifestContributors} when a
|
|
35
|
+
* contributor entry does not match the device directory.
|
|
36
|
+
*/
|
|
37
|
+
export declare class ManifestCrossCheckError extends Error {
|
|
38
|
+
readonly name = "ManifestCrossCheckError";
|
|
39
|
+
readonly reason: CrossCheckReason;
|
|
40
|
+
/** Contributor share index (1-based) that caused the failure. */
|
|
41
|
+
readonly shareIndex: number;
|
|
42
|
+
/** Contributor device id that caused the failure. */
|
|
43
|
+
readonly deviceId: string;
|
|
44
|
+
constructor(reason: CrossCheckReason, shareIndex: number, deviceId: string, detail: string);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Cross-check that every contributor in `m` corresponds to a
|
|
48
|
+
* device in `directory` per §5.2:
|
|
49
|
+
*
|
|
50
|
+
* - Manifest user_id MUST match directory.userId.
|
|
51
|
+
* - Each contributor's device_id MUST be present in the directory.
|
|
52
|
+
* - The directory entry's public_key + algorithm MUST match the
|
|
53
|
+
* manifest contributor's device_identity_pubkey.
|
|
54
|
+
*
|
|
55
|
+
* Throws {@link ManifestCrossCheckError} on the first violation;
|
|
56
|
+
* returns silently when every contributor matches.
|
|
57
|
+
*/
|
|
58
|
+
export declare function crossCheckManifestContributors(m: RecoverySetManifest, directory: DirectoryView, manifestUserId: string): void;
|
|
59
|
+
//# sourceMappingURL=manifest_crosscheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest_crosscheck.d.ts","sourceRoot":"","sources":["../../src/recovery/manifest_crosscheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,MAAM,IAAI,MAAM,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;QAC5B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,4CAA4C;AAC5C,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,oBAAoB,CAAC;AAEzB;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAkB,IAAI,6BAA6B;IACnD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAGxB,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAOjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,CAAC,EAAE,mBAAmB,EACtB,SAAS,EAAE,aAAa,EACxB,cAAc,EAAE,MAAM,GACrB,IAAI,CAoCN"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest-contributors cross-check per RECOVERY.md §5.2.
|
|
3
|
+
*
|
|
4
|
+
* Before trusting a fetched recovery-set manifest, a verifier MUST
|
|
5
|
+
* confirm that each contributor's `device_identity_pubkey` matches
|
|
6
|
+
* the user's currently-published device directory. The
|
|
7
|
+
* {@link DirectoryView} interface lets recovery code consult the
|
|
8
|
+
* device directory without depending on the keys package.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown by {@link crossCheckManifestContributors} when a
|
|
14
|
+
* contributor entry does not match the device directory.
|
|
15
|
+
*/
|
|
16
|
+
export class ManifestCrossCheckError extends Error {
|
|
17
|
+
name = "ManifestCrossCheckError";
|
|
18
|
+
reason;
|
|
19
|
+
/** Contributor share index (1-based) that caused the failure. */
|
|
20
|
+
shareIndex;
|
|
21
|
+
/** Contributor device id that caused the failure. */
|
|
22
|
+
deviceId;
|
|
23
|
+
constructor(reason, shareIndex, deviceId, detail) {
|
|
24
|
+
super(`recovery: ${detail}`);
|
|
25
|
+
this.reason = reason;
|
|
26
|
+
this.shareIndex = shareIndex;
|
|
27
|
+
this.deviceId = deviceId;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Cross-check that every contributor in `m` corresponds to a
|
|
32
|
+
* device in `directory` per §5.2:
|
|
33
|
+
*
|
|
34
|
+
* - Manifest user_id MUST match directory.userId.
|
|
35
|
+
* - Each contributor's device_id MUST be present in the directory.
|
|
36
|
+
* - The directory entry's public_key + algorithm MUST match the
|
|
37
|
+
* manifest contributor's device_identity_pubkey.
|
|
38
|
+
*
|
|
39
|
+
* Throws {@link ManifestCrossCheckError} on the first violation;
|
|
40
|
+
* returns silently when every contributor matches.
|
|
41
|
+
*/
|
|
42
|
+
export function crossCheckManifestContributors(m, directory, manifestUserId) {
|
|
43
|
+
if (directory.userId() !== manifestUserId) {
|
|
44
|
+
throw new ManifestCrossCheckError("user_mismatch", 0, "", `manifest user ${JSON.stringify(manifestUserId)} does not match directory user ${JSON.stringify(directory.userId())}`);
|
|
45
|
+
}
|
|
46
|
+
for (const c of m.contributors) {
|
|
47
|
+
const lookup = directory.findDevice(c.device_id);
|
|
48
|
+
if (!lookup.found) {
|
|
49
|
+
throw new ManifestCrossCheckError("device_missing", c.share_index, c.device_id, `manifest contributor share_index=${c.share_index} device_id=${JSON.stringify(c.device_id)} is not in the directory`);
|
|
50
|
+
}
|
|
51
|
+
if (lookup.algorithm !== c.device_identity_pubkey.algorithm) {
|
|
52
|
+
throw new ManifestCrossCheckError("algorithm_mismatch", c.share_index, c.device_id, `manifest contributor share_index=${c.share_index} algorithm ${JSON.stringify(c.device_identity_pubkey.algorithm)} does not match directory ${JSON.stringify(lookup.algorithm)}`);
|
|
53
|
+
}
|
|
54
|
+
if (lookup.publicKey !== c.device_identity_pubkey.public_key) {
|
|
55
|
+
throw new ManifestCrossCheckError("pubkey_mismatch", c.share_index, c.device_id, `manifest contributor share_index=${c.share_index} public_key does not match directory entry`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=manifest_crosscheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest_crosscheck.js","sourceRoot":"","sources":["../../src/recovery/manifest_crosscheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA8BH;;;GAGG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAC9B,IAAI,GAAG,yBAAyB,CAAC;IAC1C,MAAM,CAAmB;IAClC,iEAAiE;IACxD,UAAU,CAAS;IAC5B,qDAAqD;IAC5C,QAAQ,CAAS;IAE1B,YACE,MAAwB,EACxB,UAAkB,EAClB,QAAgB,EAChB,MAAc;QAEd,KAAK,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,8BAA8B,CAC5C,CAAsB,EACtB,SAAwB,EACxB,cAAsB;IAEtB,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,uBAAuB,CAC/B,eAAe,EACf,CAAC,EACD,EAAE,EACF,iBAAiB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,kCAAkC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CACtH,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,uBAAuB,CAC/B,gBAAgB,EAChB,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,SAAS,EACX,oCAAoC,CAAC,CAAC,WAAW,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,0BAA0B,CACrH,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC;YAC5D,MAAM,IAAI,uBAAuB,CAC/B,oBAAoB,EACpB,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,SAAS,EACX,oCAAoC,CAAC,CAAC,WAAW,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,SAAS,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CACjL,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,sBAAsB,CAAC,UAAU,EAAE,CAAC;YAC7D,MAAM,IAAI,uBAAuB,CAC/B,iBAAiB,EACjB,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,SAAS,EACX,oCAAoC,CAAC,CAAC,WAAW,4CAA4C,CAC9F,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shamir's Secret Sharing over GF(256) per RECOVERY.md §5.1 + §5.4.
|
|
3
|
+
*
|
|
4
|
+
* Operates one polynomial per secret byte; the polynomial constant
|
|
5
|
+
* term is the secret byte and the higher coefficients are random.
|
|
6
|
+
* Reconstruction uses Lagrange interpolation at x=0.
|
|
7
|
+
*
|
|
8
|
+
* GF(256) arithmetic uses the AES reduction polynomial 0x11b with
|
|
9
|
+
* generator g = 3 (matches semp-go byte-for-byte; the recovery-shamir
|
|
10
|
+
* vectors verify cross-language reproducibility).
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
/** Minimum reconstruction threshold per §5.1. */
|
|
15
|
+
export declare const MinShamirThreshold = 2;
|
|
16
|
+
/** Maximum share count per §5.1. */
|
|
17
|
+
export declare const MaxShamirTotalShares = 16;
|
|
18
|
+
/** A single Shamir share. */
|
|
19
|
+
export interface ShamirShare {
|
|
20
|
+
/** 1-based polynomial-evaluation x-coordinate. Index 0 IS the secret. */
|
|
21
|
+
index: number;
|
|
22
|
+
/** One byte per secret byte. */
|
|
23
|
+
value: Uint8Array;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Random source for split. `n` MUST be filled with cryptographically
|
|
27
|
+
* strong bytes. Defaults to `globalThis.crypto.getRandomValues`.
|
|
28
|
+
*/
|
|
29
|
+
export type RandSource = (n: number) => Uint8Array;
|
|
30
|
+
/**
|
|
31
|
+
* Split `secret` into `totalShares` shares with reconstruction
|
|
32
|
+
* threshold `threshold` per §5.1. Returns `totalShares` shares; any
|
|
33
|
+
* `threshold` of them suffice.
|
|
34
|
+
*
|
|
35
|
+
* Bounds: `MinShamirThreshold <= threshold <= totalShares <=
|
|
36
|
+
* MaxShamirTotalShares`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function splitSecret(secret: Uint8Array, threshold: number, totalShares: number, rand?: RandSource): ShamirShare[];
|
|
39
|
+
/**
|
|
40
|
+
* Reconstruct the secret from at least `threshold` shares per §5.4.
|
|
41
|
+
* Each share's `value` MUST have the same length; that common length
|
|
42
|
+
* is the recovered secret's length.
|
|
43
|
+
*
|
|
44
|
+
* Caller MUST track the threshold against the manifest. This function
|
|
45
|
+
* does not enforce a minimum count; supplying more than threshold is
|
|
46
|
+
* well-defined (Lagrange interpolation is exact for any subset >=
|
|
47
|
+
* threshold), and supplying fewer yields a nonsense byte string with
|
|
48
|
+
* no error.
|
|
49
|
+
*/
|
|
50
|
+
export declare function combineShares(shares: ShamirShare[]): Uint8Array;
|
|
51
|
+
//# sourceMappingURL=shamir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shamir.d.ts","sourceRoot":"","sources":["../../src/recovery/shamir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,KAAK,EAAE,UAAU,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;AAQnD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,UAAwB,GAC7B,WAAW,EAAE,CA6Cf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAyC/D"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shamir's Secret Sharing over GF(256) per RECOVERY.md §5.1 + §5.4.
|
|
3
|
+
*
|
|
4
|
+
* Operates one polynomial per secret byte; the polynomial constant
|
|
5
|
+
* term is the secret byte and the higher coefficients are random.
|
|
6
|
+
* Reconstruction uses Lagrange interpolation at x=0.
|
|
7
|
+
*
|
|
8
|
+
* GF(256) arithmetic uses the AES reduction polynomial 0x11b with
|
|
9
|
+
* generator g = 3 (matches semp-go byte-for-byte; the recovery-shamir
|
|
10
|
+
* vectors verify cross-language reproducibility).
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
/** Minimum reconstruction threshold per §5.1. */
|
|
15
|
+
export const MinShamirThreshold = 2;
|
|
16
|
+
/** Maximum share count per §5.1. */
|
|
17
|
+
export const MaxShamirTotalShares = 16;
|
|
18
|
+
const defaultRand = (n) => {
|
|
19
|
+
const out = new Uint8Array(n);
|
|
20
|
+
globalThis.crypto.getRandomValues(out);
|
|
21
|
+
return out;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Split `secret` into `totalShares` shares with reconstruction
|
|
25
|
+
* threshold `threshold` per §5.1. Returns `totalShares` shares; any
|
|
26
|
+
* `threshold` of them suffice.
|
|
27
|
+
*
|
|
28
|
+
* Bounds: `MinShamirThreshold <= threshold <= totalShares <=
|
|
29
|
+
* MaxShamirTotalShares`.
|
|
30
|
+
*/
|
|
31
|
+
export function splitSecret(secret, threshold, totalShares, rand = defaultRand) {
|
|
32
|
+
if (secret.length === 0) {
|
|
33
|
+
throw new Error("recovery: split secret is empty");
|
|
34
|
+
}
|
|
35
|
+
if (!Number.isInteger(threshold) || threshold < MinShamirThreshold) {
|
|
36
|
+
throw new Error(`recovery: threshold ${threshold} below minimum ${MinShamirThreshold}`);
|
|
37
|
+
}
|
|
38
|
+
if (!Number.isInteger(totalShares) || totalShares < threshold) {
|
|
39
|
+
throw new Error(`recovery: total_shares ${totalShares} below threshold ${threshold}`);
|
|
40
|
+
}
|
|
41
|
+
if (totalShares > MaxShamirTotalShares) {
|
|
42
|
+
throw new Error(`recovery: total_shares ${totalShares} above maximum ${MaxShamirTotalShares}`);
|
|
43
|
+
}
|
|
44
|
+
const shares = [];
|
|
45
|
+
for (let i = 0; i < totalShares; i++) {
|
|
46
|
+
shares.push({ index: i + 1, value: new Uint8Array(secret.length) });
|
|
47
|
+
}
|
|
48
|
+
// One polynomial per secret byte. Coefficient 0 is the secret byte;
|
|
49
|
+
// 1..threshold-1 are random.
|
|
50
|
+
const coeffs = new Uint8Array(threshold);
|
|
51
|
+
const randomNeeded = (threshold - 1) * secret.length;
|
|
52
|
+
const randomBuf = rand(randomNeeded);
|
|
53
|
+
if (randomBuf.length < randomNeeded) {
|
|
54
|
+
throw new Error("recovery: shamir random source returned too few bytes");
|
|
55
|
+
}
|
|
56
|
+
let randIdx = 0;
|
|
57
|
+
for (let j = 0; j < secret.length; j++) {
|
|
58
|
+
coeffs[0] = secret[j] ?? 0;
|
|
59
|
+
for (let k = 1; k < threshold; k++) {
|
|
60
|
+
coeffs[k] = randomBuf[randIdx++] ?? 0;
|
|
61
|
+
}
|
|
62
|
+
for (const share of shares) {
|
|
63
|
+
share.value[j] = polyEval(coeffs, share.index);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return shares;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Reconstruct the secret from at least `threshold` shares per §5.4.
|
|
70
|
+
* Each share's `value` MUST have the same length; that common length
|
|
71
|
+
* is the recovered secret's length.
|
|
72
|
+
*
|
|
73
|
+
* Caller MUST track the threshold against the manifest. This function
|
|
74
|
+
* does not enforce a minimum count; supplying more than threshold is
|
|
75
|
+
* well-defined (Lagrange interpolation is exact for any subset >=
|
|
76
|
+
* threshold), and supplying fewer yields a nonsense byte string with
|
|
77
|
+
* no error.
|
|
78
|
+
*/
|
|
79
|
+
export function combineShares(shares) {
|
|
80
|
+
if (shares.length === 0) {
|
|
81
|
+
throw new Error("recovery: combine got no shares");
|
|
82
|
+
}
|
|
83
|
+
const secretLen = shares[0].value.length;
|
|
84
|
+
if (secretLen === 0) {
|
|
85
|
+
throw new Error("recovery: combine got empty share value");
|
|
86
|
+
}
|
|
87
|
+
const xs = new Uint8Array(shares.length);
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
for (let i = 0; i < shares.length; i++) {
|
|
90
|
+
const s = shares[i];
|
|
91
|
+
if (s.index === 0) {
|
|
92
|
+
throw new Error(`recovery: share[${i}] has invalid index 0`);
|
|
93
|
+
}
|
|
94
|
+
if (s.index < 0 || s.index > 255 || !Number.isInteger(s.index)) {
|
|
95
|
+
throw new Error(`recovery: share[${i}] index ${s.index} out of [1, 255]`);
|
|
96
|
+
}
|
|
97
|
+
if (seen.has(s.index)) {
|
|
98
|
+
throw new Error(`recovery: share index ${s.index} appears more than once`);
|
|
99
|
+
}
|
|
100
|
+
seen.add(s.index);
|
|
101
|
+
if (s.value.length !== secretLen) {
|
|
102
|
+
throw new Error(`recovery: share[${i}] value length ${s.value.length} differs from share[0] length ${secretLen}`);
|
|
103
|
+
}
|
|
104
|
+
xs[i] = s.index;
|
|
105
|
+
}
|
|
106
|
+
const out = new Uint8Array(secretLen);
|
|
107
|
+
const ys = new Uint8Array(shares.length);
|
|
108
|
+
for (let j = 0; j < secretLen; j++) {
|
|
109
|
+
for (let i = 0; i < shares.length; i++) {
|
|
110
|
+
ys[i] = shares[i].value[j] ?? 0;
|
|
111
|
+
}
|
|
112
|
+
out[j] = lagrangeInterpolateAtZero(xs, ys);
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// GF(256) tables under AES reduction polynomial 0x11b, generator g = 3.
|
|
118
|
+
const gf256Exp = new Uint8Array(256);
|
|
119
|
+
const gf256Log = new Uint8Array(256);
|
|
120
|
+
(function buildTables() {
|
|
121
|
+
let x = 1;
|
|
122
|
+
for (let i = 0; i < 255; i++) {
|
|
123
|
+
gf256Exp[i] = x;
|
|
124
|
+
gf256Log[x] = i;
|
|
125
|
+
x = gf256MulRaw(x, 3);
|
|
126
|
+
}
|
|
127
|
+
gf256Exp[255] = 1;
|
|
128
|
+
})();
|
|
129
|
+
function gf256MulRaw(a, b) {
|
|
130
|
+
let p = 0;
|
|
131
|
+
for (let i = 0; i < 8; i++) {
|
|
132
|
+
if ((b & 1) === 1) {
|
|
133
|
+
p ^= a;
|
|
134
|
+
}
|
|
135
|
+
const hi = a & 0x80;
|
|
136
|
+
a = (a << 1) & 0xff;
|
|
137
|
+
if (hi !== 0) {
|
|
138
|
+
a ^= 0x1b;
|
|
139
|
+
}
|
|
140
|
+
b >>= 1;
|
|
141
|
+
}
|
|
142
|
+
return p & 0xff;
|
|
143
|
+
}
|
|
144
|
+
function gf256Mul(a, b) {
|
|
145
|
+
if (a === 0 || b === 0) {
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
148
|
+
const idx = (gf256Log[a] + gf256Log[b]) % 255;
|
|
149
|
+
return gf256Exp[idx];
|
|
150
|
+
}
|
|
151
|
+
function gf256Inv(a) {
|
|
152
|
+
if (a === 0) {
|
|
153
|
+
throw new Error("recovery: gf256Inv(0)");
|
|
154
|
+
}
|
|
155
|
+
return gf256Exp[255 - gf256Log[a]];
|
|
156
|
+
}
|
|
157
|
+
function polyEval(coeffs, x) {
|
|
158
|
+
let y = 0;
|
|
159
|
+
for (let k = coeffs.length - 1; k >= 0; k--) {
|
|
160
|
+
y = gf256Mul(y, x) ^ (coeffs[k] ?? 0);
|
|
161
|
+
}
|
|
162
|
+
return y & 0xff;
|
|
163
|
+
}
|
|
164
|
+
function lagrangeInterpolateAtZero(xs, ys) {
|
|
165
|
+
let result = 0;
|
|
166
|
+
for (let i = 0; i < xs.length; i++) {
|
|
167
|
+
let num = 1;
|
|
168
|
+
let den = 1;
|
|
169
|
+
for (let k = 0; k < xs.length; k++) {
|
|
170
|
+
if (k === i) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
num = gf256Mul(num, xs[k]);
|
|
174
|
+
den = gf256Mul(den, xs[k] ^ xs[i]);
|
|
175
|
+
}
|
|
176
|
+
const basis = gf256Mul(num, gf256Inv(den));
|
|
177
|
+
result ^= gf256Mul(ys[i], basis);
|
|
178
|
+
}
|
|
179
|
+
return result & 0xff;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=shamir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shamir.js","sourceRoot":"","sources":["../../src/recovery/shamir.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sign / verify primitives for recovery wire records per
|
|
3
|
+
* RECOVERY.md §5.2, §5.3, §7.3, §7.5.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { type RecoverySetManifest, type RecoveryShareRecord, type SuccessorRecord } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Pre-populate the algorithm + key_id fields on all three signature
|
|
10
|
+
* blocks so the canonical bytes are stable across the three signing
|
|
11
|
+
* passes. Every signing pass signs the SAME canonical bytes (with
|
|
12
|
+
* all three `value` fields elided), so this MUST be called before
|
|
13
|
+
* any of the {@link signSuccessor*} functions.
|
|
14
|
+
*/
|
|
15
|
+
export declare function prepareSuccessorSignatures(r: SuccessorRecord, recoveryKeyId: string, newKeyId: string, domainKeyId: string): void;
|
|
16
|
+
/** Sign `r.recovery_signature` per §7.3. */
|
|
17
|
+
export declare function signSuccessorRecovery(r: SuccessorRecord, recoveryPriv: Uint8Array, recoveryKeyId: string): string;
|
|
18
|
+
/** Sign `r.new_key_signature` per §7.3. */
|
|
19
|
+
export declare function signSuccessorNewKey(r: SuccessorRecord, newIdentityPriv: Uint8Array, newKeyId: string): string;
|
|
20
|
+
/** Sign `r.domain_signature` per §7.3. */
|
|
21
|
+
export declare function signSuccessorDomain(r: SuccessorRecord, domainPriv: Uint8Array, domainKeyId: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Verify the two device-side signatures (recovery, new_key) on `r`
|
|
24
|
+
* and accept an empty `domain_signature.value`. This is what the
|
|
25
|
+
* home server runs on receipt of a key-compromise rotation cascade
|
|
26
|
+
* (KEY.md §10.5.5): the device produced both signatures, the server
|
|
27
|
+
* has not yet added its own.
|
|
28
|
+
*/
|
|
29
|
+
export declare function verifySuccessorTwoSignatures(r: SuccessorRecord, recoveryVerifyPub: Uint8Array, newKeyPub: Uint8Array): boolean;
|
|
30
|
+
/** Verify all three signatures on `r` per §7.5. */
|
|
31
|
+
export declare function verifySuccessorRecord(r: SuccessorRecord, recoveryVerifyPub: Uint8Array, newKeyPub: Uint8Array, domainPub: Uint8Array): boolean;
|
|
32
|
+
/** Structural validation per §7. Throws on first violation. */
|
|
33
|
+
export declare function validateSuccessorRecord(r: SuccessorRecord, opts?: {
|
|
34
|
+
skipSignatureCheck?: boolean;
|
|
35
|
+
}): void;
|
|
36
|
+
/**
|
|
37
|
+
* Sign `m.signature` with the user's identity private key per §5.2.
|
|
38
|
+
* Pre-populates algorithm + key_id so the canonical bytes cover them.
|
|
39
|
+
*/
|
|
40
|
+
export declare function signManifest(m: RecoverySetManifest, identityPriv: Uint8Array, identityKeyId: string): string;
|
|
41
|
+
/** Verify `m.signature` against `identityPub` per §5.2. */
|
|
42
|
+
export declare function verifyManifest(m: RecoverySetManifest, identityPub: Uint8Array): boolean;
|
|
43
|
+
/** Structural validation per §5.2. Throws on first violation. */
|
|
44
|
+
export declare function validateManifest(m: RecoverySetManifest, opts?: {
|
|
45
|
+
skipSignatureCheck?: boolean;
|
|
46
|
+
}): void;
|
|
47
|
+
/** Sign `s.device_signature` with the device's identity private key per §5.3. */
|
|
48
|
+
export declare function signShareRecord(s: RecoveryShareRecord, devicePriv: Uint8Array, deviceKeyId: string): string;
|
|
49
|
+
/** Verify `s.device_signature` against `devicePub` per §5.3. */
|
|
50
|
+
export declare function verifyShareRecord(s: RecoveryShareRecord, devicePub: Uint8Array): boolean;
|
|
51
|
+
/** Structural validation per §5.3. Throws on first violation. */
|
|
52
|
+
export declare function validateShareRecord(s: RecoveryShareRecord, opts?: {
|
|
53
|
+
skipSignatureCheck?: boolean;
|
|
54
|
+
}): void;
|
|
55
|
+
/**
|
|
56
|
+
* Cross-check that `s` belongs to `m` per §5.3 step 2: bundle_id,
|
|
57
|
+
* share_index, device_id, threshold, total_shares MUST all match.
|
|
58
|
+
* Returns true when every check passes.
|
|
59
|
+
*/
|
|
60
|
+
export declare function checkShareMatchesManifest(s: RecoveryShareRecord, m: RecoverySetManifest): boolean;
|
|
61
|
+
//# sourceMappingURL=sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/recovery/sign.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAKrB,MAAM,YAAY,CAAC;AAKpB;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,CAAC,EAAE,eAAe,EAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAED,4CAA4C;AAC5C,wBAAgB,qBAAqB,CACnC,CAAC,EAAE,eAAe,EAClB,YAAY,EAAE,UAAU,EACxB,aAAa,EAAE,MAAM,GACpB,MAAM,CAQR;AAED,2CAA2C;AAC3C,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,eAAe,EAClB,eAAe,EAAE,UAAU,EAC3B,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,eAAe,EAClB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,CAQR;AAuCD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,eAAe,EAClB,iBAAiB,EAAE,UAAU,EAC7B,SAAS,EAAE,UAAU,GACpB,OAAO,CAoCT;AAED,mDAAmD;AACnD,wBAAgB,qBAAqB,CACnC,CAAC,EAAE,eAAe,EAClB,iBAAiB,EAAE,UAAU,EAC7B,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,UAAU,GACpB,OAAO,CA+BT;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CACrC,CAAC,EAAE,eAAe,EAClB,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,IAAI,CA+BN;AAoBD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,mBAAmB,EACtB,YAAY,EAAE,UAAU,EACxB,aAAa,EAAE,MAAM,GACpB,MAAM,CAkBR;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAC5B,CAAC,EAAE,mBAAmB,EACtB,WAAW,EAAE,UAAU,GACtB,OAAO,CAYT;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,mBAAmB,EACtB,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,IAAI,CAyEN;AAKD,iFAAiF;AACjF,wBAAgB,eAAe,CAC7B,CAAC,EAAE,mBAAmB,EACtB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,CAgBR;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,mBAAmB,EACtB,SAAS,EAAE,UAAU,GACpB,OAAO,CAYT;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,mBAAmB,EACtB,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,IAAI,CAqCN;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,mBAAmB,EACtB,CAAC,EAAE,mBAAmB,GACrB,OAAO,CAiBT"}
|