@digitaldefiance/node-ecies-lib 4.6.3 → 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 (51) hide show
  1. package/package.json +5 -5
  2. package/src/constants.d.ts.map +1 -1
  3. package/src/constants.js +5 -0
  4. package/src/constants.js.map +1 -1
  5. package/src/index.d.ts +1 -1
  6. package/src/index.d.ts.map +1 -1
  7. package/src/index.js +0 -1
  8. package/src/index.js.map +1 -1
  9. package/src/lib/index.d.ts +1 -0
  10. package/src/lib/index.d.ts.map +1 -1
  11. package/src/lib/index.js +1 -0
  12. package/src/lib/index.js.map +1 -1
  13. package/src/lib/voting/audit.d.ts +44 -0
  14. package/src/lib/voting/audit.d.ts.map +1 -0
  15. package/src/lib/voting/audit.js +129 -0
  16. package/src/lib/voting/audit.js.map +1 -0
  17. package/src/lib/voting/encoder.d.ts +22 -0
  18. package/src/lib/voting/encoder.d.ts.map +1 -0
  19. package/src/lib/voting/encoder.js +115 -0
  20. package/src/lib/voting/encoder.js.map +1 -0
  21. package/src/lib/voting/factory.d.ts +14 -0
  22. package/src/lib/voting/factory.d.ts.map +1 -0
  23. package/src/lib/voting/factory.js +36 -0
  24. package/src/lib/voting/factory.js.map +1 -0
  25. package/src/lib/voting/index.d.ts +11 -0
  26. package/src/lib/voting/index.d.ts.map +1 -0
  27. package/src/lib/voting/index.js +24 -0
  28. package/src/lib/voting/index.js.map +1 -0
  29. package/src/lib/voting/poll-core.d.ts +34 -0
  30. package/src/lib/voting/poll-core.d.ts.map +1 -0
  31. package/src/lib/voting/poll-core.js +183 -0
  32. package/src/lib/voting/poll-core.js.map +1 -0
  33. package/src/lib/voting/security.d.ts +21 -0
  34. package/src/lib/voting/security.d.ts.map +1 -0
  35. package/src/lib/voting/security.js +54 -0
  36. package/src/lib/voting/security.js.map +1 -0
  37. package/src/lib/voting/tallier.d.ts +27 -0
  38. package/src/lib/voting/tallier.d.ts.map +1 -0
  39. package/src/lib/voting/tallier.js +373 -0
  40. package/src/lib/voting/tallier.js.map +1 -0
  41. package/src/lib/voting/types.d.ts +66 -0
  42. package/src/lib/voting/types.d.ts.map +1 -0
  43. package/src/lib/voting/types.js +29 -0
  44. package/src/lib/voting/types.js.map +1 -0
  45. package/src/services/ecies/service.d.ts +4 -4
  46. package/src/services/progress-tracker.d.ts.map +1 -1
  47. package/src/services/progress-tracker.js.map +1 -1
  48. package/src/services/voting.service.d.ts +0 -3
  49. package/src/services/voting.service.d.ts.map +1 -1
  50. package/src/services/voting.service.js +2 -3
  51. package/src/services/voting.service.js.map +1 -1
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Poll = void 0;
4
+ /**
5
+ * Secure Voting Poll - Node.js Optimized
6
+ */
7
+ const crypto_1 = require("crypto");
8
+ const audit_1 = require("./audit");
9
+ const security_1 = require("./security");
10
+ const types_1 = require("./types");
11
+ class Poll {
12
+ _id;
13
+ _choices;
14
+ _method;
15
+ _authority;
16
+ ___votingPublicKey;
17
+ _votes = new Map();
18
+ _receipts = new Map();
19
+ _createdAt;
20
+ _closedAt;
21
+ _maxWeight;
22
+ _auditLog;
23
+ constructor(id, choices, method, authority, votingPublicKey, maxWeight, allowInsecure) {
24
+ if (choices.length < 2)
25
+ throw new Error('Poll requires at least 2 choices');
26
+ if (!authority.votingPublicKey)
27
+ throw new Error('Authority must have voting keys');
28
+ security_1.VotingSecurityValidator.validate(method, { allowInsecure });
29
+ this._id = id;
30
+ this._choices = Object.freeze([...choices]);
31
+ this._method = method;
32
+ this._authority = authority;
33
+ this.___votingPublicKey = votingPublicKey;
34
+ this._maxWeight = maxWeight;
35
+ this._createdAt = Date.now();
36
+ this._auditLog = new audit_1.ImmutableAuditLog(authority);
37
+ this._auditLog.recordPollCreated(id, {
38
+ method,
39
+ choiceCount: choices.length,
40
+ maxWeight: maxWeight?.toString(),
41
+ });
42
+ }
43
+ get id() {
44
+ return this._id;
45
+ }
46
+ get choices() {
47
+ return this._choices;
48
+ }
49
+ get method() {
50
+ return this._method;
51
+ }
52
+ get isClosed() {
53
+ return this._closedAt !== undefined;
54
+ }
55
+ get voterCount() {
56
+ return this._receipts.size;
57
+ }
58
+ get createdAt() {
59
+ return this._createdAt;
60
+ }
61
+ get closedAt() {
62
+ return this._closedAt;
63
+ }
64
+ get auditLog() {
65
+ return this._auditLog;
66
+ }
67
+ vote(voter, vote) {
68
+ if (this.isClosed)
69
+ throw new Error('Poll is closed');
70
+ const voterId = voter.id.toString('hex');
71
+ if (this._receipts.has(voterId))
72
+ throw new Error('Already voted');
73
+ this._validateVote(vote);
74
+ this._votes.set(voterId, vote.encrypted);
75
+ const receipt = this._generateReceipt(voter);
76
+ this._receipts.set(voterId, receipt);
77
+ const voterIdHash = (0, crypto_1.createHash)('sha256').update(voter.id).digest();
78
+ this._auditLog.recordVoteCast(this._id, voterIdHash);
79
+ return receipt;
80
+ }
81
+ verifyReceipt(voter, receipt) {
82
+ const voterId = voter.id.toString('hex');
83
+ const stored = this._receipts.get(voterId);
84
+ if (!stored)
85
+ return false;
86
+ const data = this._receiptData(receipt);
87
+ return this._authority.verify(receipt.signature, data);
88
+ }
89
+ close() {
90
+ if (this.isClosed)
91
+ throw new Error('Already closed');
92
+ this._closedAt = Date.now();
93
+ this._auditLog.recordPollClosed(this._id, {
94
+ voterCount: this.voterCount,
95
+ closedAt: this._closedAt,
96
+ });
97
+ }
98
+ getEncryptedVotes() {
99
+ const frozenEntries = Array.from(this._votes.entries()).map(([key, value]) => [key, Object.freeze([...value])]);
100
+ const readonlyMap = new Map(frozenEntries);
101
+ return new Proxy(readonlyMap, {
102
+ get(target, prop) {
103
+ if (prop === 'set' || prop === 'delete' || prop === 'clear') {
104
+ throw new Error('Cannot modify readonly map');
105
+ }
106
+ const value = Reflect.get(target, prop);
107
+ if (typeof value === 'function') {
108
+ return value.bind(target);
109
+ }
110
+ return value;
111
+ },
112
+ });
113
+ }
114
+ _validateVote(vote) {
115
+ switch (this._method) {
116
+ case types_1.VotingMethod.Plurality:
117
+ if (vote.choiceIndex === undefined)
118
+ throw new Error('Choice required');
119
+ if (vote.choiceIndex < 0 || vote.choiceIndex >= this._choices.length) {
120
+ throw new Error('Invalid choice');
121
+ }
122
+ break;
123
+ case types_1.VotingMethod.Approval:
124
+ if (!vote.choices?.length)
125
+ throw new Error('Choices required');
126
+ for (const c of vote.choices) {
127
+ if (c < 0 || c >= this._choices.length)
128
+ throw new Error('Invalid choice');
129
+ }
130
+ break;
131
+ case types_1.VotingMethod.Weighted:
132
+ if (vote.choiceIndex === undefined)
133
+ throw new Error('Choice required');
134
+ if (!vote.weight || vote.weight <= 0n)
135
+ throw new Error('Weight must be positive');
136
+ if (this._maxWeight && vote.weight > this._maxWeight) {
137
+ throw new Error('Weight exceeds maximum');
138
+ }
139
+ break;
140
+ case types_1.VotingMethod.Borda:
141
+ case types_1.VotingMethod.RankedChoice: {
142
+ if (!vote.rankings?.length)
143
+ throw new Error('Rankings required');
144
+ const seen = new Set();
145
+ for (const r of vote.rankings) {
146
+ if (r < 0 || r >= this._choices.length)
147
+ throw new Error('Invalid choice');
148
+ if (seen.has(r))
149
+ throw new Error('Duplicate ranking');
150
+ seen.add(r);
151
+ }
152
+ break;
153
+ }
154
+ }
155
+ if (!vote.encrypted?.length)
156
+ throw new Error('Encrypted data required');
157
+ }
158
+ _generateReceipt(voter) {
159
+ const nonce = (0, crypto_1.randomBytes)(16);
160
+ const receipt = {
161
+ voterId: voter.id,
162
+ pollId: this._id,
163
+ timestamp: Date.now(),
164
+ signature: Buffer.alloc(0),
165
+ nonce,
166
+ };
167
+ const data = this._receiptData(receipt);
168
+ receipt.signature = this._authority.sign(data);
169
+ return receipt;
170
+ }
171
+ _receiptData(receipt) {
172
+ const timestamp = Buffer.alloc(8);
173
+ timestamp.writeBigUInt64BE(BigInt(receipt.timestamp));
174
+ return Buffer.concat([
175
+ receipt.voterId,
176
+ receipt.pollId,
177
+ timestamp,
178
+ receipt.nonce,
179
+ ]);
180
+ }
181
+ }
182
+ exports.Poll = Poll;
183
+ //# sourceMappingURL=poll-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll-core.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-node-ecies-lib/src/lib/voting/poll-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
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",
8
+ MultiRound = "multi-round",
9
+ Insecure = "insecure"
10
+ }
11
+ export declare const VOTING_SECURITY: Record<VotingMethod, SecurityLevel>;
12
+ export declare class VotingSecurityValidator {
13
+ static isFullySecure(method: VotingMethod): boolean;
14
+ static requiresMultipleRounds(method: VotingMethod): boolean;
15
+ static getSecurityLevel(method: VotingMethod): SecurityLevel;
16
+ static validate(method: VotingMethod, options?: {
17
+ requireFullySecure?: boolean;
18
+ allowInsecure?: boolean;
19
+ }): void;
20
+ }
21
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-node-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;IACtC,UAAU,gBAAgB;IAC1B,QAAQ,aAAa;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,aAAa,CAgB/D,CAAC;AAEF,qBAAa,uBAAuB;IAClC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAInD,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAI5D,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa;IAI5D,MAAM,CAAC,QAAQ,CACb,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAClE,IAAI;CAgBR"}
@@ -0,0 +1,54 @@
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
+ static isFullySecure(method) {
34
+ return exports.VOTING_SECURITY[method] === SecurityLevel.FullyHomomorphic;
35
+ }
36
+ static requiresMultipleRounds(method) {
37
+ return exports.VOTING_SECURITY[method] === SecurityLevel.MultiRound;
38
+ }
39
+ static getSecurityLevel(method) {
40
+ return exports.VOTING_SECURITY[method];
41
+ }
42
+ static validate(method, options) {
43
+ const level = exports.VOTING_SECURITY[method];
44
+ if (level === SecurityLevel.Insecure && !options?.allowInsecure) {
45
+ throw new Error(`Voting method ${method} is not cryptographically secure with Paillier. Set allowInsecure: true to use anyway (NOT RECOMMENDED).`);
46
+ }
47
+ if (options?.requireFullySecure &&
48
+ level !== SecurityLevel.FullyHomomorphic) {
49
+ throw new Error(`Voting method ${method} requires intermediate decryption. Use a fully homomorphic method for maximum security.`);
50
+ }
51
+ }
52
+ }
53
+ exports.VotingSecurityValidator = VotingSecurityValidator;
54
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-node-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,MAAM,CAAC,aAAa,CAAC,MAAoB;QACvC,OAAO,uBAAe,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,gBAAgB,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,MAAoB;QAChD,OAAO,uBAAe,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,UAAU,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAAoB;QAC1C,OAAO,uBAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,QAAQ,CACb,MAAoB,EACpB,OAAmE;QAEnE,MAAM,KAAK,GAAG,uBAAe,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,aAAa,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,0GAA0G,CAClI,CAAC;QACJ,CAAC;QACD,IACE,OAAO,EAAE,kBAAkB;YAC3B,KAAK,KAAK,aAAa,CAAC,gBAAgB,EACxC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,yFAAyF,CACjH,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAhCD,0DAgCC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Poll Tallier - Node.js optimized
3
+ */
4
+ import type { PrivateKey, PublicKey } from 'paillier-bigint';
5
+ import type { IMember } from '../../interfaces/member';
6
+ import { Poll } from './poll-core';
7
+ import { type PollResults } 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
+ tally(poll: Poll): PollResults;
14
+ private _tallyAdditive;
15
+ private _tallyScored;
16
+ private _tallyYesNo;
17
+ private _tallyRankedChoice;
18
+ private _decryptRankings;
19
+ private _countFirstChoices;
20
+ private _tallyQuadratic;
21
+ private _tallyConsensus;
22
+ private _tallyConsentBased;
23
+ private _tallyTwoRound;
24
+ private _tallySTAR;
25
+ private _tallySTV;
26
+ }
27
+ //# sourceMappingURL=tallier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tallier.d.ts","sourceRoot":"","sources":["../../../../../../packages/digitaldefiance-node-ecies-lib/src/lib/voting/tallier.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAgB,KAAK,WAAW,EAAoB,MAAM,SAAS,CAAC;AAE3E,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;IAM/C,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW;IAmC9B,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,kBAAkB;IA6F1B,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,cAAc;IA+CtB,OAAO,CAAC,UAAU;IAqClB,OAAO,CAAC,SAAS;CA2DlB"}