@tearleads/client-sdk 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/client/organizations/index.js +2 -2
  2. package/client/organizations/index.js.map +1 -1
  3. package/client/organizations/organizationHistory.js +66 -0
  4. package/client/organizations/organizationHistory.js.map +1 -0
  5. package/client/organizations/organizationReadModels.d.ts +1 -1
  6. package/client/organizations/organizationReadModels.js +7 -27
  7. package/client/organizations/organizationReadModels.js.map +1 -1
  8. package/client/organizations/organizationsTypes.d.ts +1 -1
  9. package/client/organizations/organizationsTypes.js.map +1 -1
  10. package/data/containers/shared/types.d.ts +2 -2
  11. package/data/containers/shared/types.js.map +1 -1
  12. package/data/documents/shared/syncSubmitFailure.d.ts +2 -2
  13. package/data/documents/shared/syncSubmitFailure.js.map +1 -1
  14. package/data/keyingProjectionVerification/documentPurgeCheckpointCurrency.js +34 -8
  15. package/data/keyingProjectionVerification/documentPurgeCheckpointCurrency.js.map +1 -1
  16. package/data/keyingProjectionVerification/documentPurgeDocumentChainVerification.js.map +1 -1
  17. package/data/keyingProjectionVerification/documentPurgePolicyCheckpoints.js +17 -0
  18. package/data/keyingProjectionVerification/documentPurgePolicyCheckpoints.js.map +1 -0
  19. package/data/keyingProjectionVerification/documentPurgePolicyCurrency.js +55 -0
  20. package/data/keyingProjectionVerification/documentPurgePolicyCurrency.js.map +1 -0
  21. package/data/keyingProjectionVerification/documentPurgePrincipalEvidence.js +25 -13
  22. package/data/keyingProjectionVerification/documentPurgePrincipalEvidence.js.map +1 -1
  23. package/data/keyingProjectionVerification/documentPurgeProofVerification.d.ts +5 -3
  24. package/data/keyingProjectionVerification/documentPurgeProofVerification.js +52 -8
  25. package/data/keyingProjectionVerification/documentPurgeProofVerification.js.map +1 -1
  26. package/data/keyingProjectionVerification/projectionPolicyEvidence.js.map +1 -1
  27. package/data/keyingProjectionVerification/types.d.ts +4 -0
  28. package/data/keyingProjectionVerification/types.js.map +1 -1
  29. package/data/persistence/organizations/organizationReadModelProjection.js +2 -2
  30. package/data/persistence/organizations/organizationReadModelProjection.js.map +1 -1
  31. package/data/persistence/principalAuthorizationCheckpoints.js +1 -1
  32. package/data/persistence/principalAuthorizationCheckpoints.js.map +1 -1
  33. package/data/persistence/principalCurrentAcknowledgementPersistence.d.ts +1 -0
  34. package/data/persistence/principalCurrentAcknowledgementPersistence.js +58 -12
  35. package/data/persistence/principalCurrentAcknowledgementPersistence.js.map +1 -1
  36. package/data/persistence/principalHistoryEvidencePersistence.d.ts +2 -0
  37. package/data/persistence/principalHistoryEvidencePersistence.js +2 -0
  38. package/data/persistence/principalHistoryEvidencePersistence.js.map +1 -1
  39. package/data/persistence/principalHistoryIncompleteRetention.js +32 -0
  40. package/data/persistence/principalHistoryIncompleteRetention.js.map +1 -0
  41. package/data/persistence/principalHistoryNodeRetention.js +76 -0
  42. package/data/persistence/principalHistoryNodeRetention.js.map +1 -0
  43. package/data/persistence/principalHistoryPrefixPersistence.d.ts +1 -0
  44. package/data/persistence/principalHistoryPrefixPersistence.js +30 -1
  45. package/data/persistence/principalHistoryPrefixPersistence.js.map +1 -1
  46. package/data/persistence/principalHistoryRootOwnership.js +71 -0
  47. package/data/persistence/principalHistoryRootOwnership.js.map +1 -0
  48. package/data/persistence/principalHistoryStagePersistence.js +45 -0
  49. package/data/persistence/principalHistoryStagePersistence.js.map +1 -1
  50. package/data/persistence/principalHistoryStageRetention.js +44 -0
  51. package/data/persistence/principalHistoryStageRetention.js.map +1 -0
  52. package/data/persistence/principalHistoryUnpublishedRetention.js +71 -0
  53. package/data/persistence/principalHistoryUnpublishedRetention.js.map +1 -0
  54. package/data/persistence/principalKeyEnvelopeArchivePersistence.js +63 -0
  55. package/data/persistence/principalKeyEnvelopeArchivePersistence.js.map +1 -0
  56. package/data/persistence/principalKeyEnvelopeCandidates.js +10 -1
  57. package/data/persistence/principalKeyEnvelopeCandidates.js.map +1 -1
  58. package/data/persistence/principalPolicyReferencePersistence.js +2 -2
  59. package/data/persistence/principalPolicyReferencePersistence.js.map +1 -1
  60. package/data/sqlite/principalHistoryEvidenceSchema.js +2 -0
  61. package/data/sqlite/principalHistoryEvidenceSchema.js.map +1 -1
  62. package/data/sqlite/principalHistoryNodeRetentionSchema.js +30 -0
  63. package/data/sqlite/principalHistoryNodeRetentionSchema.js.map +1 -0
  64. package/data/sqlite/principalHistoryRetentionSchema.js +40 -0
  65. package/data/sqlite/principalHistoryRetentionSchema.js.map +1 -0
  66. package/data/sqlite/principalHistoryStageSchema.js +2 -0
  67. package/data/sqlite/principalHistoryStageSchema.js.map +1 -1
  68. package/data/sqlite/schema.d.ts +453 -0
  69. package/data/sqlite/schema.js +6 -0
  70. package/data/sqlite/schema.js.map +1 -1
  71. package/data/sqlite/sqliteCommitGuards.js +49 -0
  72. package/data/sqlite/sqliteCommitGuards.js.map +1 -0
  73. package/data/sqlite/sqlitePersistenceRuntime.js +14 -2
  74. package/data/sqlite/sqlitePersistenceRuntime.js.map +1 -1
  75. package/index.d.ts +3 -1
  76. package/index.js.map +1 -1
  77. package/internal/api-client/ApiClient.d.ts +60 -137
  78. package/internal/api-client/ApiClient.js +7 -5
  79. package/internal/api-client/ApiClient.js.map +1 -1
  80. package/internal/api-client/apiRequestRuntime.js +7 -7
  81. package/internal/api-client/apiRequestRuntime.js.map +1 -1
  82. package/internal/api-client/documentPurge.js +25 -0
  83. package/internal/api-client/documentPurge.js.map +1 -0
  84. package/internal/api-client/organizationPolicyHistory.d.ts +53 -0
  85. package/internal/api-client/organizationPolicyHistory.js +15 -0
  86. package/internal/api-client/organizationPolicyHistory.js.map +1 -0
  87. package/internal/api-client/requestInternals.js +4 -4
  88. package/internal/api-client/requestInternals.js.map +1 -1
  89. package/internal/api-client/types.d.ts +2 -2
  90. package/internal/api-client/types.js.map +1 -1
  91. package/internal/crypto/keying/accessEvent.js +11 -9
  92. package/internal/crypto/keying/accessEvent.js.map +1 -1
  93. package/internal/crypto/keying/principalPolicyChainEntry.js +3 -0
  94. package/internal/crypto/keying/principalPolicyChainEntry.js.map +1 -1
  95. package/internal/crypto/keying/principalPolicyHistory.js +4 -0
  96. package/internal/crypto/keying/principalPolicyHistory.js.map +1 -1
  97. package/internal/crypto/keying/principalPolicyHistoryTypes.d.ts +2 -0
  98. package/internal/crypto/keying/principalPolicyHistoryTypes.js.map +1 -1
  99. package/internal/crypto/keying/principalPolicyTransition.d.ts +2 -1
  100. package/internal/crypto/keying/principalPolicyTransition.js +5 -0
  101. package/internal/crypto/keying/principalPolicyTransition.js.map +1 -1
  102. package/internal/crypto/principalState.js +2 -2
  103. package/internal/crypto/principalState.js.map +1 -1
  104. package/internal/validators/operation/containerMutations.d.ts +448 -6528
  105. package/internal/validators/operation/documentMutations.d.ts +323 -579
  106. package/internal/validators/operation/documentMutations.js +22 -4
  107. package/internal/validators/operation/documentMutations.js.map +1 -1
  108. package/internal/validators/operation/documentSync.d.ts +26 -406
  109. package/internal/validators/operation/organizationPolicyHistory.d.ts +188 -310
  110. package/internal/validators/operation/organizationPolicyHistory.js +17 -3
  111. package/internal/validators/operation/organizationPolicyHistory.js.map +1 -1
  112. package/internal/validators/operation/organizations.d.ts +2 -2
  113. package/internal/validators/request/principal.js +2 -2
  114. package/internal/validators/request/principal.js.map +1 -1
  115. package/internal/validators/response/containerMutationError.d.ts +28 -408
  116. package/internal/validators/response/documentMutation.d.ts +232 -544
  117. package/internal/validators/response/documentMutation.js +1 -2
  118. package/internal/validators/response/documentMutation.js.map +1 -1
  119. package/internal/validators/response/documentSyncError.d.ts +26 -406
  120. package/internal/validators/response/documentSyncError.js +4 -3
  121. package/internal/validators/response/documentSyncError.js.map +1 -1
  122. package/internal/validators/response/index.d.ts +1 -1
  123. package/internal/validators/response/index.js +1 -1
  124. package/internal/validators/response/index.js.map +1 -1
  125. package/internal/validators/response/organization.d.ts +1 -1
  126. package/internal/validators/response/organization.js +1 -1
  127. package/internal/validators/response/organization.js.map +1 -1
  128. package/internal/validators/response/organizationPolicyHistory.d.ts +127 -309
  129. package/internal/validators/response/organizationPolicyHistory.js +10 -4
  130. package/internal/validators/response/organizationPolicyHistory.js.map +1 -1
  131. package/internal/validators/response/organizationReadModel.d.ts +5 -5
  132. package/internal/validators/response/principal.d.ts +28 -408
  133. package/internal/validators/response/principal.js +3 -1
  134. package/internal/validators/response/principal.js.map +1 -1
  135. package/internal/validators/response/principalReference.d.ts +1 -1
  136. package/internal/validators/response/principalReference.js +1 -1
  137. package/internal/validators/response/principalReference.js.map +1 -1
  138. package/internal/validators/response/principalSnapshot.js +4 -4
  139. package/internal/validators/response/principalSnapshot.js.map +1 -1
  140. package/internal/validators/util/index.d.ts +1 -1
  141. package/internal/validators/util/index.js +1 -1
  142. package/internal/validators/util/index.js.map +1 -1
  143. package/internal/validators/util/principalHistoryWire.d.ts +2 -0
  144. package/internal/validators/util/principalHistoryWire.js +2 -0
  145. package/internal/validators/util/principalHistoryWire.js.map +1 -1
  146. package/package.json +1 -1
  147. package/workflows/container-contents/container-state/createWithMetadata.js +19 -49
  148. package/workflows/container-contents/container-state/createWithMetadata.js.map +1 -1
  149. package/workflows/container-contents/container-state/groupGrantVerification.js +29 -0
  150. package/workflows/container-contents/container-state/groupGrantVerification.js.map +1 -1
  151. package/workflows/container-contents/container-state/groupShareEpoch.js +33 -0
  152. package/workflows/container-contents/container-state/groupShareEpoch.js.map +1 -0
  153. package/workflows/container-contents/container-state/remote.js +4 -1
  154. package/workflows/container-contents/container-state/remote.js.map +1 -1
  155. package/workflows/container-contents/container-state/share.js +2 -24
  156. package/workflows/container-contents/container-state/share.js.map +1 -1
  157. package/workflows/container-contents/documentTombstoneEvidence.js +23 -12
  158. package/workflows/container-contents/documentTombstoneEvidence.js.map +1 -1
  159. package/workflows/containers/child/create.js +1 -3
  160. package/workflows/containers/child/create.js.map +1 -1
  161. package/workflows/containers/child/createSubmission.d.ts +1 -3
  162. package/workflows/containers/child/createSubmission.js +13 -15
  163. package/workflows/containers/child/createSubmission.js.map +1 -1
  164. package/workflows/containers/child/currentShareGrantMutation.js +82 -0
  165. package/workflows/containers/child/currentShareGrantMutation.js.map +1 -0
  166. package/workflows/containers/child/currentSharePrincipalPolicy.js +83 -0
  167. package/workflows/containers/child/currentSharePrincipalPolicy.js.map +1 -0
  168. package/workflows/containers/child/mutationSubmit.js +1 -1
  169. package/workflows/containers/child/mutationSubmit.js.map +1 -1
  170. package/workflows/containers/child/runtimeCurrentGroupShare.js +82 -0
  171. package/workflows/containers/child/runtimeCurrentGroupShare.js.map +1 -0
  172. package/workflows/containers/child/share.js +1 -14
  173. package/workflows/containers/child/share.js.map +1 -1
  174. package/workflows/containers/child/shareProjection.js +15 -0
  175. package/workflows/containers/child/shareProjection.js.map +1 -0
  176. package/workflows/containers/mutationResponse.js +1 -1
  177. package/workflows/containers/mutationResponse.js.map +1 -1
  178. package/workflows/documents/purge.d.ts +3 -0
  179. package/workflows/documents/purge.js +13 -0
  180. package/workflows/documents/purge.js.map +1 -1
  181. package/workflows/documents/sync.js +2 -0
  182. package/workflows/documents/sync.js.map +1 -1
  183. package/workflows/documents/syncFailures.js +2 -2
  184. package/workflows/documents/syncFailures.js.map +1 -1
  185. package/workflows/documents/syncPolicyRepair.js +15 -13
  186. package/workflows/documents/syncPolicyRepair.js.map +1 -1
  187. package/workflows/organizations/initialPrincipalCurrentPublication.js +2 -0
  188. package/workflows/organizations/initialPrincipalCurrentPublication.js.map +1 -1
  189. package/workflows/organizations/loadPolicyHistoryDetails.js +31 -32
  190. package/workflows/organizations/loadPolicyHistoryDetails.js.map +1 -1
  191. package/workflows/organizations/organizationPolicyHistoryDetails.js +37 -15
  192. package/workflows/organizations/organizationPolicyHistoryDetails.js.map +1 -1
  193. package/workflows/organizations/organizationPolicyHistoryVerification.js +56 -69
  194. package/workflows/organizations/organizationPolicyHistoryVerification.js.map +1 -1
  195. package/workflows/organizations/policyHistoryCache.js +5 -2
  196. package/workflows/organizations/policyHistoryCache.js.map +1 -1
  197. package/workflows/organizations/policyHistoryTypes.d.ts +1 -0
  198. package/workflows/organizations/policyHistoryTypes.js.map +1 -1
  199. package/workflows/organizations/retainAcknowledgedPrincipalCurrents.js +4 -1
  200. package/workflows/organizations/retainAcknowledgedPrincipalCurrents.js.map +1 -1
  201. package/workflows/principals/loadRecoveredPrincipalHistoryPage.d.ts +0 -1
  202. package/workflows/principals/loadRecoveredPrincipalHistoryPage.js +1 -2
  203. package/workflows/principals/loadRecoveredPrincipalHistoryPage.js.map +1 -1
  204. package/workflows/principals/policyRepair.js +38 -0
  205. package/workflows/principals/policyRepair.js.map +1 -0
  206. package/workflows/principals/policyRepairBudget.d.ts +2 -2
  207. package/workflows/principals/policyRepairBudget.js +3 -3
  208. package/workflows/principals/policyRepairBudget.js.map +1 -1
  209. package/workflows/principals/principalHistoryRecoveryPrefix.js +4 -0
  210. package/workflows/principals/principalHistoryRecoveryPrefix.js.map +1 -1
  211. package/workflows/principals/principalRecoveryLocalPreference.js +3 -2
  212. package/workflows/principals/principalRecoveryLocalPreference.js.map +1 -1
  213. package/workflows/principals/publicPrincipalHistoryPage.js +1 -0
  214. package/workflows/principals/publicPrincipalHistoryPage.js.map +1 -1
  215. package/workflows/principals/publicPrincipalHistoryProgress.js +1 -0
  216. package/workflows/principals/publicPrincipalHistoryProgress.js.map +1 -1
  217. package/workflows/principals/publicPrincipalHistoryTypes.d.ts +2 -0
  218. package/workflows/principals/publicPrincipalHistoryTypes.js.map +1 -1
  219. package/workflows/principals/publicProjectionPrincipal.js +1 -0
  220. package/workflows/principals/publicProjectionPrincipal.js.map +1 -1
  221. package/workflows/principals/recoverPrincipalHistoryPage.js +2 -1
  222. package/workflows/principals/recoverPrincipalHistoryPage.js.map +1 -1
  223. package/workflows/principals/recoverPrincipalPolicyHistory.js +1 -0
  224. package/workflows/principals/recoverPrincipalPolicyHistory.js.map +1 -1
  225. package/workflows/principals/recoverPublicPrincipalHistory.js +2 -0
  226. package/workflows/principals/recoverPublicPrincipalHistory.js.map +1 -1
  227. package/workflows/principals/runtimePolicyRecovery.js +2 -1
  228. package/workflows/principals/runtimePolicyRecovery.js.map +1 -1
  229. package/workflows/principals/selectPublicPrincipalHistory.js +21 -15
  230. package/workflows/principals/selectPublicPrincipalHistory.js.map +1 -1
  231. package/workflows/sync/remoteResetPrincipalScope.js +6 -0
  232. package/workflows/sync/remoteResetPrincipalScope.js.map +1 -1
  233. package/data/keyingProjectionVerification/principalPolicySnapshotVerification.js +0 -208
  234. package/data/keyingProjectionVerification/principalPolicySnapshotVerification.js.map +0 -1
  235. package/data/keyingProjectionVerification/snapshotVerificationCache.js +0 -39
  236. package/data/keyingProjectionVerification/snapshotVerificationCache.js.map +0 -1
  237. package/workflows/containers/child/policyRepair.js +0 -23
  238. package/workflows/containers/child/policyRepair.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"principalPolicyChainEntry.js","sourceRoot":"","sources":["principalPolicyChainEntry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n computePrincipalStateHash,\n normalizePrincipalProjectionMembers,\n type PrincipalProjectionMember,\n} from \"../principalState\";\nimport {\n verifyPrincipalPolicyGrantCommitments,\n verifyPrincipalPolicyProjectionCommitments,\n} from \"./principalPolicyCommitments\";\nimport {\n externalAuthorityIncludesAdminSigner,\n type PrincipalPolicyExternalAuthorityVerifier,\n} from \"./principalPolicyExternalAuthority\";\nimport {\n getPrincipalPolicyTransitionMismatch,\n throwPrincipalPolicyTransitionError,\n} from \"./principalPolicyTransition\";\nimport { throwVerification } from \"./shared\";\nimport type {\n NormalizedPrincipalPolicyStateChainEntry,\n PrincipalPolicySignedState,\n PrincipalPolicyStateChainEntry,\n} from \"./types\";\n\nfunction projectionIncludesAdminUser(\n projection: readonly PrincipalProjectionMember[],\n userId: string,\n): boolean {\n return projection.some(\n (member) => member.userId === userId && member.role === \"admin\",\n );\n}\n\nexport async function normalizePrincipalPolicyStateChainEntry(\n entry: PrincipalPolicyStateChainEntry,\n): Promise<NormalizedPrincipalPolicyStateChainEntry> {\n const projection = normalizePrincipalProjectionMembers(entry.projection);\n const computedStateHash = await computePrincipalStateHash(entry.state);\n\n if (computedStateHash !== entry.state.stateHash) {\n throwVerification(\n \"hash_mismatch\",\n \"principal policy state hash does not match signed state\",\n );\n }\n\n await verifyPrincipalPolicyProjectionCommitments({\n projection,\n state: entry.state,\n });\n const grants = await verifyPrincipalPolicyGrantCommitments({\n grants: entry.grants,\n state: entry.state,\n });\n\n return {\n state: entry.state,\n projection,\n grants,\n };\n}\n\nexport function verifyPrincipalPolicyChainEntryIdentity(input: {\n readonly currentState: Pick<\n PrincipalPolicySignedState,\n \"principalId\" | \"principalType\"\n >;\n readonly expectedVersion: number;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.principalType !==\n input.currentState.principalType ||\n input.normalizedEntry.state.principalId !== input.currentState.principalId\n ) {\n throwVerification(\n \"object_mismatch\",\n \"principal policy chain entry principal does not match current state\",\n );\n }\n\n if (input.normalizedEntry.state.version !== input.expectedVersion) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry version is not contiguous\",\n );\n }\n}\n\nexport function verifyInitialPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n const { normalizedEntry } = input;\n\n if (normalizedEntry.state.prevStateHash !== null) {\n throwVerification(\n \"stale_predecessor\",\n \"initial principal policy chain entry has a previous state hash\",\n );\n }\n\n if (\n projectionIncludesAdminUser(\n normalizedEntry.projection,\n normalizedEntry.state.signerUserId,\n )\n ) {\n if (normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n return;\n }\n\n if (\n normalizedEntry.projection.length === 0 &&\n externalAuthorityIncludesAdminSigner({\n entry: normalizedEntry,\n verifier: input.authorityVerifier,\n })\n ) {\n return;\n }\n\n throwVerification(\n \"unauthorized\",\n \"initial principal policy state signer is not an admin\",\n );\n}\n\nexport function verifySuccessorPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n readonly previousEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.prevStateHash !==\n input.previousEntry.state.stateHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry previous hash mismatch\",\n );\n }\n\n const isDirectAdmin = projectionIncludesAdminUser(\n input.previousEntry.projection,\n input.normalizedEntry.state.signerUserId,\n );\n const isExternalAdmin = externalAuthorityIncludesAdminSigner({\n entry: input.normalizedEntry,\n verifier: input.authorityVerifier,\n });\n if (!isDirectAdmin && !isExternalAdmin) {\n throwVerification(\n \"unauthorized\",\n \"principal policy state signer is not an admin in previous projection\",\n );\n }\n if (isDirectAdmin && input.normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n\n const transitionMismatch = getPrincipalPolicyTransitionMismatch({\n current: input.normalizedEntry,\n previous: input.previousEntry,\n });\n\n if (transitionMismatch) {\n throwPrincipalPolicyTransitionError(transitionMismatch);\n }\n}\n"]}
