@digitaldefiance/ecies-lib 4.6.3 → 4.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +420 -0
- package/package.json +4 -10
- package/src/builders/ecies-builder.d.ts +1 -1
- package/src/builders/ecies-builder.d.ts.map +1 -1
- package/src/builders/ecies-builder.js +2 -2
- package/src/builders/ecies-builder.js.map +1 -1
- package/src/email-string.js +2 -3
- package/src/email-string.js.map +1 -1
- package/src/i18n-setup.js +1 -1
- package/src/i18n-setup.js.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +2 -0
- package/src/index.js.map +1 -1
- package/src/interfaces/index.d.ts +1 -0
- package/src/interfaces/index.d.ts.map +1 -1
- package/src/interfaces/index.js +3 -0
- package/src/interfaces/index.js.map +1 -1
- package/src/interfaces/voting-poll.d.ts +455 -0
- package/src/interfaces/voting-poll.d.ts.map +1 -0
- package/src/interfaces/voting-poll.js +54 -0
- package/src/interfaces/voting-poll.js.map +1 -0
- package/src/isolated-private.d.ts +0 -4
- package/src/isolated-private.d.ts.map +1 -1
- package/src/isolated-private.js +0 -13
- package/src/isolated-private.js.map +1 -1
- package/src/isolated-public.d.ts +4 -2
- package/src/isolated-public.d.ts.map +1 -1
- package/src/isolated-public.js +10 -8
- package/src/isolated-public.js.map +1 -1
- package/src/lib/voting/audit.d.ts +79 -0
- package/src/lib/voting/audit.d.ts.map +1 -0
- package/src/lib/voting/audit.js +188 -0
- package/src/lib/voting/audit.js.map +1 -0
- package/src/lib/voting/bulletin-board.d.ts +94 -0
- package/src/lib/voting/bulletin-board.d.ts.map +1 -0
- package/src/lib/voting/bulletin-board.js +290 -0
- package/src/lib/voting/bulletin-board.js.map +1 -0
- package/src/lib/voting/encoder.d.ts +42 -0
- package/src/lib/voting/encoder.d.ts.map +1 -0
- package/src/lib/voting/encoder.js +157 -0
- package/src/lib/voting/encoder.js.map +1 -0
- package/src/lib/voting/event-logger.d.ts +81 -0
- package/src/lib/voting/event-logger.d.ts.map +1 -0
- package/src/lib/voting/event-logger.js +165 -0
- package/src/lib/voting/event-logger.js.map +1 -0
- package/src/lib/voting/examples.d.ts +30 -0
- package/src/lib/voting/examples.d.ts.map +1 -0
- package/src/lib/voting/examples.js +153 -0
- package/src/lib/voting/examples.js.map +1 -0
- package/src/lib/voting/factory.d.ts +35 -0
- package/src/lib/voting/factory.d.ts.map +1 -0
- package/src/lib/voting/factory.js +57 -0
- package/src/lib/voting/factory.js.map +1 -0
- package/src/lib/voting/index.d.ts +44 -0
- package/src/lib/voting/index.d.ts.map +1 -0
- package/src/lib/voting/index.js +60 -0
- package/src/lib/voting/index.js.map +1 -0
- package/src/lib/voting/poll-core.d.ts +55 -0
- package/src/lib/voting/poll-core.d.ts.map +1 -0
- package/src/lib/voting/poll-core.js +225 -0
- package/src/lib/voting/poll-core.js.map +1 -0
- package/src/lib/voting/poll.d.ts +124 -0
- package/src/lib/voting/poll.d.ts.map +1 -0
- package/src/lib/voting/poll.js +323 -0
- package/src/lib/voting/poll.js.map +1 -0
- package/src/lib/voting/security.d.ts +33 -0
- package/src/lib/voting/security.d.ts.map +1 -0
- package/src/lib/voting/security.js +68 -0
- package/src/lib/voting/security.js.map +1 -0
- package/src/lib/voting/tallier.d.ts +35 -0
- package/src/lib/voting/tallier.d.ts.map +1 -0
- package/src/lib/voting/tallier.js +415 -0
- package/src/lib/voting/tallier.js.map +1 -0
- package/src/lib/voting/types.d.ts +145 -0
- package/src/lib/voting/types.d.ts.map +1 -0
- package/src/lib/voting/types.js +48 -0
- package/src/lib/voting/types.js.map +1 -0
- package/src/member.d.ts +2 -2
- package/src/member.d.ts.map +1 -1
- package/src/member.js +2 -2
- package/src/member.js.map +1 -1
- package/src/secure-string.d.ts +2 -2
- package/src/secure-string.d.ts.map +1 -1
- package/src/secure-string.js +2 -2
- package/src/secure-string.js.map +1 -1
- package/src/services/aes-gcm.js.map +1 -1
- package/src/services/chunk-processor.d.ts +2 -2
- package/src/services/chunk-processor.d.ts.map +1 -1
- package/src/services/chunk-processor.js +3 -3
- package/src/services/chunk-processor.js.map +1 -1
- package/src/services/ecies/service.d.ts +3 -0
- package/src/services/ecies/service.d.ts.map +1 -1
- package/src/services/ecies/service.js +6 -0
- package/src/services/ecies/service.js.map +1 -1
- package/src/services/ecies/single-recipient.d.ts +1 -1
- package/src/services/ecies/single-recipient.d.ts.map +1 -1
- package/src/services/ecies/single-recipient.js +1 -1
- package/src/services/ecies/single-recipient.js.map +1 -1
- package/src/services/encryption-stream.d.ts +3 -3
- package/src/services/encryption-stream.d.ts.map +1 -1
- package/src/services/encryption-stream.js +7 -7
- package/src/services/encryption-stream.js.map +1 -1
- package/src/services/index.d.ts +1 -0
- package/src/services/index.d.ts.map +1 -1
- package/src/services/index.js.map +1 -1
- package/src/services/multi-recipient-processor.d.ts +2 -2
- package/src/services/multi-recipient-processor.d.ts.map +1 -1
- package/src/services/multi-recipient-processor.js +4 -4
- package/src/services/multi-recipient-processor.js.map +1 -1
- package/src/services/voting.service.d.ts.map +1 -1
- package/src/services/voting.service.js +4 -4
- package/src/services/voting.service.js.map +1 -1
- package/src/test-mocks/mock-frontend-member.d.ts +1 -1
- package/src/test-mocks/mock-frontend-member.d.ts.map +1 -1
- package/src/test-mocks/mock-frontend-member.js +1 -1
- package/src/test-mocks/mock-frontend-member.js.map +1 -1
- package/src/types.d.ts +1 -1
- package/src/types.d.ts.map +1 -1
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VotingPoll = void 0;
|
|
4
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
5
|
+
const utils_1 = require("@noble/hashes/utils");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
/**
|
|
8
|
+
* VotingPoll provides a high-level interface for conducting secure, verifiable polls
|
|
9
|
+
* using Paillier homomorphic encryption.
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Privacy-preserving vote aggregation (votes remain encrypted until tally)
|
|
13
|
+
* - Verifiable receipts for each voter
|
|
14
|
+
* - Multiple tallying and analysis methods
|
|
15
|
+
* - Ranked choice voting support
|
|
16
|
+
* - Weighted voting support
|
|
17
|
+
*/
|
|
18
|
+
class VotingPoll {
|
|
19
|
+
choices;
|
|
20
|
+
votes;
|
|
21
|
+
paillierKeyPair;
|
|
22
|
+
ecKeyPair;
|
|
23
|
+
eciesService;
|
|
24
|
+
receipts = new Map();
|
|
25
|
+
createdAt;
|
|
26
|
+
closedAt;
|
|
27
|
+
constructor(eciesService, choices, paillierKeyPair, ecKeyPair, votes) {
|
|
28
|
+
this.eciesService = eciesService;
|
|
29
|
+
if (choices.length === 0) {
|
|
30
|
+
throw new Error('Poll must have at least one choice');
|
|
31
|
+
}
|
|
32
|
+
if (choices.length !== votes.length) {
|
|
33
|
+
throw new Error('Number of choices must match number of vote tallies');
|
|
34
|
+
}
|
|
35
|
+
this.choices = choices;
|
|
36
|
+
this.paillierKeyPair = paillierKeyPair;
|
|
37
|
+
this.ecKeyPair = ecKeyPair;
|
|
38
|
+
this.votes = votes;
|
|
39
|
+
this.createdAt = new Date();
|
|
40
|
+
}
|
|
41
|
+
async generateEncryptedReceipt(member) {
|
|
42
|
+
const randomNonce = Buffer.from((0, utils_1.randomBytes)(16)).toString(constants_1.VOTING.KEY_FORMAT);
|
|
43
|
+
const memberId = constants_1.Constants.idProvider.serialize(member.id);
|
|
44
|
+
const hashInput = `${Date.now()}-${randomNonce}-${memberId}`;
|
|
45
|
+
const hash = (0, sha256_1.sha256)(new TextEncoder().encode(hashInput));
|
|
46
|
+
const signature = this.eciesService.signMessage(this.ecKeyPair.privateKey, hash);
|
|
47
|
+
const receipt = new Uint8Array(hash.length + signature.length);
|
|
48
|
+
receipt.set(hash, 0);
|
|
49
|
+
receipt.set(signature, hash.length);
|
|
50
|
+
// Encrypt to the poll's public key so the poll can decrypt and verify later
|
|
51
|
+
const encryptedReceipt = await this.eciesService.encryptSimpleOrSingle(false, this.ecKeyPair.publicKey, receipt);
|
|
52
|
+
this.receipts.set(memberId, encryptedReceipt);
|
|
53
|
+
return encryptedReceipt;
|
|
54
|
+
}
|
|
55
|
+
memberVoted(member) {
|
|
56
|
+
const memberId = constants_1.Constants.idProvider.serialize(member.id);
|
|
57
|
+
return this.receipts.has(memberId);
|
|
58
|
+
}
|
|
59
|
+
async verifyReceipt(member, encryptedReceipt) {
|
|
60
|
+
const memberId = constants_1.Constants.idProvider.serialize(member.id);
|
|
61
|
+
const foundReceipt = this.receipts.get(memberId);
|
|
62
|
+
if (!foundReceipt) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
if (foundReceipt.length !== encryptedReceipt.length ||
|
|
66
|
+
!foundReceipt.every((v, i) => v === encryptedReceipt[i])) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const decryptedReceipt = await this.eciesService.decryptSimpleOrSingleWithHeader(false, this.ecKeyPair.privateKey, encryptedReceipt);
|
|
70
|
+
const hash = decryptedReceipt.subarray(0, 32);
|
|
71
|
+
const signature = decryptedReceipt.subarray(32);
|
|
72
|
+
return this.eciesService.verifyMessage(this.ecKeyPair.publicKey, hash, signature);
|
|
73
|
+
}
|
|
74
|
+
async vote(choiceIndex, member) {
|
|
75
|
+
if (this.isClosed) {
|
|
76
|
+
throw new Error('Poll is closed');
|
|
77
|
+
}
|
|
78
|
+
if (this.memberVoted(member)) {
|
|
79
|
+
throw new Error('Member has already voted');
|
|
80
|
+
}
|
|
81
|
+
if (choiceIndex < 0 || choiceIndex >= this.choices.length) {
|
|
82
|
+
throw new Error(`Invalid option index ${choiceIndex}`);
|
|
83
|
+
}
|
|
84
|
+
// vote a 1 for the selected candidate and a 0 for all others
|
|
85
|
+
for (let i = 0; i < this.choices.length; i++) {
|
|
86
|
+
if (i == choiceIndex) {
|
|
87
|
+
this.votes[i] = this.paillierKeyPair.publicKey.addition(this.votes[i], this.paillierKeyPair.publicKey.encrypt(1n));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.votes[i] = this.paillierKeyPair.publicKey.addition(this.votes[i], this.paillierKeyPair.publicKey.encrypt(0n));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return await this.generateEncryptedReceipt(member);
|
|
94
|
+
}
|
|
95
|
+
async voteWeighted(choiceIndex, weight, member) {
|
|
96
|
+
if (this.isClosed) {
|
|
97
|
+
throw new Error('Poll is closed');
|
|
98
|
+
}
|
|
99
|
+
if (this.memberVoted(member)) {
|
|
100
|
+
throw new Error('Member has already voted');
|
|
101
|
+
}
|
|
102
|
+
if (choiceIndex < 0 || choiceIndex >= this.choices.length) {
|
|
103
|
+
throw new Error(`Invalid option index ${choiceIndex}`);
|
|
104
|
+
}
|
|
105
|
+
if (weight <= 0n) {
|
|
106
|
+
throw new Error('Vote weight must be positive');
|
|
107
|
+
}
|
|
108
|
+
// Add weighted vote to selected choice
|
|
109
|
+
this.votes[choiceIndex] = this.paillierKeyPair.publicKey.addition(this.votes[choiceIndex], this.paillierKeyPair.publicKey.encrypt(weight));
|
|
110
|
+
return await this.generateEncryptedReceipt(member);
|
|
111
|
+
}
|
|
112
|
+
async voteRanked(rankedChoices, member) {
|
|
113
|
+
if (this.isClosed) {
|
|
114
|
+
throw new Error('Poll is closed');
|
|
115
|
+
}
|
|
116
|
+
if (this.memberVoted(member)) {
|
|
117
|
+
throw new Error('Member has already voted');
|
|
118
|
+
}
|
|
119
|
+
if (rankedChoices.length === 0) {
|
|
120
|
+
throw new Error('Must provide at least one ranked choice');
|
|
121
|
+
}
|
|
122
|
+
// Validate all choices are valid and unique
|
|
123
|
+
const seen = new Set();
|
|
124
|
+
for (const choiceIndex of rankedChoices) {
|
|
125
|
+
if (choiceIndex < 0 || choiceIndex >= this.choices.length) {
|
|
126
|
+
throw new Error(`Invalid choice index ${choiceIndex}`);
|
|
127
|
+
}
|
|
128
|
+
if (seen.has(choiceIndex)) {
|
|
129
|
+
throw new Error(`Duplicate choice index ${choiceIndex}`);
|
|
130
|
+
}
|
|
131
|
+
seen.add(choiceIndex);
|
|
132
|
+
}
|
|
133
|
+
// Award points based on ranking (first choice gets highest points)
|
|
134
|
+
const maxPoints = BigInt(rankedChoices.length);
|
|
135
|
+
for (let i = 0; i < rankedChoices.length; i++) {
|
|
136
|
+
const choiceIndex = rankedChoices[i];
|
|
137
|
+
const points = maxPoints - BigInt(i); // First choice gets n points, second gets n-1, etc.
|
|
138
|
+
this.votes[choiceIndex] = this.paillierKeyPair.publicKey.addition(this.votes[choiceIndex], this.paillierKeyPair.publicKey.encrypt(points));
|
|
139
|
+
}
|
|
140
|
+
return await this.generateEncryptedReceipt(member);
|
|
141
|
+
}
|
|
142
|
+
async voteApproval(approvedChoices, member) {
|
|
143
|
+
if (this.isClosed) {
|
|
144
|
+
throw new Error('Poll is closed');
|
|
145
|
+
}
|
|
146
|
+
if (this.memberVoted(member)) {
|
|
147
|
+
throw new Error('Member has already voted');
|
|
148
|
+
}
|
|
149
|
+
if (approvedChoices.length === 0) {
|
|
150
|
+
throw new Error('Must approve at least one choice');
|
|
151
|
+
}
|
|
152
|
+
// Validate all choices and check for duplicates
|
|
153
|
+
const seen = new Set();
|
|
154
|
+
for (const choiceIndex of approvedChoices) {
|
|
155
|
+
if (choiceIndex < 0 || choiceIndex >= this.choices.length) {
|
|
156
|
+
throw new Error(`Invalid choice index ${choiceIndex}`);
|
|
157
|
+
}
|
|
158
|
+
if (seen.has(choiceIndex)) {
|
|
159
|
+
throw new Error(`Duplicate choice index ${choiceIndex}`);
|
|
160
|
+
}
|
|
161
|
+
seen.add(choiceIndex);
|
|
162
|
+
}
|
|
163
|
+
// Add 1 vote to each approved choice
|
|
164
|
+
for (const choiceIndex of approvedChoices) {
|
|
165
|
+
this.votes[choiceIndex] = this.paillierKeyPair.publicKey.addition(this.votes[choiceIndex], this.paillierKeyPair.publicKey.encrypt(1n));
|
|
166
|
+
}
|
|
167
|
+
return await this.generateEncryptedReceipt(member);
|
|
168
|
+
}
|
|
169
|
+
get tallies() {
|
|
170
|
+
return this.votes.map((encryptedVote) => this.paillierKeyPair.privateKey.decrypt(encryptedVote));
|
|
171
|
+
}
|
|
172
|
+
getTally(choiceIndex) {
|
|
173
|
+
return this.paillierKeyPair.privateKey.decrypt(this.votes[choiceIndex]);
|
|
174
|
+
}
|
|
175
|
+
get leadingChoice() {
|
|
176
|
+
const tallies = this.tallies;
|
|
177
|
+
let leadingOptionIndex = 0;
|
|
178
|
+
for (let i = 1; i < tallies.length; i++) {
|
|
179
|
+
if (tallies[i] > tallies[leadingOptionIndex]) {
|
|
180
|
+
leadingOptionIndex = i;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return this.choices[leadingOptionIndex];
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get the index of the leading choice
|
|
187
|
+
*/
|
|
188
|
+
get leadingChoiceIndex() {
|
|
189
|
+
const tallies = this.tallies;
|
|
190
|
+
let leadingOptionIndex = 0;
|
|
191
|
+
for (let i = 1; i < tallies.length; i++) {
|
|
192
|
+
if (tallies[i] > tallies[leadingOptionIndex]) {
|
|
193
|
+
leadingOptionIndex = i;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return leadingOptionIndex;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get complete poll results with percentages and winner
|
|
200
|
+
*/
|
|
201
|
+
getResults() {
|
|
202
|
+
const tallies = this.tallies;
|
|
203
|
+
const totalVotes = tallies.reduce((sum, tally) => sum + tally, 0n);
|
|
204
|
+
const percentages = tallies.map((tally) => totalVotes > 0n ? Number((tally * 10000n) / totalVotes) / 100 : 0);
|
|
205
|
+
return {
|
|
206
|
+
totalVotes,
|
|
207
|
+
tallies,
|
|
208
|
+
choices: [...this.choices],
|
|
209
|
+
percentages,
|
|
210
|
+
winnerIndex: this.leadingChoiceIndex,
|
|
211
|
+
winnerName: this.leadingChoice,
|
|
212
|
+
voterCount: this.receipts.size,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get sorted results (descending by vote count)
|
|
217
|
+
*/
|
|
218
|
+
getSortedResults() {
|
|
219
|
+
const results = this.getResults();
|
|
220
|
+
return this.choices
|
|
221
|
+
.map((choice, index) => ({
|
|
222
|
+
choice,
|
|
223
|
+
index,
|
|
224
|
+
tally: results.tallies[index],
|
|
225
|
+
percentage: results.percentages[index],
|
|
226
|
+
}))
|
|
227
|
+
.sort((a, b) => (b.tally > a.tally ? 1 : b.tally < a.tally ? -1 : 0));
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Check if there is a tie for first place
|
|
231
|
+
*/
|
|
232
|
+
get hasTie() {
|
|
233
|
+
const tallies = this.tallies;
|
|
234
|
+
const maxTally = tallies.reduce((max, tally) => (tally > max ? tally : max), 0n);
|
|
235
|
+
return tallies.filter((tally) => tally === maxTally).length > 1;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get all choices tied for first place
|
|
239
|
+
*/
|
|
240
|
+
get tiedChoices() {
|
|
241
|
+
if (!this.hasTie) {
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
const tallies = this.tallies;
|
|
245
|
+
const maxTally = tallies.reduce((max, tally) => (tally > max ? tally : max), 0n);
|
|
246
|
+
return this.choices.filter((_, index) => tallies[index] === maxTally);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get total number of unique voters
|
|
250
|
+
*/
|
|
251
|
+
get voterCount() {
|
|
252
|
+
return this.receipts.size;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get total encrypted votes (sum of all choice tallies)
|
|
256
|
+
* Note: This returns encrypted sum - decrypt with getTotalVotes()
|
|
257
|
+
*/
|
|
258
|
+
get encryptedTotalVotes() {
|
|
259
|
+
return this.votes.reduce((sum, vote) => this.paillierKeyPair.publicKey.addition(sum, vote), this.paillierKeyPair.publicKey.encrypt(0n));
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get total decrypted vote count
|
|
263
|
+
*/
|
|
264
|
+
getTotalVotes() {
|
|
265
|
+
return this.paillierKeyPair.privateKey.decrypt(this.encryptedTotalVotes);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Close the poll (no more votes can be cast)
|
|
269
|
+
*/
|
|
270
|
+
close() {
|
|
271
|
+
if (this.isClosed) {
|
|
272
|
+
throw new Error('Poll is already closed');
|
|
273
|
+
}
|
|
274
|
+
this.closedAt = new Date();
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Check if poll is closed
|
|
278
|
+
*/
|
|
279
|
+
get isClosed() {
|
|
280
|
+
return this.closedAt !== undefined;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get poll creation timestamp
|
|
284
|
+
*/
|
|
285
|
+
get createdAtTimestamp() {
|
|
286
|
+
return new Date(this.createdAt);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get poll closed timestamp (undefined if not closed)
|
|
290
|
+
*/
|
|
291
|
+
get closedAtTimestamp() {
|
|
292
|
+
return this.closedAt ? new Date(this.closedAt) : undefined;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get poll duration in milliseconds (undefined if not closed)
|
|
296
|
+
*/
|
|
297
|
+
get durationMs() {
|
|
298
|
+
if (!this.closedAt) {
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
return this.closedAt.getTime() - this.createdAt.getTime();
|
|
302
|
+
}
|
|
303
|
+
static newPoll(eciesService, choices, paillierKeyPair, ecKeyPair) {
|
|
304
|
+
const votes = new Array(choices.length);
|
|
305
|
+
for (let i = 0; i < choices.length; i++) {
|
|
306
|
+
votes[i] = paillierKeyPair.publicKey.encrypt(0n);
|
|
307
|
+
}
|
|
308
|
+
return new VotingPoll(eciesService, choices, paillierKeyPair, ecKeyPair, votes);
|
|
309
|
+
}
|
|
310
|
+
static async newPollWithKeys(eciesService, votingService, choices) {
|
|
311
|
+
const mnemonic = eciesService.generateNewMnemonic();
|
|
312
|
+
const keyPair = eciesService.mnemonicToSimpleKeyPair(mnemonic);
|
|
313
|
+
const ecKeyPair = {
|
|
314
|
+
privateKey: keyPair.privateKey,
|
|
315
|
+
publicKey: keyPair.publicKey,
|
|
316
|
+
};
|
|
317
|
+
const paillierKeyPair = await votingService.deriveVotingKeysFromECDH(ecKeyPair.privateKey, ecKeyPair.publicKey);
|
|
318
|
+
const poll = VotingPoll.newPoll(eciesService, choices, paillierKeyPair, ecKeyPair);
|
|
319
|
+
return { poll, paillierKeyPair, ecKeyPair };
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
exports.VotingPoll = VotingPoll;
|
|
323
|
+
//# sourceMappingURL=poll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/poll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voting Security Validator
|
|
3
|
+
* Enforces cryptographic security requirements
|
|
4
|
+
*/
|
|
5
|
+
import { VotingMethod } from './types';
|
|
6
|
+
export declare enum SecurityLevel {
|
|
7
|
+
FullyHomomorphic = "fully-homomorphic",// No intermediate decryption
|
|
8
|
+
MultiRound = "multi-round",// Requires intermediate decryption
|
|
9
|
+
Insecure = "insecure"
|
|
10
|
+
}
|
|
11
|
+
export declare const VOTING_SECURITY: Record<VotingMethod, SecurityLevel>;
|
|
12
|
+
export declare class VotingSecurityValidator {
|
|
13
|
+
/**
|
|
14
|
+
* Check if voting method is fully secure (no intermediate decryption)
|
|
15
|
+
*/
|
|
16
|
+
static isFullySecure(method: VotingMethod): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Check if voting method requires multiple rounds
|
|
19
|
+
*/
|
|
20
|
+
static requiresMultipleRounds(method: VotingMethod): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Get security level for method
|
|
23
|
+
*/
|
|
24
|
+
static getSecurityLevel(method: VotingMethod): SecurityLevel;
|
|
25
|
+
/**
|
|
26
|
+
* Validate method is supported and secure
|
|
27
|
+
*/
|
|
28
|
+
static validate(method: VotingMethod, options?: {
|
|
29
|
+
requireFullySecure?: boolean;
|
|
30
|
+
allowInsecure?: boolean;
|
|
31
|
+
}): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,oBAAY,aAAa;IACvB,gBAAgB,sBAAsB,CAAE,6BAA6B;IACrE,UAAU,gBAAgB,CAAE,mCAAmC;IAC/D,QAAQ,aAAa;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,aAAa,CAgB/D,CAAC;AAEF,qBAAa,uBAAuB;IAClC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAInD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAI5D;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa;IAI5D;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;QACR,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GACA,IAAI;CAoBR"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VotingSecurityValidator = exports.VOTING_SECURITY = exports.SecurityLevel = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Voting Security Validator
|
|
6
|
+
* Enforces cryptographic security requirements
|
|
7
|
+
*/
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
var SecurityLevel;
|
|
10
|
+
(function (SecurityLevel) {
|
|
11
|
+
SecurityLevel["FullyHomomorphic"] = "fully-homomorphic";
|
|
12
|
+
SecurityLevel["MultiRound"] = "multi-round";
|
|
13
|
+
SecurityLevel["Insecure"] = "insecure";
|
|
14
|
+
})(SecurityLevel || (exports.SecurityLevel = SecurityLevel = {}));
|
|
15
|
+
exports.VOTING_SECURITY = {
|
|
16
|
+
[types_1.VotingMethod.Plurality]: SecurityLevel.FullyHomomorphic,
|
|
17
|
+
[types_1.VotingMethod.Approval]: SecurityLevel.FullyHomomorphic,
|
|
18
|
+
[types_1.VotingMethod.Weighted]: SecurityLevel.FullyHomomorphic,
|
|
19
|
+
[types_1.VotingMethod.Borda]: SecurityLevel.FullyHomomorphic,
|
|
20
|
+
[types_1.VotingMethod.Score]: SecurityLevel.FullyHomomorphic,
|
|
21
|
+
[types_1.VotingMethod.YesNo]: SecurityLevel.FullyHomomorphic,
|
|
22
|
+
[types_1.VotingMethod.YesNoAbstain]: SecurityLevel.FullyHomomorphic,
|
|
23
|
+
[types_1.VotingMethod.Supermajority]: SecurityLevel.FullyHomomorphic,
|
|
24
|
+
[types_1.VotingMethod.RankedChoice]: SecurityLevel.MultiRound,
|
|
25
|
+
[types_1.VotingMethod.TwoRound]: SecurityLevel.MultiRound,
|
|
26
|
+
[types_1.VotingMethod.STAR]: SecurityLevel.MultiRound,
|
|
27
|
+
[types_1.VotingMethod.STV]: SecurityLevel.MultiRound,
|
|
28
|
+
[types_1.VotingMethod.Quadratic]: SecurityLevel.Insecure,
|
|
29
|
+
[types_1.VotingMethod.Consensus]: SecurityLevel.Insecure,
|
|
30
|
+
[types_1.VotingMethod.ConsentBased]: SecurityLevel.Insecure,
|
|
31
|
+
};
|
|
32
|
+
class VotingSecurityValidator {
|
|
33
|
+
/**
|
|
34
|
+
* Check if voting method is fully secure (no intermediate decryption)
|
|
35
|
+
*/
|
|
36
|
+
static isFullySecure(method) {
|
|
37
|
+
return exports.VOTING_SECURITY[method] === SecurityLevel.FullyHomomorphic;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if voting method requires multiple rounds
|
|
41
|
+
*/
|
|
42
|
+
static requiresMultipleRounds(method) {
|
|
43
|
+
return exports.VOTING_SECURITY[method] === SecurityLevel.MultiRound;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get security level for method
|
|
47
|
+
*/
|
|
48
|
+
static getSecurityLevel(method) {
|
|
49
|
+
return exports.VOTING_SECURITY[method];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Validate method is supported and secure
|
|
53
|
+
*/
|
|
54
|
+
static validate(method, options) {
|
|
55
|
+
const level = exports.VOTING_SECURITY[method];
|
|
56
|
+
if (level === SecurityLevel.Insecure && !options?.allowInsecure) {
|
|
57
|
+
throw new Error(`Voting method ${method} is not cryptographically secure with Paillier. ` +
|
|
58
|
+
`Set allowInsecure: true to use anyway (NOT RECOMMENDED).`);
|
|
59
|
+
}
|
|
60
|
+
if (options?.requireFullySecure &&
|
|
61
|
+
level !== SecurityLevel.FullyHomomorphic) {
|
|
62
|
+
throw new Error(`Voting method ${method} requires intermediate decryption. ` +
|
|
63
|
+
`Use a fully homomorphic method for maximum security.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.VotingSecurityValidator = VotingSecurityValidator;
|
|
68
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/security.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,mCAAuC;AAEvC,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,uDAAsC,CAAA;IACtC,2CAA0B,CAAA;IAC1B,sCAAqB,CAAA;AACvB,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB;AAEY,QAAA,eAAe,GAAwC;IAClE,CAAC,oBAAY,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,gBAAgB;IACxD,CAAC,oBAAY,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,gBAAgB;IACvD,CAAC,oBAAY,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,gBAAgB;IACvD,CAAC,oBAAY,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,gBAAgB;IACpD,CAAC,oBAAY,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,gBAAgB;IACpD,CAAC,oBAAY,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,gBAAgB;IACpD,CAAC,oBAAY,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,gBAAgB;IAC3D,CAAC,oBAAY,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,gBAAgB;IAC5D,CAAC,oBAAY,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,UAAU;IACrD,CAAC,oBAAY,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,UAAU;IACjD,CAAC,oBAAY,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,UAAU;IAC7C,CAAC,oBAAY,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,UAAU;IAC5C,CAAC,oBAAY,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,QAAQ;IAChD,CAAC,oBAAY,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,QAAQ;IAChD,CAAC,oBAAY,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,QAAQ;CACpD,CAAC;AAEF,MAAa,uBAAuB;IAClC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,MAAoB;QACvC,OAAO,uBAAe,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,gBAAgB,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAoB;QAChD,OAAO,uBAAe,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,UAAU,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAoB;QAC1C,OAAO,uBAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CACb,MAAoB,EACpB,OAGC;QAED,MAAM,KAAK,GAAG,uBAAe,CAAC,MAAM,CAAC,CAAC;QAEtC,IAAI,KAAK,KAAK,aAAa,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,kDAAkD;gBACvE,0DAA0D,CAC7D,CAAC;QACJ,CAAC;QAED,IACE,OAAO,EAAE,kBAAkB;YAC3B,KAAK,KAAK,aAAa,CAAC,gBAAgB,EACxC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,qCAAqC;gBAC1D,sDAAsD,CACzD,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAnDD,0DAmDC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Poll Tallier - Holds private key, decrypts results
|
|
3
|
+
* Separate from Poll to enforce role separation
|
|
4
|
+
*/
|
|
5
|
+
import type { PrivateKey, PublicKey } from 'paillier-bigint';
|
|
6
|
+
import { Poll } from './poll-core';
|
|
7
|
+
import { type PollResults, type IMember } from './types';
|
|
8
|
+
export declare class PollTallier {
|
|
9
|
+
private readonly __authority;
|
|
10
|
+
private readonly votingPrivateKey;
|
|
11
|
+
private readonly __votingPublicKey;
|
|
12
|
+
constructor(__authority: IMember, votingPrivateKey: PrivateKey, __votingPublicKey: PublicKey);
|
|
13
|
+
/**
|
|
14
|
+
* Tally votes and determine winner(s)
|
|
15
|
+
* Can only be called after poll is closed
|
|
16
|
+
*/
|
|
17
|
+
tally(poll: Poll): PollResults;
|
|
18
|
+
private _tallyAdditive;
|
|
19
|
+
private _tallyScored;
|
|
20
|
+
private _tallyYesNo;
|
|
21
|
+
/**
|
|
22
|
+
* True Ranked Choice Voting (Instant Runoff)
|
|
23
|
+
* Requires multiple rounds of elimination
|
|
24
|
+
*/
|
|
25
|
+
private _tallyRankedChoice;
|
|
26
|
+
private _decryptRankings;
|
|
27
|
+
private _countFirstChoices;
|
|
28
|
+
private _tallyQuadratic;
|
|
29
|
+
private _tallyConsensus;
|
|
30
|
+
private _tallyConsentBased;
|
|
31
|
+
private _tallyTwoRound;
|
|
32
|
+
private _tallySTAR;
|
|
33
|
+
private _tallySTV;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=tallier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tallier.d.ts","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/tallier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,OAAO,EACb,MAAM,SAAS,CAAC;AAEjB,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAFjB,WAAW,EAAE,OAAO,EACpB,gBAAgB,EAAE,UAAU,EAC5B,iBAAiB,EAAE,SAAS;IAO/C;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW;IA+C9B,OAAO,CAAC,cAAc;IA6BtB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA+G1B,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,cAAc;IA8DtB,OAAO,CAAC,UAAU;IAuDlB,OAAO,CAAC,SAAS;CAwElB"}
|