@digitaldefiance/ecies-lib 4.17.2 → 4.17.3
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/package.json +1 -1
- package/src/i18n-setup.d.ts +7 -1
- package/src/i18n-setup.d.ts.map +1 -1
- package/src/i18n-setup.js +12 -0
- package/src/i18n-setup.js.map +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.d.ts.map +1 -1
- package/src/index.js +2 -1
- package/src/index.js.map +1 -1
- package/src/lib/voting/index.d.ts +1 -0
- package/src/lib/voting/index.d.ts.map +1 -1
- package/src/lib/voting/index.js +2 -0
- package/src/lib/voting/index.js.map +1 -1
- package/src/lib/voting/threshold/decryption-combiner.d.ts +141 -0
- package/src/lib/voting/threshold/decryption-combiner.d.ts.map +1 -0
- package/src/lib/voting/threshold/decryption-combiner.js +343 -0
- package/src/lib/voting/threshold/decryption-combiner.js.map +1 -0
- package/src/lib/voting/threshold/enumerations/ceremony-status.d.ts +19 -0
- package/src/lib/voting/threshold/enumerations/ceremony-status.d.ts.map +1 -0
- package/src/lib/voting/threshold/enumerations/ceremony-status.js +23 -0
- package/src/lib/voting/threshold/enumerations/ceremony-status.js.map +1 -0
- package/src/lib/voting/threshold/enumerations/guardian-status.d.ts +18 -0
- package/src/lib/voting/threshold/enumerations/guardian-status.d.ts.map +1 -0
- package/src/lib/voting/threshold/enumerations/guardian-status.js +22 -0
- package/src/lib/voting/threshold/enumerations/guardian-status.js.map +1 -0
- package/src/lib/voting/threshold/enumerations/index.d.ts +8 -0
- package/src/lib/voting/threshold/enumerations/index.d.ts.map +1 -0
- package/src/lib/voting/threshold/enumerations/index.js +11 -0
- package/src/lib/voting/threshold/enumerations/index.js.map +1 -0
- package/src/lib/voting/threshold/enumerations/interval-trigger-type.d.ts +15 -0
- package/src/lib/voting/threshold/enumerations/interval-trigger-type.d.ts.map +1 -0
- package/src/lib/voting/threshold/enumerations/interval-trigger-type.js +19 -0
- package/src/lib/voting/threshold/enumerations/interval-trigger-type.js.map +1 -0
- package/src/lib/voting/threshold/enumerations/threshold-audit-event-type.d.ts +29 -0
- package/src/lib/voting/threshold/enumerations/threshold-audit-event-type.d.ts.map +1 -0
- package/src/lib/voting/threshold/enumerations/threshold-audit-event-type.js +33 -0
- package/src/lib/voting/threshold/enumerations/threshold-audit-event-type.js.map +1 -0
- package/src/lib/voting/threshold/guardian-registry.d.ts +120 -0
- package/src/lib/voting/threshold/guardian-registry.d.ts.map +1 -0
- package/src/lib/voting/threshold/guardian-registry.js +227 -0
- package/src/lib/voting/threshold/guardian-registry.js.map +1 -0
- package/src/lib/voting/threshold/index.d.ts +49 -0
- package/src/lib/voting/threshold/index.d.ts.map +1 -0
- package/src/lib/voting/threshold/index.js +69 -0
- package/src/lib/voting/threshold/index.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/ceremony-coordinator.d.ts +19 -0
- package/src/lib/voting/threshold/interfaces/ceremony-coordinator.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/ceremony-coordinator.js +3 -0
- package/src/lib/voting/threshold/interfaces/ceremony-coordinator.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/ceremony.d.ts +33 -0
- package/src/lib/voting/threshold/interfaces/ceremony.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/ceremony.js +3 -0
- package/src/lib/voting/threshold/interfaces/ceremony.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/combined-decryption.d.ts +20 -0
- package/src/lib/voting/threshold/interfaces/combined-decryption.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/combined-decryption.js +3 -0
- package/src/lib/voting/threshold/interfaces/combined-decryption.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/combined-zk-proof.d.ts +16 -0
- package/src/lib/voting/threshold/interfaces/combined-zk-proof.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/combined-zk-proof.js +3 -0
- package/src/lib/voting/threshold/interfaces/combined-zk-proof.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/decryption-combiner.d.ts +14 -0
- package/src/lib/voting/threshold/interfaces/decryption-combiner.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/decryption-combiner.js +3 -0
- package/src/lib/voting/threshold/interfaces/decryption-combiner.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/guardian-registry.d.ts +28 -0
- package/src/lib/voting/threshold/interfaces/guardian-registry.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/guardian-registry.js +3 -0
- package/src/lib/voting/threshold/interfaces/guardian-registry.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/guardian-status-change-event.d.ts +16 -0
- package/src/lib/voting/threshold/interfaces/guardian-status-change-event.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/guardian-status-change-event.js +3 -0
- package/src/lib/voting/threshold/interfaces/guardian-status-change-event.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/guardian.d.ts +25 -0
- package/src/lib/voting/threshold/interfaces/guardian.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/guardian.js +3 -0
- package/src/lib/voting/threshold/interfaces/guardian.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/index.d.ts +32 -0
- package/src/lib/voting/threshold/interfaces/index.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/index.js +6 -0
- package/src/lib/voting/threshold/interfaces/index.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-config.d.ts +17 -0
- package/src/lib/voting/threshold/interfaces/interval-config.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-config.js +3 -0
- package/src/lib/voting/threshold/interfaces/interval-config.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-scheduler.d.ts +23 -0
- package/src/lib/voting/threshold/interfaces/interval-scheduler.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-scheduler.js +3 -0
- package/src/lib/voting/threshold/interfaces/interval-scheduler.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-tally.d.ts +30 -0
- package/src/lib/voting/threshold/interfaces/interval-tally.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-tally.js +3 -0
- package/src/lib/voting/threshold/interfaces/interval-tally.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-trigger-event.d.ts +20 -0
- package/src/lib/voting/threshold/interfaces/interval-trigger-event.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/interval-trigger-event.js +3 -0
- package/src/lib/voting/threshold/interfaces/interval-trigger-event.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/key-share.d.ts +15 -0
- package/src/lib/voting/threshold/interfaces/key-share.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/key-share.js +3 -0
- package/src/lib/voting/threshold/interfaces/key-share.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption-service.d.ts +17 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption-service.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption-service.js +3 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption-service.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption.d.ts +20 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption.js +3 -0
- package/src/lib/voting/threshold/interfaces/partial-decryption.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/public-tally-feed.d.ts +19 -0
- package/src/lib/voting/threshold/interfaces/public-tally-feed.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/public-tally-feed.js +3 -0
- package/src/lib/voting/threshold/interfaces/public-tally-feed.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/tally-subscription.d.ts +16 -0
- package/src/lib/voting/threshold/interfaces/tally-subscription.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/tally-subscription.js +3 -0
- package/src/lib/voting/threshold/interfaces/tally-subscription.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/tally-verifier.d.ts +12 -0
- package/src/lib/voting/threshold/interfaces/tally-verifier.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/tally-verifier.js +3 -0
- package/src/lib/voting/threshold/interfaces/tally-verifier.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-aggregator.d.ts +15 -0
- package/src/lib/voting/threshold/interfaces/threshold-aggregator.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-aggregator.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-aggregator.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-audit-entry.d.ts +28 -0
- package/src/lib/voting/threshold/interfaces/threshold-audit-entry.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-audit-entry.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-audit-entry.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-config.d.ts +12 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-config.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-config.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-config.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-generator.d.ts +12 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-generator.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-generator.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-generator.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-pair.d.ts +30 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-pair.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-pair.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-key-pair.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-config.d.ts +19 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-config.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-config.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-config.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-factory.d.ts +16 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-factory.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-factory.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll-factory.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll.d.ts +25 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll.js +3 -0
- package/src/lib/voting/threshold/interfaces/threshold-poll.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/verification-result.d.ts +17 -0
- package/src/lib/voting/threshold/interfaces/verification-result.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/verification-result.js +3 -0
- package/src/lib/voting/threshold/interfaces/verification-result.js.map +1 -0
- package/src/lib/voting/threshold/interfaces/zk-proof.d.ts +15 -0
- package/src/lib/voting/threshold/interfaces/zk-proof.d.ts.map +1 -0
- package/src/lib/voting/threshold/interfaces/zk-proof.js +3 -0
- package/src/lib/voting/threshold/interfaces/zk-proof.js.map +1 -0
- package/src/lib/voting/threshold/partial-decryption-service.d.ts +130 -0
- package/src/lib/voting/threshold/partial-decryption-service.d.ts.map +1 -0
- package/src/lib/voting/threshold/partial-decryption-service.js +288 -0
- package/src/lib/voting/threshold/partial-decryption-service.js.map +1 -0
- package/src/lib/voting/threshold/threshold-key-generator.d.ts +114 -0
- package/src/lib/voting/threshold/threshold-key-generator.d.ts.map +1 -0
- package/src/lib/voting/threshold/threshold-key-generator.js +275 -0
- package/src/lib/voting/threshold/threshold-key-generator.js.map +1 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ThresholdKeyGenerator = exports.KeyGenerationFailedError = exports.InvalidThresholdConfigError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Error thrown when threshold configuration is invalid.
|
|
6
|
+
*/
|
|
7
|
+
class InvalidThresholdConfigError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'InvalidThresholdConfigError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.InvalidThresholdConfigError = InvalidThresholdConfigError;
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when key generation fails.
|
|
16
|
+
*/
|
|
17
|
+
class KeyGenerationFailedError extends Error {
|
|
18
|
+
constructor(message) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = 'KeyGenerationFailedError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.KeyGenerationFailedError = KeyGenerationFailedError;
|
|
24
|
+
/**
|
|
25
|
+
* Default key bit length for Paillier keys.
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_KEY_BIT_LENGTH = 2048;
|
|
28
|
+
/**
|
|
29
|
+
* Generates threshold Paillier keys with n shares and threshold k.
|
|
30
|
+
*
|
|
31
|
+
* Uses Shamir's Secret Sharing to split the private key into n shares,
|
|
32
|
+
* where any k shares can reconstruct decryption capability.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const generator = new ThresholdKeyGenerator();
|
|
37
|
+
* const keyPair = await generator.generate({
|
|
38
|
+
* totalShares: 9,
|
|
39
|
+
* threshold: 5,
|
|
40
|
+
* keyBitLength: 2048
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // Distribute keyPair.keyShares to Guardians
|
|
44
|
+
* // Use keyPair.publicKey for encryption
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
class ThresholdKeyGenerator {
|
|
48
|
+
/**
|
|
49
|
+
* Validate a threshold configuration.
|
|
50
|
+
*
|
|
51
|
+
* @param config - The threshold configuration to validate
|
|
52
|
+
* @throws InvalidThresholdConfigError if configuration is invalid
|
|
53
|
+
*/
|
|
54
|
+
validateConfig(config) {
|
|
55
|
+
const { totalShares: n, threshold: k } = config;
|
|
56
|
+
if (!Number.isInteger(n) || n < 2) {
|
|
57
|
+
throw new InvalidThresholdConfigError(`Total shares (n) must be an integer >= 2, got ${n}`);
|
|
58
|
+
}
|
|
59
|
+
if (!Number.isInteger(k) || k < 2) {
|
|
60
|
+
throw new InvalidThresholdConfigError(`Threshold (k) must be an integer >= 2, got ${k}`);
|
|
61
|
+
}
|
|
62
|
+
if (k > n) {
|
|
63
|
+
throw new InvalidThresholdConfigError(`Threshold (k=${k}) cannot exceed total shares (n=${n})`);
|
|
64
|
+
}
|
|
65
|
+
if (config.keyBitLength !== undefined) {
|
|
66
|
+
if (!Number.isInteger(config.keyBitLength) || config.keyBitLength < 512) {
|
|
67
|
+
throw new InvalidThresholdConfigError(`Key bit length must be an integer >= 512, got ${config.keyBitLength}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate a new threshold key pair.
|
|
73
|
+
*
|
|
74
|
+
* @param config - The threshold configuration
|
|
75
|
+
* @returns A promise that resolves to the threshold key pair
|
|
76
|
+
* @throws InvalidThresholdConfigError if configuration is invalid
|
|
77
|
+
* @throws KeyGenerationFailedError if key generation fails
|
|
78
|
+
*/
|
|
79
|
+
async generate(config) {
|
|
80
|
+
this.validateConfig(config);
|
|
81
|
+
const { totalShares: n, threshold: k } = config;
|
|
82
|
+
const keyBitLength = config.keyBitLength ?? DEFAULT_KEY_BIT_LENGTH;
|
|
83
|
+
try {
|
|
84
|
+
// Dynamically import paillier-bigint to support both browser and Node.js
|
|
85
|
+
const paillier = await import('paillier-bigint');
|
|
86
|
+
// Generate the base Paillier key pair
|
|
87
|
+
const baseKeyPair = await paillier.generateRandomKeys(keyBitLength);
|
|
88
|
+
const publicKey = baseKeyPair.publicKey;
|
|
89
|
+
// Get the private key components
|
|
90
|
+
// In Paillier, the private key contains lambda and mu
|
|
91
|
+
// For threshold, we need to split lambda using Shamir's Secret Sharing
|
|
92
|
+
const lambda = baseKeyPair.privateKey.lambda;
|
|
93
|
+
const n2 = publicKey.n * publicKey.n;
|
|
94
|
+
// The Shamir modulus must be a multiple of the group order of Z*_{n²}.
|
|
95
|
+
// The order of Z*_{n²} divides n·λ, so we split modulo n·λ.
|
|
96
|
+
// This ensures that Lagrange reconstruction in the exponent is correct:
|
|
97
|
+
// Σ λ_i'·s_i ≡ Δ·λ (mod n·λ) implies c^(Σ ...) ≡ c^(Δ·λ) (mod n²).
|
|
98
|
+
const shamirModulus = publicKey.n * lambda;
|
|
99
|
+
// Generate key shares using Shamir's Secret Sharing
|
|
100
|
+
const { shares, coefficients } = this.shamirSplit(lambda, k, n, shamirModulus);
|
|
101
|
+
// Generate verification keys for each share
|
|
102
|
+
// The verification key allows ZK proof verification without revealing the share
|
|
103
|
+
const verificationKeys = await this.generateVerificationKeys(shares, publicKey, coefficients[0]);
|
|
104
|
+
// Create KeyShare objects
|
|
105
|
+
const keyShares = shares.map((share, i) => ({
|
|
106
|
+
index: i + 1, // 1-indexed
|
|
107
|
+
share: share,
|
|
108
|
+
verificationKey: verificationKeys[i],
|
|
109
|
+
}));
|
|
110
|
+
// Compute the threshold decryption constant theta.
|
|
111
|
+
// θ = L(g^(4·Δ·λ) mod n²) mod n, where Δ = n! (totalShares factorial).
|
|
112
|
+
// The combiner uses θ⁻¹ to convert combined partial decryptions
|
|
113
|
+
// into the final plaintext. This value is public and safe to share.
|
|
114
|
+
const delta = this.factorial(BigInt(n));
|
|
115
|
+
const g = publicKey.g;
|
|
116
|
+
const thetaBase = this.modPow(g, 4n * delta * lambda, n2);
|
|
117
|
+
const theta = this.mod((thetaBase - 1n) / publicKey.n, publicKey.n);
|
|
118
|
+
return {
|
|
119
|
+
publicKey,
|
|
120
|
+
verificationKeys,
|
|
121
|
+
keyShares,
|
|
122
|
+
config: {
|
|
123
|
+
totalShares: n,
|
|
124
|
+
threshold: k,
|
|
125
|
+
keyBitLength,
|
|
126
|
+
},
|
|
127
|
+
theta,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (error instanceof InvalidThresholdConfigError ||
|
|
132
|
+
error instanceof KeyGenerationFailedError) {
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
throw new KeyGenerationFailedError(`Failed to generate threshold keys: ${error instanceof Error ? error.message : String(error)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Split a secret using Shamir's Secret Sharing.
|
|
140
|
+
*
|
|
141
|
+
* Creates a random polynomial of degree k-1 where the constant term is the secret.
|
|
142
|
+
* Evaluates the polynomial at points 1, 2, ..., n to generate n shares.
|
|
143
|
+
*
|
|
144
|
+
* @param secret - The secret to split
|
|
145
|
+
* @param k - The threshold (minimum shares needed to reconstruct)
|
|
146
|
+
* @param n - The total number of shares
|
|
147
|
+
* @param modulus - The modulus for arithmetic operations
|
|
148
|
+
* @returns The shares and polynomial coefficients
|
|
149
|
+
*/
|
|
150
|
+
shamirSplit(secret, k, n, modulus) {
|
|
151
|
+
// Generate random coefficients for polynomial of degree k-1
|
|
152
|
+
// f(x) = secret + a1*x + a2*x^2 + ... + a(k-1)*x^(k-1)
|
|
153
|
+
const coefficients = [secret];
|
|
154
|
+
for (let i = 1; i < k; i++) {
|
|
155
|
+
coefficients.push(this.randomBigInt(modulus));
|
|
156
|
+
}
|
|
157
|
+
// Evaluate polynomial at points 1, 2, ..., n
|
|
158
|
+
const shares = [];
|
|
159
|
+
for (let i = 1; i <= n; i++) {
|
|
160
|
+
const x = BigInt(i);
|
|
161
|
+
let y = 0n;
|
|
162
|
+
let xPower = 1n;
|
|
163
|
+
for (const coeff of coefficients) {
|
|
164
|
+
y = this.mod(y + this.mod(coeff * xPower, modulus), modulus);
|
|
165
|
+
xPower = this.mod(xPower * x, modulus);
|
|
166
|
+
}
|
|
167
|
+
shares.push(y);
|
|
168
|
+
}
|
|
169
|
+
return { shares, coefficients };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Generate verification keys for each share.
|
|
173
|
+
*
|
|
174
|
+
* The verification key is used to verify ZK proofs of correct partial decryption.
|
|
175
|
+
* It's computed as g^share mod n^2 where g is the Paillier generator.
|
|
176
|
+
*
|
|
177
|
+
* @param shares - The key shares
|
|
178
|
+
* @param publicKey - The Paillier public key
|
|
179
|
+
* @param _secret - The original secret (for verification)
|
|
180
|
+
* @returns Array of verification keys as Uint8Array
|
|
181
|
+
*/
|
|
182
|
+
async generateVerificationKeys(shares, publicKey, _secret) {
|
|
183
|
+
const n2 = publicKey.n * publicKey.n;
|
|
184
|
+
const g = publicKey.g;
|
|
185
|
+
const verificationKeys = [];
|
|
186
|
+
for (const share of shares) {
|
|
187
|
+
// Verification key: v_i = g^(share_i) mod n^2
|
|
188
|
+
const vk = this.modPow(g, share, n2);
|
|
189
|
+
verificationKeys.push(this.bigintToUint8Array(vk));
|
|
190
|
+
}
|
|
191
|
+
return verificationKeys;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Generate a cryptographically secure random bigint less than max.
|
|
195
|
+
*
|
|
196
|
+
* @param max - The upper bound (exclusive)
|
|
197
|
+
* @returns A random bigint in [0, max)
|
|
198
|
+
*/
|
|
199
|
+
randomBigInt(max) {
|
|
200
|
+
const byteLength = Math.ceil(max.toString(2).length / 8) + 8;
|
|
201
|
+
const randomBytes = new Uint8Array(byteLength);
|
|
202
|
+
crypto.getRandomValues(randomBytes);
|
|
203
|
+
let result = 0n;
|
|
204
|
+
for (const byte of randomBytes) {
|
|
205
|
+
result = (result << 8n) | BigInt(byte);
|
|
206
|
+
}
|
|
207
|
+
return this.mod(result, max);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Compute a mod m, handling negative numbers correctly.
|
|
211
|
+
*
|
|
212
|
+
* @param a - The dividend
|
|
213
|
+
* @param m - The modulus
|
|
214
|
+
* @returns a mod m (always non-negative)
|
|
215
|
+
*/
|
|
216
|
+
mod(a, m) {
|
|
217
|
+
const result = a % m;
|
|
218
|
+
return result >= 0n ? result : result + m;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Compute base^exp mod m using square-and-multiply.
|
|
222
|
+
*
|
|
223
|
+
* @param base - The base
|
|
224
|
+
* @param exp - The exponent
|
|
225
|
+
* @param m - The modulus
|
|
226
|
+
* @returns base^exp mod m
|
|
227
|
+
*/
|
|
228
|
+
modPow(base, exp, m) {
|
|
229
|
+
if (m === 1n)
|
|
230
|
+
return 0n;
|
|
231
|
+
let result = 1n;
|
|
232
|
+
base = this.mod(base, m);
|
|
233
|
+
while (exp > 0n) {
|
|
234
|
+
if (exp % 2n === 1n) {
|
|
235
|
+
result = this.mod(result * base, m);
|
|
236
|
+
}
|
|
237
|
+
exp = exp >> 1n;
|
|
238
|
+
base = this.mod(base * base, m);
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Convert a bigint to Uint8Array.
|
|
244
|
+
*
|
|
245
|
+
* @param value - The bigint to convert
|
|
246
|
+
* @returns The Uint8Array representation
|
|
247
|
+
*/
|
|
248
|
+
bigintToUint8Array(value) {
|
|
249
|
+
if (value === 0n) {
|
|
250
|
+
return new Uint8Array([0]);
|
|
251
|
+
}
|
|
252
|
+
const hex = value.toString(16);
|
|
253
|
+
const paddedHex = hex.length % 2 === 0 ? hex : '0' + hex;
|
|
254
|
+
const bytes = new Uint8Array(paddedHex.length / 2);
|
|
255
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
256
|
+
bytes[i] = parseInt(paddedHex.slice(i * 2, i * 2 + 2), 16);
|
|
257
|
+
}
|
|
258
|
+
return bytes;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Compute n! (factorial).
|
|
262
|
+
*
|
|
263
|
+
* @param n - The number to compute factorial of
|
|
264
|
+
* @returns n!
|
|
265
|
+
*/
|
|
266
|
+
factorial(n) {
|
|
267
|
+
let result = 1n;
|
|
268
|
+
for (let i = 2n; i <= n; i++) {
|
|
269
|
+
result *= i;
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.ThresholdKeyGenerator = ThresholdKeyGenerator;
|
|
275
|
+
//# sourceMappingURL=threshold-key-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold-key-generator.js","sourceRoot":"","sources":["../../../../../../../packages/digitaldefiance-ecies-lib/src/lib/voting/threshold/threshold-key-generator.ts"],"names":[],"mappings":"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"}
|