1
+ {"version":3,"file":"principalPolicyChainEntry.js","sourceRoot":"","sources":["principalPolicyChainEntry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n computePrincipalStateHash,\n normalizePrincipalProjectionMembers,\n type PrincipalProjectionMember,\n} from \"../principalState\";\nimport {\n verifyPrincipalPolicyGrantCommitments,\n verifyPrincipalPolicyProjectionCommitments,\n} from \"./principalPolicyCommitments\";\nimport {\n externalAuthorityIncludesAdminSigner,\n type PrincipalPolicyExternalAuthorityVerifier,\n} from \"./principalPolicyExternalAuthority\";\nimport {\n getPrincipalPolicyTransitionMismatch,\n throwPrincipalPolicyTransitionError,\n} from \"./principalPolicyTransition\";\nimport { throwVerification } from \"./shared\";\nimport type {\n NormalizedPrincipalPolicyStateChainEntry,\n PrincipalPolicySignedState,\n PrincipalPolicyStateChainEntry,\n} from \"./types\";\n\nfunction projectionIncludesAdminUser(\n projection: readonly PrincipalProjectionMember[],\n userId: string,\n): boolean {\n return projection.some(\n (member) => member.userId === userId && member.role === \"admin\",\n );\n}\n\nexport async function normalizePrincipalPolicyStateChainEntry(\n entry: PrincipalPolicyStateChainEntry,\n): Promise<NormalizedPrincipalPolicyStateChainEntry> {\n const projection = normalizePrincipalProjectionMembers(entry.projection);\n const computedStateHash = await computePrincipalStateHash(entry.state);\n\n if (computedStateHash !== entry.state.stateHash) {\n throwVerification(\n \"hash_mismatch\",\n \"principal policy state hash does not match signed state\",\n );\n }\n\n await verifyPrincipalPolicyProjectionCommitments({\n projection,\n state: entry.state,\n });\n const grants = await verifyPrincipalPolicyGrantCommitments({\n grants: entry.grants,\n state: entry.state,\n });\n\n return {\n state: entry.state,\n projection,\n grants,\n };\n}\n\nexport function verifyPrincipalPolicyChainEntryIdentity(input: {\n readonly currentState: Pick<\n PrincipalPolicySignedState,\n \"principalId\" | \"principalType\"\n >;\n readonly expectedVersion: number;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.principalType !==\n input.currentState.principalType ||\n input.normalizedEntry.state.principalId !== input.currentState.principalId\n ) {\n throwVerification(\n \"object_mismatch\",\n \"principal policy chain entry principal does not match current state\",\n );\n }\n\n if (input.normalizedEntry.state.version !== input.expectedVersion) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry version is not contiguous\",\n );\n }\n}\n\nexport function verifyInitialPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n const { normalizedEntry } = input;\n\n if (normalizedEntry.state.keyEpoch !== 1) {\n throwVerification(\n \"key_epoch_reuse\",\n \"initial principal policy key epoch must be 1\",\n );\n }\n\n if (normalizedEntry.state.prevStateHash !== null) {\n throwVerification(\n \"stale_predecessor\",\n \"initial principal policy chain entry has a previous state hash\",\n );\n }\n\n if (\n projectionIncludesAdminUser(\n normalizedEntry.projection,\n normalizedEntry.state.signerUserId,\n )\n ) {\n if (normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n return;\n }\n\n if (\n normalizedEntry.projection.length === 0 &&\n externalAuthorityIncludesAdminSigner({\n entry: normalizedEntry,\n verifier: input.authorityVerifier,\n })\n ) {\n return;\n }\n\n throwVerification(\n \"unauthorized\",\n \"initial principal policy state signer is not an admin\",\n );\n}\n\nexport function verifySuccessorPrincipalPolicyChainEntry(input: {\n readonly authorityVerifier: PrincipalPolicyExternalAuthorityVerifier;\n readonly normalizedEntry: NormalizedPrincipalPolicyStateChainEntry;\n readonly previousEntry: NormalizedPrincipalPolicyStateChainEntry;\n}): void {\n if (\n input.normalizedEntry.state.prevStateHash !==\n input.previousEntry.state.stateHash\n ) {\n throwVerification(\n \"stale_predecessor\",\n \"principal policy chain entry previous hash mismatch\",\n );\n }\n\n const isDirectAdmin = projectionIncludesAdminUser(\n input.previousEntry.projection,\n input.normalizedEntry.state.signerUserId,\n );\n const isExternalAdmin = externalAuthorityIncludesAdminSigner({\n entry: input.normalizedEntry,\n verifier: input.authorityVerifier,\n });\n if (!isDirectAdmin && !isExternalAdmin) {\n throwVerification(\n \"unauthorized\",\n \"principal policy state signer is not an admin in previous projection\",\n );\n }\n if (isDirectAdmin && input.normalizedEntry.state.externalAuthority) {\n throwVerification(\n \"invalid_shape\",\n \"directly authorized principal policy state cannot cite external authority\",\n );\n }\n\n const transitionMismatch = getPrincipalPolicyTransitionMismatch({\n current: input.normalizedEntry,\n previous: input.previousEntry,\n });\n\n if (transitionMismatch) {\n throwPrincipalPolicyTransitionError(transitionMismatch);\n }\n}\n"]}
@@ -48,6 +48,9 @@ class PrincipalPolicyHistoryVerifierImpl {
48
48
  checkpoint: this.#input.checkpoint,
49
49
  });
