mindoodb 0.0.23 → 0.0.32
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/README-server.md +9 -1
- package/README.md +5 -3
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +24 -5
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +14 -2
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +124 -27
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +159 -4
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +334 -25
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +9 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +77 -5
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -1
- package/dist/browser/index.mjs +103 -0
- package/dist/core/BaseMindooDB.d.ts +697 -4
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +3273 -180
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +192 -1
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +633 -88
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +770 -10
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +2715 -292
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +2 -0
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +20 -0
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/accesscontrol/AccessDeniedError.d.ts +22 -0
- package/dist/core/accesscontrol/AccessDeniedError.d.ts.map +1 -0
- package/dist/core/accesscontrol/AccessDeniedError.js +28 -0
- package/dist/core/accesscontrol/AccessDeniedError.js.map +1 -0
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts +220 -0
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts.map +1 -0
- package/dist/core/accesscontrol/DirectoryStateNode.js +297 -0
- package/dist/core/accesscontrol/DirectoryStateNode.js.map +1 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.d.ts +118 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.d.ts.map +1 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.js +173 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.js.map +1 -0
- package/dist/core/accesscontrol/directoryProjection.d.ts +26 -0
- package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -0
- package/dist/core/accesscontrol/directoryProjection.js +174 -0
- package/dist/core/accesscontrol/directoryProjection.js.map +1 -0
- package/dist/core/accesscontrol/evaluate.d.ts +77 -0
- package/dist/core/accesscontrol/evaluate.d.ts.map +1 -0
- package/dist/core/accesscontrol/evaluate.js +206 -0
- package/dist/core/accesscontrol/evaluate.js.map +1 -0
- package/dist/core/accesscontrol/grantKeys.d.ts +113 -0
- package/dist/core/accesscontrol/grantKeys.d.ts.map +1 -0
- package/dist/core/accesscontrol/grantKeys.js +302 -0
- package/dist/core/accesscontrol/grantKeys.js.map +1 -0
- package/dist/core/accesscontrol/keyBagReconciler.d.ts +22 -0
- package/dist/core/accesscontrol/keyBagReconciler.d.ts.map +1 -0
- package/dist/core/accesscontrol/keyBagReconciler.js +3 -0
- package/dist/core/accesscontrol/keyBagReconciler.js.map +1 -0
- package/dist/core/accesscontrol/materializationGuard.d.ts +89 -0
- package/dist/core/accesscontrol/materializationGuard.d.ts.map +1 -0
- package/dist/core/accesscontrol/materializationGuard.js +69 -0
- package/dist/core/accesscontrol/materializationGuard.js.map +1 -0
- package/dist/core/accesscontrol/quarantine.d.ts +65 -0
- package/dist/core/accesscontrol/quarantine.d.ts.map +1 -0
- package/dist/core/accesscontrol/quarantine.js +79 -0
- package/dist/core/accesscontrol/quarantine.js.map +1 -0
- package/dist/core/accesscontrol/receiptValidation.d.ts +113 -0
- package/dist/core/accesscontrol/receiptValidation.d.ts.map +1 -0
- package/dist/core/accesscontrol/receiptValidation.js +142 -0
- package/dist/core/accesscontrol/receiptValidation.js.map +1 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.d.ts +31 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.d.ts.map +1 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.js +66 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.js.map +1 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.d.ts +79 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.d.ts.map +1 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.js +22 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.js.map +1 -0
- package/dist/core/accesscontrol/types.d.ts +825 -0
- package/dist/core/accesscontrol/types.d.ts.map +1 -0
- package/dist/core/accesscontrol/types.js +534 -0
- package/dist/core/accesscontrol/types.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +9 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +54 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +38 -2
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +199 -26
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +17 -3
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +58 -4
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.js +4 -0
- package/dist/core/appendonlystores/network/types.js.map +1 -1
- package/dist/core/appendonlystores/scanUtils.d.ts +27 -0
- package/dist/core/appendonlystores/scanUtils.d.ts.map +1 -0
- package/dist/core/appendonlystores/scanUtils.js +87 -0
- package/dist/core/appendonlystores/scanUtils.js.map +1 -0
- package/dist/core/appendonlystores/types.d.ts +23 -2
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/cache/CacheManager.d.ts +13 -3
- package/dist/core/cache/CacheManager.d.ts.map +1 -1
- package/dist/core/cache/CacheManager.js +7 -4
- package/dist/core/cache/CacheManager.js.map +1 -1
- package/dist/core/crypto/EntrySignature.d.ts +137 -0
- package/dist/core/crypto/EntrySignature.d.ts.map +1 -0
- package/dist/core/crypto/EntrySignature.js +210 -0
- package/dist/core/crypto/EntrySignature.js.map +1 -0
- package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -1
- package/dist/core/crypto/MindooDocSigner.js +6 -2
- package/dist/core/crypto/MindooDocSigner.js.map +1 -1
- package/dist/core/crypto/WitnessReceipt.d.ts +137 -0
- package/dist/core/crypto/WitnessReceipt.d.ts.map +1 -0
- package/dist/core/crypto/WitnessReceipt.js +182 -0
- package/dist/core/crypto/WitnessReceipt.js.map +1 -0
- package/dist/core/crypto/encryptedFields.d.ts +27 -0
- package/dist/core/crypto/encryptedFields.d.ts.map +1 -0
- package/dist/core/crypto/encryptedFields.js +58 -0
- package/dist/core/crypto/encryptedFields.js.map +1 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts +12 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts.map +1 -1
- package/dist/core/crypto/pbkdf2Iterations.js +23 -0
- package/dist/core/crypto/pbkdf2Iterations.js.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.d.ts.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.js +3 -1
- package/dist/core/crypto/privateKeyEncryption.js.map +1 -1
- package/dist/core/databaseIdValidation.d.ts +1 -1
- package/dist/core/databaseIdValidation.d.ts.map +1 -1
- package/dist/core/databaseIdValidation.js +4 -4
- package/dist/core/databaseIdValidation.js.map +1 -1
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +42 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/expressions/builder.d.ts +102 -0
- package/dist/core/expressions/builder.d.ts.map +1 -0
- package/dist/core/expressions/builder.js +249 -0
- package/dist/core/expressions/builder.js.map +1 -0
- package/dist/core/expressions/evaluateExpression.d.ts +78 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -0
- package/dist/core/expressions/evaluateExpression.js +386 -0
- package/dist/core/expressions/evaluateExpression.js.map +1 -0
- package/dist/core/expressions/formulaSource.d.ts +24 -0
- package/dist/core/expressions/formulaSource.d.ts.map +1 -0
- package/dist/core/expressions/formulaSource.js +765 -0
- package/dist/core/expressions/formulaSource.js.map +1 -0
- package/dist/core/expressions/index.d.ts +8 -0
- package/dist/core/expressions/index.d.ts.map +1 -0
- package/dist/core/expressions/index.js +46 -0
- package/dist/core/expressions/index.js.map +1 -0
- package/dist/core/expressions/metadata.d.ts +23 -0
- package/dist/core/expressions/metadata.d.ts.map +1 -0
- package/dist/core/expressions/metadata.js +191 -0
- package/dist/core/expressions/metadata.js.map +1 -0
- package/dist/core/expressions/types.d.ts +164 -0
- package/dist/core/expressions/types.d.ts.map +1 -0
- package/dist/core/expressions/types.js +3 -0
- package/dist/core/expressions/types.js.map +1 -0
- package/dist/core/extraction/types.d.ts +47 -0
- package/dist/core/extraction/types.d.ts.map +1 -0
- package/dist/core/extraction/types.js +42 -0
- package/dist/core/extraction/types.js.map +1 -0
- package/dist/core/index.d.ts +13 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +113 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/indexing/createViewDataProvider.d.ts +84 -0
- package/dist/core/indexing/createViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/createViewDataProvider.js +139 -0
- package/dist/core/indexing/createViewDataProvider.js.map +1 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.d.ts +180 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.js +548 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.js.map +1 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.d.ts +69 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.js +183 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.js.map +1 -0
- package/dist/core/indexing/fulltext/extractFulltextText.d.ts +34 -0
- package/dist/core/indexing/fulltext/extractFulltextText.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/extractFulltextText.js +129 -0
- package/dist/core/indexing/fulltext/extractFulltextText.js.map +1 -0
- package/dist/core/indexing/fulltext/index.d.ts +5 -0
- package/dist/core/indexing/fulltext/index.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/index.js +20 -0
- package/dist/core/indexing/fulltext/index.js.map +1 -0
- package/dist/core/indexing/fulltext/types.d.ts +168 -0
- package/dist/core/indexing/fulltext/types.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/types.js +89 -0
- package/dist/core/indexing/fulltext/types.js.map +1 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts +137 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts.map +1 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.js +438 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.js.map +1 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts +72 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js +221 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js.map +1 -0
- package/dist/core/indexing/summary/extractSummaryFields.d.ts +75 -0
- package/dist/core/indexing/summary/extractSummaryFields.d.ts.map +1 -0
- package/dist/core/indexing/summary/extractSummaryFields.js +266 -0
- package/dist/core/indexing/summary/extractSummaryFields.js.map +1 -0
- package/dist/core/indexing/summary/index.d.ts +5 -0
- package/dist/core/indexing/summary/index.d.ts.map +1 -0
- package/dist/core/indexing/summary/index.js +23 -0
- package/dist/core/indexing/summary/index.js.map +1 -0
- package/dist/core/indexing/summary/types.d.ts +119 -0
- package/dist/core/indexing/summary/types.d.ts.map +1 -0
- package/dist/core/indexing/summary/types.js +81 -0
- package/dist/core/indexing/summary/types.js.map +1 -0
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts +47 -1
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +24 -8
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +96 -41
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts +2 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js +8 -3
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.d.ts +111 -5
- package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.js +266 -75
- package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts +12 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +12 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +66 -5
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts +50 -6
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js +54 -12
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js.map +1 -1
- package/dist/core/indexing/virtualviews/index.d.ts +3 -3
- package/dist/core/indexing/virtualviews/index.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/index.js.map +1 -1
- package/dist/core/indexing/virtualviews/types.d.ts +6 -0
- package/dist/core/indexing/virtualviews/types.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/types.js +11 -3
- package/dist/core/indexing/virtualviews/types.js.map +1 -1
- package/dist/core/keys/KeyBag.d.ts +25 -0
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +37 -1
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/query/executeQuery.d.ts +18 -0
- package/dist/core/query/executeQuery.d.ts.map +1 -0
- package/dist/core/query/executeQuery.js +313 -0
- package/dist/core/query/executeQuery.js.map +1 -0
- package/dist/core/query/index.d.ts +5 -0
- package/dist/core/query/index.d.ts.map +1 -0
- package/dist/core/query/index.js +14 -0
- package/dist/core/query/index.js.map +1 -0
- package/dist/core/query/queryLive.d.ts +27 -0
- package/dist/core/query/queryLive.d.ts.map +1 -0
- package/dist/core/query/queryLive.js +104 -0
- package/dist/core/query/queryLive.js.map +1 -0
- package/dist/core/query/queryView.d.ts +156 -0
- package/dist/core/query/queryView.d.ts.map +1 -0
- package/dist/core/query/queryView.js +266 -0
- package/dist/core/query/queryView.js.map +1 -0
- package/dist/core/query/types.d.ts +121 -0
- package/dist/core/query/types.d.ts.map +1 -0
- package/dist/core/query/types.js +18 -0
- package/dist/core/query/types.js.map +1 -0
- package/dist/core/storeEntryTime.d.ts +57 -0
- package/dist/core/storeEntryTime.d.ts.map +1 -0
- package/dist/core/storeEntryTime.js +72 -0
- package/dist/core/storeEntryTime.js.map +1 -0
- package/dist/core/types.d.ts +1509 -39
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +13 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts +53 -1
- package/dist/core/uri/MindooURI.d.ts.map +1 -1
- package/dist/core/uri/MindooURI.js +135 -0
- package/dist/core/uri/MindooURI.js.map +1 -1
- package/dist/core/utils/urlSafety.d.ts +46 -0
- package/dist/core/utils/urlSafety.d.ts.map +1 -0
- package/dist/core/utils/urlSafety.js +144 -0
- package/dist/core/utils/urlSafety.js.map +1 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +14 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +95 -4
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/server/CapabilityMatcher.d.ts +10 -0
- package/dist/node/server/CapabilityMatcher.d.ts.map +1 -1
- package/dist/node/server/CapabilityMatcher.js +14 -2
- package/dist/node/server/CapabilityMatcher.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +117 -8
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/PurgedDocRegistry.d.ts +32 -0
- package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -0
- package/dist/node/server/PurgedDocRegistry.js +94 -0
- package/dist/node/server/PurgedDocRegistry.js.map +1 -0
- package/dist/node/server/ServerSync.d.ts.map +1 -1
- package/dist/node/server/ServerSync.js +5 -2
- package/dist/node/server/ServerSync.js.map +1 -1
- package/dist/node/server/SystemAdminAuth.d.ts +10 -0
- package/dist/node/server/SystemAdminAuth.d.ts.map +1 -1
- package/dist/node/server/SystemAdminAuth.js +25 -0
- package/dist/node/server/SystemAdminAuth.js.map +1 -1
- package/dist/node/server/TenantManager.d.ts +95 -1
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +382 -15
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +5 -1
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/types.d.ts +29 -3
- package/dist/node/server/types.d.ts.map +1 -1
- package/dist/node/server/types.js +12 -0
- package/dist/node/server/types.js.map +1 -1
- package/dist/node/server/validation.d.ts +6 -0
- package/dist/node/server/validation.d.ts.map +1 -1
- package/dist/node/server/validation.js +7 -1
- package/dist/node/server/validation.js.map +1 -1
- package/package.json +4 -3
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts +0 -8
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts.map +0 -1
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js +0 -16
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js.map +0 -1
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +0 -68
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +0 -1
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js +0 -659
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js.map +0 -1
- package/dist/node/attachments/writeAttachmentToFile.d.ts +0 -15
- package/dist/node/attachments/writeAttachmentToFile.d.ts.map +0 -1
- package/dist/node/attachments/writeAttachmentToFile.js +0 -73
- package/dist/node/attachments/writeAttachmentToFile.js.map +0 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ENTRY_SIGNATURE_LAYOUT_VERSION = void 0;
|
|
4
|
+
exports.buildEntrySigningBytes = buildEntrySigningBytes;
|
|
5
|
+
exports.entrySignatureFieldsFromEntry = entrySignatureFieldsFromEntry;
|
|
6
|
+
exports.signEntryMetadata = signEntryMetadata;
|
|
7
|
+
exports.verifyEntrySignatureWithImportedKey = verifyEntrySignatureWithImportedKey;
|
|
8
|
+
exports.verifyEntrySignatureCrypto = verifyEntrySignatureCrypto;
|
|
9
|
+
/**
|
|
10
|
+
* Author entry signatures (security hardening, audit finding #5).
|
|
11
|
+
*
|
|
12
|
+
* Historically (early betas) a store entry's author signature (`StoreEntryMetadata.signature`)
|
|
13
|
+
* covered ONLY the encrypted payload bytes. That leaves every cleartext metadata
|
|
14
|
+
* field (`entryType`, `docId`, `decryptionKeyId`, `createdAt`, `dependencyIds`,
|
|
15
|
+
* `contentHash`, ...) unauthenticated: a relay holding any trusted key could
|
|
16
|
+
* tweak metadata on an un-witnessed/legacy entry and the legacy signature would
|
|
17
|
+
* still verify.
|
|
18
|
+
*
|
|
19
|
+
* This module adds a second, stronger author signature
|
|
20
|
+
* (`StoreEntryMetadata.metadataSignature`) computed over a **fixed, versioned,
|
|
21
|
+
* length-prefixed byte layout** that binds the security-relevant metadata
|
|
22
|
+
* alongside the `contentHash` (which itself is `SHA-256(encryptedData)`, so the
|
|
23
|
+
* ciphertext is transitively bound). It mirrors {@link WitnessReceipt} in style
|
|
24
|
+
* and is intentionally free of tenant/IO dependencies so it can be reused on
|
|
25
|
+
* both client and server and unit-tested in isolation.
|
|
26
|
+
*
|
|
27
|
+
* Backward compatibility: writers populate BOTH `signature` (legacy, over
|
|
28
|
+
* ciphertext) and `metadataSignature`. Verifiers prefer `metadataSignature`
|
|
29
|
+
* when present and fall back to the legacy `signature` for v1/legacy entries
|
|
30
|
+
* that predate this field, so old entries remain readable.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Version byte of the canonical entry-signature layout. Any change to the field
|
|
34
|
+
* set or ordering MUST bump this value (and verifiers MUST reject unknown
|
|
35
|
+
* versions).
|
|
36
|
+
*
|
|
37
|
+
* Exception — backward-compatible trailing extensions: a strictly trailing,
|
|
38
|
+
* optional block whose absence produces ZERO bytes (so the layout is
|
|
39
|
+
* byte-identical to the prior version for entries that do not carry the new
|
|
40
|
+
* data) does NOT bump this value. The `attachmentRefs` block (see
|
|
41
|
+
* {@link buildEntrySigningBytes}) is such an extension: attachment-free entries —
|
|
42
|
+
* including every entry signed before the field existed — are unaffected and
|
|
43
|
+
* keep verifying.
|
|
44
|
+
*/
|
|
45
|
+
exports.ENTRY_SIGNATURE_LAYOUT_VERSION = 0x01;
|
|
46
|
+
const textEncoder = new TextEncoder();
|
|
47
|
+
function pushLengthPrefixed(parts, bytes) {
|
|
48
|
+
const lengthPrefix = new Uint8Array(4);
|
|
49
|
+
new DataView(lengthPrefix.buffer).setUint32(0, bytes.length, false /* big-endian */);
|
|
50
|
+
parts.push(lengthPrefix, bytes);
|
|
51
|
+
}
|
|
52
|
+
function pushString(parts, value) {
|
|
53
|
+
pushLengthPrefixed(parts, textEncoder.encode(value));
|
|
54
|
+
}
|
|
55
|
+
function pushUint32BE(parts, value) {
|
|
56
|
+
const buf = new Uint8Array(4);
|
|
57
|
+
new DataView(buf.buffer).setUint32(0, value >>> 0, false /* big-endian */);
|
|
58
|
+
parts.push(buf);
|
|
59
|
+
}
|
|
60
|
+
function pushInt64BE(parts, value) {
|
|
61
|
+
if (!Number.isInteger(value)) {
|
|
62
|
+
throw new Error(`Entry signature int64 field must be an integer, got: ${value}`);
|
|
63
|
+
}
|
|
64
|
+
const buf = new Uint8Array(8);
|
|
65
|
+
new DataView(buf.buffer).setBigInt64(0, BigInt(value), false /* big-endian */);
|
|
66
|
+
parts.push(buf);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build the canonical, versioned, length-prefixed byte layout the author signs
|
|
70
|
+
* over.
|
|
71
|
+
*
|
|
72
|
+
* Layout:
|
|
73
|
+
* ```
|
|
74
|
+
* version(1 byte)
|
|
75
|
+
* || len(entryType) || entryType
|
|
76
|
+
* || len(id) || id
|
|
77
|
+
* || len(docId) || docId
|
|
78
|
+
* || len(decryptionKeyId) || decryptionKeyId
|
|
79
|
+
* || int64BE(createdAt)
|
|
80
|
+
* || uint32BE(dependencyIds.length)
|
|
81
|
+
* || ( len(dep) || dep ) * (in array order)
|
|
82
|
+
* || len(contentHash) || contentHash
|
|
83
|
+
* || len(createdByPublicKey) || createdByPublicKey
|
|
84
|
+
* -- trailing attachmentRefs block, PRESENT ONLY IF attachmentRefs.length > 0 --
|
|
85
|
+
* || uint32BE(attachmentRefs.length)
|
|
86
|
+
* || ( len(attachmentId) || attachmentId
|
|
87
|
+
* || len(lastChunkId) || lastChunkId
|
|
88
|
+
* || int64BE(size) ) * (one triple per ref, in array order)
|
|
89
|
+
* ```
|
|
90
|
+
*
|
|
91
|
+
* The attachmentRefs block is a deliberately backward-compatible TRAILING
|
|
92
|
+
* extension: it is appended ONLY when there is at least one ref, so an
|
|
93
|
+
* attachment-free entry (every entry written before this field existed, and
|
|
94
|
+
* every future text-only revision) produces byte-for-byte the same input as the
|
|
95
|
+
* original layout and its existing signature still verifies. This is why the
|
|
96
|
+
* version byte intentionally stays `0x01` and is NOT bumped despite the new
|
|
97
|
+
* field: absence is byte-identical to the prior layout. Callers MUST treat an
|
|
98
|
+
* empty array as absent (the canonicalization in {@link entrySignatureFieldsFromEntry}
|
|
99
|
+
* guarantees this) and emit refs in a stable order (the writer sorts by
|
|
100
|
+
* `attachmentId`) so signing and verification produce identical bytes.
|
|
101
|
+
*/
|
|
102
|
+
function buildEntrySigningBytes(fields, version = exports.ENTRY_SIGNATURE_LAYOUT_VERSION) {
|
|
103
|
+
const parts = [];
|
|
104
|
+
parts.push(new Uint8Array([version & 0xff]));
|
|
105
|
+
pushString(parts, fields.entryType);
|
|
106
|
+
pushString(parts, fields.id);
|
|
107
|
+
pushString(parts, fields.docId);
|
|
108
|
+
pushString(parts, fields.decryptionKeyId);
|
|
109
|
+
pushInt64BE(parts, fields.createdAt);
|
|
110
|
+
pushUint32BE(parts, fields.dependencyIds.length);
|
|
111
|
+
for (const dep of fields.dependencyIds) {
|
|
112
|
+
pushString(parts, dep);
|
|
113
|
+
}
|
|
114
|
+
pushString(parts, fields.contentHash);
|
|
115
|
+
pushString(parts, fields.createdByPublicKey);
|
|
116
|
+
// Backward-compatible trailing block: appended only when non-empty so that
|
|
117
|
+
// attachment-free entries remain byte-identical to the original v1 layout.
|
|
118
|
+
const attachmentRefs = fields.attachmentRefs;
|
|
119
|
+
if (attachmentRefs && attachmentRefs.length > 0) {
|
|
120
|
+
pushUint32BE(parts, attachmentRefs.length);
|
|
121
|
+
for (const ref of attachmentRefs) {
|
|
122
|
+
pushString(parts, ref.attachmentId);
|
|
123
|
+
pushString(parts, ref.lastChunkId);
|
|
124
|
+
pushInt64BE(parts, ref.size);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const total = parts.reduce((sum, p) => sum + p.length, 0);
|
|
128
|
+
const out = new Uint8Array(total);
|
|
129
|
+
let offset = 0;
|
|
130
|
+
for (const p of parts) {
|
|
131
|
+
out.set(p, offset);
|
|
132
|
+
offset += p.length;
|
|
133
|
+
}
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
/** Project the signed fields out of an entry's metadata. */
|
|
137
|
+
function entrySignatureFieldsFromEntry(entry) {
|
|
138
|
+
return {
|
|
139
|
+
entryType: entry.entryType,
|
|
140
|
+
id: entry.id,
|
|
141
|
+
docId: entry.docId,
|
|
142
|
+
decryptionKeyId: entry.decryptionKeyId,
|
|
143
|
+
createdAt: entry.createdAt,
|
|
144
|
+
dependencyIds: entry.dependencyIds,
|
|
145
|
+
contentHash: entry.contentHash,
|
|
146
|
+
createdByPublicKey: entry.createdByPublicKey,
|
|
147
|
+
// Canonicalize empty -> undefined so "no attachments" has a single byte
|
|
148
|
+
// representation (zero trailing bytes); see buildEntrySigningBytes.
|
|
149
|
+
attachmentRefs: entry.attachmentRefs && entry.attachmentRefs.length > 0
|
|
150
|
+
? entry.attachmentRefs
|
|
151
|
+
: undefined,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** Convert a PEM-encoded SPKI public key to an ArrayBuffer (dependency-free). */
|
|
155
|
+
function pemToArrayBuffer(pem) {
|
|
156
|
+
const base64 = pem
|
|
157
|
+
.replace("-----BEGIN PUBLIC KEY-----", "")
|
|
158
|
+
.replace("-----END PUBLIC KEY-----", "")
|
|
159
|
+
.replace(/\s/g, "");
|
|
160
|
+
const binary = atob(base64);
|
|
161
|
+
const bytes = new Uint8Array(binary.length);
|
|
162
|
+
for (let i = 0; i < binary.length; i++) {
|
|
163
|
+
bytes[i] = binary.charCodeAt(i);
|
|
164
|
+
}
|
|
165
|
+
return bytes.buffer;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Sign the canonical entry layout with an already-imported Ed25519 private key.
|
|
169
|
+
* Returns the raw signature bytes to store as `metadataSignature`.
|
|
170
|
+
*/
|
|
171
|
+
async function signEntryMetadata(fields, signingPrivateKey, subtle, version = exports.ENTRY_SIGNATURE_LAYOUT_VERSION) {
|
|
172
|
+
const bytes = buildEntrySigningBytes(fields, version);
|
|
173
|
+
const signature = await subtle.sign({ name: "Ed25519" }, signingPrivateKey, bytes.buffer);
|
|
174
|
+
return new Uint8Array(signature);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Pure cryptographic verification of an entry's author signature, version-aware.
|
|
178
|
+
*
|
|
179
|
+
* - If `metadataSignature` is present, verifies it over {@link buildEntrySigningBytes}
|
|
180
|
+
* (strong, metadata-binding scheme; v2+).
|
|
181
|
+
* - Otherwise falls back to the legacy `signature` over `encryptedData`
|
|
182
|
+
* (v1/legacy entries that predate the metadata-binding scheme).
|
|
183
|
+
*
|
|
184
|
+
* This does NOT decide whether the author key is *trusted* — callers must
|
|
185
|
+
* separately confirm the key via the tenant directory.
|
|
186
|
+
*/
|
|
187
|
+
async function verifyEntrySignatureWithImportedKey(entry, encryptedData, cryptoKey, subtle, opts) {
|
|
188
|
+
if (entry.metadataSignature) {
|
|
189
|
+
const bytes = buildEntrySigningBytes(entrySignatureFieldsFromEntry(entry));
|
|
190
|
+
return subtle.verify({ name: "Ed25519" }, cryptoKey, entry.metadataSignature.buffer, bytes.buffer);
|
|
191
|
+
}
|
|
192
|
+
// Storage-format floor (audit #5 follow-up): when the tenant requires the
|
|
193
|
+
// metadata-binding signature for this entry's trusted time, refuse to accept
|
|
194
|
+
// the weaker legacy ciphertext-only signature. Returning false routes the
|
|
195
|
+
// entry to the caller's fail-closed / quarantine path.
|
|
196
|
+
if (opts?.requireMetadataSignature) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return subtle.verify({ name: "Ed25519" }, cryptoKey, entry.signature.buffer, encryptedData.buffer);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Same as {@link verifyEntrySignatureWithImportedKey} but imports the author's
|
|
203
|
+
* PEM-encoded public key first. Convenient for one-off verifications (e.g. on
|
|
204
|
+
* the server's push path) where no key cache is available.
|
|
205
|
+
*/
|
|
206
|
+
async function verifyEntrySignatureCrypto(entry, encryptedData, authorPublicKeyPem, subtle, opts) {
|
|
207
|
+
const cryptoKey = await subtle.importKey("spki", pemToArrayBuffer(authorPublicKeyPem), { name: "Ed25519" }, false, ["verify"]);
|
|
208
|
+
return verifyEntrySignatureWithImportedKey(entry, encryptedData, cryptoKey, subtle, opts);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=EntrySignature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntrySignature.js","sourceRoot":"","sources":["../../../src/core/crypto/EntrySignature.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MindooDocSigner.d.ts","sourceRoot":"","sources":["../../../src/core/crypto/MindooDocSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAoB,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAoC,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ9E;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,mBAAmB;IA6C3B;;;;;;;;OAQG;IACG,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"MindooDocSigner.d.ts","sourceRoot":"","sources":["../../../src/core/crypto/MindooDocSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAoB,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAoC,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ9E;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,mBAAmB;IA6C3B;;;;;;;;OAQG;IACG,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA8C3F;;;;;;;;OAQG;IACG,WAAW,CACf,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;CA2CpB"}
|
|
@@ -140,7 +140,9 @@ class MindooDocSigner {
|
|
|
140
140
|
const docPayload = doc.getData();
|
|
141
141
|
// Create canonical JSON representation
|
|
142
142
|
const canonicalJSON = this.createCanonicalJSON(docPayload, items);
|
|
143
|
-
|
|
143
|
+
// Do NOT log the canonical JSON itself: it is the plaintext document content
|
|
144
|
+
// being signed (audit, Medium: sensitive debug logging). Log only metadata.
|
|
145
|
+
this.logger.debug(`Building canonical payload for signing: ${items.length} item(s), ${canonicalJSON.length} chars`);
|
|
144
146
|
// Convert to bytes (UTF-8 encoding)
|
|
145
147
|
const encoder = new TextEncoder();
|
|
146
148
|
const payloadBytes = encoder.encode(canonicalJSON);
|
|
@@ -172,7 +174,9 @@ class MindooDocSigner {
|
|
|
172
174
|
const docPayload = doc.getData();
|
|
173
175
|
// Create the same canonical JSON representation
|
|
174
176
|
const canonicalJSON = this.createCanonicalJSON(docPayload, items);
|
|
175
|
-
|
|
177
|
+
// Do NOT log the canonical JSON itself: it is the plaintext document content
|
|
178
|
+
// being verified (audit, Medium: sensitive debug logging). Log only metadata.
|
|
179
|
+
this.logger.debug(`Building canonical payload for verification: ${items.length} item(s), ${canonicalJSON.length} chars`);
|
|
176
180
|
// Convert to bytes (UTF-8 encoding)
|
|
177
181
|
const encoder = new TextEncoder();
|
|
178
182
|
const payloadBytes = encoder.encode(canonicalJSON);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MindooDocSigner.js","sourceRoot":"","sources":["../../../src/core/crypto/MindooDocSigner.ts"],"names":[],"mappings":";;;AAEA,wCAAsE;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,MAAa,eAAe;IAK1B,YAAY,MAAwB,EAAE,OAAuB,EAAE,MAAe;QAC5E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM;YACT,MAAM;gBACN,IAAI,sBAAY,CAAC,IAAA,4BAAkB,GAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACK,mBAAmB,CAAC,OAAyB,EAAE,KAAe;QACpE,mCAAmC;QACnC,uEAAuE;QACvE,qEAAqE;QACrE,MAAM,aAAa,GAAqB,EAAE,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;YAC5B,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBACvB,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,oEAAoE;gBACpE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;YAChC,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE;YAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC,CAAC,0CAA0C;YACzD,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,0DAA0D;gBAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM,aAAa,GAAqB,EAAE,CAAC;gBAC3C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAI,KAA0B,CAAC,GAAG,CAAC,CAAC;oBACnD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;wBAC5B,aAAa,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBACD,OAAO,aAAa,CAAC;YACvB,CAAC;YAED,sCAAsC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,SAAS,CAAC,GAAc,EAAE,KAAe,EAAE,YAAoB;QACnE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAEjC,uCAAuC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"MindooDocSigner.js","sourceRoot":"","sources":["../../../src/core/crypto/MindooDocSigner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { StoreEntryMetadata } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Witness receipts (docs/accesscontrol.md §5).
|
|
4
|
+
*
|
|
5
|
+
* A witness receipt is an Ed25519 signature, produced by a trusted sync server
|
|
6
|
+
* ("witness"), attesting that a store entry was accepted into the tenant at a
|
|
7
|
+
* specific `receivedAt` time and satisfied the Tier 1 (identity) access policy
|
|
8
|
+
* at that moment. Other replicas trust this attestation instead of
|
|
9
|
+
* re-evaluating Tier 1 forever, which keeps the system stable under eventual
|
|
10
|
+
* consistency (§4, Scenario C).
|
|
11
|
+
*
|
|
12
|
+
* The signature is computed over a **fixed, versioned, length-prefixed byte
|
|
13
|
+
* layout** rather than JSON, to avoid canonicalization ambiguity. The layout
|
|
14
|
+
* deliberately binds every attribute Tier 1 depends on — `entryType`, `dbid`
|
|
15
|
+
* and `decryptionKeyId` in particular — so a relay cannot transplant a receipt
|
|
16
|
+
* onto a different operation type, database, or key (§5.2).
|
|
17
|
+
*
|
|
18
|
+
* This module is intentionally free of any tenant/IO dependencies so it can be
|
|
19
|
+
* unit-tested in isolation and reused on both client and server.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Version byte of the canonical signing layout. Any change to the field set or
|
|
23
|
+
* ordering MUST bump this value (and verifiers MUST reject unknown versions).
|
|
24
|
+
*/
|
|
25
|
+
export declare const WITNESS_RECEIPT_LAYOUT_VERSION = 1;
|
|
26
|
+
/**
|
|
27
|
+
* The exact set of fields bound by a witness receipt signature, in the order
|
|
28
|
+
* they appear in the byte layout (§5.2).
|
|
29
|
+
*/
|
|
30
|
+
export interface WitnessReceiptFields {
|
|
31
|
+
/** Store entry operation type, e.g. `doc_create` / `doc_change`. */
|
|
32
|
+
entryType: string;
|
|
33
|
+
/**
|
|
34
|
+
* The database the witness accepted the entry under. This is the sync/store
|
|
35
|
+
* context, not necessarily a standalone metadata field; binding it prevents
|
|
36
|
+
* an entry witnessed for one database being presented as belonging to another.
|
|
37
|
+
*/
|
|
38
|
+
dbid: string;
|
|
39
|
+
/** SHA-256 hash of the encrypted payload. */
|
|
40
|
+
contentHash: string;
|
|
41
|
+
/** Store entry id. */
|
|
42
|
+
id: string;
|
|
43
|
+
/** Document id the entry belongs to. */
|
|
44
|
+
docId: string;
|
|
45
|
+
/** Id of the symmetric key the entry was encrypted with. */
|
|
46
|
+
decryptionKeyId: string;
|
|
47
|
+
/** Author-reported creation time (ms epoch). */
|
|
48
|
+
createdAt: number;
|
|
49
|
+
/** Ed25519 public key (PEM) of the author. */
|
|
50
|
+
createdByPublicKey: string;
|
|
51
|
+
/** Witness-assigned acceptance time (ms epoch). */
|
|
52
|
+
receivedAt: number;
|
|
53
|
+
/** Ed25519 public key (PEM) of the witness. */
|
|
54
|
+
receivedByPublicKey: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build the canonical, versioned, length-prefixed byte layout that a witness
|
|
58
|
+
* signs over (docs/accesscontrol.md §5.2).
|
|
59
|
+
*
|
|
60
|
+
* Layout:
|
|
61
|
+
* ```
|
|
62
|
+
* version(1 byte)
|
|
63
|
+
* || len(entryType) || entryType
|
|
64
|
+
* || len(dbid) || dbid
|
|
65
|
+
* || len(contentHash) || contentHash
|
|
66
|
+
* || len(id) || id
|
|
67
|
+
* || len(docId) || docId
|
|
68
|
+
* || len(decryptionKeyId) || decryptionKeyId
|
|
69
|
+
* || int64BE(createdAt)
|
|
70
|
+
* || len(createdByPublicKey) || createdByPublicKey
|
|
71
|
+
* || int64BE(receivedAt)
|
|
72
|
+
* || len(receivedByPublicKey)|| receivedByPublicKey
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function buildWitnessSigningBytes(fields: WitnessReceiptFields, version?: number): Uint8Array;
|
|
76
|
+
/**
|
|
77
|
+
* Derive the {@link WitnessReceiptFields} for an entry the witness is about to
|
|
78
|
+
* stamp. `dbid`, `receivedAt` and `receivedByPublicKey` come from the witness's
|
|
79
|
+
* own context (which database it accepted the entry under, its clock, its key);
|
|
80
|
+
* everything else is read from the entry's existing metadata.
|
|
81
|
+
*/
|
|
82
|
+
export declare function witnessFieldsFromEntry(entry: Pick<StoreEntryMetadata, "entryType" | "contentHash" | "id" | "docId" | "decryptionKeyId" | "createdAt" | "createdByPublicKey">, context: {
|
|
83
|
+
dbid: string;
|
|
84
|
+
receivedAt: number;
|
|
85
|
+
receivedByPublicKey: string;
|
|
86
|
+
}): WitnessReceiptFields;
|
|
87
|
+
/**
|
|
88
|
+
* Sign a witness receipt over {@link buildWitnessSigningBytes} using an already
|
|
89
|
+
* imported Ed25519 private `CryptoKey`. The caller (the witness/server) is
|
|
90
|
+
* responsible for decrypting and importing its own signing key.
|
|
91
|
+
*
|
|
92
|
+
* @returns the raw Ed25519 signature bytes (store as `receivedDateSignature`).
|
|
93
|
+
*/
|
|
94
|
+
export declare function signWitnessReceipt(fields: WitnessReceiptFields, signingPrivateKey: CryptoKey, subtle: SubtleCrypto, version?: number): Promise<Uint8Array>;
|
|
95
|
+
/**
|
|
96
|
+
* The witness fields a server stamps onto an accepted entry (§5.3): the
|
|
97
|
+
* acceptance time, the witness identity, and the signature binding them to the
|
|
98
|
+
* entry. Merging this into an entry's metadata produces a witnessed entry.
|
|
99
|
+
*/
|
|
100
|
+
export interface StampedWitnessFields {
|
|
101
|
+
receivedAt: number;
|
|
102
|
+
receivedByPublicKey: string;
|
|
103
|
+
receivedDateSignature: Uint8Array;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A server's witness identity: its public key (PEM, stored as
|
|
107
|
+
* `receivedByPublicKey`) and the imported Ed25519 private key used to sign.
|
|
108
|
+
* Kept as a small struct so the server store can stamp receipts without
|
|
109
|
+
* depending on the full tenant crypto stack.
|
|
110
|
+
*/
|
|
111
|
+
export interface WitnessSigner {
|
|
112
|
+
publicKeyPem: string;
|
|
113
|
+
signingPrivateKey: CryptoKey;
|
|
114
|
+
subtle: SubtleCrypto;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Produce the witness fields for an entry the server has decided to accept
|
|
118
|
+
* (§5.3). The caller merges the returned fields into the stored metadata and
|
|
119
|
+
* echoes them back to the pushing client so every replica gets the receipt.
|
|
120
|
+
*/
|
|
121
|
+
export declare function stampEntryReceipt(entry: Pick<StoreEntryMetadata, "entryType" | "contentHash" | "id" | "docId" | "decryptionKeyId" | "createdAt" | "createdByPublicKey">, context: {
|
|
122
|
+
dbid: string;
|
|
123
|
+
receivedAt: number;
|
|
124
|
+
}, signer: WitnessSigner): Promise<StampedWitnessFields>;
|
|
125
|
+
/**
|
|
126
|
+
* Verify a witness receipt signature against the witness public key (PEM).
|
|
127
|
+
*
|
|
128
|
+
* This is a pure cryptographic check of the signature over the §5.2 layout. It
|
|
129
|
+
* does NOT decide whether the witness is *trusted* — callers must separately
|
|
130
|
+
* confirm `receivedByPublicKey` is in the tenant's trusted-witness list and run
|
|
131
|
+
* the receipt-time validation rules (§5.4: per-witness monotonicity, wall-clock
|
|
132
|
+
* sanity) before relying on the attestation.
|
|
133
|
+
*
|
|
134
|
+
* Unknown layout versions are rejected.
|
|
135
|
+
*/
|
|
136
|
+
export declare function verifyWitnessReceipt(fields: WitnessReceiptFields, signature: Uint8Array, witnessPublicKeyPem: string, subtle: SubtleCrypto, version?: number): Promise<boolean>;
|
|
137
|
+
//# sourceMappingURL=WitnessReceipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WitnessReceipt.d.ts","sourceRoot":"","sources":["../../../src/core/crypto/WitnessReceipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;GAGG;AACH,eAAO,MAAM,8BAA8B,IAAO,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AA6BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,MAAuC,GAC/C,UAAU,CAsBZ;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,IAAI,CACT,kBAAkB,EAClB,WAAW,GAAG,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,iBAAiB,GAAG,WAAW,GAAG,oBAAoB,CACtG,EACD,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,GACzE,oBAAoB,CAatB;AAmBD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,oBAAoB,EAC5B,iBAAiB,EAAE,SAAS,EAC5B,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,MAAuC,GAC/C,OAAO,CAAC,UAAU,CAAC,CAIrB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,UAAU,CAAC;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,IAAI,CACT,kBAAkB,EAClB,WAAW,GAAG,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,iBAAiB,GAAG,WAAW,GAAG,oBAAoB,CACtG,EACD,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC7C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAY/B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,UAAU,EACrB,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,MAAuC,GAC/C,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WITNESS_RECEIPT_LAYOUT_VERSION = void 0;
|
|
4
|
+
exports.buildWitnessSigningBytes = buildWitnessSigningBytes;
|
|
5
|
+
exports.witnessFieldsFromEntry = witnessFieldsFromEntry;
|
|
6
|
+
exports.signWitnessReceipt = signWitnessReceipt;
|
|
7
|
+
exports.stampEntryReceipt = stampEntryReceipt;
|
|
8
|
+
exports.verifyWitnessReceipt = verifyWitnessReceipt;
|
|
9
|
+
/**
|
|
10
|
+
* Witness receipts (docs/accesscontrol.md §5).
|
|
11
|
+
*
|
|
12
|
+
* A witness receipt is an Ed25519 signature, produced by a trusted sync server
|
|
13
|
+
* ("witness"), attesting that a store entry was accepted into the tenant at a
|
|
14
|
+
* specific `receivedAt` time and satisfied the Tier 1 (identity) access policy
|
|
15
|
+
* at that moment. Other replicas trust this attestation instead of
|
|
16
|
+
* re-evaluating Tier 1 forever, which keeps the system stable under eventual
|
|
17
|
+
* consistency (§4, Scenario C).
|
|
18
|
+
*
|
|
19
|
+
* The signature is computed over a **fixed, versioned, length-prefixed byte
|
|
20
|
+
* layout** rather than JSON, to avoid canonicalization ambiguity. The layout
|
|
21
|
+
* deliberately binds every attribute Tier 1 depends on — `entryType`, `dbid`
|
|
22
|
+
* and `decryptionKeyId` in particular — so a relay cannot transplant a receipt
|
|
23
|
+
* onto a different operation type, database, or key (§5.2).
|
|
24
|
+
*
|
|
25
|
+
* This module is intentionally free of any tenant/IO dependencies so it can be
|
|
26
|
+
* unit-tested in isolation and reused on both client and server.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Version byte of the canonical signing layout. Any change to the field set or
|
|
30
|
+
* ordering MUST bump this value (and verifiers MUST reject unknown versions).
|
|
31
|
+
*/
|
|
32
|
+
exports.WITNESS_RECEIPT_LAYOUT_VERSION = 0x01;
|
|
33
|
+
const textEncoder = new TextEncoder();
|
|
34
|
+
/**
|
|
35
|
+
* Append a 32-bit big-endian length prefix followed by the raw bytes.
|
|
36
|
+
* `len(x)` in the §5.2 layout.
|
|
37
|
+
*/
|
|
38
|
+
function pushLengthPrefixed(parts, bytes) {
|
|
39
|
+
const lengthPrefix = new Uint8Array(4);
|
|
40
|
+
new DataView(lengthPrefix.buffer).setUint32(0, bytes.length, false /* big-endian */);
|
|
41
|
+
parts.push(lengthPrefix, bytes);
|
|
42
|
+
}
|
|
43
|
+
/** Append a UTF-8, length-prefixed string. */
|
|
44
|
+
function pushString(parts, value) {
|
|
45
|
+
pushLengthPrefixed(parts, textEncoder.encode(value));
|
|
46
|
+
}
|
|
47
|
+
/** Append a 64-bit big-endian integer (`int64BE` in the §5.2 layout). */
|
|
48
|
+
function pushInt64BE(parts, value) {
|
|
49
|
+
if (!Number.isInteger(value)) {
|
|
50
|
+
throw new Error(`Witness receipt int64 field must be an integer, got: ${value}`);
|
|
51
|
+
}
|
|
52
|
+
const buf = new Uint8Array(8);
|
|
53
|
+
new DataView(buf.buffer).setBigInt64(0, BigInt(value), false /* big-endian */);
|
|
54
|
+
parts.push(buf);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build the canonical, versioned, length-prefixed byte layout that a witness
|
|
58
|
+
* signs over (docs/accesscontrol.md §5.2).
|
|
59
|
+
*
|
|
60
|
+
* Layout:
|
|
61
|
+
* ```
|
|
62
|
+
* version(1 byte)
|
|
63
|
+
* || len(entryType) || entryType
|
|
64
|
+
* || len(dbid) || dbid
|
|
65
|
+
* || len(contentHash) || contentHash
|
|
66
|
+
* || len(id) || id
|
|
67
|
+
* || len(docId) || docId
|
|
68
|
+
* || len(decryptionKeyId) || decryptionKeyId
|
|
69
|
+
* || int64BE(createdAt)
|
|
70
|
+
* || len(createdByPublicKey) || createdByPublicKey
|
|
71
|
+
* || int64BE(receivedAt)
|
|
72
|
+
* || len(receivedByPublicKey)|| receivedByPublicKey
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
function buildWitnessSigningBytes(fields, version = exports.WITNESS_RECEIPT_LAYOUT_VERSION) {
|
|
76
|
+
const parts = [];
|
|
77
|
+
parts.push(new Uint8Array([version & 0xff]));
|
|
78
|
+
pushString(parts, fields.entryType);
|
|
79
|
+
pushString(parts, fields.dbid);
|
|
80
|
+
pushString(parts, fields.contentHash);
|
|
81
|
+
pushString(parts, fields.id);
|
|
82
|
+
pushString(parts, fields.docId);
|
|
83
|
+
pushString(parts, fields.decryptionKeyId);
|
|
84
|
+
pushInt64BE(parts, fields.createdAt);
|
|
85
|
+
pushString(parts, fields.createdByPublicKey);
|
|
86
|
+
pushInt64BE(parts, fields.receivedAt);
|
|
87
|
+
pushString(parts, fields.receivedByPublicKey);
|
|
88
|
+
const total = parts.reduce((sum, p) => sum + p.length, 0);
|
|
89
|
+
const out = new Uint8Array(total);
|
|
90
|
+
let offset = 0;
|
|
91
|
+
for (const p of parts) {
|
|
92
|
+
out.set(p, offset);
|
|
93
|
+
offset += p.length;
|
|
94
|
+
}
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Derive the {@link WitnessReceiptFields} for an entry the witness is about to
|
|
99
|
+
* stamp. `dbid`, `receivedAt` and `receivedByPublicKey` come from the witness's
|
|
100
|
+
* own context (which database it accepted the entry under, its clock, its key);
|
|
101
|
+
* everything else is read from the entry's existing metadata.
|
|
102
|
+
*/
|
|
103
|
+
function witnessFieldsFromEntry(entry, context) {
|
|
104
|
+
return {
|
|
105
|
+
entryType: entry.entryType,
|
|
106
|
+
dbid: context.dbid,
|
|
107
|
+
contentHash: entry.contentHash,
|
|
108
|
+
id: entry.id,
|
|
109
|
+
docId: entry.docId,
|
|
110
|
+
decryptionKeyId: entry.decryptionKeyId,
|
|
111
|
+
createdAt: entry.createdAt,
|
|
112
|
+
createdByPublicKey: entry.createdByPublicKey,
|
|
113
|
+
receivedAt: context.receivedAt,
|
|
114
|
+
receivedByPublicKey: context.receivedByPublicKey,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Convert a PEM-encoded SPKI public key to an ArrayBuffer. Mirrors
|
|
119
|
+
* `BaseMindooTenant.pemToArrayBuffer` but kept dependency-free here.
|
|
120
|
+
*/
|
|
121
|
+
function pemToArrayBuffer(pem) {
|
|
122
|
+
const base64 = pem
|
|
123
|
+
.replace("-----BEGIN PUBLIC KEY-----", "")
|
|
124
|
+
.replace("-----END PUBLIC KEY-----", "")
|
|
125
|
+
.replace(/\s/g, "");
|
|
126
|
+
const binary = atob(base64);
|
|
127
|
+
const bytes = new Uint8Array(binary.length);
|
|
128
|
+
for (let i = 0; i < binary.length; i++) {
|
|
129
|
+
bytes[i] = binary.charCodeAt(i);
|
|
130
|
+
}
|
|
131
|
+
return bytes.buffer;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Sign a witness receipt over {@link buildWitnessSigningBytes} using an already
|
|
135
|
+
* imported Ed25519 private `CryptoKey`. The caller (the witness/server) is
|
|
136
|
+
* responsible for decrypting and importing its own signing key.
|
|
137
|
+
*
|
|
138
|
+
* @returns the raw Ed25519 signature bytes (store as `receivedDateSignature`).
|
|
139
|
+
*/
|
|
140
|
+
async function signWitnessReceipt(fields, signingPrivateKey, subtle, version = exports.WITNESS_RECEIPT_LAYOUT_VERSION) {
|
|
141
|
+
const bytes = buildWitnessSigningBytes(fields, version);
|
|
142
|
+
const signature = await subtle.sign({ name: "Ed25519" }, signingPrivateKey, bytes.buffer);
|
|
143
|
+
return new Uint8Array(signature);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Produce the witness fields for an entry the server has decided to accept
|
|
147
|
+
* (§5.3). The caller merges the returned fields into the stored metadata and
|
|
148
|
+
* echoes them back to the pushing client so every replica gets the receipt.
|
|
149
|
+
*/
|
|
150
|
+
async function stampEntryReceipt(entry, context, signer) {
|
|
151
|
+
const fields = witnessFieldsFromEntry(entry, {
|
|
152
|
+
dbid: context.dbid,
|
|
153
|
+
receivedAt: context.receivedAt,
|
|
154
|
+
receivedByPublicKey: signer.publicKeyPem,
|
|
155
|
+
});
|
|
156
|
+
const signature = await signWitnessReceipt(fields, signer.signingPrivateKey, signer.subtle);
|
|
157
|
+
return {
|
|
158
|
+
receivedAt: context.receivedAt,
|
|
159
|
+
receivedByPublicKey: signer.publicKeyPem,
|
|
160
|
+
receivedDateSignature: signature,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Verify a witness receipt signature against the witness public key (PEM).
|
|
165
|
+
*
|
|
166
|
+
* This is a pure cryptographic check of the signature over the §5.2 layout. It
|
|
167
|
+
* does NOT decide whether the witness is *trusted* — callers must separately
|
|
168
|
+
* confirm `receivedByPublicKey` is in the tenant's trusted-witness list and run
|
|
169
|
+
* the receipt-time validation rules (§5.4: per-witness monotonicity, wall-clock
|
|
170
|
+
* sanity) before relying on the attestation.
|
|
171
|
+
*
|
|
172
|
+
* Unknown layout versions are rejected.
|
|
173
|
+
*/
|
|
174
|
+
async function verifyWitnessReceipt(fields, signature, witnessPublicKeyPem, subtle, version = exports.WITNESS_RECEIPT_LAYOUT_VERSION) {
|
|
175
|
+
if (version !== exports.WITNESS_RECEIPT_LAYOUT_VERSION) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
const bytes = buildWitnessSigningBytes(fields, version);
|
|
179
|
+
const cryptoKey = await subtle.importKey("spki", pemToArrayBuffer(witnessPublicKeyPem), { name: "Ed25519" }, false, ["verify"]);
|
|
180
|
+
return subtle.verify({ name: "Ed25519" }, cryptoKey, signature.buffer, bytes.buffer);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=WitnessReceipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WitnessReceipt.js","sourceRoot":"","sources":["../../../src/core/crypto/WitnessReceipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal decryptor surface needed to decrypt an `_encrypted` field. This is a
|
|
3
|
+
* subset of `MindooTenant` so callers can pass a tenant directly without this
|
|
4
|
+
* module depending on the full tenant type.
|
|
5
|
+
*/
|
|
6
|
+
export interface EncryptedFieldDecryptor {
|
|
7
|
+
decryptPayload(encryptedPayload: Uint8Array, decryptionKeyId: string): Promise<Uint8Array>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the symmetric key id for an `_encrypted` field following the
|
|
11
|
+
* `<field>_encrypted` / `<field>_encrypted_key` naming convention.
|
|
12
|
+
*
|
|
13
|
+
* Resolution order: explicit `override` -> the field's `<field>_key` companion
|
|
14
|
+
* field on the document -> the tenant default key (`"default"`).
|
|
15
|
+
*/
|
|
16
|
+
export declare function getEncryptedFieldKeyId(data: Record<string, unknown>, encryptedFieldName: string, override?: string | null): string;
|
|
17
|
+
/**
|
|
18
|
+
* Decrypts a base64 `_encrypted` field to its UTF-8 plaintext.
|
|
19
|
+
*
|
|
20
|
+
* The key id is resolved with {@link getEncryptedFieldKeyId} unless
|
|
21
|
+
* `keyIdOverride` is provided. Returns `null` when the field is missing/blank
|
|
22
|
+
* or decryption fails (for example the named key is not present in the
|
|
23
|
+
* decryptor's key bag), so callers can treat unreadable fields as absent rather
|
|
24
|
+
* than throwing.
|
|
25
|
+
*/
|
|
26
|
+
export declare function decryptEncryptedField(decryptor: EncryptedFieldDecryptor, data: Record<string, unknown>, encryptedFieldName: string, keyIdOverride?: string | null): Promise<string | null>;
|
|
27
|
+
//# sourceMappingURL=encryptedFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryptedFields.d.ts","sourceRoot":"","sources":["../../../src/core/crypto/encryptedFields.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5F;AAKD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,MAAM,CASR;AAYD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,uBAAuB,EAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,kBAAkB,EAAE,MAAM,EAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB"}
|