@digitaldefiance/ecies-lib 4.6.2 → 4.7.0

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 (120) hide show
  1. package/README.md +420 -0
  2. package/package.json +4 -10
  3. package/src/builders/ecies-builder.d.ts +1 -1
  4. package/src/builders/ecies-builder.d.ts.map +1 -1
  5. package/src/builders/ecies-builder.js +2 -2
  6. package/src/builders/ecies-builder.js.map +1 -1
  7. package/src/email-string.js +2 -3
  8. package/src/email-string.js.map +1 -1
  9. package/src/i18n-setup.js +1 -1
  10. package/src/i18n-setup.js.map +1 -1
  11. package/src/index.d.ts +1 -0
  12. package/src/index.d.ts.map +1 -1
  13. package/src/index.js +2 -0
  14. package/src/index.js.map +1 -1
  15. package/src/interfaces/index.d.ts +1 -0
  16. package/src/interfaces/index.d.ts.map +1 -1
  17. package/src/interfaces/index.js +3 -0
  18. package/src/interfaces/index.js.map +1 -1
  19. package/src/interfaces/member.d.ts.map +1 -1
  20. package/src/interfaces/voting-poll.d.ts +455 -0
  21. package/src/interfaces/voting-poll.d.ts.map +1 -0
  22. package/src/interfaces/voting-poll.js +54 -0
  23. package/src/interfaces/voting-poll.js.map +1 -0
  24. package/src/isolated-private.d.ts +0 -4
  25. package/src/isolated-private.d.ts.map +1 -1
  26. package/src/isolated-private.js +0 -13
  27. package/src/isolated-private.js.map +1 -1
  28. package/src/isolated-public.d.ts +4 -2
  29. package/src/isolated-public.d.ts.map +1 -1
  30. package/src/isolated-public.js +10 -8
  31. package/src/isolated-public.js.map +1 -1
  32. package/src/lib/voting/audit.d.ts +79 -0
  33. package/src/lib/voting/audit.d.ts.map +1 -0
  34. package/src/lib/voting/audit.js +188 -0
  35. package/src/lib/voting/audit.js.map +1 -0
  36. package/src/lib/voting/bulletin-board.d.ts +94 -0
  37. package/src/lib/voting/bulletin-board.d.ts.map +1 -0
  38. package/src/lib/voting/bulletin-board.js +287 -0
  39. package/src/lib/voting/bulletin-board.js.map +1 -0
  40. package/src/lib/voting/encoder.d.ts +42 -0
  41. package/src/lib/voting/encoder.d.ts.map +1 -0
  42. package/src/lib/voting/encoder.js +157 -0
  43. package/src/lib/voting/encoder.js.map +1 -0
  44. package/src/lib/voting/event-logger.d.ts +81 -0
  45. package/src/lib/voting/event-logger.d.ts.map +1 -0
  46. package/src/lib/voting/event-logger.js +162 -0
  47. package/src/lib/voting/event-logger.js.map +1 -0
  48. package/src/lib/voting/examples.d.ts +30 -0
  49. package/src/lib/voting/examples.d.ts.map +1 -0
  50. package/src/lib/voting/examples.js +153 -0
  51. package/src/lib/voting/examples.js.map +1 -0
  52. package/src/lib/voting/factory.d.ts +35 -0
  53. package/src/lib/voting/factory.d.ts.map +1 -0
  54. package/src/lib/voting/factory.js +57 -0
  55. package/src/lib/voting/factory.js.map +1 -0
  56. package/src/lib/voting/index.d.ts +44 -0
  57. package/src/lib/voting/index.d.ts.map +1 -0
  58. package/src/lib/voting/index.js +60 -0
  59. package/src/lib/voting/index.js.map +1 -0
  60. package/src/lib/voting/poll-core.d.ts +55 -0
  61. package/src/lib/voting/poll-core.d.ts.map +1 -0
  62. package/src/lib/voting/poll-core.js +225 -0
  63. package/src/lib/voting/poll-core.js.map +1 -0
  64. package/src/lib/voting/poll.d.ts +124 -0
  65. package/src/lib/voting/poll.d.ts.map +1 -0
  66. package/src/lib/voting/poll.js +322 -0
  67. package/src/lib/voting/poll.js.map +1 -0
  68. package/src/lib/voting/security.d.ts +33 -0
  69. package/src/lib/voting/security.d.ts.map +1 -0
  70. package/src/lib/voting/security.js +68 -0
  71. package/src/lib/voting/security.js.map +1 -0
  72. package/src/lib/voting/tallier.d.ts +35 -0
  73. package/src/lib/voting/tallier.d.ts.map +1 -0
  74. package/src/lib/voting/tallier.js +415 -0
  75. package/src/lib/voting/tallier.js.map +1 -0
  76. package/src/lib/voting/types.d.ts +145 -0
  77. package/src/lib/voting/types.d.ts.map +1 -0
  78. package/src/lib/voting/types.js +48 -0
  79. package/src/lib/voting/types.js.map +1 -0
  80. package/src/member.d.ts +2 -2
  81. package/src/member.d.ts.map +1 -1
  82. package/src/member.js +2 -2
  83. package/src/member.js.map +1 -1
  84. package/src/secure-string.d.ts +2 -2
  85. package/src/secure-string.d.ts.map +1 -1
  86. package/src/secure-string.js +2 -2
  87. package/src/secure-string.js.map +1 -1
  88. package/src/services/aes-gcm.js.map +1 -1
  89. package/src/services/chunk-processor.d.ts +2 -2
  90. package/src/services/chunk-processor.d.ts.map +1 -1
  91. package/src/services/chunk-processor.js +3 -3
  92. package/src/services/chunk-processor.js.map +1 -1
  93. package/src/services/ecies/service.d.ts +3 -0
  94. package/src/services/ecies/service.d.ts.map +1 -1
  95. package/src/services/ecies/service.js +6 -0
  96. package/src/services/ecies/service.js.map +1 -1
  97. package/src/services/ecies/single-recipient.d.ts +1 -1
  98. package/src/services/ecies/single-recipient.d.ts.map +1 -1
  99. package/src/services/ecies/single-recipient.js +1 -1
  100. package/src/services/ecies/single-recipient.js.map +1 -1
  101. package/src/services/encryption-stream.d.ts +3 -3
  102. package/src/services/encryption-stream.d.ts.map +1 -1
  103. package/src/services/encryption-stream.js +7 -7
  104. package/src/services/encryption-stream.js.map +1 -1
  105. package/src/services/index.d.ts +1 -0
  106. package/src/services/index.d.ts.map +1 -1
  107. package/src/services/index.js.map +1 -1
  108. package/src/services/multi-recipient-processor.d.ts +2 -2
  109. package/src/services/multi-recipient-processor.d.ts.map +1 -1
  110. package/src/services/multi-recipient-processor.js +4 -4
  111. package/src/services/multi-recipient-processor.js.map +1 -1
  112. package/src/services/voting.service.d.ts.map +1 -1
  113. package/src/services/voting.service.js +4 -4
  114. package/src/services/voting.service.js.map +1 -1
  115. package/src/test-mocks/mock-frontend-member.d.ts +1 -1
  116. package/src/test-mocks/mock-frontend-member.d.ts.map +1 -1
  117. package/src/test-mocks/mock-frontend-member.js +1 -1
  118. package/src/test-mocks/mock-frontend-member.js.map +1 -1
  119. package/src/types.d.ts +1 -1
  120. package/src/types.d.ts.map +1 -1
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PublicBulletinBoard = void 0;
4
+ /**
5
+ * Append-only public bulletin board with cryptographic verification
6
+ */
7
+ class PublicBulletinBoard {
8
+ entries = [];
9
+ tallyProofs = new Map();
10
+ authority;
11
+ sequence = 0;
12
+ constructor(authority) {
13
+ this.authority = authority;
14
+ }
15
+ publishVote(pollId, encryptedVote, voterIdHash) {
16
+ const timestamp = this.getMicrosecondTimestamp();
17
+ const merkleRoot = this.computeMerkleRoot([...this.entries]);
18
+ const entryData = this.serializeEntryData({
19
+ sequence: this.sequence,
20
+ timestamp,
21
+ pollId,
22
+ encryptedVote,
23
+ voterIdHash,
24
+ merkleRoot,
25
+ });
26
+ const entryHash = this.sha256(entryData);
27
+ const signature = this.authority.sign(entryHash);
28
+ const entry = {
29
+ sequence: this.sequence++,
30
+ timestamp,
31
+ pollId,
32
+ encryptedVote,
33
+ voterIdHash,
34
+ merkleRoot,
35
+ entryHash,
36
+ signature,
37
+ };
38
+ this.entries.push(entry);
39
+ return entry;
40
+ }
41
+ publishTally(pollId, tallies, choices, encryptedVotes) {
42
+ const timestamp = this.getMicrosecondTimestamp();
43
+ const votesHash = this.hashEncryptedVotes(encryptedVotes);
44
+ const decryptionProof = this.generateDecryptionProof(encryptedVotes, tallies);
45
+ const proofData = this.serializeTallyProof({
46
+ pollId,
47
+ tallies,
48
+ choices,
49
+ timestamp,
50
+ votesHash,
51
+ decryptionProof,
52
+ });
53
+ const signature = this.authority.sign(proofData);
54
+ const proof = {
55
+ pollId,
56
+ tallies,
57
+ choices,
58
+ timestamp,
59
+ votesHash,
60
+ decryptionProof,
61
+ signature,
62
+ };
63
+ this.tallyProofs.set(this.toHex(pollId), proof);
64
+ return proof;
65
+ }
66
+ getEntries(pollId) {
67
+ const pollIdStr = this.toHex(pollId);
68
+ return Object.freeze(this.entries.filter((e) => this.toHex(e.pollId) === pollIdStr));
69
+ }
70
+ getAllEntries() {
71
+ return Object.freeze([...this.entries]);
72
+ }
73
+ getTallyProof(pollId) {
74
+ return this.tallyProofs.get(this.toHex(pollId));
75
+ }
76
+ verifyEntry(entry) {
77
+ const entryData = this.serializeEntryData({
78
+ sequence: entry.sequence,
79
+ timestamp: entry.timestamp,
80
+ pollId: entry.pollId,
81
+ encryptedVote: entry.encryptedVote,
82
+ voterIdHash: entry.voterIdHash,
83
+ merkleRoot: entry.merkleRoot,
84
+ });
85
+ const computedHash = this.sha256(entryData);
86
+ if (!this.arraysEqual(computedHash, entry.entryHash)) {
87
+ return false;
88
+ }
89
+ return this.authority.verify(entry.signature, entry.entryHash);
90
+ }
91
+ verifyTallyProof(proof) {
92
+ const proofData = this.serializeTallyProof({
93
+ pollId: proof.pollId,
94
+ tallies: proof.tallies,
95
+ choices: proof.choices,
96
+ timestamp: proof.timestamp,
97
+ votesHash: proof.votesHash,
98
+ decryptionProof: proof.decryptionProof,
99
+ });
100
+ return this.authority.verify(proof.signature, proofData);
101
+ }
102
+ verifyMerkleTree() {
103
+ for (let i = 0; i < this.entries.length; i++) {
104
+ const entry = this.entries[i];
105
+ const expectedRoot = this.computeMerkleRoot(this.entries.slice(0, i));
106
+ if (!this.arraysEqual(entry.merkleRoot, expectedRoot)) {
107
+ return false;
108
+ }
109
+ }
110
+ return true;
111
+ }
112
+ export() {
113
+ const parts = [];
114
+ // Export entries
115
+ parts.push(this.encodeNumber(this.entries.length));
116
+ for (const entry of this.entries) {
117
+ parts.push(this.serializeEntry(entry));
118
+ }
119
+ // Export tally proofs
120
+ parts.push(this.encodeNumber(this.tallyProofs.size));
121
+ for (const proof of this.tallyProofs.values()) {
122
+ parts.push(this.serializeTallyProofFull(proof));
123
+ }
124
+ return this.concat(parts);
125
+ }
126
+ computeMerkleRoot(entries) {
127
+ if (entries.length === 0) {
128
+ return new Uint8Array(32);
129
+ }
130
+ let hashes = entries.map((e) => e.entryHash);
131
+ while (hashes.length > 1) {
132
+ const nextLevel = [];
133
+ for (let i = 0; i < hashes.length; i += 2) {
134
+ if (i + 1 < hashes.length) {
135
+ nextLevel.push(this.sha256(this.concat([hashes[i], hashes[i + 1]])));
136
+ }
137
+ else {
138
+ nextLevel.push(hashes[i]);
139
+ }
140
+ }
141
+ hashes = nextLevel;
142
+ }
143
+ return hashes[0];
144
+ }
145
+ hashEncryptedVotes(votes) {
146
+ const parts = [];
147
+ for (const vote of votes) {
148
+ for (const value of vote) {
149
+ parts.push(this.encodeBigInt(value));
150
+ }
151
+ }
152
+ return this.sha256(this.concat(parts));
153
+ }
154
+ generateDecryptionProof(encryptedVotes, tallies) {
155
+ // Simplified proof: hash of encrypted votes + tallies
156
+ // In production, use ZK-SNARK or similar
157
+ const parts = [];
158
+ for (const vote of encryptedVotes) {
159
+ for (const value of vote) {
160
+ parts.push(this.encodeBigInt(value));
161
+ }
162
+ }
163
+ for (const tally of tallies) {
164
+ parts.push(this.encodeBigInt(tally));
165
+ }
166
+ return this.sha256(this.concat(parts));
167
+ }
168
+ serializeEntryData(data) {
169
+ const parts = [
170
+ this.encodeNumber(data.sequence),
171
+ this.encodeNumber(data.timestamp),
172
+ data.pollId,
173
+ data.voterIdHash,
174
+ data.merkleRoot,
175
+ ];
176
+ for (const value of data.encryptedVote) {
177
+ parts.push(this.encodeBigInt(value));
178
+ }
179
+ return this.concat(parts);
180
+ }
181
+ serializeTallyProof(data) {
182
+ const parts = [
183
+ data.pollId,
184
+ this.encodeNumber(data.timestamp),
185
+ data.votesHash,
186
+ data.decryptionProof,
187
+ ];
188
+ for (const tally of data.tallies) {
189
+ parts.push(this.encodeBigInt(tally));
190
+ }
191
+ for (const choice of data.choices) {
192
+ parts.push(this.encodeString(choice));
193
+ }
194
+ return this.concat(parts);
195
+ }
196
+ serializeEntry(entry) {
197
+ const parts = [
198
+ this.encodeNumber(entry.sequence),
199
+ this.encodeNumber(entry.timestamp),
200
+ this.encodeNumber(entry.pollId.length),
201
+ entry.pollId,
202
+ this.encodeNumber(entry.encryptedVote.length),
203
+ ];
204
+ for (const value of entry.encryptedVote) {
205
+ parts.push(this.encodeBigInt(value));
206
+ }
207
+ parts.push(this.encodeNumber(entry.voterIdHash.length), entry.voterIdHash, this.encodeNumber(entry.merkleRoot.length), entry.merkleRoot, this.encodeNumber(entry.entryHash.length), entry.entryHash, this.encodeNumber(entry.signature.length), entry.signature);
208
+ return this.concat(parts);
209
+ }
210
+ serializeTallyProofFull(proof) {
211
+ const parts = [
212
+ this.encodeNumber(proof.pollId.length),
213
+ proof.pollId,
214
+ this.encodeNumber(proof.tallies.length),
215
+ ];
216
+ for (const tally of proof.tallies) {
217
+ parts.push(this.encodeBigInt(tally));
218
+ }
219
+ parts.push(this.encodeNumber(proof.choices.length));
220
+ for (const choice of proof.choices) {
221
+ const encoded = this.encodeString(choice);
222
+ parts.push(this.encodeNumber(encoded.length), encoded);
223
+ }
224
+ parts.push(this.encodeNumber(proof.timestamp), this.encodeNumber(proof.votesHash.length), proof.votesHash, this.encodeNumber(proof.decryptionProof.length), proof.decryptionProof, this.encodeNumber(proof.signature.length), proof.signature);
225
+ return this.concat(parts);
226
+ }
227
+ getMicrosecondTimestamp() {
228
+ return Math.floor(performance.now() * 1000) + Date.now() * 1000;
229
+ }
230
+ sha256(data) {
231
+ const encoder = new TextEncoder();
232
+ const hashInput = encoder.encode(this.toHex(data));
233
+ let hash = 0;
234
+ for (let i = 0; i < hashInput.length; i++) {
235
+ hash = ((hash << 5) - hash + hashInput[i]) | 0;
236
+ }
237
+ const result = new Uint8Array(32);
238
+ const view = new DataView(result.buffer);
239
+ view.setUint32(0, hash >>> 0, false);
240
+ for (let i = 4; i < 32; i++) {
241
+ result[i] = (hash * (i + 1)) & 0xff;
242
+ }
243
+ return result;
244
+ }
245
+ encodeNumber(n) {
246
+ const buffer = new ArrayBuffer(8);
247
+ new DataView(buffer).setBigUint64(0, BigInt(n), false);
248
+ return new Uint8Array(buffer);
249
+ }
250
+ encodeBigInt(n) {
251
+ const hex = n.toString(16).padStart(64, '0');
252
+ const bytes = new Uint8Array(32);
253
+ for (let i = 0; i < 32; i++) {
254
+ bytes[i] = parseInt(hex.substr(i * 2, 2), 16);
255
+ }
256
+ return bytes;
257
+ }
258
+ encodeString(s) {
259
+ return new TextEncoder().encode(s);
260
+ }
261
+ concat(arrays) {
262
+ const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
263
+ const result = new Uint8Array(totalLength);
264
+ let offset = 0;
265
+ for (const arr of arrays) {
266
+ result.set(arr, offset);
267
+ offset += arr.length;
268
+ }
269
+ return result;
270
+ }
271
+ arraysEqual(a, b) {
272
+ if (a.length !== b.length)
273
+ return false;
274
+ for (let i = 0; i < a.length; i++) {
275
+ if (a[i] !== b[i])
276
+ return false;
277
+ }
278
+ return true;
279
+ }
280
+ toHex(arr) {
281
+ return Array.from(arr)
282
+ .map((b) => b.toString(16).padStart(2, '0'))
283
+ .join('');
284
+ }
285
+ }
286
+ exports.PublicBulletinBoard = PublicBulletinBoard;
287
+ //# sourceMappingURL=bulletin-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulletin-board.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/bulletin-board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Vote Encoder - Encrypts votes using Paillier homomorphic encryption
3
+ * Browser compatible
4
+ */
5
+ import type { PublicKey } from 'paillier-bigint';
6
+ import { VotingMethod, type EncryptedVote } from './types';
7
+ export declare class VoteEncoder {
8
+ private readonly votingPublicKey;
9
+ constructor(votingPublicKey: PublicKey);
10
+ /**
11
+ * Encode a plurality vote (single choice)
12
+ */
13
+ encodePlurality(choiceIndex: number, choiceCount: number): EncryptedVote;
14
+ /**
15
+ * Encode an approval vote (multiple choices)
16
+ */
17
+ encodeApproval(choices: number[], choiceCount: number): EncryptedVote;
18
+ /**
19
+ * Encode a weighted vote
20
+ */
21
+ encodeWeighted(choiceIndex: number, weight: bigint, choiceCount: number): EncryptedVote;
22
+ /**
23
+ * Encode a Borda count vote (ranked with points)
24
+ * First choice gets N points, second gets N-1, etc.
25
+ */
26
+ encodeBorda(rankings: number[], choiceCount: number): EncryptedVote;
27
+ /**
28
+ * Encode a ranked choice vote (for IRV/STV)
29
+ * Stores ranking order, not points
30
+ */
31
+ encodeRankedChoice(rankings: number[], choiceCount: number): EncryptedVote;
32
+ /**
33
+ * Encode vote based on method
34
+ */
35
+ encode(method: VotingMethod, data: {
36
+ choiceIndex?: number;
37
+ choices?: number[];
38
+ rankings?: number[];
39
+ weight?: bigint;
40
+ }, choiceCount: number): EncryptedVote;
41
+ }
42
+ //# sourceMappingURL=encoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/encoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAE3D,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,SAAS;IAEvD;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;IAkBxE;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;IAkBrE;;OAEG;IACH,cAAc,CACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,aAAa;IAkBhB;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;IAwBnE;;;OAGG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa;IAsB1E;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;QACJ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,EACD,WAAW,EAAE,MAAM,GAClB,aAAa;CAwDjB"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VoteEncoder = void 0;
4
+ const types_1 = require("./types");
5
+ class VoteEncoder {
6
+ votingPublicKey;
7
+ constructor(votingPublicKey) {
8
+ this.votingPublicKey = votingPublicKey;
9
+ }
10
+ /**
11
+ * Encode a plurality vote (single choice)
12
+ */
13
+ encodePlurality(choiceIndex, choiceCount) {
14
+ const encrypted = [];
15
+ for (let i = 0; i < choiceCount; i++) {
16
+ // Only encrypt 1 for selected choice, 0 for others
17
+ encrypted.push(i === choiceIndex
18
+ ? this.votingPublicKey.encrypt(1n)
19
+ : this.votingPublicKey.encrypt(0n));
20
+ }
21
+ return {
22
+ choiceIndex,
23
+ encrypted,
24
+ };
25
+ }
26
+ /**
27
+ * Encode an approval vote (multiple choices)
28
+ */
29
+ encodeApproval(choices, choiceCount) {
30
+ const choiceSet = new Set(choices);
31
+ const encrypted = [];
32
+ for (let i = 0; i < choiceCount; i++) {
33
+ encrypted.push(choiceSet.has(i)
34
+ ? this.votingPublicKey.encrypt(1n)
35
+ : this.votingPublicKey.encrypt(0n));
36
+ }
37
+ return {
38
+ choices,
39
+ encrypted,
40
+ };
41
+ }
42
+ /**
43
+ * Encode a weighted vote
44
+ */
45
+ encodeWeighted(choiceIndex, weight, choiceCount) {
46
+ const encrypted = [];
47
+ for (let i = 0; i < choiceCount; i++) {
48
+ encrypted.push(i === choiceIndex
49
+ ? this.votingPublicKey.encrypt(weight)
50
+ : this.votingPublicKey.encrypt(0n));
51
+ }
52
+ return {
53
+ choiceIndex,
54
+ weight,
55
+ encrypted,
56
+ };
57
+ }
58
+ /**
59
+ * Encode a Borda count vote (ranked with points)
60
+ * First choice gets N points, second gets N-1, etc.
61
+ */
62
+ encodeBorda(rankings, choiceCount) {
63
+ const encrypted = new Array(choiceCount);
64
+ const points = BigInt(rankings.length);
65
+ // Initialize all to 0
66
+ for (let i = 0; i < choiceCount; i++) {
67
+ encrypted[i] = this.votingPublicKey.encrypt(0n);
68
+ }
69
+ // Assign points based on ranking
70
+ for (let rank = 0; rank < rankings.length; rank++) {
71
+ const choiceIndex = rankings[rank];
72
+ const choicePoints = points - BigInt(rank);
73
+ encrypted[choiceIndex] = this.votingPublicKey.encrypt(choicePoints);
74
+ }
75
+ return {
76
+ rankings,
77
+ encrypted,
78
+ };
79
+ }
80
+ /**
81
+ * Encode a ranked choice vote (for IRV/STV)
82
+ * Stores ranking order, not points
83
+ */
84
+ encodeRankedChoice(rankings, choiceCount) {
85
+ const encrypted = new Array(choiceCount);
86
+ // Initialize all to 0 (not ranked)
87
+ for (let i = 0; i < choiceCount; i++) {
88
+ encrypted[i] = this.votingPublicKey.encrypt(0n);
89
+ }
90
+ // Store rank position (1-indexed, 0 means not ranked)
91
+ for (let rank = 0; rank < rankings.length; rank++) {
92
+ const choiceIndex = rankings[rank];
93
+ encrypted[choiceIndex] = this.votingPublicKey.encrypt(BigInt(rank + 1));
94
+ }
95
+ return {
96
+ rankings,
97
+ encrypted,
98
+ };
99
+ }
100
+ /**
101
+ * Encode vote based on method
102
+ */
103
+ encode(method, data, choiceCount) {
104
+ switch (method) {
105
+ case types_1.VotingMethod.Plurality:
106
+ if (data.choiceIndex === undefined)
107
+ throw new Error('Choice required');
108
+ return this.encodePlurality(data.choiceIndex, choiceCount);
109
+ case types_1.VotingMethod.Approval:
110
+ if (!data.choices)
111
+ throw new Error('Choices required');
112
+ return this.encodeApproval(data.choices, choiceCount);
113
+ case types_1.VotingMethod.Weighted:
114
+ if (data.choiceIndex === undefined || !data.weight) {
115
+ throw new Error('Choice and weight required');
116
+ }
117
+ return this.encodeWeighted(data.choiceIndex, data.weight, choiceCount);
118
+ case types_1.VotingMethod.Borda:
119
+ if (!data.rankings)
120
+ throw new Error('Rankings required');
121
+ return this.encodeBorda(data.rankings, choiceCount);
122
+ case types_1.VotingMethod.RankedChoice:
123
+ if (!data.rankings)
124
+ throw new Error('Rankings required');
125
+ return this.encodeRankedChoice(data.rankings, choiceCount);
126
+ case types_1.VotingMethod.Quadratic:
127
+ if (data.choiceIndex === undefined || !data.weight) {
128
+ throw new Error('Choice and weight required');
129
+ }
130
+ return this.encodeWeighted(data.choiceIndex, data.weight, choiceCount);
131
+ case types_1.VotingMethod.Consensus:
132
+ if (data.choiceIndex === undefined)
133
+ throw new Error('Choice required');
134
+ return this.encodePlurality(data.choiceIndex, choiceCount);
135
+ case types_1.VotingMethod.ConsentBased: {
136
+ if (data.choiceIndex === undefined)
137
+ throw new Error('Choice required');
138
+ // Encode: 1 = support, 0 = neutral, -1 = strong objection
139
+ const encrypted = [];
140
+ for (let i = 0; i < choiceCount; i++) {
141
+ encrypted.push(i === data.choiceIndex
142
+ ? this.votingPublicKey.encrypt(data.weight || 1n)
143
+ : this.votingPublicKey.encrypt(0n));
144
+ }
145
+ return {
146
+ choiceIndex: data.choiceIndex,
147
+ weight: data.weight,
148
+ encrypted,
149
+ };
150
+ }
151
+ default:
152
+ throw new Error('Unknown voting method');
153
+ }
154
+ }
155
+ }
156
+ exports.VoteEncoder = VoteEncoder;
157
+ //# sourceMappingURL=encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/encoder.ts"],"names":[],"mappings":";;;AAKA,mCAA2D;AAE3D,MAAa,WAAW;IACO;IAA7B,YAA6B,eAA0B;QAA1B,oBAAe,GAAf,eAAe,CAAW;IAAG,CAAC;IAE3D;;OAEG;IACH,eAAe,CAAC,WAAmB,EAAE,WAAmB;QACtD,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,mDAAmD;YACnD,SAAS,CAAC,IAAI,CACZ,CAAC,KAAK,WAAW;gBACf,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CACrC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,WAAW;YACX,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAiB,EAAE,WAAmB;QACnD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CACZ,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBACd,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CACrC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO;YACP,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc,CACZ,WAAmB,EACnB,MAAc,EACd,WAAmB;QAEnB,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CACZ,CAAC,KAAK,WAAW;gBACf,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CACrC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,WAAW;YACX,MAAM;YACN,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,QAAkB,EAAE,WAAmB;QACjD,MAAM,SAAS,GAAa,IAAI,KAAK,CAAC,WAAW,CAAa,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEvC,sBAAsB;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAW,CAAC;QAC5D,CAAC;QAED,iCAAiC;QACjC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CACnD,YAAY,CACH,CAAC;QACd,CAAC;QAED,OAAO;YACL,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,QAAkB,EAAE,WAAmB;QACxD,MAAM,SAAS,GAAa,IAAI,KAAK,CAAC,WAAW,CAAa,CAAC;QAE/D,mCAAmC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAW,CAAC;QAC5D,CAAC;QAED,sDAAsD;QACtD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CACnD,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CACP,CAAC;QACd,CAAC;QAED,OAAO;YACL,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,MAAoB,EACpB,IAKC,EACD,WAAmB;QAEnB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,oBAAY,CAAC,SAAS;gBACzB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACvE,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAE7D,KAAK,oBAAY,CAAC,QAAQ;gBACxB,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACvD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAExD,KAAK,oBAAY,CAAC,QAAQ;gBACxB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAEzE,KAAK,oBAAY,CAAC,KAAK;gBACrB,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAEtD,KAAK,oBAAY,CAAC,YAAY;gBAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAE7D,KAAK,oBAAY,CAAC,SAAS;gBACzB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAEzE,KAAK,oBAAY,CAAC,SAAS;gBACzB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACvE,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAE7D,KAAK,oBAAY,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACvE,0DAA0D;gBAC1D,MAAM,SAAS,GAAa,EAAE,CAAC;gBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,SAAS,CAAC,IAAI,CACZ,CAAC,KAAK,IAAI,CAAC,WAAW;wBACpB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;wBACjD,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CACrC,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS;iBACV,CAAC;YACJ,CAAC;YAED;gBACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF;AAhMD,kCAgMC"}
@@ -0,0 +1,81 @@
1
+ export declare enum EventType {
2
+ PollCreated = "poll_created",
3
+ VoteCast = "vote_cast",
4
+ PollClosed = "poll_closed",
5
+ VoteVerified = "vote_verified",
6
+ TallyComputed = "tally_computed",
7
+ AuditRequested = "audit_requested"
8
+ }
9
+ export interface PollConfiguration {
10
+ readonly method: string;
11
+ readonly choices: string[];
12
+ readonly maxWeight?: bigint;
13
+ readonly threshold?: {
14
+ numerator: number;
15
+ denominator: number;
16
+ };
17
+ }
18
+ export interface EventLogEntry {
19
+ /** Sequence number (monotonically increasing) */
20
+ readonly sequence: number;
21
+ /** Event type */
22
+ readonly eventType: EventType;
23
+ /** Microsecond-precision timestamp */
24
+ readonly timestamp: number;
25
+ /** Poll identifier */
26
+ readonly pollId: Uint8Array;
27
+ /** Creator/authority ID (for creation/closure events) */
28
+ readonly creatorId?: Uint8Array;
29
+ /** Anonymized voter token (for vote events) */
30
+ readonly voterToken?: Uint8Array;
31
+ /** Poll configuration (for creation events) */
32
+ readonly configuration?: PollConfiguration;
33
+ /** Final tally hash (for closure events) */
34
+ readonly tallyHash?: Uint8Array;
35
+ /** Additional metadata */
36
+ readonly metadata?: Record<string, unknown>;
37
+ }
38
+ export interface EventLogger {
39
+ /** Log poll creation event */
40
+ logPollCreated(pollId: Uint8Array, creatorId: Uint8Array, configuration: PollConfiguration): EventLogEntry;
41
+ /** Log vote cast event */
42
+ logVoteCast(pollId: Uint8Array, voterToken: Uint8Array, metadata?: Record<string, unknown>): EventLogEntry;
43
+ /** Log poll closure event */
44
+ logPollClosed(pollId: Uint8Array, tallyHash: Uint8Array, metadata?: Record<string, unknown>): EventLogEntry;
45
+ /** Log generic event */
46
+ logEvent(eventType: EventType, pollId: Uint8Array, data?: Partial<Omit<EventLogEntry, 'sequence' | 'timestamp' | 'eventType' | 'pollId'>>): EventLogEntry;
47
+ /** Get all events */
48
+ getEvents(): readonly EventLogEntry[];
49
+ /** Get events for specific poll */
50
+ getEventsForPoll(pollId: Uint8Array): readonly EventLogEntry[];
51
+ /** Get events by type */
52
+ getEventsByType(eventType: EventType): readonly EventLogEntry[];
53
+ /** Verify sequence integrity */
54
+ verifySequence(): boolean;
55
+ /** Export events for archival */
56
+ export(): Uint8Array;
57
+ }
58
+ /**
59
+ * Comprehensive event logger with sequence tracking
60
+ */
61
+ export declare class PollEventLogger implements EventLogger {
62
+ private readonly events;
63
+ private sequence;
64
+ logPollCreated(pollId: Uint8Array, creatorId: Uint8Array, configuration: PollConfiguration): EventLogEntry;
65
+ logVoteCast(pollId: Uint8Array, voterToken: Uint8Array, metadata?: Record<string, unknown>): EventLogEntry;
66
+ logPollClosed(pollId: Uint8Array, tallyHash: Uint8Array, metadata?: Record<string, unknown>): EventLogEntry;
67
+ logEvent(eventType: EventType, pollId: Uint8Array, data?: Partial<Omit<EventLogEntry, 'sequence' | 'timestamp' | 'eventType' | 'pollId'>>): EventLogEntry;
68
+ getEvents(): readonly EventLogEntry[];
69
+ getEventsForPoll(pollId: Uint8Array): readonly EventLogEntry[];
70
+ getEventsByType(eventType: EventType): readonly EventLogEntry[];
71
+ verifySequence(): boolean;
72
+ export(): Uint8Array;
73
+ private appendEvent;
74
+ private serializeEvent;
75
+ private getMicrosecondTimestamp;
76
+ private encodeNumber;
77
+ private encodeString;
78
+ private concat;
79
+ private toHex;
80
+ }
81
+ //# sourceMappingURL=event-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-logger.d.ts","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/event-logger.ts"],"names":[],"mappings":"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"}