50
50
  const index = await appendPrincipalHistoryIndex(this.#indexFrontier, verified.entries.map((entry) => entry.state));
51
+ // Verified pages are nonempty; narrow the general index result here.
52
+ if (!index.rootHash)
53
+ throwVerification("invalid_shape", "accepted principal history has no index root");
51
54
  // Publish only after every check, including the final signature, passes.
52
55
  for (const entry of verified.entries) {
53
56
  if (entry.state.version === this.#input.checkpoint?.version)
@@ -62,6 +65,7 @@ class PrincipalPolicyHistoryVerifierImpl {
62
65
  this.#indexRootHash = index.rootHash;
63
66
  return {
64
67
  throughVersion: verified.last.state.version,
68
+ indexRootHash: index.rootHash,
65
69
  indexNodes: index.nodes,
66
70
  };
67
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"principalPolicyHistory.js","sourceRoot":"","sources":["principalPolicyHistory.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrincipalStateExternalAuthority } from \"../principalState\";\nimport { normalizeReferencedPrincipalHead } from \"./accessEvent\";\nimport {\n normalizeCanonicalJsonValue,\n serializeKeyingCanonicalJson,\n} from \"./canonical\";\nimport {\n normalizePrincipalHistoryInput,\n verifyPrincipalHistoryCheckpoint,\n} from \"./principalPolicyHistoryChecks\";\nimport { appendPrincipalHistoryIndex } from \"./principalPolicyHistoryIndex\";\nimport { verifyPrincipalHistoryPage } from \"./principalPolicyHistoryPage\";\nimport {\n normalizeAuthenticatedPrincipalHistoryProgress,\n type PrincipalHistoryProgress,\n} from \"./principalPolicyHistoryProgress\";\nimport {\n capturePrincipalHistoryAuthority,\n capturePrincipalHistoryProgressEntry,\n} from \"./principalPolicyHistoryProgressEntry\";\nimport {\n openPrincipalHistoryProgress,\n ownPrincipalHistoryProgressProtection,\n sealPrincipalHistoryProgress,\n} from \"./principalPolicyHistoryProgressProtection\";\nimport {\n makeVerifiedPrincipalPolicyHistory,\n type PrincipalPolicyHistoryInput,\n type PrincipalPolicyHistoryPage,\n type PrincipalPolicyHistoryProgressOptions,\n type PrincipalPolicyHistoryVerifier,\n type VerifiedPrincipalPolicyHistory,\n} from \"./principalPolicyHistoryTypes\";\nimport { principalPolicyStateMatchesReference } from \"./principalPolicyReference\";\nimport { runVerifier, throwVerification, toVerificationResult } from \"./shared\";\nimport type {\n KeyingVerificationResult,\n NormalizedPrincipalPolicyStateChainEntry,\n ReferencedPrincipalHead,\n} from \"./types\";\n\nclass PrincipalPolicyHistoryVerifierImpl\n implements PrincipalPolicyHistoryVerifier\n{\n readonly #input: ReturnType<typeof normalizePrincipalHistoryInput>;\n #previous: NormalizedPrincipalPolicyStateChainEntry | undefined;\n #latestAuthority: PrincipalStateExternalAuthority | null = null;\n #checkpointHash: string | undefined;\n #indexFrontier: readonly (string | null)[] = [];\n #indexRootHash: string | null = null;\n readonly #retained = new Map<\n number,\n NormalizedPrincipalPolicyStateChainEntry\n >();\n #appending = false;\n\n constructor(\n input: PrincipalPolicyHistoryInput,\n progress?: PrincipalHistoryProgress,\n ) {\n this.#input = normalizePrincipalHistoryInput(input);\n if (progress) {\n this.#previous = progress.previous ?? undefined;\n this.#latestAuthority = progress.latestAuthority;\n this.#checkpointHash = progress.checkpointHash ?? undefined;\n this.#indexFrontier = progress.indexFrontier;\n this.#indexRootHash = progress.indexRootHash;\n for (const entry of progress.retained)\n this.#retained.set(entry.state.version, entry);\n }\n }\n\n getExternalAuthorityReference(): ReferencedPrincipalHead | null {\n return this.#latestAuthority ? { ...this.#latestAuthority } : null;\n }\n\n append(page: PrincipalPolicyHistoryPage) {\n return runVerifier(async () => {\n this.#assertIdle();\n this.#appending = true;\n try {\n const verified = await verifyPrincipalHistoryPage({\n page,\n principalId: this.#input.principalId,\n principalType: this.#input.principalType,\n previous: this.#previous,\n latestAuthority: this.#latestAuthority,\n references: this.#input.references,\n checkpoint: this.#input.checkpoint,\n });\n const index = await appendPrincipalHistoryIndex(\n this.#indexFrontier,\n verified.entries.map((entry) => entry.state),\n );\n // Publish only after every check, including the final signature, passes.\n for (const entry of verified.entries) {\n if (entry.state.version === this.#input.checkpoint?.version)\n this.#checkpointHash = entry.state.stateHash;\n if (\n entry.state.version === this.#input.checkpoint?.version ||\n this.#input.references.some(\n (reference) => reference.version === entry.state.version,\n )\n )\n this.#retained.set(entry.state.version, entry);\n }\n this.#previous = verified.last;\n this.#latestAuthority = verified.latestAuthority;\n this.#indexFrontier = index.frontier;\n this.#indexRootHash = index.rootHash;\n return {\n throughVersion: verified.last.state.version,\n indexNodes: index.nodes,\n };\n } finally {\n this.#appending = false;\n }\n });\n }\n\n #assertIdle(): void {\n if (this.#appending)\n throwVerification(\n \"invalid_shape\",\n \"principal history append in progress\",\n );\n }\n\n exportProgress(options: PrincipalPolicyHistoryProgressOptions) {\n return runVerifier(async () => {\n this.#assertIdle();\n // Capture a complete accepted prefix before the first yield. A later\n // append cannot change this snapshot or publish a partial page into it.\n const plaintext = serializeKeyingCanonicalJson(\n normalizeCanonicalJsonValue(\n {\n previous: this.#previous\n ? capturePrincipalHistoryProgressEntry(this.#previous)\n : null,\n latestAuthority: this.#latestAuthority\n ? capturePrincipalHistoryAuthority(this.#latestAuthority)\n : null,\n checkpointHash: this.#checkpointHash ?? null,\n indexFrontier: this.#indexFrontier,\n retained: [...this.#retained.values()].map(\n capturePrincipalHistoryProgressEntry,\n ),\n },\n \"principal history progress\",\n ),\n );\n return sealPrincipalHistoryProgress(\n plaintext,\n ownPrincipalHistoryProgressProtection(this.#input, options),\n );\n });\n }\n\n finish(\n expectedHead: ReferencedPrincipalHead,\n ): KeyingVerificationResult<VerifiedPrincipalPolicyHistory> {\n try {\n this.#assertIdle();\n const reference = normalizeReferencedPrincipalHead(expectedHead);\n const previous = this.#previous;\n if (\n !previous ||\n !this.#indexRootHash ||\n !principalPolicyStateMatchesReference(previous.state, reference)\n )\n throwVerification(\n \"missing_dependency\",\n \"principal history has not reached the requested head\",\n );\n verifyPrincipalHistoryCheckpoint(\n previous.state,\n this.#input.checkpoint,\n this.#checkpointHash,\n );\n const history = new Map(this.#retained);\n history.set(previous.state.version, previous);\n const { state, projection, grants } = previous;\n const { principalId, principalType } = this.#input;\n const owned = structuredClone({\n indexRootHash: this.#indexRootHash,\n currentEntry: { state, projection, grants },\n retainedEntries: [...history.values()].sort(\n (left, right) => left.state.version - right.state.version,\n ),\n checkpoint: {\n principalId,\n principalType,\n version: state.version,\n stateHash: state.stateHash,\n },\n });\n return {\n ok: true,\n value: makeVerifiedPrincipalPolicyHistory(owned, this.#latestAuthority),\n };\n } catch (error) {\n return toVerificationResult(error);\n }\n }\n}\n\n/**\n * Verify from genesis with bounded retained state. A rejected page cannot\n * advance authorization or continuity. Progress is local to this verifier;\n * a remote cursor/checkpoint is never accepted as verified history.\n * Callers bound serialized page bytes and authenticate external authority.\n * Throws KeyingVerificationError for invalid local scope, checkpoint or references.\n */\nexport function createPrincipalPolicyHistoryVerifier(\n input: PrincipalPolicyHistoryInput,\n): PrincipalPolicyHistoryVerifier {\n const verifier = new PrincipalPolicyHistoryVerifierImpl(input);\n return publicVerifier(verifier);\n}\n\nfunction publicVerifier(\n verifier: PrincipalPolicyHistoryVerifierImpl,\n): PrincipalPolicyHistoryVerifier {\n return {\n getExternalAuthorityReference: () =>\n verifier.getExternalAuthorityReference(),\n append: (page: PrincipalPolicyHistoryPage) => verifier.append(page),\n finish: (expectedHead: ReferencedPrincipalHead) =>\n verifier.finish(expectedHead),\n exportProgress: (options: PrincipalPolicyHistoryProgressOptions) =>\n verifier.exportProgress(options),\n };\n}\n\n/** Restore only progress authenticated by this verifier's own local key. */\nexport function restorePrincipalPolicyHistoryVerifier(\n input: PrincipalPolicyHistoryInput,\n progress: string,\n protection: PrincipalPolicyHistoryProgressOptions,\n): Promise<KeyingVerificationResult<PrincipalPolicyHistoryVerifier>> {\n return runVerifier(async () => {\n const normalized = normalizePrincipalHistoryInput(input);\n const ownedInput: PrincipalPolicyHistoryInput = {\n principalId: normalized.principalId,\n principalType: normalized.principalType,\n localCheckpoint: normalized.checkpoint,\n retainedReferences: normalized.references,\n };\n const decoded = await openPrincipalHistoryProgress(\n progress,\n ownPrincipalHistoryProgressProtection(normalized, protection),\n );\n const authenticated = await normalizeAuthenticatedPrincipalHistoryProgress(\n decoded,\n normalized,\n );\n return publicVerifier(\n new PrincipalPolicyHistoryVerifierImpl(ownedInput, authenticated),\n );\n });\n}\n"]}
1
+ {"version":3,"file":"principalPolicyHistory.js","sourceRoot":"","sources":["principalPolicyHistory.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrincipalStateExternalAuthority } from \"../principalState\";\nimport { normalizeReferencedPrincipalHead } from \"./accessEvent\";\nimport {\n normalizeCanonicalJsonValue,\n serializeKeyingCanonicalJson,\n} from \"./canonical\";\nimport {\n normalizePrincipalHistoryInput,\n verifyPrincipalHistoryCheckpoint,\n} from \"./principalPolicyHistoryChecks\";\nimport { appendPrincipalHistoryIndex } from \"./principalPolicyHistoryIndex\";\nimport { verifyPrincipalHistoryPage } from \"./principalPolicyHistoryPage\";\nimport {\n normalizeAuthenticatedPrincipalHistoryProgress,\n type PrincipalHistoryProgress,\n} from \"./principalPolicyHistoryProgress\";\nimport {\n capturePrincipalHistoryAuthority,\n capturePrincipalHistoryProgressEntry,\n} from \"./principalPolicyHistoryProgressEntry\";\nimport {\n openPrincipalHistoryProgress,\n ownPrincipalHistoryProgressProtection,\n sealPrincipalHistoryProgress,\n} from \"./principalPolicyHistoryProgressProtection\";\nimport {\n makeVerifiedPrincipalPolicyHistory,\n type PrincipalPolicyHistoryInput,\n type PrincipalPolicyHistoryPage,\n type PrincipalPolicyHistoryProgressOptions,\n type PrincipalPolicyHistoryVerifier,\n type VerifiedPrincipalPolicyHistory,\n} from \"./principalPolicyHistoryTypes\";\nimport { principalPolicyStateMatchesReference } from \"./principalPolicyReference\";\nimport { runVerifier, throwVerification, toVerificationResult } from \"./shared\";\nimport type {\n KeyingVerificationResult,\n NormalizedPrincipalPolicyStateChainEntry,\n ReferencedPrincipalHead,\n} from \"./types\";\n\nclass PrincipalPolicyHistoryVerifierImpl\n implements PrincipalPolicyHistoryVerifier\n{\n readonly #input: ReturnType<typeof normalizePrincipalHistoryInput>;\n #previous: NormalizedPrincipalPolicyStateChainEntry | undefined;\n #latestAuthority: PrincipalStateExternalAuthority | null = null;\n #checkpointHash: string | undefined;\n #indexFrontier: readonly (string | null)[] = [];\n #indexRootHash: string | null = null;\n readonly #retained = new Map<\n number,\n NormalizedPrincipalPolicyStateChainEntry\n >();\n #appending = false;\n\n constructor(\n input: PrincipalPolicyHistoryInput,\n progress?: PrincipalHistoryProgress,\n ) {\n this.#input = normalizePrincipalHistoryInput(input);\n if (progress) {\n this.#previous = progress.previous ?? undefined;\n this.#latestAuthority = progress.latestAuthority;\n this.#checkpointHash = progress.checkpointHash ?? undefined;\n this.#indexFrontier = progress.indexFrontier;\n this.#indexRootHash = progress.indexRootHash;\n for (const entry of progress.retained)\n this.#retained.set(entry.state.version, entry);\n }\n }\n\n getExternalAuthorityReference(): ReferencedPrincipalHead | null {\n return this.#latestAuthority ? { ...this.#latestAuthority } : null;\n }\n\n append(page: PrincipalPolicyHistoryPage) {\n return runVerifier(async () => {\n this.#assertIdle();\n this.#appending = true;\n try {\n const verified = await verifyPrincipalHistoryPage({\n page,\n principalId: this.#input.principalId,\n principalType: this.#input.principalType,\n previous: this.#previous,\n latestAuthority: this.#latestAuthority,\n references: this.#input.references,\n checkpoint: this.#input.checkpoint,\n });\n const index = await appendPrincipalHistoryIndex(\n this.#indexFrontier,\n verified.entries.map((entry) => entry.state),\n );\n // Verified pages are nonempty; narrow the general index result here.\n if (!index.rootHash)\n throwVerification(\n \"invalid_shape\",\n \"accepted principal history has no index root\",\n );\n // Publish only after every check, including the final signature, passes.\n for (const entry of verified.entries) {\n if (entry.state.version === this.#input.checkpoint?.version)\n this.#checkpointHash = entry.state.stateHash;\n if (\n entry.state.version === this.#input.checkpoint?.version ||\n this.#input.references.some(\n (reference) => reference.version === entry.state.version,\n )\n )\n this.#retained.set(entry.state.version, entry);\n }\n this.#previous = verified.last;\n this.#latestAuthority = verified.latestAuthority;\n this.#indexFrontier = index.frontier;\n this.#indexRootHash = index.rootHash;\n return {\n throughVersion: verified.last.state.version,\n indexRootHash: index.rootHash,\n indexNodes: index.nodes,\n };\n } finally {\n this.#appending = false;\n }\n });\n }\n\n #assertIdle(): void {\n if (this.#appending)\n throwVerification(\n \"invalid_shape\",\n \"principal history append in progress\",\n );\n }\n\n exportProgress(options: PrincipalPolicyHistoryProgressOptions) {\n return runVerifier(async () => {\n this.#assertIdle();\n // Capture a complete accepted prefix before the first yield. A later\n // append cannot change this snapshot or publish a partial page into it.\n const plaintext = serializeKeyingCanonicalJson(\n normalizeCanonicalJsonValue(\n {\n previous: this.#previous\n ? capturePrincipalHistoryProgressEntry(this.#previous)\n : null,\n latestAuthority: this.#latestAuthority\n ? capturePrincipalHistoryAuthority(this.#latestAuthority)\n : null,\n checkpointHash: this.#checkpointHash ?? null,\n indexFrontier: this.#indexFrontier,\n retained: [...this.#retained.values()].map(\n capturePrincipalHistoryProgressEntry,\n ),\n },\n \"principal history progress\",\n ),\n );\n return sealPrincipalHistoryProgress(\n plaintext,\n ownPrincipalHistoryProgressProtection(this.#input, options),\n );\n });\n }\n\n finish(\n expectedHead: ReferencedPrincipalHead,\n ): KeyingVerificationResult<VerifiedPrincipalPolicyHistory> {\n try {\n this.#assertIdle();\n const reference = normalizeReferencedPrincipalHead(expectedHead);\n const previous = this.#previous;\n if (\n !previous ||\n !this.#indexRootHash ||\n !principalPolicyStateMatchesReference(previous.state, reference)\n )\n throwVerification(\n \"missing_dependency\",\n \"principal history has not reached the requested head\",\n );\n verifyPrincipalHistoryCheckpoint(\n previous.state,\n this.#input.checkpoint,\n this.#checkpointHash,\n );\n const history = new Map(this.#retained);\n history.set(previous.state.version, previous);\n const { state, projection, grants } = previous;\n const { principalId, principalType } = this.#input;\n const owned = structuredClone({\n indexRootHash: this.#indexRootHash,\n currentEntry: { state, projection, grants },\n retainedEntries: [...history.values()].sort(\n (left, right) => left.state.version - right.state.version,\n ),\n checkpoint: {\n principalId,\n principalType,\n version: state.version,\n stateHash: state.stateHash,\n },\n });\n return {\n ok: true,\n value: makeVerifiedPrincipalPolicyHistory(owned, this.#latestAuthority),\n };\n } catch (error) {\n return toVerificationResult(error);\n }\n }\n}\n\n/**\n * Verify from genesis with bounded retained state. A rejected page cannot\n * advance authorization or continuity. Progress is local to this verifier;\n * a remote cursor/checkpoint is never accepted as verified history.\n * Callers bound serialized page bytes and authenticate external authority.\n * Throws KeyingVerificationError for invalid local scope, checkpoint or references.\n */\nexport function createPrincipalPolicyHistoryVerifier(\n input: PrincipalPolicyHistoryInput,\n): PrincipalPolicyHistoryVerifier {\n const verifier = new PrincipalPolicyHistoryVerifierImpl(input);\n return publicVerifier(verifier);\n}\n\nfunction publicVerifier(\n verifier: PrincipalPolicyHistoryVerifierImpl,\n): PrincipalPolicyHistoryVerifier {\n return {\n getExternalAuthorityReference: () =>\n verifier.getExternalAuthorityReference(),\n append: (page: PrincipalPolicyHistoryPage) => verifier.append(page),\n finish: (expectedHead: ReferencedPrincipalHead) =>\n verifier.finish(expectedHead),\n exportProgress: (options: PrincipalPolicyHistoryProgressOptions) =>\n verifier.exportProgress(options),\n };\n}\n\n/** Restore only progress authenticated by this verifier's own local key. */\nexport function restorePrincipalPolicyHistoryVerifier(\n input: PrincipalPolicyHistoryInput,\n progress: string,\n protection: PrincipalPolicyHistoryProgressOptions,\n): Promise<KeyingVerificationResult<PrincipalPolicyHistoryVerifier>> {\n return runVerifier(async () => {\n const normalized = normalizePrincipalHistoryInput(input);\n const ownedInput: PrincipalPolicyHistoryInput = {\n principalId: normalized.principalId,\n principalType: normalized.principalType,\n localCheckpoint: normalized.checkpoint,\n retainedReferences: normalized.references,\n };\n const decoded = await openPrincipalHistoryProgress(\n progress,\n ownPrincipalHistoryProgressProtection(normalized, protection),\n );\n const authenticated = await normalizeAuthenticatedPrincipalHistoryProgress(\n decoded,\n normalized,\n );\n return publicVerifier(\n new PrincipalPolicyHistoryVerifierImpl(ownedInput, authenticated),\n );\n });\n}\n"]}
@@ -43,6 +43,8 @@ export interface PrincipalPolicyHistoryVerifier {
43
43
  getExternalAuthorityReference(): ReferencedPrincipalHead | null;
44
44
  append(page: PrincipalPolicyHistoryPage): Promise<KeyingVerificationResult<{
45
45
  readonly throughVersion: number;
46
+ /** Retention hint computed from this accepted prefix, not verification authority. */
47
+ readonly indexRootHash: string;
46
48
  readonly indexNodes: readonly PrincipalHistoryIndexNode[];
47
49
  }>>;
48
50
  finish(expectedHead: ReferencedPrincipalHead): KeyingVerificationResult<VerifiedPrincipalPolicyHistory>;
@@ -1 +1 @@
1
- {"version":3,"file":"principalPolicyHistoryTypes.js","sourceRoot":"","sources":["principalPolicyHistoryTypes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAS7C,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAyBtD,MAAM,oBAAoB,GAAkB,MAAM,CAChD,gCAAgC,CACjC,CAAC;AAiBF,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,eAAe,GAAG,IAAI,OAAO,EAGhC,CAAC;AAEJ,MAAM,UAAU,kCAAkC,CAChD,KAAwE,EACxE,eAAuD;IAEvD,MAAM,MAAM,GAAmC;QAC7C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,CAAC,oBAAoB,CAAC,EAAE,IAAI;KAC7B,CAAC;IACF,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IAC5E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAAuC;IAEvC,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ;QACX,iBAAiB,CACf,eAAe,EACf,mDAAmD,CACpD,CAAC;IACJ,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import type { PrincipalStateExternalAuthority } from \"../principalState\";\nimport type { PrincipalPolicyExternalAuthority } from \"./principalPolicyExternalAuthorityTypes\";\nimport type { PrincipalHistoryIndexNode } from \"./principalPolicyHistoryIndex\";\nimport { throwVerification } from \"./shared\";\nimport type {\n KeyingVerificationResult,\n PrincipalPolicyCheckpoint,\n PrincipalPolicySignerPublicKey,\n PrincipalPolicyStateChainEntry,\n ReferencedPrincipalHead,\n} from \"./types\";\n\nexport const PRINCIPAL_HISTORY_PAGE_ENTRY_LIMIT = 128;\n\n/** A crypto verification batch, not a wire-response DTO. */\nexport interface PrincipalPolicyHistoryPage {\n readonly entries: readonly PrincipalPolicyStateChainEntry[];\n /** Keys resolved through the caller's trusted user-identity mechanism. */\n readonly signerPublicKeys: readonly PrincipalPolicySignerPublicKey[];\n /** Already authenticated authority; never trust a server page directly. */\n readonly externalAuthority?: PrincipalPolicyExternalAuthority;\n}\n\nexport interface PrincipalPolicyHistoryInput {\n readonly principalId: string;\n readonly principalType: ReferencedPrincipalHead[\"principalType\"];\n readonly localCheckpoint?: PrincipalPolicyCheckpoint | null;\n readonly retainedReferences?: readonly ReferencedPrincipalHead[];\n}\n\n/** Local verifier protection; never obtain this key from a remote API. */\nexport interface PrincipalPolicyHistoryProgressOptions {\n readonly localKey: Uint8Array;\n /** Stable local operation identity, bound into authenticated progress. */\n readonly context: string;\n}\n\nconst verifiedHistoryBrand: unique symbol = Symbol(\n \"verifiedPrincipalPolicyHistory\",\n);\n\n/** A verified prefix with explicitly retained references, not a full snapshot. */\nexport interface VerifiedPrincipalPolicyHistory {\n readonly [verifiedHistoryBrand]: true;\n readonly currentEntry: PrincipalPolicyStateChainEntry;\n readonly retainedEntries: readonly PrincipalPolicyStateChainEntry[];\n readonly checkpoint: PrincipalPolicyCheckpoint;\n /** Computed only from locally accepted entries; never supplied by a peer. */\n readonly indexRootHash: string;\n}\n\ntype HistorySnapshot = Omit<\n VerifiedPrincipalPolicyHistory,\n typeof verifiedHistoryBrand\n> & { readonly latestAuthority: PrincipalStateExternalAuthority | null };\n\n// Public copies are useful for inspection, but their fields are not authority.\n// A later verifier consumes the privately held snapshot issued by finish().\nconst issuedHistories = new WeakMap<\n VerifiedPrincipalPolicyHistory,\n HistorySnapshot\n>();\n\nexport function makeVerifiedPrincipalPolicyHistory(\n value: Omit<VerifiedPrincipalPolicyHistory, typeof verifiedHistoryBrand>,\n latestAuthority: PrincipalStateExternalAuthority | null,\n): VerifiedPrincipalPolicyHistory {\n const result: VerifiedPrincipalPolicyHistory = {\n currentEntry: value.currentEntry,\n retainedEntries: value.retainedEntries,\n checkpoint: value.checkpoint,\n indexRootHash: value.indexRootHash,\n [verifiedHistoryBrand]: true,\n };\n issuedHistories.set(result, structuredClone({ ...value, latestAuthority }));\n return result;\n}\n\nexport function ownVerifiedPrincipalPolicyHistory(\n history: VerifiedPrincipalPolicyHistory,\n): HistorySnapshot {\n const snapshot = issuedHistories.get(history);\n if (!snapshot)\n throwVerification(\n \"invalid_shape\",\n \"principal history must come from a local verifier\",\n );\n return structuredClone(snapshot);\n}\n\nexport interface PrincipalPolicyHistoryVerifier {\n /** Owned copy of the latest accepted citation, including across uncited pages. */\n getExternalAuthorityReference(): ReferencedPrincipalHead | null;\n append(page: PrincipalPolicyHistoryPage): Promise<\n KeyingVerificationResult<{\n readonly throughVersion: number;\n readonly indexNodes: readonly PrincipalHistoryIndexNode[];\n }>\n >;\n finish(\n expectedHead: ReferencedPrincipalHead,\n ): KeyingVerificationResult<VerifiedPrincipalPolicyHistory>;\n exportProgress(\n options: PrincipalPolicyHistoryProgressOptions,\n ): Promise<KeyingVerificationResult<string>>;\n}\n"]}
1
+ {"version":3,"file":"principalPolicyHistoryTypes.js","sourceRoot":"","sources":["principalPolicyHistoryTypes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAS7C,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAyBtD,MAAM,oBAAoB,GAAkB,MAAM,CAChD,gCAAgC,CACjC,CAAC;AAiBF,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,eAAe,GAAG,IAAI,OAAO,EAGhC,CAAC;AAEJ,MAAM,UAAU,kCAAkC,CAChD,KAAwE,EACxE,eAAuD;IAEvD,MAAM,MAAM,GAAmC;QAC7C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,CAAC,oBAAoB,CAAC,EAAE,IAAI;KAC7B,CAAC;IACF,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IAC5E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,OAAuC;IAEvC,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ;QACX,iBAAiB,CACf,eAAe,EACf,mDAAmD,CACpD,CAAC;IACJ,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import type { PrincipalStateExternalAuthority } from \"../principalState\";\nimport type { PrincipalPolicyExternalAuthority } from \"./principalPolicyExternalAuthorityTypes\";\nimport type { PrincipalHistoryIndexNode } from \"./principalPolicyHistoryIndex\";\nimport { throwVerification } from \"./shared\";\nimport type {\n KeyingVerificationResult,\n PrincipalPolicyCheckpoint,\n PrincipalPolicySignerPublicKey,\n PrincipalPolicyStateChainEntry,\n ReferencedPrincipalHead,\n} from \"./types\";\n\nexport const PRINCIPAL_HISTORY_PAGE_ENTRY_LIMIT = 128;\n\n/** A crypto verification batch, not a wire-response DTO. */\nexport interface PrincipalPolicyHistoryPage {\n readonly entries: readonly PrincipalPolicyStateChainEntry[];\n /** Keys resolved through the caller's trusted user-identity mechanism. */\n readonly signerPublicKeys: readonly PrincipalPolicySignerPublicKey[];\n /** Already authenticated authority; never trust a server page directly. */\n readonly externalAuthority?: PrincipalPolicyExternalAuthority;\n}\n\nexport interface PrincipalPolicyHistoryInput {\n readonly principalId: string;\n readonly principalType: ReferencedPrincipalHead[\"principalType\"];\n readonly localCheckpoint?: PrincipalPolicyCheckpoint | null;\n readonly retainedReferences?: readonly ReferencedPrincipalHead[];\n}\n\n/** Local verifier protection; never obtain this key from a remote API. */\nexport interface PrincipalPolicyHistoryProgressOptions {\n readonly localKey: Uint8Array;\n /** Stable local operation identity, bound into authenticated progress. */\n readonly context: string;\n}\n\nconst verifiedHistoryBrand: unique symbol = Symbol(\n \"verifiedPrincipalPolicyHistory\",\n);\n\n/** A verified prefix with explicitly retained references, not a full snapshot. */\nexport interface VerifiedPrincipalPolicyHistory {\n readonly [verifiedHistoryBrand]: true;\n readonly currentEntry: PrincipalPolicyStateChainEntry;\n readonly retainedEntries: readonly PrincipalPolicyStateChainEntry[];\n readonly checkpoint: PrincipalPolicyCheckpoint;\n /** Computed only from locally accepted entries; never supplied by a peer. */\n readonly indexRootHash: string;\n}\n\ntype HistorySnapshot = Omit<\n VerifiedPrincipalPolicyHistory,\n typeof verifiedHistoryBrand\n> & { readonly latestAuthority: PrincipalStateExternalAuthority | null };\n\n// Public copies are useful for inspection, but their fields are not authority.\n// A later verifier consumes the privately held snapshot issued by finish().\nconst issuedHistories = new WeakMap<\n VerifiedPrincipalPolicyHistory,\n HistorySnapshot\n>();\n\nexport function makeVerifiedPrincipalPolicyHistory(\n value: Omit<VerifiedPrincipalPolicyHistory, typeof verifiedHistoryBrand>,\n latestAuthority: PrincipalStateExternalAuthority | null,\n): VerifiedPrincipalPolicyHistory {\n const result: VerifiedPrincipalPolicyHistory = {\n currentEntry: value.currentEntry,\n retainedEntries: value.retainedEntries,\n checkpoint: value.checkpoint,\n indexRootHash: value.indexRootHash,\n [verifiedHistoryBrand]: true,\n };\n issuedHistories.set(result, structuredClone({ ...value, latestAuthority }));\n return result;\n}\n\nexport function ownVerifiedPrincipalPolicyHistory(\n history: VerifiedPrincipalPolicyHistory,\n): HistorySnapshot {\n const snapshot = issuedHistories.get(history);\n if (!snapshot)\n throwVerification(\n \"invalid_shape\",\n \"principal history must come from a local verifier\",\n );\n return structuredClone(snapshot);\n}\n\nexport interface PrincipalPolicyHistoryVerifier {\n /** Owned copy of the latest accepted citation, including across uncited pages. */\n getExternalAuthorityReference(): ReferencedPrincipalHead | null;\n append(page: PrincipalPolicyHistoryPage): Promise<\n KeyingVerificationResult<{\n readonly throughVersion: number;\n /** Retention hint computed from this accepted prefix, not verification authority. */\n readonly indexRootHash: string;\n readonly indexNodes: readonly PrincipalHistoryIndexNode[];\n }>\n >;\n finish(\n expectedHead: ReferencedPrincipalHead,\n ): KeyingVerificationResult<VerifiedPrincipalPolicyHistory>;\n exportProgress(\n options: PrincipalPolicyHistoryProgressOptions,\n ): Promise<KeyingVerificationResult<string>>;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { PrincipalContainerGrant, PrincipalProjectionMember, SignedPrincipalState } from "../principalState.js";
2
2
  import type { PrincipalPolicySignedState } from "./types.js";
3
- export type PrincipalPolicyTransitionMismatchCode = "epoch_advance_without_key_material" | "grant_removal_without_key_rotation" | "key_change_without_epoch" | "key_epoch_decrease" | "previous_hash_mismatch" | "principal_mismatch" | "shrink_without_key_rotation" | "version_not_contiguous";
3
+ export type PrincipalPolicyTransitionMismatchCode = "epoch_advance_without_key_material" | "grant_removal_without_key_rotation" | "key_change_without_epoch" | "key_epoch_decrease" | "key_epoch_jump" | "previous_hash_mismatch" | "principal_mismatch" | "shrink_without_key_rotation" | "version_not_contiguous";
4
4
  export interface PrincipalPolicyTransitionMismatch {
5
5
  readonly code: PrincipalPolicyTransitionMismatchCode;
6
6
  readonly message: string;
@@ -18,4 +18,5 @@ export declare function getPrincipalPolicyTransitionMismatch(input: {
18
18
  };
19
19
  }): PrincipalPolicyTransitionMismatch | null;
20
20
  export declare function getPrincipalPolicyTransitionMismatchReason(input: Parameters<typeof getPrincipalPolicyTransitionMismatch>[0]): string | null;
21
+ /** key_epoch_reuse classifies all epoch/key-material continuity violations. */
21
22
  export declare function throwPrincipalPolicyTransitionError(mismatch: PrincipalPolicyTransitionMismatch): never;
@@ -53,6 +53,9 @@ export function getPrincipalPolicyTransitionMismatch(input) {
53
53
  if (current.state.keyEpoch < previous.state.keyEpoch) {
54
54
  return principalPolicyTransitionMismatch("key_epoch_decrease", "Principal policy key epoch cannot decrease");
55
55
  }
56
+ if (current.state.keyEpoch > previous.state.keyEpoch + 1) {
57
+ return principalPolicyTransitionMismatch("key_epoch_jump", "Principal policy key epoch must advance by exactly one");
58
+ }
56
59
  const previousProjection = normalizePrincipalProjectionMembers(previous.projection);
57
60
  const currentProjection = normalizePrincipalProjectionMembers(current.projection);
58
61
  const keyMaterialChanged = principalPolicyKeyMaterialChanged({
@@ -85,12 +88,14 @@ export function getPrincipalPolicyTransitionMismatch(input) {
85
88
  export function getPrincipalPolicyTransitionMismatchReason(input) {
86
89
  return getPrincipalPolicyTransitionMismatch(input)?.message ?? null;
87
90
  }
91
+ /** key_epoch_reuse classifies all epoch/key-material continuity violations. */
88
92
  export function throwPrincipalPolicyTransitionError(mismatch) {
89
93
  switch (mismatch.code) {
90
94
  case "epoch_advance_without_key_material":
91
95
  case "grant_removal_without_key_rotation":
92
96
  case "key_change_without_epoch":
93
97
  case "key_epoch_decrease":
98
+ case "key_epoch_jump":
94
99
  case "shrink_without_key_rotation":
95
100
  return throwVerification("key_epoch_reuse", mismatch.message);
96
101
  case "previous_hash_mismatch":
@@ -1 +1 @@
1
- {"version":3,"file":"principalPolicyTransition.js","sourceRoot":"","sources":["principalPolicyTransition.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PrincipalContainerGrant,\n PrincipalProjectionMember,\n SignedPrincipalState,\n} from \"../principalState\";\nimport { normalizePrincipalProjectionMembers } from \"../principalState\";\nimport { throwVerification } from \"./shared\";\nimport type { PrincipalPolicySignedState } from \"./types\";\n\nfunction principalProjectionMemberKey(\n member: PrincipalProjectionMember,\n): string {\n return member.userId;\n}\n\nfunction principalProjectionRoleRank(\n role: PrincipalProjectionMember[\"role\"],\n): number {\n return role === \"admin\" ? 2 : 1;\n}\n\nfunction hasPrincipalPolicyProjectionShrink(input: {\n currentProjection: readonly PrincipalProjectionMember[];\n previousProjection: readonly PrincipalProjectionMember[];\n}): boolean {\n const currentProjectionByMember = new Map<string, PrincipalProjectionMember>(\n input.currentProjection.map((member) => [\n principalProjectionMemberKey(member),\n member,\n ]),\n );\n\n return input.previousProjection.some((previousMember) => {\n const currentMember = currentProjectionByMember.get(\n principalProjectionMemberKey(previousMember),\n );\n\n if (!currentMember) {\n return true;\n }\n\n return (\n principalProjectionRoleRank(currentMember.role) <\n principalProjectionRoleRank(previousMember.role)\n );\n });\n}\n\n/**\n * Container KEK wraps sealed to a group's key stay stored after the group\n * loses a grant, so a member added later at the same key epoch could still\n * open them (#2365 finding 20). A grant may change its access level in place,\n * but dropping a container needs a new key, exactly like a projection shrink.\n */\nfunction hasPrincipalPolicyGrantRemoval(input: {\n currentGrants: readonly PrincipalContainerGrant[];\n previousGrants: readonly PrincipalContainerGrant[];\n}): boolean {\n const retained = new Set(\n input.currentGrants.map((grant) => grant.containerId),\n );\n return input.previousGrants.some((grant) => !retained.has(grant.containerId));\n}\n\nfunction principalPolicyKeyMaterialChanged(input: {\n currentState: SignedPrincipalState;\n previousState: SignedPrincipalState;\n}): boolean {\n return (\n input.currentState.encapsulationPublicKey !==\n input.previousState.encapsulationPublicKey ||\n input.currentState.keyFingerprint !== input.previousState.keyFingerprint\n );\n}\n\nexport type PrincipalPolicyTransitionMismatchCode =\n | \"epoch_advance_without_key_material\"\n | \"grant_removal_without_key_rotation\"\n | \"key_change_without_epoch\"\n | \"key_epoch_decrease\"\n | \"previous_hash_mismatch\"\n | \"principal_mismatch\"\n | \"shrink_without_key_rotation\"\n | \"version_not_contiguous\";\n\nexport interface PrincipalPolicyTransitionMismatch {\n readonly code: PrincipalPolicyTransitionMismatchCode;\n readonly message: string;\n}\n\nfunction principalPolicyTransitionMismatch(\n code: PrincipalPolicyTransitionMismatchCode,\n message: string,\n): PrincipalPolicyTransitionMismatch {\n return { code, message };\n}\n\nexport function getPrincipalPolicyTransitionMismatch(input: {\n readonly current: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: SignedPrincipalState;\n };\n readonly previous: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: PrincipalPolicySignedState;\n };\n}): PrincipalPolicyTransitionMismatch | null {\n const { current, previous } = input;\n\n if (\n current.state.principalType !== previous.state.principalType ||\n current.state.principalId !== previous.state.principalId\n ) {\n return principalPolicyTransitionMismatch(\n \"principal_mismatch\",\n \"Principal policy transition principal mismatch\",\n );\n }\n\n if (current.state.version !== previous.state.version + 1) {\n return principalPolicyTransitionMismatch(\n \"version_not_contiguous\",\n \"Principal policy transition version is not contiguous\",\n );\n }\n\n if (current.state.prevStateHash !== previous.state.stateHash) {\n return principalPolicyTransitionMismatch(\n \"previous_hash_mismatch\",\n \"Principal policy transition previous hash mismatch\",\n );\n }\n\n if (current.state.keyEpoch < previous.state.keyEpoch) {\n return principalPolicyTransitionMismatch(\n \"key_epoch_decrease\",\n \"Principal policy key epoch cannot decrease\",\n );\n }\n\n const previousProjection = normalizePrincipalProjectionMembers(\n previous.projection,\n );\n const currentProjection = normalizePrincipalProjectionMembers(\n current.projection,\n );\n const keyMaterialChanged = principalPolicyKeyMaterialChanged({\n currentState: current.state,\n previousState: previous.state,\n });\n\n if (\n current.state.keyEpoch === previous.state.keyEpoch &&\n keyMaterialChanged\n ) {\n return principalPolicyTransitionMismatch(\n \"key_change_without_epoch\",\n \"Principal policy key change requires a new key epoch\",\n );\n }\n\n if (current.state.keyEpoch > previous.state.keyEpoch && !keyMaterialChanged) {\n return principalPolicyTransitionMismatch(\n \"epoch_advance_without_key_material\",\n \"Principal policy key epoch advance requires new key material\",\n );\n }\n\n if (\n hasPrincipalPolicyProjectionShrink({\n currentProjection,\n previousProjection,\n }) &&\n (current.state.keyEpoch <= previous.state.keyEpoch || !keyMaterialChanged)\n ) {\n return principalPolicyTransitionMismatch(\n \"shrink_without_key_rotation\",\n \"Principal policy shrink requires a new key epoch and key material\",\n );\n }\n\n if (\n hasPrincipalPolicyGrantRemoval({\n currentGrants: current.grants,\n previousGrants: previous.grants,\n }) &&\n current.state.keyEpoch <= previous.state.keyEpoch\n ) {\n return principalPolicyTransitionMismatch(\n \"grant_removal_without_key_rotation\",\n \"Principal policy grant removal requires a new key epoch\",\n );\n }\n\n return null;\n}\n\nexport function getPrincipalPolicyTransitionMismatchReason(\n input: Parameters<typeof getPrincipalPolicyTransitionMismatch>[0],\n): string | null {\n return getPrincipalPolicyTransitionMismatch(input)?.message ?? null;\n}\n\nexport function throwPrincipalPolicyTransitionError(\n mismatch: PrincipalPolicyTransitionMismatch,\n): never {\n switch (mismatch.code) {\n case \"epoch_advance_without_key_material\":\n case \"grant_removal_without_key_rotation\":\n case \"key_change_without_epoch\":\n case \"key_epoch_decrease\":\n case \"shrink_without_key_rotation\":\n return throwVerification(\"key_epoch_reuse\", mismatch.message);\n case \"previous_hash_mismatch\":\n return throwVerification(\"stale_predecessor\", mismatch.message);\n case \"principal_mismatch\":\n case \"version_not_contiguous\":\n return throwVerification(\"invalid_shape\", mismatch.message);\n }\n}\n"]}
1
+ {"version":3,"file":"principalPolicyTransition.js","sourceRoot":"","sources":["principalPolicyTransition.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PrincipalContainerGrant,\n PrincipalProjectionMember,\n SignedPrincipalState,\n} from \"../principalState\";\nimport { normalizePrincipalProjectionMembers } from \"../principalState\";\nimport { throwVerification } from \"./shared\";\nimport type { PrincipalPolicySignedState } from \"./types\";\n\nfunction principalProjectionMemberKey(\n member: PrincipalProjectionMember,\n): string {\n return member.userId;\n}\n\nfunction principalProjectionRoleRank(\n role: PrincipalProjectionMember[\"role\"],\n): number {\n return role === \"admin\" ? 2 : 1;\n}\n\nfunction hasPrincipalPolicyProjectionShrink(input: {\n currentProjection: readonly PrincipalProjectionMember[];\n previousProjection: readonly PrincipalProjectionMember[];\n}): boolean {\n const currentProjectionByMember = new Map<string, PrincipalProjectionMember>(\n input.currentProjection.map((member) => [\n principalProjectionMemberKey(member),\n member,\n ]),\n );\n\n return input.previousProjection.some((previousMember) => {\n const currentMember = currentProjectionByMember.get(\n principalProjectionMemberKey(previousMember),\n );\n\n if (!currentMember) {\n return true;\n }\n\n return (\n principalProjectionRoleRank(currentMember.role) <\n principalProjectionRoleRank(previousMember.role)\n );\n });\n}\n\n/**\n * Container KEK wraps sealed to a group's key stay stored after the group\n * loses a grant, so a member added later at the same key epoch could still\n * open them (#2365 finding 20). A grant may change its access level in place,\n * but dropping a container needs a new key, exactly like a projection shrink.\n */\nfunction hasPrincipalPolicyGrantRemoval(input: {\n currentGrants: readonly PrincipalContainerGrant[];\n previousGrants: readonly PrincipalContainerGrant[];\n}): boolean {\n const retained = new Set(\n input.currentGrants.map((grant) => grant.containerId),\n );\n return input.previousGrants.some((grant) => !retained.has(grant.containerId));\n}\n\nfunction principalPolicyKeyMaterialChanged(input: {\n currentState: SignedPrincipalState;\n previousState: SignedPrincipalState;\n}): boolean {\n return (\n input.currentState.encapsulationPublicKey !==\n input.previousState.encapsulationPublicKey ||\n input.currentState.keyFingerprint !== input.previousState.keyFingerprint\n );\n}\n\nexport type PrincipalPolicyTransitionMismatchCode =\n | \"epoch_advance_without_key_material\"\n | \"grant_removal_without_key_rotation\"\n | \"key_change_without_epoch\"\n | \"key_epoch_decrease\"\n | \"key_epoch_jump\"\n | \"previous_hash_mismatch\"\n | \"principal_mismatch\"\n | \"shrink_without_key_rotation\"\n | \"version_not_contiguous\";\n\nexport interface PrincipalPolicyTransitionMismatch {\n readonly code: PrincipalPolicyTransitionMismatchCode;\n readonly message: string;\n}\n\nfunction principalPolicyTransitionMismatch(\n code: PrincipalPolicyTransitionMismatchCode,\n message: string,\n): PrincipalPolicyTransitionMismatch {\n return { code, message };\n}\n\nexport function getPrincipalPolicyTransitionMismatch(input: {\n readonly current: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: SignedPrincipalState;\n };\n readonly previous: {\n readonly grants: readonly PrincipalContainerGrant[];\n readonly projection: readonly PrincipalProjectionMember[];\n readonly state: PrincipalPolicySignedState;\n };\n}): PrincipalPolicyTransitionMismatch | null {\n const { current, previous } = input;\n\n if (\n current.state.principalType !== previous.state.principalType ||\n current.state.principalId !== previous.state.principalId\n ) {\n return principalPolicyTransitionMismatch(\n \"principal_mismatch\",\n \"Principal policy transition principal mismatch\",\n );\n }\n\n if (current.state.version !== previous.state.version + 1) {\n return principalPolicyTransitionMismatch(\n \"version_not_contiguous\",\n \"Principal policy transition version is not contiguous\",\n );\n }\n\n if (current.state.prevStateHash !== previous.state.stateHash) {\n return principalPolicyTransitionMismatch(\n \"previous_hash_mismatch\",\n \"Principal policy transition previous hash mismatch\",\n );\n }\n\n if (current.state.keyEpoch < previous.state.keyEpoch) {\n return principalPolicyTransitionMismatch(\n \"key_epoch_decrease\",\n \"Principal policy key epoch cannot decrease\",\n );\n }\n\n if (current.state.keyEpoch > previous.state.keyEpoch + 1) {\n return principalPolicyTransitionMismatch(\n \"key_epoch_jump\",\n \"Principal policy key epoch must advance by exactly one\",\n );\n }\n\n const previousProjection = normalizePrincipalProjectionMembers(\n previous.projection,\n );\n const currentProjection = normalizePrincipalProjectionMembers(\n current.projection,\n );\n const keyMaterialChanged = principalPolicyKeyMaterialChanged({\n currentState: current.state,\n previousState: previous.state,\n });\n\n if (\n current.state.keyEpoch === previous.state.keyEpoch &&\n keyMaterialChanged\n ) {\n return principalPolicyTransitionMismatch(\n \"key_change_without_epoch\",\n \"Principal policy key change requires a new key epoch\",\n );\n }\n\n if (current.state.keyEpoch > previous.state.keyEpoch && !keyMaterialChanged) {\n return principalPolicyTransitionMismatch(\n \"epoch_advance_without_key_material\",\n \"Principal policy key epoch advance requires new key material\",\n );\n }\n\n if (\n hasPrincipalPolicyProjectionShrink({\n currentProjection,\n previousProjection,\n }) &&\n (current.state.keyEpoch <= previous.state.keyEpoch || !keyMaterialChanged)\n ) {\n return principalPolicyTransitionMismatch(\n \"shrink_without_key_rotation\",\n \"Principal policy shrink requires a new key epoch and key material\",\n );\n }\n\n if (\n hasPrincipalPolicyGrantRemoval({\n currentGrants: current.grants,\n previousGrants: previous.grants,\n }) &&\n current.state.keyEpoch <= previous.state.keyEpoch\n ) {\n return principalPolicyTransitionMismatch(\n \"grant_removal_without_key_rotation\",\n \"Principal policy grant removal requires a new key epoch\",\n );\n }\n\n return null;\n}\n\nexport function getPrincipalPolicyTransitionMismatchReason(\n input: Parameters<typeof getPrincipalPolicyTransitionMismatch>[0],\n): string | null {\n return getPrincipalPolicyTransitionMismatch(input)?.message ?? null;\n}\n\n/** key_epoch_reuse classifies all epoch/key-material continuity violations. */\nexport function throwPrincipalPolicyTransitionError(\n mismatch: PrincipalPolicyTransitionMismatch,\n): never {\n switch (mismatch.code) {\n case \"epoch_advance_without_key_material\":\n case \"grant_removal_without_key_rotation\":\n case \"key_change_without_epoch\":\n case \"key_epoch_decrease\":\n case \"key_epoch_jump\":\n case \"shrink_without_key_rotation\":\n return throwVerification(\"key_epoch_reuse\", mismatch.message);\n case \"previous_hash_mismatch\":\n return throwVerification(\"stale_predecessor\", mismatch.message);\n case \"principal_mismatch\":\n case \"version_not_contiguous\":\n return throwVerification(\"invalid_shape\", mismatch.message);\n }\n}\n"]}
@@ -10,7 +10,7 @@ import { sign } from "./signing/sign.js";
10
10
  const TEXT_ENCODER = new TextEncoder();
11
11
  const TEXT_DECODER = new TextDecoder();
12
12
  function isValidPositiveInteger(value) {
13
- return Number.isInteger(value) && value > 0;
13
+ return Number.isSafeInteger(value) && value > 0;
14
14
  }
15
15
  function isValidNonNegativeInteger(value) {
16
16
  return Number.isInteger(value) && value >= 0;
@@ -83,7 +83,7 @@ function validatePrincipalStateIdentityFields(state) {
83
83
  throw new Error("Principal state version must be a positive safe integer");
84
84
  }
85
85
  if (!isValidPositiveInteger(state.keyEpoch)) {
86
- throw new Error("Principal state key epoch must be a positive integer");
86
+ throw new Error("Principal state key epoch must be a positive safe integer");
87
87
  }
88
88
  if (state.principalId.length === 0) {
89
89
  throw new Error("Principal state principalId cannot be empty");
@@ -1 +1 @@
1
- {"version":3,"file":"principalState.js","sourceRoot":"","sources":["principalState.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport {\n isCanonicalSignedAt,\n SIGNED_AT_CONTRACT,\n} from \"@tearleads/validators/util\";\nimport { ML_KEM1024_PUBLIC_KEY_BYTES } from \"./encapsulation/generateKeyPair\";\nimport { toFingerprint } from \"./fingerprint\";\nimport { computePrincipalContainerGrantRoot } from \"./principalContainerGrants\";\nimport { computePrincipalMemberEnvelopesRoot } from \"./principalMemberEnvelopes\";\nimport { throwPrincipalPolicyValidationError } from \"./principalPolicyValidationError\";\nimport {\n comparePrincipalProjectionMembers,\n comparePrincipalStateMembers,\n hasDuplicateNormalizedPrincipalProjectionMembers,\n hasDuplicateNormalizedPrincipalStateMembers,\n} from \"./principalStateMembers\";\nimport type {\n ManagedRecipientPrincipalType,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMembershipMode,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\nimport { sign } from \"./signing/sign\";\n\nconst TEXT_ENCODER = new TextEncoder();\nconst TEXT_DECODER = new TextDecoder();\n\nexport type {\n ManagedRecipientPrincipalType,\n PrincipalContainerGrant,\n PrincipalContainerGrantAccessLevel,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMemberEnvelope,\n PrincipalStateMembershipMode,\n PrincipalStatePayloadCipherSuite,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\n\nfunction isValidPositiveInteger(value: number): boolean {\n return Number.isInteger(value) && value > 0;\n}\n\nfunction isValidNonNegativeInteger(value: number): boolean {\n return Number.isInteger(value) && value >= 0;\n}\n\nfunction encodeNormalizedPrincipalStateMembers(\n normalizedMembers: ReadonlyArray<PrincipalStateMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n })),\n ),\n );\n}\n\nfunction encodeNormalizedPrincipalProjectionMembers(\n normalizedMembers: ReadonlyArray<PrincipalProjectionMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n role: member.role,\n })),\n ),\n );\n}\n\nexport function encodeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify({\n domain: \"tearleads.principal-state\",\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n }),\n );\n}\n\nexport function toUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): UnsignedPrincipalState {\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nfunction isMembershipMode(\n value: string,\n): value is PrincipalStateMembershipMode {\n return value === \"projection\";\n}\n\nfunction validatePrincipalStateIdentityFields(\n state: UnsignedPrincipalState,\n): void {\n // Versions are counters, not a lifetime history budget. Keep every value\n // exact across JSON, JavaScript arithmetic, and the database number mapping.\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new Error(\"Principal state version must be a positive safe integer\");\n }\n\n if (!isValidPositiveInteger(state.keyEpoch)) {\n throw new Error(\"Principal state key epoch must be a positive integer\");\n }\n\n if (state.principalId.length === 0) {\n throw new Error(\"Principal state principalId cannot be empty\");\n }\n\n if (state.encapsulationPublicKey.length === 0) {\n throw new Error(\"Principal state encapsulationPublicKey cannot be empty\");\n }\n\n if (state.keyFingerprint.length === 0) {\n throw new Error(\"Principal state keyFingerprint cannot be empty\");\n }\n\n if (state.signerUserId.length === 0) {\n throw new Error(\"Principal state signerUserId cannot be empty\");\n }\n\n if (state.signerUserKeyFingerprint.length === 0) {\n throw new Error(\"Principal state signerUserKeyFingerprint cannot be empty\");\n }\n\n if (!isCanonicalSignedAt(state.signedAt)) {\n throw new Error(`Principal state signedAt must be ${SIGNED_AT_CONTRACT}`);\n }\n}\n\nfunction resolveMembershipMode(\n membershipMode: string | undefined,\n): PrincipalStateMembershipMode {\n if (!membershipMode || !isMembershipMode(membershipMode)) {\n throw new Error(\"Principal state membershipMode is unsupported\");\n }\n return membershipMode;\n}\n\nfunction requireNonEmptyHeaderString(\n value: string | undefined,\n message: string,\n): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(message);\n }\n return value;\n}\n\nfunction resolveMemberCount(state: UnsignedPrincipalState): number {\n if (\n typeof state.memberCount !== \"number\" ||\n !isValidNonNegativeInteger(state.memberCount)\n ) {\n throw new Error(\n \"Principal state memberCount must be a non-negative integer\",\n );\n }\n\n return state.memberCount;\n}\n\nfunction normalizeExternalAuthority(\n authority: PrincipalStateExternalAuthority | null,\n): PrincipalStateExternalAuthority | null {\n if (authority === null) {\n return null;\n }\n\n if (\n authority.principalType !== \"group\" ||\n authority.principalId.length === 0 ||\n !Number.isSafeInteger(authority.version) ||\n authority.version < 1 ||\n !isValidPositiveInteger(authority.keyEpoch) ||\n authority.stateHash.length === 0 ||\n authority.keyFingerprint.length === 0\n ) {\n throw new Error(\"Principal state externalAuthority is invalid\");\n }\n\n return {\n principalType: \"group\",\n principalId: authority.principalId,\n version: authority.version,\n keyEpoch: authority.keyEpoch,\n stateHash: authority.stateHash,\n keyFingerprint: authority.keyFingerprint,\n };\n}\n\nasync function validatePrincipalEncapsulationKey(\n state: UnsignedPrincipalState,\n): Promise<void> {\n let publicKey: Uint8Array;\n try {\n publicKey = base64ToBytes(state.encapsulationPublicKey);\n } catch {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (bytesToBase64(publicKey) !== state.encapsulationPublicKey) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (publicKey.length !== ML_KEM1024_PUBLIC_KEY_BYTES) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n `Principal state encapsulationPublicKey must contain exactly ${ML_KEM1024_PUBLIC_KEY_BYTES} bytes`,\n );\n }\n\n const publicKeyFingerprint = await toFingerprint(publicKey);\n if (publicKeyFingerprint !== state.keyFingerprint) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state keyFingerprint does not match encapsulationPublicKey\",\n );\n }\n}\n\nexport async function normalizeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<UnsignedPrincipalState> {\n validatePrincipalStateIdentityFields(state);\n\n const membershipMode = resolveMembershipMode(state.membershipMode);\n const resolvedMembershipRoot = requireNonEmptyHeaderString(\n state.membershipRoot,\n \"Principal state membershipRoot is required\",\n );\n const resolvedProjectionRoot = requireNonEmptyHeaderString(\n state.projectionRoot,\n \"Principal state projectionRoot is required\",\n );\n const resolvedGrantRoot = requireNonEmptyHeaderString(\n state.grantRoot,\n \"Principal state grantRoot is required\",\n );\n const resolvedMemberEnvelopesRoot = requireNonEmptyHeaderString(\n state.memberEnvelopesRoot,\n \"Principal state memberEnvelopesRoot is required\",\n );\n const resolvedPayloadCiphertextHash = requireNonEmptyHeaderString(\n state.payloadCiphertextHash,\n \"Principal state payloadCiphertextHash is required\",\n );\n const memberCount = resolveMemberCount(state);\n if (!isValidNonNegativeInteger(state.grantCount)) {\n throw new Error(\n \"Principal state grantCount must be a non-negative integer\",\n );\n }\n\n await validatePrincipalEncapsulationKey(state);\n\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode,\n membershipRoot: resolvedMembershipRoot,\n memberEnvelopesRoot: resolvedMemberEnvelopesRoot,\n projectionRoot: resolvedProjectionRoot,\n grantRoot: resolvedGrantRoot,\n payloadCiphertextHash: resolvedPayloadCiphertextHash,\n memberCount,\n grantCount: state.grantCount,\n externalAuthority: normalizeExternalAuthority(state.externalAuthority),\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nexport function isManagedRecipientPrincipalType(\n value: string,\n): value is ManagedRecipientPrincipalType {\n return value === \"group\" || value === \"organization\";\n}\n\nexport function isPrincipalProjectionRole(\n value: string,\n): value is PrincipalProjectionRole {\n return value === \"member\" || value === \"admin\";\n}\n\nexport function normalizePrincipalStateMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalStateMember[] {\n return members\n .map((member) => ({ userId: member.userId }))\n .sort(comparePrincipalStateMembers);\n}\n\nexport function derivePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalProjectionMember[] {\n return normalizePrincipalStateMembers(members).map((member) => ({\n userId: member.userId,\n role: \"member\",\n }));\n}\n\nexport function normalizePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): PrincipalProjectionMember[] {\n return members\n .map((member) => ({ userId: member.userId, role: member.role }))\n .sort(comparePrincipalProjectionMembers);\n}\n\nexport async function computePrincipalMembershipRoot(\n members: ReadonlyArray<PrincipalStateMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalStateMembers(members);\n\n if (hasDuplicateNormalizedPrincipalStateMembers(normalizedMembers)) {\n throw new Error(\"Principal state cannot contain duplicate members\");\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalStateMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalProjectionRoot(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalProjectionMembers(members);\n\n if (hasDuplicateNormalizedPrincipalProjectionMembers(normalizedMembers)) {\n throw new Error(\n \"Principal state projection cannot contain duplicate members\",\n );\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalProjectionMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalStatePayloadCiphertextHash(\n ciphertext: string,\n): Promise<string> {\n return toFingerprint(TEXT_ENCODER.encode(ciphertext));\n}\n\nexport async function buildPrincipalStateSigningInput(\n input: PrincipalStateHeaderInput,\n): Promise<PrincipalStateSigningInput> {\n return {\n principalType: input.principalType,\n principalId: input.principalId,\n version: input.version,\n prevStateHash: input.prevStateHash,\n keyEpoch: input.keyEpoch,\n encapsulationPublicKey: input.encapsulationPublicKey,\n keyFingerprint: input.keyFingerprint,\n membershipMode: \"projection\",\n membershipRoot: await computePrincipalMembershipRoot(input.members),\n memberEnvelopesRoot: await computePrincipalMemberEnvelopesRoot(\n input.memberEnvelopes,\n ),\n projectionRoot: await computePrincipalProjectionRoot(input.projection),\n grantRoot: await computePrincipalContainerGrantRoot(input.grants),\n payloadCiphertextHash: await computePrincipalStatePayloadCiphertextHash(\n input.payloadCiphertext,\n ),\n memberCount: input.projection.length,\n grantCount: input.grants.length,\n externalAuthority: input.externalAuthority,\n signedAt: input.signedAt,\n signerUserId: input.signerUserId,\n signerUserKeyFingerprint: input.signerUserKeyFingerprint,\n };\n}\n\nexport async function serializeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return TEXT_DECODER.decode(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function computePrincipalStateHash(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return toFingerprint(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function signPrincipalState(\n state: PrincipalStateSigningInput,\n secretKey: Uint8Array,\n): Promise<SignedPrincipalState> {\n const normalizedState = await normalizeUnsignedPrincipalState(\n toUnsignedPrincipalState(state),\n );\n const signature = sign(\n encodeUnsignedPrincipalState(normalizedState),\n secretKey,\n );\n\n return {\n ...normalizedState,\n signature: bytesToBase64(signature),\n };\n}\n"]}
1
+ {"version":3,"file":"principalState.js","sourceRoot":"","sources":["principalState.ts"],"names":[],"mappings":"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","sourcesContent":["import { base64ToBytes, bytesToBase64 } from \"@tearleads/encoding\";\nimport {\n isCanonicalSignedAt,\n SIGNED_AT_CONTRACT,\n} from \"@tearleads/validators/util\";\nimport { ML_KEM1024_PUBLIC_KEY_BYTES } from \"./encapsulation/generateKeyPair\";\nimport { toFingerprint } from \"./fingerprint\";\nimport { computePrincipalContainerGrantRoot } from \"./principalContainerGrants\";\nimport { computePrincipalMemberEnvelopesRoot } from \"./principalMemberEnvelopes\";\nimport { throwPrincipalPolicyValidationError } from \"./principalPolicyValidationError\";\nimport {\n comparePrincipalProjectionMembers,\n comparePrincipalStateMembers,\n hasDuplicateNormalizedPrincipalProjectionMembers,\n hasDuplicateNormalizedPrincipalStateMembers,\n} from \"./principalStateMembers\";\nimport type {\n ManagedRecipientPrincipalType,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMembershipMode,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\nimport { sign } from \"./signing/sign\";\n\nconst TEXT_ENCODER = new TextEncoder();\nconst TEXT_DECODER = new TextDecoder();\n\nexport type {\n ManagedRecipientPrincipalType,\n PrincipalContainerGrant,\n PrincipalContainerGrantAccessLevel,\n PrincipalProjectionMember,\n PrincipalProjectionRole,\n PrincipalStateExternalAuthority,\n PrincipalStateHeaderInput,\n PrincipalStateMember,\n PrincipalStateMemberEnvelope,\n PrincipalStateMembershipMode,\n PrincipalStatePayloadCipherSuite,\n PrincipalStateSigningInput,\n SignedPrincipalState,\n UnsignedPrincipalState,\n} from \"./principalStateTypes\";\n\nfunction isValidPositiveInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isValidNonNegativeInteger(value: number): boolean {\n return Number.isInteger(value) && value >= 0;\n}\n\nfunction encodeNormalizedPrincipalStateMembers(\n normalizedMembers: ReadonlyArray<PrincipalStateMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n })),\n ),\n );\n}\n\nfunction encodeNormalizedPrincipalProjectionMembers(\n normalizedMembers: ReadonlyArray<PrincipalProjectionMember>,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify(\n normalizedMembers.map((member) => ({\n userId: member.userId,\n role: member.role,\n })),\n ),\n );\n}\n\nexport function encodeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Uint8Array {\n return TEXT_ENCODER.encode(\n JSON.stringify({\n domain: \"tearleads.principal-state\",\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n }),\n );\n}\n\nexport function toUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): UnsignedPrincipalState {\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode: state.membershipMode,\n membershipRoot: state.membershipRoot,\n memberEnvelopesRoot: state.memberEnvelopesRoot,\n projectionRoot: state.projectionRoot,\n grantRoot: state.grantRoot,\n payloadCiphertextHash: state.payloadCiphertextHash,\n memberCount: state.memberCount,\n grantCount: state.grantCount,\n externalAuthority: state.externalAuthority,\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nfunction isMembershipMode(\n value: string,\n): value is PrincipalStateMembershipMode {\n return value === \"projection\";\n}\n\nfunction validatePrincipalStateIdentityFields(\n state: UnsignedPrincipalState,\n): void {\n // Versions are counters, not a lifetime history budget. Keep every value\n // exact across JSON, JavaScript arithmetic, and the database number mapping.\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new Error(\"Principal state version must be a positive safe integer\");\n }\n\n if (!isValidPositiveInteger(state.keyEpoch)) {\n throw new Error(\n \"Principal state key epoch must be a positive safe integer\",\n );\n }\n\n if (state.principalId.length === 0) {\n throw new Error(\"Principal state principalId cannot be empty\");\n }\n\n if (state.encapsulationPublicKey.length === 0) {\n throw new Error(\"Principal state encapsulationPublicKey cannot be empty\");\n }\n\n if (state.keyFingerprint.length === 0) {\n throw new Error(\"Principal state keyFingerprint cannot be empty\");\n }\n\n if (state.signerUserId.length === 0) {\n throw new Error(\"Principal state signerUserId cannot be empty\");\n }\n\n if (state.signerUserKeyFingerprint.length === 0) {\n throw new Error(\"Principal state signerUserKeyFingerprint cannot be empty\");\n }\n\n if (!isCanonicalSignedAt(state.signedAt)) {\n throw new Error(`Principal state signedAt must be ${SIGNED_AT_CONTRACT}`);\n }\n}\n\nfunction resolveMembershipMode(\n membershipMode: string | undefined,\n): PrincipalStateMembershipMode {\n if (!membershipMode || !isMembershipMode(membershipMode)) {\n throw new Error(\"Principal state membershipMode is unsupported\");\n }\n return membershipMode;\n}\n\nfunction requireNonEmptyHeaderString(\n value: string | undefined,\n message: string,\n): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(message);\n }\n return value;\n}\n\nfunction resolveMemberCount(state: UnsignedPrincipalState): number {\n if (\n typeof state.memberCount !== \"number\" ||\n !isValidNonNegativeInteger(state.memberCount)\n ) {\n throw new Error(\n \"Principal state memberCount must be a non-negative integer\",\n );\n }\n\n return state.memberCount;\n}\n\nfunction normalizeExternalAuthority(\n authority: PrincipalStateExternalAuthority | null,\n): PrincipalStateExternalAuthority | null {\n if (authority === null) {\n return null;\n }\n\n if (\n authority.principalType !== \"group\" ||\n authority.principalId.length === 0 ||\n !Number.isSafeInteger(authority.version) ||\n authority.version < 1 ||\n !isValidPositiveInteger(authority.keyEpoch) ||\n authority.stateHash.length === 0 ||\n authority.keyFingerprint.length === 0\n ) {\n throw new Error(\"Principal state externalAuthority is invalid\");\n }\n\n return {\n principalType: \"group\",\n principalId: authority.principalId,\n version: authority.version,\n keyEpoch: authority.keyEpoch,\n stateHash: authority.stateHash,\n keyFingerprint: authority.keyFingerprint,\n };\n}\n\nasync function validatePrincipalEncapsulationKey(\n state: UnsignedPrincipalState,\n): Promise<void> {\n let publicKey: Uint8Array;\n try {\n publicKey = base64ToBytes(state.encapsulationPublicKey);\n } catch {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (bytesToBase64(publicKey) !== state.encapsulationPublicKey) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state encapsulationPublicKey must use canonical base64 encoding\",\n );\n }\n\n if (publicKey.length !== ML_KEM1024_PUBLIC_KEY_BYTES) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n `Principal state encapsulationPublicKey must contain exactly ${ML_KEM1024_PUBLIC_KEY_BYTES} bytes`,\n );\n }\n\n const publicKeyFingerprint = await toFingerprint(publicKey);\n if (publicKeyFingerprint !== state.keyFingerprint) {\n throwPrincipalPolicyValidationError(\n \"invalid_artifact\",\n \"Principal state keyFingerprint does not match encapsulationPublicKey\",\n );\n }\n}\n\nexport async function normalizeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<UnsignedPrincipalState> {\n validatePrincipalStateIdentityFields(state);\n\n const membershipMode = resolveMembershipMode(state.membershipMode);\n const resolvedMembershipRoot = requireNonEmptyHeaderString(\n state.membershipRoot,\n \"Principal state membershipRoot is required\",\n );\n const resolvedProjectionRoot = requireNonEmptyHeaderString(\n state.projectionRoot,\n \"Principal state projectionRoot is required\",\n );\n const resolvedGrantRoot = requireNonEmptyHeaderString(\n state.grantRoot,\n \"Principal state grantRoot is required\",\n );\n const resolvedMemberEnvelopesRoot = requireNonEmptyHeaderString(\n state.memberEnvelopesRoot,\n \"Principal state memberEnvelopesRoot is required\",\n );\n const resolvedPayloadCiphertextHash = requireNonEmptyHeaderString(\n state.payloadCiphertextHash,\n \"Principal state payloadCiphertextHash is required\",\n );\n const memberCount = resolveMemberCount(state);\n if (!isValidNonNegativeInteger(state.grantCount)) {\n throw new Error(\n \"Principal state grantCount must be a non-negative integer\",\n );\n }\n\n await validatePrincipalEncapsulationKey(state);\n\n return {\n principalType: state.principalType,\n principalId: state.principalId,\n version: state.version,\n prevStateHash: state.prevStateHash,\n keyEpoch: state.keyEpoch,\n encapsulationPublicKey: state.encapsulationPublicKey,\n keyFingerprint: state.keyFingerprint,\n membershipMode,\n membershipRoot: resolvedMembershipRoot,\n memberEnvelopesRoot: resolvedMemberEnvelopesRoot,\n projectionRoot: resolvedProjectionRoot,\n grantRoot: resolvedGrantRoot,\n payloadCiphertextHash: resolvedPayloadCiphertextHash,\n memberCount,\n grantCount: state.grantCount,\n externalAuthority: normalizeExternalAuthority(state.externalAuthority),\n signedAt: state.signedAt,\n signerUserId: state.signerUserId,\n signerUserKeyFingerprint: state.signerUserKeyFingerprint,\n };\n}\n\nexport function isManagedRecipientPrincipalType(\n value: string,\n): value is ManagedRecipientPrincipalType {\n return value === \"group\" || value === \"organization\";\n}\n\nexport function isPrincipalProjectionRole(\n value: string,\n): value is PrincipalProjectionRole {\n return value === \"member\" || value === \"admin\";\n}\n\nexport function normalizePrincipalStateMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalStateMember[] {\n return members\n .map((member) => ({ userId: member.userId }))\n .sort(comparePrincipalStateMembers);\n}\n\nexport function derivePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalStateMember>,\n): PrincipalProjectionMember[] {\n return normalizePrincipalStateMembers(members).map((member) => ({\n userId: member.userId,\n role: \"member\",\n }));\n}\n\nexport function normalizePrincipalProjectionMembers(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): PrincipalProjectionMember[] {\n return members\n .map((member) => ({ userId: member.userId, role: member.role }))\n .sort(comparePrincipalProjectionMembers);\n}\n\nexport async function computePrincipalMembershipRoot(\n members: ReadonlyArray<PrincipalStateMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalStateMembers(members);\n\n if (hasDuplicateNormalizedPrincipalStateMembers(normalizedMembers)) {\n throw new Error(\"Principal state cannot contain duplicate members\");\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalStateMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalProjectionRoot(\n members: ReadonlyArray<PrincipalProjectionMember>,\n): Promise<string> {\n const normalizedMembers = normalizePrincipalProjectionMembers(members);\n\n if (hasDuplicateNormalizedPrincipalProjectionMembers(normalizedMembers)) {\n throw new Error(\n \"Principal state projection cannot contain duplicate members\",\n );\n }\n\n return toFingerprint(\n encodeNormalizedPrincipalProjectionMembers(normalizedMembers),\n );\n}\n\nexport async function computePrincipalStatePayloadCiphertextHash(\n ciphertext: string,\n): Promise<string> {\n return toFingerprint(TEXT_ENCODER.encode(ciphertext));\n}\n\nexport async function buildPrincipalStateSigningInput(\n input: PrincipalStateHeaderInput,\n): Promise<PrincipalStateSigningInput> {\n return {\n principalType: input.principalType,\n principalId: input.principalId,\n version: input.version,\n prevStateHash: input.prevStateHash,\n keyEpoch: input.keyEpoch,\n encapsulationPublicKey: input.encapsulationPublicKey,\n keyFingerprint: input.keyFingerprint,\n membershipMode: \"projection\",\n membershipRoot: await computePrincipalMembershipRoot(input.members),\n memberEnvelopesRoot: await computePrincipalMemberEnvelopesRoot(\n input.memberEnvelopes,\n ),\n projectionRoot: await computePrincipalProjectionRoot(input.projection),\n grantRoot: await computePrincipalContainerGrantRoot(input.grants),\n payloadCiphertextHash: await computePrincipalStatePayloadCiphertextHash(\n input.payloadCiphertext,\n ),\n memberCount: input.projection.length,\n grantCount: input.grants.length,\n externalAuthority: input.externalAuthority,\n signedAt: input.signedAt,\n signerUserId: input.signerUserId,\n signerUserKeyFingerprint: input.signerUserKeyFingerprint,\n };\n}\n\nexport async function serializeUnsignedPrincipalState(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return TEXT_DECODER.decode(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function computePrincipalStateHash(\n state: UnsignedPrincipalState,\n): Promise<string> {\n const normalizedState = await normalizeUnsignedPrincipalState(state);\n return toFingerprint(encodeUnsignedPrincipalState(normalizedState));\n}\n\nexport async function signPrincipalState(\n state: PrincipalStateSigningInput,\n secretKey: Uint8Array,\n): Promise<SignedPrincipalState> {\n const normalizedState = await normalizeUnsignedPrincipalState(\n toUnsignedPrincipalState(state),\n );\n const signature = sign(\n encodeUnsignedPrincipalState(normalizedState),\n secretKey,\n );\n\n return {\n ...normalizedState,\n signature: bytesToBase64(signature),\n };\n}\n"]}