sealed-lattice 0.0.10 → 0.0.12

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 (56) hide show
  1. package/README.md +7 -3
  2. package/dist/index.d.ts +23 -1
  3. package/dist/index.js +57 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/internal/board-target.d.ts +325 -0
  6. package/dist/internal/board-target.js +1 -0
  7. package/dist/internal/crypto/canonical-json.js +111 -0
  8. package/dist/internal/crypto/digests.js +29 -0
  9. package/dist/internal/crypto/index.js +3 -0
  10. package/dist/internal/crypto/signatures.js +320 -0
  11. package/dist/internal/election-foundation/board/digests.js +130 -0
  12. package/dist/internal/election-foundation/board/index.js +356 -0
  13. package/dist/internal/election-foundation/board/shell-evidence.js +41 -0
  14. package/dist/internal/election-foundation/closing/index.js +246 -0
  15. package/dist/internal/election-foundation/common/verification-helpers.js +14 -0
  16. package/dist/internal/election-foundation/finality/index.js +408 -0
  17. package/dist/internal/election-foundation/index.js +11 -0
  18. package/dist/internal/election-foundation/lifecycle/capabilities.js +313 -0
  19. package/dist/internal/election-foundation/lifecycle/labels.js +285 -0
  20. package/dist/internal/election-foundation/lifecycle/lifecycle.js +58 -0
  21. package/dist/internal/election-foundation/lifecycle/poll-spec.js +125 -0
  22. package/dist/internal/election-foundation/lifecycle/profiles.js +14 -0
  23. package/dist/internal/election-foundation/lifecycle/refusal.js +9 -0
  24. package/dist/internal/election-foundation/lifecycle/thresholds.js +174 -0
  25. package/dist/internal/election-foundation/ordering/index.js +147 -0
  26. package/dist/internal/election-foundation/recovery/index.js +255 -0
  27. package/dist/internal/election-foundation/roster/digests.js +64 -0
  28. package/dist/internal/election-foundation/roster/inclusion.js +31 -0
  29. package/dist/internal/election-foundation/roster/index.js +3 -0
  30. package/dist/internal/election-foundation/roster/object-validation.js +316 -0
  31. package/dist/internal/election-foundation/roster/verification.js +196 -0
  32. package/dist/internal/lifecycle.d.ts +185 -0
  33. package/dist/internal/lifecycle.js +1 -0
  34. package/dist/internal/plaintext-oracle.d.ts +96 -0
  35. package/dist/internal/plaintext-oracle.js +1 -0
  36. package/dist/internal/profile-identifiers.d.ts +13 -0
  37. package/dist/internal/profile-identifiers.js +13 -0
  38. package/dist/internal/protocol-digest.d.ts +3 -0
  39. package/dist/internal/protocol-digest.js +102 -0
  40. package/dist/internal/protocol-objects.d.ts +75 -0
  41. package/dist/internal/protocol-objects.js +1 -0
  42. package/dist/internal/pvss-ballot.d.ts +171 -0
  43. package/dist/internal/pvss-ballot.js +1 -0
  44. package/dist/internal/roster-recovery.d.ts +220 -0
  45. package/dist/internal/roster-recovery.js +1 -0
  46. package/dist/internal/transcript-core-bridge.js +378 -0
  47. package/dist/internal/transcript-core.d.ts +88 -0
  48. package/dist/internal/transcript-core.js +24 -0
  49. package/dist/internal/types.d.ts +9 -0
  50. package/dist/internal/types.js +9 -0
  51. package/dist/kernel.d.ts +6 -0
  52. package/dist/kernel.js +4 -0
  53. package/dist/kernel.js.map +1 -0
  54. package/dist/sealed-lattice-kernel.wasm +0 -0
  55. package/package.json +55 -41
  56. package/public-surface.json +272 -0
package/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  This package is the only published npm surface in the workspace.
4
4
 
5
- The current public runtime facade is intentionally empty. The package exists so
6
- packaging, documentation, smoke checks, and release workflow can stabilize
7
- before broader protocol-facing APIs are introduced.
5
+ The current public runtime facade exposes the safe transcript core fixture
6
+ verifier plus the threshold, lifecycle, poll specification, capability,
7
+ board-consistency, target-finality, roster-manifest, cast receipt, close
8
+ record, first-valid ordering, and recovery-epoch helpers. It does not expose raw
9
+ hashing, object mutation, generic cryptography, ballots, local replay record
10
+ checks, semantic target acceptance, decryption-share shell checks,
11
+ decryption, or protocol internals.
package/dist/index.d.ts CHANGED
@@ -1 +1,23 @@
1
- export {};
1
+ import type { ActionCurrentForRecoveryEpochInput, ActionCurrentForRecoveryEpochResult, BoardConsistencyInput, BoardConsistencyVerification, CastReceiptVerification, CastReceiptVerificationInput, CapabilityContext, CapabilityDecision, CloseRecordVerification, CloseRecordVerificationInput, FirstValidOrderingInput, FirstValidOrderingVerification, FutureProtocolOperationResult, LifecycleLabelInput, LifecycleLabels, LifecycleTransition, PollSpecInput, PollSpecValidation, ProtocolAction, RecoveryEpochVerification, RecoveryEpochVerificationInput, ThresholdProfile, ThresholdProfileInput, TranscriptCoreFixture, TranscriptCoreVerificationResult, RosterManifestTranscriptInput, RosterManifestTranscriptVerification, RosterExternalAcceptanceVerification, RosterExternalAcceptanceVerificationInput, TargetFinalityVerification, TargetFinalityVerificationInput } from './internal/types.js';
2
+ export type { AcceptedTargetFinalityCheckpoint, ActionContext, ActionCurrentForRecoveryEpochInput, ActionCurrentForRecoveryEpochResult, TargetBoundShareSelectionProfile, AppendOnlyConsistencyProof, BaseClaimProfile, BoardConsistencyInput, BoardConsistencyVerification, BoardEntryMerklePathStep, CanonicalError, CanonicalErrorCode, CanonicalSignedRootObject, CapabilityContext, CapabilityDecision, CastReceipt, CastReceiptVerification, CastReceiptVerificationInput, CloseRecord, CloseRecordKind, CloseRecordVerification, CloseRecordVerificationInput, ConflictingHeadEvidence, ConflictingManifestEvidence, DuplicateBallotPolicy, ElectionManifest, DecryptionShareFilteringMode, DecryptionShareSelectionRule, EvaluationProofMode, FailureStatusLabel, FirstValidOrderingInput, FirstValidOrderingVerification, FutureProtocolOperationResult, GoldenTranscriptCoreFixture, GoldenTranscriptCoreFixtureVerification, HeBackendCorruptionModel, InclusionProof, LifecycleLabelInput, LifecycleLabels, LifecycleState, LifecycleTransition, MalformedObjectFixture, MalformedObjectFixtureVerification, ManifestOpaqueBindings, ManifestPolicyDigests, MheSecurityClosure, MlDsaSignatureMode, MlDsaSignatureProfile, ModeStatusLabel, PollSpec, PollSpecInput, PollSpecValidation, PollSpecValidationError, PollSpecValidationErrorCode, PrimaryStatusLabel, ProtocolAction, ProtocolDigest, ProtocolObjectType, ProtocolRefusalCode, ProtocolSignatureEnvelope, ProtocolVerificationStatusLabel, ReceiverKeyRegistration, RecoveryEpochMapEntry, RecoveryEpochUpdate, RecoveryEpochVerification, RecoveryEpochVerificationInput, RecoveryState, RefusalReason, RefusalRecord, RegistrationEntry, ResultClaimLabel, RosterExternalAcceptance, RosterExternalAcceptanceVerification, RosterExternalAcceptanceVerificationInput, RosterManifestTranscriptInput, RosterManifestTranscriptVerification, RosterProfileKind, ScoreDomain, SignatureVerificationResult, SignedBoardHead, SignedObjectType, SignerRole, StructuredProtocolVerificationResult, TargetFinalityPolicy, TargetFinalityCheckpoint, TargetFinalityRecord, TargetFinalityVerification, TargetFinalityVerificationInput, TargetProposal, ThresholdProfile, ThresholdProfileInput, ThresholdWarning, TiePolicy, TranscriptCoreAnalysis, TranscriptCoreFixture, TranscriptCoreFixtureVerification, TranscriptCoreMheSecurityClosure, TranscriptCoreReplayFixture, TranscriptCoreStatusLabel, TranscriptCoreVerificationLabel, TranscriptCoreVerificationResult, TrusteeSetupEntry, ValidatedFirstValidObject, WitnessCheckpoint, WitnessPolicy, } from './internal/types.js';
3
+ export declare const deriveThresholdProfile: (input: ThresholdProfileInput) => ThresholdProfile;
4
+ export declare function validatePollSpec(input: PollSpecInput): PollSpecValidation;
5
+ export declare function validatePollSpec(input: unknown): PollSpecValidation;
6
+ export declare const isValidLifecycleTransition: (transition: LifecycleTransition) => boolean;
7
+ export declare const deriveLifecycleLabels: (input: LifecycleLabelInput) => LifecycleLabels;
8
+ export declare const evaluateActionCapability: (action: ProtocolAction, context: CapabilityContext) => CapabilityDecision;
9
+ export declare const verifyTranscript: () => FutureProtocolOperationResult;
10
+ export declare const createBridgeProof: () => FutureProtocolOperationResult;
11
+ export declare const verifyBridgeProof: () => FutureProtocolOperationResult;
12
+ export declare const verifyOneShotSharePolicy: () => FutureProtocolOperationResult;
13
+ export declare const verifyBoardConsistency: (input: BoardConsistencyInput) => BoardConsistencyVerification;
14
+ export declare const verifyCastReceiptShell: (input: CastReceiptVerificationInput) => CastReceiptVerification;
15
+ export declare const verifyCloseRecordShell: (input: CloseRecordVerificationInput) => CloseRecordVerification;
16
+ export declare const verifyTargetFinality: (input: TargetFinalityVerificationInput) => TargetFinalityVerification;
17
+ export declare const deriveValidatedFirstValidOrder: (input: FirstValidOrderingInput) => FirstValidOrderingVerification;
18
+ export declare const verifyFirstValidPolicy: (input: FirstValidOrderingInput) => FirstValidOrderingVerification;
19
+ export declare const verifyRosterExternalAcceptance: (input: RosterExternalAcceptanceVerificationInput) => RosterExternalAcceptanceVerification;
20
+ export declare const verifyRosterManifestTranscript: (input: RosterManifestTranscriptInput) => RosterManifestTranscriptVerification;
21
+ export declare const isActionCurrentForRecoveryEpoch: (input: ActionCurrentForRecoveryEpochInput) => ActionCurrentForRecoveryEpochResult;
22
+ export declare const verifyRecoveryEpochUpdate: (input: RecoveryEpochVerificationInput) => RecoveryEpochVerification;
23
+ export declare const verifyTranscriptCoreFixture: (fixture: TranscriptCoreFixture) => Promise<TranscriptCoreVerificationResult>;
package/dist/index.js CHANGED
@@ -1,2 +1,58 @@
1
- export {};
1
+ import { deriveValidatedFirstValidOrder as deriveValidatedFirstValidOrderInternal, deriveLifecycleLabels as deriveLifecycleLabelsInternal, deriveThresholdProfile as deriveThresholdProfileInternal, evaluateActionCapability as evaluateActionCapabilityInternal, verifyCastReceiptShell as verifyCastReceiptShellInternal, verifyCloseRecordShell as verifyCloseRecordShellInternal, isValidLifecycleTransition as isValidLifecycleTransitionInternal, isActionCurrentForRecoveryEpoch as isActionCurrentForRecoveryEpochInternal, validatePollSpec as validatePollSpecInternal, verifyBoardConsistency as verifyBoardConsistencyInternal, verifyFirstValidPolicy as verifyFirstValidPolicyInternal, verifyRecoveryEpochUpdate as verifyRecoveryEpochUpdateInternal, verifyRosterExternalAcceptance as verifyRosterExternalAcceptanceInternal, verifyRosterManifestTranscript as verifyRosterManifestTranscriptInternal, verifyTargetFinality as verifyTargetFinalityInternal, } from './internal/election-foundation/index.js';
2
+ import { loadTranscriptCoreKernel } from './kernel.js';
3
+ export const deriveThresholdProfile = (input) => deriveThresholdProfileInternal(input);
4
+ export function validatePollSpec(input) {
5
+ return validatePollSpecInternal(input);
6
+ }
7
+ export const isValidLifecycleTransition = (transition) => isValidLifecycleTransitionInternal(transition);
8
+ export const deriveLifecycleLabels = (input) => deriveLifecycleLabelsInternal(input);
9
+ export const evaluateActionCapability = (action, context) => evaluateActionCapabilityInternal(action, context);
10
+ const unavailableFutureProtocolOperation = (operation) => ({
11
+ ok: false,
12
+ statusLabels: [],
13
+ acceptedDigests: [],
14
+ refusedObjects: [
15
+ {
16
+ code: 'OperationUnavailable',
17
+ message: `${operation} is reserved for later protocol implementation and is not implemented in this package version.`,
18
+ },
19
+ ],
20
+ unresolvedReason: 'OperationUnavailable',
21
+ operation,
22
+ });
23
+ export const verifyTranscript = () => unavailableFutureProtocolOperation('verifyTranscript');
24
+ export const createBridgeProof = () => unavailableFutureProtocolOperation('createBridgeProof');
25
+ export const verifyBridgeProof = () => unavailableFutureProtocolOperation('verifyBridgeProof');
26
+ export const verifyOneShotSharePolicy = () => unavailableFutureProtocolOperation('verifyOneShotSharePolicy');
27
+ export const verifyBoardConsistency = (input) => verifyBoardConsistencyInternal(input);
28
+ export const verifyCastReceiptShell = (input) => verifyCastReceiptShellInternal(input);
29
+ export const verifyCloseRecordShell = (input) => verifyCloseRecordShellInternal(input);
30
+ export const verifyTargetFinality = (input) => verifyTargetFinalityInternal(input);
31
+ export const deriveValidatedFirstValidOrder = (input) => deriveValidatedFirstValidOrderInternal(input);
32
+ export const verifyFirstValidPolicy = (input) => verifyFirstValidPolicyInternal(input);
33
+ export const verifyRosterExternalAcceptance = (input) => verifyRosterExternalAcceptanceInternal(input);
34
+ export const verifyRosterManifestTranscript = (input) => verifyRosterManifestTranscriptInternal(input);
35
+ export const isActionCurrentForRecoveryEpoch = (input) => isActionCurrentForRecoveryEpochInternal(input);
36
+ export const verifyRecoveryEpochUpdate = (input) => verifyRecoveryEpochUpdateInternal(input);
37
+ export const verifyTranscriptCoreFixture = async (fixture) => {
38
+ const kernel = await loadTranscriptCoreKernel();
39
+ const verification = kernel.verifyFixture(fixture);
40
+ if ('expectedErrorCode' in verification) {
41
+ return {
42
+ caseName: verification.caseName,
43
+ label: 'TranscriptCoreRejected',
44
+ statusLabels: [],
45
+ rejection: {
46
+ code: verification.expectedErrorCode,
47
+ },
48
+ };
49
+ }
50
+ return {
51
+ caseName: verification.caseName,
52
+ label: 'TranscriptCoreVerified',
53
+ objectHash512: verification.objectHash512,
54
+ chunkRoot: verification.chunkRoot,
55
+ statusLabels: verification.statusLabels,
56
+ };
57
+ };
2
58
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,325 @@
1
+ import type { ProtocolDigest } from './protocol-digest.js';
2
+ import type { ConflictingHeadEvidence, ProtocolObjectType, ProtocolSignatureEnvelope, StructuredProtocolVerificationResult } from './protocol-objects.js';
3
+ export type SignedBoardHead = {
4
+ readonly objectType: 'BoardHead';
5
+ readonly objectVersion: 1;
6
+ readonly headDigest: ProtocolDigest;
7
+ readonly ceremonyId: string;
8
+ readonly boardSequence: number;
9
+ readonly boardRoot: ProtocolDigest;
10
+ readonly previousHeadDigest: ProtocolDigest | null;
11
+ readonly boardPolicyDigest: ProtocolDigest;
12
+ readonly signature: ProtocolSignatureEnvelope;
13
+ };
14
+ export type BoardEntryMerklePathStep = {
15
+ readonly siblingPosition: 'Left' | 'Right';
16
+ readonly siblingDigest: ProtocolDigest;
17
+ };
18
+ export type InclusionProof = {
19
+ readonly boardHeadDigest: ProtocolDigest;
20
+ readonly boardSequence: number;
21
+ readonly boardPosition: number;
22
+ readonly includedObjectType: ProtocolObjectType;
23
+ readonly includedObjectDigest: ProtocolDigest;
24
+ readonly boardEntryDigest: ProtocolDigest;
25
+ readonly boardRoot: ProtocolDigest;
26
+ readonly boardEntryCount?: number;
27
+ readonly boardEntryMerklePath?: readonly BoardEntryMerklePathStep[];
28
+ readonly boardEntryDigests?: readonly ProtocolDigest[];
29
+ readonly inclusionProofDigest: ProtocolDigest;
30
+ };
31
+ export type AppendOnlyConsistencyProof = {
32
+ readonly proofType: 'SignedHeadChain';
33
+ readonly fromBoardHeadDigest: ProtocolDigest | null;
34
+ readonly toBoardHeadDigest: ProtocolDigest;
35
+ readonly signedBoardHeads: readonly SignedBoardHead[];
36
+ };
37
+ export type BoardConsistencyInput = {
38
+ readonly ceremonyId: string;
39
+ readonly boardPolicyDigest: ProtocolDigest;
40
+ readonly signedBoardHeads: readonly SignedBoardHead[];
41
+ readonly expectedBoardPublicKeyDigest: ProtocolDigest;
42
+ readonly inclusionProofs?: readonly InclusionProof[];
43
+ readonly consistencyProofs?: readonly AppendOnlyConsistencyProof[];
44
+ readonly conflictingHeadEvidence?: readonly ConflictingHeadEvidence[];
45
+ };
46
+ export type BoardConsistencyVerification = StructuredProtocolVerificationResult & {
47
+ readonly verifiedHeadDigests: readonly ProtocolDigest[];
48
+ };
49
+ export type CastReceipt = {
50
+ readonly objectType: 'CastReceipt';
51
+ readonly objectVersion: 1;
52
+ readonly castReceiptDigest: ProtocolDigest;
53
+ readonly ceremonyId: string;
54
+ readonly electionManifestDigest: ProtocolDigest;
55
+ readonly voterIdentity: string;
56
+ readonly ballotPackageDigest: ProtocolDigest;
57
+ readonly boardSequence: number;
58
+ readonly boardPosition: number;
59
+ readonly recoveryEpoch: number;
60
+ readonly deviceEpoch: number;
61
+ readonly contextDigest: ProtocolDigest;
62
+ readonly signature: ProtocolSignatureEnvelope;
63
+ };
64
+ export type CloseRecordKind = 'RegistrationClosed' | 'VotingClosed';
65
+ export type CloseRecord = {
66
+ readonly objectType: 'CloseRecord';
67
+ readonly objectVersion: 1;
68
+ readonly closeRecordDigest: ProtocolDigest;
69
+ readonly ceremonyId: string;
70
+ readonly electionManifestDigest: ProtocolDigest;
71
+ readonly closeKind: CloseRecordKind;
72
+ readonly closedBoardHeadDigest: ProtocolDigest;
73
+ readonly postVotingClosedContextDigest: ProtocolDigest | null;
74
+ readonly boardSequence: number;
75
+ readonly boardPosition: number;
76
+ readonly organizerIdentity: string;
77
+ readonly signature: ProtocolSignatureEnvelope;
78
+ };
79
+ export type CastReceiptVerificationInput = {
80
+ readonly boardEvidence: BoardConsistencyInput;
81
+ readonly receipt: CastReceipt;
82
+ readonly receiptInclusionProof: InclusionProof;
83
+ readonly expectedElectionManifestDigest: ProtocolDigest;
84
+ readonly expectedVoterPublicKeyDigest: ProtocolDigest;
85
+ };
86
+ export type CastReceiptVerification = StructuredProtocolVerificationResult & {
87
+ readonly castReceiptDigest?: ProtocolDigest;
88
+ };
89
+ export type CloseRecordVerificationInput = {
90
+ readonly boardEvidence: BoardConsistencyInput;
91
+ readonly closeRecord: CloseRecord;
92
+ readonly closeRecordInclusionProof: InclusionProof;
93
+ readonly expectedElectionManifestDigest: ProtocolDigest;
94
+ readonly expectedOrganizerIdentity: string;
95
+ readonly expectedOrganizerPublicKeyDigest: ProtocolDigest;
96
+ };
97
+ export type CloseRecordVerification = StructuredProtocolVerificationResult & {
98
+ readonly closeRecordDigest?: ProtocolDigest;
99
+ readonly postVotingClosedContextDigest?: ProtocolDigest;
100
+ };
101
+ export type WitnessPolicy = {
102
+ readonly witnessPolicyDigest: ProtocolDigest;
103
+ readonly witnessIdentities: readonly string[];
104
+ readonly witnessQuorum: number;
105
+ readonly totalWitnesses: number;
106
+ };
107
+ export type TargetFinalityPolicy = {
108
+ readonly targetFinalityPolicyDigest: ProtocolDigest;
109
+ readonly targetFinalityScope: string;
110
+ readonly witnessQuorum: number;
111
+ readonly totalWitnesses: number;
112
+ };
113
+ export type TargetProposal = {
114
+ readonly targetProposalDigest: ProtocolDigest;
115
+ readonly ceremonyId: string;
116
+ readonly electionManifestDigest: ProtocolDigest;
117
+ readonly evaluationContextDigest: ProtocolDigest;
118
+ readonly topKEvaluationRecordDigest: ProtocolDigest;
119
+ readonly topKCiphertextDigest: ProtocolDigest;
120
+ readonly publicSlotMaskDigest: ProtocolDigest;
121
+ readonly targetCiphertextDigest: ProtocolDigest;
122
+ readonly targetLayoutDigest: ProtocolDigest;
123
+ readonly evaluationProofProfileDigest: ProtocolDigest;
124
+ readonly targetFinalityPolicyDigest: ProtocolDigest;
125
+ };
126
+ export type TargetFinalityCheckpoint = TargetProposal & {
127
+ readonly objectType: 'TargetFinalityCheckpoint';
128
+ readonly objectVersion: 1;
129
+ readonly targetFinalityCheckpointDigest: ProtocolDigest;
130
+ readonly boardPolicyDigest: ProtocolDigest;
131
+ readonly finalizedBoardHeadDigest: ProtocolDigest;
132
+ readonly witnessPolicyDigest: ProtocolDigest;
133
+ };
134
+ export type WitnessCheckpoint = {
135
+ readonly objectType: 'WitnessCheckpoint';
136
+ readonly objectVersion: 1;
137
+ readonly checkpointDigest: ProtocolDigest;
138
+ readonly ceremonyId: string;
139
+ readonly targetFinalityScope: string;
140
+ readonly targetProposalDigest: ProtocolDigest;
141
+ readonly targetFinalityCheckpointDigest: ProtocolDigest;
142
+ readonly witnessPolicyDigest: ProtocolDigest;
143
+ readonly targetFinalityPolicyDigest: ProtocolDigest;
144
+ readonly witnessIdentity: string;
145
+ readonly signature: ProtocolSignatureEnvelope;
146
+ };
147
+ export type TargetFinalityRecord = {
148
+ readonly objectType: 'TargetFinalityRecord';
149
+ readonly objectVersion: 1;
150
+ readonly targetFinalityRecordDigest: ProtocolDigest;
151
+ readonly ceremonyId: string;
152
+ readonly targetFinalityScope: string;
153
+ readonly targetProposalDigest: ProtocolDigest;
154
+ readonly targetFinalityCheckpoint: TargetFinalityCheckpoint;
155
+ readonly witnessPolicyDigest: ProtocolDigest;
156
+ readonly targetFinalityPolicyDigest: ProtocolDigest;
157
+ readonly inclusionProof: InclusionProof;
158
+ readonly witnessCheckpoints: readonly WitnessCheckpoint[];
159
+ };
160
+ export type TargetFinalityVerificationInput = {
161
+ readonly boardEvidence: BoardConsistencyInput;
162
+ readonly record: TargetFinalityRecord;
163
+ readonly targetFinalityPolicy: TargetFinalityPolicy;
164
+ readonly witnessPolicy: WitnessPolicy;
165
+ readonly witnessPublicKeyDigests: Readonly<Record<string, ProtocolDigest>>;
166
+ readonly conflictingRecords?: readonly TargetFinalityRecord[];
167
+ };
168
+ export type TargetFinalityVerification = StructuredProtocolVerificationResult & {
169
+ readonly targetFinalityRecordDigest?: ProtocolDigest;
170
+ readonly targetProposalDigest?: ProtocolDigest;
171
+ readonly targetFinalityCheckpointDigest?: ProtocolDigest;
172
+ readonly validWitnessIdentities: readonly string[];
173
+ readonly equivocatingWitnessIdentities: readonly string[];
174
+ };
175
+ export type AcceptedTargetFinalityCheckpoint = {
176
+ readonly targetFinalityRecordDigest: ProtocolDigest;
177
+ readonly targetProposalDigest: ProtocolDigest;
178
+ readonly targetFinalityCheckpointDigest: ProtocolDigest;
179
+ readonly finalizedBoardHeadDigest: ProtocolDigest;
180
+ readonly topKEvaluationRecordDigest: ProtocolDigest;
181
+ readonly evaluationContextDigest: ProtocolDigest;
182
+ readonly topKCiphertextDigest: ProtocolDigest;
183
+ readonly publicSlotMaskDigest: ProtocolDigest;
184
+ readonly targetCiphertextDigest: ProtocolDigest;
185
+ readonly targetLayoutDigest: ProtocolDigest;
186
+ readonly evaluationProofProfileDigest: ProtocolDigest;
187
+ readonly targetFinalityScope: string;
188
+ readonly witnessPolicyDigest: ProtocolDigest;
189
+ readonly targetFinalityPolicyDigest: ProtocolDigest;
190
+ };
191
+ export type EvaluationProofRecord = {
192
+ readonly objectType: 'EvaluationProofRecord';
193
+ readonly objectVersion: 1;
194
+ readonly evaluationProofRecordDigest: ProtocolDigest;
195
+ readonly ceremonyId: string;
196
+ readonly electionManifestDigest: ProtocolDigest;
197
+ readonly targetProposalDigest: ProtocolDigest;
198
+ readonly topKEvaluationRecordDigest: ProtocolDigest;
199
+ readonly targetFinalityRecordDigest: ProtocolDigest;
200
+ readonly evaluationProofProfileDigest: ProtocolDigest;
201
+ readonly evaluationContextDigest: ProtocolDigest;
202
+ readonly topKCiphertextDigest: ProtocolDigest;
203
+ readonly publicSlotMaskDigest: ProtocolDigest;
204
+ readonly targetCiphertextDigest: ProtocolDigest;
205
+ readonly targetLayoutDigest: ProtocolDigest;
206
+ readonly proofRoot: ProtocolDigest;
207
+ readonly boardSequence: number;
208
+ readonly boardPosition: number;
209
+ };
210
+ export type LocalReplayRecord = {
211
+ readonly objectType: 'LocalReplayRecord';
212
+ readonly objectVersion: 1;
213
+ readonly localReplayRecordDigest: ProtocolDigest;
214
+ readonly ceremonyId: string;
215
+ readonly electionManifestDigest: ProtocolDigest;
216
+ readonly participantIdentity: string;
217
+ readonly targetProposalDigest: ProtocolDigest;
218
+ readonly targetFinalityRecordDigest: ProtocolDigest;
219
+ readonly evaluationProofRecordDigest: ProtocolDigest;
220
+ readonly replayContextDigest: ProtocolDigest;
221
+ readonly recoveryEpoch: number;
222
+ readonly deviceEpoch: number;
223
+ readonly mobileReplayCertDigest: ProtocolDigest;
224
+ readonly signature: ProtocolSignatureEnvelope;
225
+ };
226
+ export type TargetAcceptedRecord = {
227
+ readonly objectType: 'TargetAcceptedRecord';
228
+ readonly objectVersion: 1;
229
+ readonly targetAcceptedRecordDigest: ProtocolDigest;
230
+ readonly ceremonyId: string;
231
+ readonly electionManifestDigest: ProtocolDigest;
232
+ readonly targetFinalityScope: string;
233
+ readonly targetProposalDigest: ProtocolDigest;
234
+ readonly topKEvaluationRecordDigest: ProtocolDigest;
235
+ readonly targetContextDigest: ProtocolDigest;
236
+ readonly targetFinalityRecordDigest: ProtocolDigest;
237
+ readonly targetFinalityCheckpointDigest: ProtocolDigest;
238
+ readonly evaluationProofRecordDigest: ProtocolDigest;
239
+ readonly evaluationProofProfileDigest: ProtocolDigest;
240
+ readonly targetPreimageDigest: ProtocolDigest;
241
+ readonly targetCiphertextDigest: ProtocolDigest;
242
+ readonly targetLayoutDigest: ProtocolDigest;
243
+ readonly cpadProfileDigest: ProtocolDigest;
244
+ readonly cpadProfileId: string;
245
+ readonly thresholdDecryptionProfileDigest: ProtocolDigest;
246
+ readonly thresholdDecryptionProfileId: string;
247
+ readonly bgvAsyncThresholdCPADProfileDigest: ProtocolDigest;
248
+ readonly targetBasisDigest: ProtocolDigest;
249
+ readonly acceptanceMode: 'evaluation-proof';
250
+ readonly boardSequence: number;
251
+ readonly boardPosition: number;
252
+ readonly organizerIdentity: string;
253
+ readonly signature: ProtocolSignatureEnvelope;
254
+ };
255
+ export type TopKDecryptionShareShell = {
256
+ readonly objectType: 'TopKDecryptionShare';
257
+ readonly objectVersion: 1;
258
+ readonly topKDecryptionShareDigest: ProtocolDigest;
259
+ readonly ceremonyId: string;
260
+ readonly electionManifestDigest: ProtocolDigest;
261
+ readonly trusteeIdentity: string;
262
+ readonly targetAcceptedRecordDigest: ProtocolDigest;
263
+ readonly targetProposalDigest: ProtocolDigest;
264
+ readonly targetPreimageDigest: ProtocolDigest;
265
+ readonly targetFinalityRecordDigest: ProtocolDigest;
266
+ readonly targetFinalityCheckpointDigest: ProtocolDigest;
267
+ readonly evaluationProofRecordDigest: ProtocolDigest;
268
+ readonly topKEvaluationRecordDigest: ProtocolDigest;
269
+ readonly targetContextDigest: ProtocolDigest;
270
+ readonly targetCiphertextDigest: ProtocolDigest;
271
+ readonly cpadProfileDigest: ProtocolDigest;
272
+ readonly thresholdDecryptionProfileDigest: ProtocolDigest;
273
+ readonly bgvAsyncThresholdCPADProfileDigest: ProtocolDigest;
274
+ readonly targetDecryptionPreparationRecordDigest: ProtocolDigest;
275
+ readonly targetDecryptionCiphertextDigest: ProtocolDigest;
276
+ readonly targetBasisDigest: ProtocolDigest;
277
+ readonly thresholdShareVerificationKeyRoot: ProtocolDigest;
278
+ readonly thresholdShareVerificationKeyDigest: ProtocolDigest;
279
+ readonly trusteeThresholdVerificationKeyDigest: ProtocolDigest;
280
+ readonly boardSequence: number;
281
+ readonly boardPosition: number;
282
+ readonly recoveryEpoch: number;
283
+ readonly deviceEpoch: number;
284
+ readonly shareRoot: ProtocolDigest;
285
+ readonly signature: ProtocolSignatureEnvelope;
286
+ };
287
+ export type LocalReplayRecordVerificationInput = {
288
+ readonly boardEvidence: BoardConsistencyInput;
289
+ readonly record: LocalReplayRecord;
290
+ readonly recordInclusionProof: InclusionProof;
291
+ readonly targetFinalityRecord: TargetFinalityRecord;
292
+ readonly targetFinalityVerification: TargetFinalityVerification;
293
+ readonly evaluationProofRecord: EvaluationProofRecord;
294
+ readonly expectedSignerPublicKeyDigest: ProtocolDigest;
295
+ };
296
+ export type LocalReplayRecordVerification = StructuredProtocolVerificationResult & {
297
+ readonly localReplayRecordDigest?: ProtocolDigest;
298
+ readonly targetFinalityRecordDigest?: ProtocolDigest;
299
+ };
300
+ export type TargetAcceptedRecordVerificationInput = {
301
+ readonly boardEvidence: BoardConsistencyInput;
302
+ readonly targetAcceptedRecord: TargetAcceptedRecord;
303
+ readonly targetAcceptedRecordInclusionProof: InclusionProof;
304
+ readonly targetFinalityRecord: TargetFinalityRecord;
305
+ readonly targetFinalityVerification: TargetFinalityVerification;
306
+ readonly evaluationProofRecord: EvaluationProofRecord;
307
+ readonly expectedOrganizerPublicKeyDigest: ProtocolDigest;
308
+ };
309
+ export type TargetAcceptedRecordVerification = StructuredProtocolVerificationResult & {
310
+ readonly targetAcceptedRecordDigest?: ProtocolDigest;
311
+ readonly targetFinalityRecordDigest?: ProtocolDigest;
312
+ };
313
+ export type TopKDecryptionShareShellVerificationInput = {
314
+ readonly boardEvidence: BoardConsistencyInput;
315
+ readonly decryptionShare: TopKDecryptionShareShell;
316
+ readonly decryptionShareInclusionProof: InclusionProof;
317
+ readonly targetAcceptedRecord: TargetAcceptedRecord;
318
+ readonly targetAcceptedRecordVerification: TargetAcceptedRecordVerification;
319
+ readonly expectedTrusteePublicKeyDigest: ProtocolDigest;
320
+ };
321
+ export type TopKDecryptionShareShellVerification = StructuredProtocolVerificationResult & {
322
+ readonly topKDecryptionShareDigest?: ProtocolDigest;
323
+ readonly targetAcceptedRecordDigest?: ProtocolDigest;
324
+ readonly targetFinalityRecordDigest?: ProtocolDigest;
325
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,111 @@
1
+ import { shake256 } from '@noble/hashes/sha3.js';
2
+ import { bytesToHex } from '@noble/hashes/utils.js';
3
+ const textEncoder = new TextEncoder();
4
+ const hash512PreimagePrefix = textEncoder.encode('sealed.vote/v1/hash512');
5
+ const isCanonicalInteger = (value) => Number.isSafeInteger(value) && !Object.is(value, -0);
6
+ const isPlainObject = (value) => typeof value === 'object' &&
7
+ value !== null &&
8
+ !Array.isArray(value) &&
9
+ Object.getPrototypeOf(value) === Object.prototype;
10
+ const hasOwnProperty = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
11
+ const containsLoneSurrogate = (value) => {
12
+ for (let index = 0; index < value.length; index += 1) {
13
+ const codeUnit = value.charCodeAt(index);
14
+ if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
15
+ const nextCodeUnit = value.charCodeAt(index + 1);
16
+ if (index + 1 >= value.length ||
17
+ nextCodeUnit < 0xdc00 ||
18
+ nextCodeUnit > 0xdfff) {
19
+ return true;
20
+ }
21
+ index += 1;
22
+ }
23
+ else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {
24
+ return true;
25
+ }
26
+ }
27
+ return false;
28
+ };
29
+ const normalizeCanonicalString = (value) => {
30
+ if (containsLoneSurrogate(value)) {
31
+ throw new TypeError('Canonical strings cannot contain lone UTF-16 surrogates.');
32
+ }
33
+ return value.normalize('NFC');
34
+ };
35
+ const normalizeCanonicalValue = (value) => {
36
+ if (value === null) {
37
+ return null;
38
+ }
39
+ if (typeof value === 'string') {
40
+ return normalizeCanonicalString(value);
41
+ }
42
+ if (typeof value === 'boolean') {
43
+ return value;
44
+ }
45
+ if (typeof value === 'number') {
46
+ if (!isCanonicalInteger(value)) {
47
+ throw new TypeError('Canonical numeric fields must be safe integers.');
48
+ }
49
+ return value;
50
+ }
51
+ if (Array.isArray(value)) {
52
+ const normalized = [];
53
+ for (let index = 0; index < value.length; index += 1) {
54
+ if (!hasOwnProperty(value, index)) {
55
+ throw new TypeError('Canonical arrays cannot be sparse.');
56
+ }
57
+ normalized.push(normalizeCanonicalValue(value[index]));
58
+ }
59
+ return normalized;
60
+ }
61
+ if (isPlainObject(value)) {
62
+ const normalized = Object.create(null);
63
+ for (const key of Object.keys(value).sort()) {
64
+ const normalizedKey = normalizeCanonicalString(key);
65
+ if (hasOwnProperty(normalized, normalizedKey)) {
66
+ throw new TypeError('Canonical object keys must be unique after NFC normalization.');
67
+ }
68
+ const entry = value[key];
69
+ if (entry === undefined) {
70
+ throw new TypeError('Canonical objects cannot contain undefined.');
71
+ }
72
+ normalized[normalizedKey] = normalizeCanonicalValue(entry);
73
+ }
74
+ return normalized;
75
+ }
76
+ throw new TypeError('Unsupported canonical value.');
77
+ };
78
+ export const canonicalJson = (value) => JSON.stringify(normalizeCanonicalValue(value));
79
+ const appendVarUint = (output, value) => {
80
+ if (!Number.isSafeInteger(value) || value < 0) {
81
+ throw new TypeError('Varuint values must be non-negative safe integers.');
82
+ }
83
+ let remainingValue = value;
84
+ for (;;) {
85
+ let byte = remainingValue & 0x7f;
86
+ remainingValue = Math.floor(remainingValue / 128);
87
+ if (remainingValue !== 0) {
88
+ byte |= 0x80;
89
+ }
90
+ output.push(byte);
91
+ if (remainingValue === 0) {
92
+ break;
93
+ }
94
+ }
95
+ };
96
+ const appendBytes = (output, value) => {
97
+ appendVarUint(output, value.byteLength);
98
+ for (let index = 0; index < value.byteLength; index += 1) {
99
+ output.push(value[index] ?? 0);
100
+ }
101
+ };
102
+ export const hash512 = (domain, parts) => {
103
+ const preimage = Array.from(hash512PreimagePrefix);
104
+ appendBytes(preimage, textEncoder.encode(domain));
105
+ appendVarUint(preimage, parts.length);
106
+ for (const part of parts) {
107
+ appendBytes(preimage, part);
108
+ }
109
+ return shake256(Uint8Array.from(preimage), { dkLen: 64 });
110
+ };
111
+ export const hash512Hex = (domain, parts) => bytesToHex(hash512(domain, parts));
@@ -0,0 +1,29 @@
1
+ import { protocolDigestNamespaceValues } from '../types.js';
2
+ import { canonicalJson, hash512Hex } from './canonical-json.js';
3
+ export { protocolDigestNamespaceValues };
4
+ const textEncoder = new TextEncoder();
5
+ const protocolDigestNamespaceSet = new Set(protocolDigestNamespaceValues);
6
+ const pascalCaseToKebabCase = (value) => value
7
+ .replace(/([A-Z]+)([A-Z][a-z])/gu, '$1-$2')
8
+ .replace(/([a-z0-9])([A-Z])/gu, '$1-$2')
9
+ .toLowerCase();
10
+ const reservedProtocolDigestDomainSet = new Set(protocolDigestNamespaceValues.map((reservedNamespace) => `sealed-lattice-root/${pascalCaseToKebabCase(reservedNamespace)}-v1`));
11
+ export const resolveProtocolDigestDomain = (namespace) => {
12
+ if (protocolDigestNamespaceSet.has(namespace)) {
13
+ return `sealed-lattice-root/${pascalCaseToKebabCase(namespace)}-v1`;
14
+ }
15
+ if (namespace.startsWith('sealed-lattice-root/')) {
16
+ if (reservedProtocolDigestDomainSet.has(namespace)) {
17
+ return namespace;
18
+ }
19
+ throw new TypeError('Protocol digest namespace domain must be reserved in the transcript-core registry.');
20
+ }
21
+ if (!/^[A-Z][A-Za-z0-9]*$/u.test(namespace)) {
22
+ throw new TypeError('Protocol digest namespace must be a reserved PascalCase name.');
23
+ }
24
+ throw new TypeError('Protocol digest namespace must be reserved in the transcript-core registry.');
25
+ };
26
+ export const deriveProtocolDigest = (namespace, value) => hash512Hex(resolveProtocolDigestDomain(namespace), [
27
+ textEncoder.encode(canonicalJson(value)),
28
+ ]);
29
+ export const derivePolicyDigest = (namespace, policy) => deriveProtocolDigest(namespace, policy);
@@ -0,0 +1,3 @@
1
+ export { canonicalJson, hash512, hash512Hex } from './canonical-json.js';
2
+ export { derivePolicyDigest, deriveProtocolDigest, protocolDigestNamespaceValues, resolveProtocolDigestDomain, } from './digests.js';
3
+ export { createMlDsaKeyPairFixture, createMlDsaSignatureProfileFixture, createProtocolSignatureFixture, deriveCanonicalSignedRootDigest, deriveMlDsaContextByteLength, deriveMlDsaPublicKeyDigest, deriveProtocolSignatureDigest, verifySignedObjectSignature, } from './signatures.js';