@inco/js 0.8.0-devnet-12 → 0.8.0-devnet-20
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 +18 -76
- package/dist/cjs/advancedacl/session-key.d.ts +1 -1
- package/dist/cjs/advancedacl/session-key.js +3 -2
- package/dist/cjs/binary.d.ts +2 -4
- package/dist/cjs/binary.js +11 -6
- package/dist/cjs/encryption/index.d.ts +1 -1
- package/dist/cjs/encryption/index.js +17 -16
- package/dist/cjs/generated/abis/lightning.d.ts +70 -17
- package/dist/cjs/generated/abis/lightning.js +44 -19
- package/dist/cjs/generated/abis/test-elist.d.ts +10 -2
- package/dist/cjs/generated/abis/test-elist.js +8 -3
- package/dist/cjs/generated/abis/verifier.d.ts +8 -4
- package/dist/cjs/generated/abis/verifier.js +4 -4
- package/dist/cjs/generated/lightning.d.ts +60 -0
- package/dist/cjs/generated/lightning.js +64 -1
- package/dist/cjs/generated/local-node.d.ts +4 -4
- package/dist/cjs/generated/local-node.js +4 -4
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +11 -2
- package/dist/cjs/kms/quorumClient.d.ts +1 -10
- package/dist/cjs/kms/quorumClient.js +21 -237
- package/dist/cjs/kms/quorumConsistency.d.ts +58 -0
- package/dist/cjs/kms/quorumConsistency.js +200 -0
- package/dist/cjs/kms/thresholdPromises.d.ts +4 -3
- package/dist/cjs/kms/thresholdPromises.js +25 -15
- package/dist/cjs/lite/hadu.d.ts +1 -1
- package/dist/cjs/lite/hadu.js +3 -3
- package/dist/cjs/lite/index.d.ts +0 -2
- package/dist/cjs/lite/index.js +1 -15
- package/dist/cjs/lite/lightning.d.ts +1 -1
- package/dist/cjs/lite/lightning.js +10 -33
- package/dist/esm/advancedacl/session-key.d.ts +1 -1
- package/dist/esm/advancedacl/session-key.js +3 -2
- package/dist/esm/binary.d.ts +2 -4
- package/dist/esm/binary.js +11 -6
- package/dist/esm/encryption/index.d.ts +1 -1
- package/dist/esm/encryption/index.js +2 -2
- package/dist/esm/generated/abis/lightning.d.ts +70 -17
- package/dist/esm/generated/abis/lightning.js +44 -19
- package/dist/esm/generated/abis/test-elist.d.ts +10 -2
- package/dist/esm/generated/abis/test-elist.js +8 -3
- package/dist/esm/generated/abis/verifier.d.ts +8 -4
- package/dist/esm/generated/abis/verifier.js +4 -4
- package/dist/esm/generated/lightning.d.ts +60 -0
- package/dist/esm/generated/lightning.js +64 -1
- package/dist/esm/generated/local-node.d.ts +4 -4
- package/dist/esm/generated/local-node.js +4 -4
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/kms/quorumClient.d.ts +1 -10
- package/dist/esm/kms/quorumClient.js +21 -237
- package/dist/esm/kms/quorumConsistency.d.ts +58 -0
- package/dist/esm/kms/quorumConsistency.js +193 -0
- package/dist/esm/kms/thresholdPromises.d.ts +4 -3
- package/dist/esm/kms/thresholdPromises.js +25 -15
- package/dist/esm/lite/hadu.d.ts +1 -1
- package/dist/esm/lite/hadu.js +2 -2
- package/dist/esm/lite/index.d.ts +0 -2
- package/dist/esm/lite/index.js +1 -3
- package/dist/esm/lite/lightning.d.ts +1 -1
- package/dist/esm/lite/lightning.js +4 -27
- package/dist/types/advancedacl/session-key.d.ts +1 -1
- package/dist/types/binary.d.ts +2 -4
- package/dist/types/encryption/index.d.ts +1 -1
- package/dist/types/generated/abis/lightning.d.ts +70 -17
- package/dist/types/generated/abis/test-elist.d.ts +10 -2
- package/dist/types/generated/abis/verifier.d.ts +8 -4
- package/dist/types/generated/lightning.d.ts +60 -0
- package/dist/types/generated/local-node.d.ts +4 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/kms/quorumClient.d.ts +1 -10
- package/dist/types/kms/quorumConsistency.d.ts +58 -0
- package/dist/types/kms/thresholdPromises.d.ts +4 -3
- package/dist/types/lite/hadu.d.ts +1 -1
- package/dist/types/lite/index.d.ts +0 -2
- package/dist/types/lite/lightning.d.ts +1 -1
- package/package.json +12 -12
|
@@ -4,18 +4,18 @@ exports.KmsQuorumClient = void 0;
|
|
|
4
4
|
const binary_js_1 = require("../binary.js");
|
|
5
5
|
const encryption_js_1 = require("../encryption/encryption.js");
|
|
6
6
|
const handle_js_1 = require("../handle.js");
|
|
7
|
-
const xwing_js_1 = require("../lite/xwing.js");
|
|
8
7
|
const retry_js_1 = require("../retry.js");
|
|
9
8
|
const client_js_1 = require("./client.js");
|
|
9
|
+
const quorumConsistency_js_1 = require("./quorumConsistency.js");
|
|
10
10
|
const thresholdPromises_js_1 = require("./thresholdPromises.js");
|
|
11
11
|
/**
|
|
12
|
-
* Checks if the threshold is at least a majority of signers and
|
|
12
|
+
* Checks if the threshold is at least a majority of signers and throws an error if not.
|
|
13
|
+
* This is important to ensure that the quorum client provides the expected security guarantees.
|
|
13
14
|
*/
|
|
14
15
|
function checkMajorityThreshold(threshold, signerCount) {
|
|
15
16
|
const majority = Math.floor(signerCount / 2) + 1;
|
|
16
17
|
if (threshold < majority) {
|
|
17
|
-
|
|
18
|
-
`A threshold below majority weakens quorum security guarantees.`);
|
|
18
|
+
throw new Error(`Threshold (${threshold}) must be at least a majority (${majority}) of ${signerCount} signers to ensure security guarantees.`);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
class KmsQuorumClient {
|
|
@@ -71,7 +71,6 @@ class KmsQuorumClient {
|
|
|
71
71
|
if (threshold < 1 || threshold > urls.length) {
|
|
72
72
|
throw new Error(`Threshold must be between 1 and ${urls.length} (number of URLs)`);
|
|
73
73
|
}
|
|
74
|
-
checkMajorityThreshold(threshold, urls.length);
|
|
75
74
|
const attesters = urls.map((url, index) => {
|
|
76
75
|
return { url, signer: signers[index] };
|
|
77
76
|
});
|
|
@@ -92,41 +91,31 @@ class KmsQuorumClient {
|
|
|
92
91
|
if (threshold < 1 || threshold > kmsClients.length) {
|
|
93
92
|
throw new Error(`Threshold must be between 1 and ${kmsClients.length} (number of KMS clients)`);
|
|
94
93
|
}
|
|
95
|
-
checkMajorityThreshold(threshold, kmsClients.length);
|
|
96
94
|
return new KmsQuorumClient(kmsClients, threshold);
|
|
97
95
|
}
|
|
98
96
|
async attestedDecrypt(request, backoffConfig, reencryptKeypair) {
|
|
99
97
|
const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
|
|
100
98
|
return await kms.client.attestedDecrypt(request);
|
|
101
99
|
}, backoffConfig);
|
|
102
|
-
// Extract responses and signers
|
|
103
|
-
const thresholdResponses = thresholdResults.map((r) => r.response);
|
|
104
|
-
const signers = thresholdResults.map((r) => r.signer);
|
|
105
100
|
// Verify that responses are consistent across quorum (plaintext or ciphertext)
|
|
106
|
-
const reference = await
|
|
107
|
-
return this.buildAggregatedAttestations(reference,
|
|
101
|
+
const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyDecryptResponseConsistency)(thresholdResults, this.threshold, reencryptKeypair);
|
|
102
|
+
return this.buildAggregatedAttestations(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer));
|
|
108
103
|
}
|
|
109
104
|
async attestedCompute(request, backoffConfig, reencryptKeypair) {
|
|
110
105
|
const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
|
|
111
106
|
return await kms.client.attestedCompute(request);
|
|
112
107
|
}, backoffConfig);
|
|
113
|
-
// Extract responses and signers
|
|
114
|
-
const thresholdResponses = thresholdResults.map((r) => r.response);
|
|
115
|
-
const signers = thresholdResults.map((r) => r.signer);
|
|
116
108
|
// Verify that responses are consistent across quorum
|
|
117
|
-
const reference = await
|
|
118
|
-
return this.buildAggregatedComputeAttestation(reference,
|
|
109
|
+
const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyComputeResponseConsistency)(thresholdResults, this.threshold, request, reencryptKeypair);
|
|
110
|
+
return this.buildAggregatedComputeAttestation(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer));
|
|
119
111
|
}
|
|
120
112
|
async attestedReveal(request, backoffConfig) {
|
|
121
113
|
const thresholdResults = await this.executeKmsOperationWithThreshold(async (kms) => {
|
|
122
114
|
return await kms.client.attestedReveal(request);
|
|
123
115
|
}, backoffConfig);
|
|
124
|
-
// Extract responses and signers
|
|
125
|
-
const thresholdResponses = thresholdResults.map((r) => r.response);
|
|
126
|
-
const signers = thresholdResults.map((r) => r.signer);
|
|
127
116
|
// Verify that responses are consistent across quorum (plaintext only for reveal)
|
|
128
|
-
const reference = await this.
|
|
129
|
-
return this.buildAggregatedAttestations(reference,
|
|
117
|
+
const { reference, winningResults } = await (0, quorumConsistency_js_1.verifyDecryptResponseConsistency)(thresholdResults, this.threshold);
|
|
118
|
+
return this.buildAggregatedAttestations(reference, winningResults.map((r) => r.response), winningResults.map((r) => r.signer));
|
|
130
119
|
}
|
|
131
120
|
/**
|
|
132
121
|
* Generic method to execute a KMS operation across all clients with retry and threshold logic.
|
|
@@ -216,14 +205,14 @@ class KmsQuorumClient {
|
|
|
216
205
|
const encryptedCovalidatorSignatures = this.collectAndSortSignatures(encryptedSignatures, signers);
|
|
217
206
|
const reencryption = refAtt.value.value;
|
|
218
207
|
const ct = reencryption.userCiphertext;
|
|
219
|
-
const
|
|
208
|
+
const handleType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
|
|
220
209
|
return {
|
|
221
210
|
handle: refAtt.handle,
|
|
222
211
|
encryptedPlaintext: {
|
|
223
212
|
ciphertext: {
|
|
224
213
|
value: (0, binary_js_1.bytesToHex)(ct),
|
|
225
|
-
scheme:
|
|
226
|
-
type:
|
|
214
|
+
scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme: XWING
|
|
215
|
+
type: handleType,
|
|
227
216
|
},
|
|
228
217
|
},
|
|
229
218
|
encryptedSignatures: encryptedCovalidatorSignatures,
|
|
@@ -244,13 +233,13 @@ class KmsQuorumClient {
|
|
|
244
233
|
throw new Error('No value in reference attestation');
|
|
245
234
|
}
|
|
246
235
|
// Collect signatures and sort by signer address
|
|
247
|
-
//
|
|
236
|
+
// All responses are guaranteed to have decryption attestations by verifyComputeResponseConsistency
|
|
248
237
|
const signatures = [];
|
|
249
238
|
for (const resp of thresholdResponses) {
|
|
250
239
|
const att = resp.decryptionAttestation;
|
|
251
|
-
if (att)
|
|
252
|
-
|
|
253
|
-
|
|
240
|
+
if (!att)
|
|
241
|
+
throw new Error('Missing decryption attestation in winning response');
|
|
242
|
+
signatures.push(att.signature);
|
|
254
243
|
}
|
|
255
244
|
const covalidatorSignatures = this.collectAndSortSignatures(signatures, signers);
|
|
256
245
|
if (refAtt.value.case === 'plaintext') {
|
|
@@ -262,7 +251,7 @@ class KmsQuorumClient {
|
|
|
262
251
|
if (!ct) {
|
|
263
252
|
throw new Error('No ciphertext in reencryption');
|
|
264
253
|
}
|
|
265
|
-
const
|
|
254
|
+
const handleType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
|
|
266
255
|
// Collect encrypted signatures and sort by signer address
|
|
267
256
|
const encryptedSignatures = thresholdResponses.map((resp) => {
|
|
268
257
|
if (resp.decryptionAttestation?.value.case === 'reencryption') {
|
|
@@ -279,8 +268,8 @@ class KmsQuorumClient {
|
|
|
279
268
|
encryptedPlaintext: {
|
|
280
269
|
ciphertext: {
|
|
281
270
|
value: (0, binary_js_1.bytesToHex)(ct),
|
|
282
|
-
scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme:
|
|
283
|
-
type:
|
|
271
|
+
scheme: encryption_js_1.encryptionSchemes.xwing, // EncryptionScheme: XWING
|
|
272
|
+
type: handleType,
|
|
284
273
|
},
|
|
285
274
|
},
|
|
286
275
|
encryptedSignatures: encryptedCovalidatorSignatures,
|
|
@@ -289,211 +278,6 @@ class KmsQuorumClient {
|
|
|
289
278
|
}
|
|
290
279
|
throw new Error(`Unexpected attestation type: ${refAtt.value.case}, expected 'plaintext' or 'reencryption'`);
|
|
291
280
|
}
|
|
292
|
-
async verifyResponseConsistency(thresholdResponses, reencryptKeypair) {
|
|
293
|
-
if (thresholdResponses.length === 0) {
|
|
294
|
-
throw new Error('No responses collected to verify');
|
|
295
|
-
}
|
|
296
|
-
const reference = thresholdResponses[0];
|
|
297
|
-
for (let r = 1; r < thresholdResponses.length; r++) {
|
|
298
|
-
if (thresholdResponses[r].decryptionAttestations.length !==
|
|
299
|
-
reference.decryptionAttestations.length) {
|
|
300
|
-
throw new Error('Inconsistent number of decryption attestations across KMS responses');
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
for (let i = 0; i < reference.decryptionAttestations.length; i++) {
|
|
304
|
-
const refAtt = reference.decryptionAttestations[i];
|
|
305
|
-
if (!refAtt.value) {
|
|
306
|
-
throw new Error('No value in reference attestation');
|
|
307
|
-
}
|
|
308
|
-
const refCase = refAtt.value.case;
|
|
309
|
-
// Verify that all responses have the same case (plaintext or reencryption)
|
|
310
|
-
for (let r = 1; r < thresholdResponses.length; r++) {
|
|
311
|
-
const att = thresholdResponses[r].decryptionAttestations[i];
|
|
312
|
-
if (!att.value) {
|
|
313
|
-
throw new Error('No value in attestation');
|
|
314
|
-
}
|
|
315
|
-
if (att.value.case !== refCase) {
|
|
316
|
-
throw new Error(`Inconsistent attestation types: reference has '${refCase}' but response ${r} has '${att.value.case}'`);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
// Verify consistency based on the case
|
|
320
|
-
if (refCase === 'plaintext') {
|
|
321
|
-
this.verifyPlaintextConsistency(i, reference, thresholdResponses);
|
|
322
|
-
}
|
|
323
|
-
else if (refCase === 'reencryption') {
|
|
324
|
-
await this.verifyCiphertextConsistency(i, reference, thresholdResponses, reencryptKeypair);
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
throw new Error(`Unexpected attestation type: ${refCase}, expected 'plaintext' or 'reencryption'`);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
return reference;
|
|
331
|
-
}
|
|
332
|
-
async verifyComputeResponseConsistency(thresholdResponses, request, reencryptKeypair) {
|
|
333
|
-
if (thresholdResponses.length === 0) {
|
|
334
|
-
throw new Error('No responses collected to verify');
|
|
335
|
-
}
|
|
336
|
-
const reference = thresholdResponses[0];
|
|
337
|
-
const refAtt = reference.decryptionAttestation;
|
|
338
|
-
if (!refAtt) {
|
|
339
|
-
throw new Error('No decryption attestation in reference response');
|
|
340
|
-
}
|
|
341
|
-
if (!refAtt.value) {
|
|
342
|
-
throw new Error('No value in reference attestation');
|
|
343
|
-
}
|
|
344
|
-
const refCase = refAtt.value.case;
|
|
345
|
-
// Precompute reference values based on the case
|
|
346
|
-
let refBytes;
|
|
347
|
-
let refReencryption;
|
|
348
|
-
let refCt;
|
|
349
|
-
let refFheType;
|
|
350
|
-
if (refCase === 'plaintext') {
|
|
351
|
-
refBytes = refAtt.value.value.value;
|
|
352
|
-
}
|
|
353
|
-
else if (refCase === 'reencryption') {
|
|
354
|
-
refReencryption = refAtt.value.value;
|
|
355
|
-
refCt = refReencryption.userCiphertext;
|
|
356
|
-
if (!refCt) {
|
|
357
|
-
throw new Error('No ciphertext in reference reencryption');
|
|
358
|
-
}
|
|
359
|
-
refFheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
throw new Error(`Unexpected attestation type: ${refCase}, expected 'plaintext' or 'reencryption'`);
|
|
363
|
-
}
|
|
364
|
-
// If no reencryptPubKey is provided in the request (or it's empty), reject reencryption attestations
|
|
365
|
-
const hasReencryptPubKey = request?.reencryptPubKey && request.reencryptPubKey.length > 0;
|
|
366
|
-
if (refCase === 'reencryption' && !hasReencryptPubKey) {
|
|
367
|
-
throw new Error("Unexpected attestation type: reencryption, expected 'plaintext'");
|
|
368
|
-
}
|
|
369
|
-
// Verify that all responses have a decryption attestation and are consistent
|
|
370
|
-
for (let r = 1; r < thresholdResponses.length; r++) {
|
|
371
|
-
const att = thresholdResponses[r].decryptionAttestation;
|
|
372
|
-
if (!att) {
|
|
373
|
-
throw new Error('No decryption attestation in response');
|
|
374
|
-
}
|
|
375
|
-
if (!att.value) {
|
|
376
|
-
throw new Error('No value in attestation');
|
|
377
|
-
}
|
|
378
|
-
if (att.value.case !== refCase) {
|
|
379
|
-
throw new Error(`Inconsistent attestation types: reference has '${refCase}' but response ${r} has '${att.value.case}'`);
|
|
380
|
-
}
|
|
381
|
-
// Verify handles match
|
|
382
|
-
if (att.handle !== refAtt.handle) {
|
|
383
|
-
throw new Error('Handles differ across KMS responses');
|
|
384
|
-
}
|
|
385
|
-
// Verify consistency based on the case
|
|
386
|
-
if (refCase === 'plaintext') {
|
|
387
|
-
if (!refBytes) {
|
|
388
|
-
throw new Error('No reference plaintext bytes to compare');
|
|
389
|
-
}
|
|
390
|
-
if (att.value.case !== 'plaintext') {
|
|
391
|
-
throw new Error('Expected plaintext attestation but received non-plaintext');
|
|
392
|
-
}
|
|
393
|
-
const bytes = att.value.value.value;
|
|
394
|
-
this.verifyPlaintextBytesConsistency(refBytes, bytes);
|
|
395
|
-
}
|
|
396
|
-
else if (refCase === 'reencryption') {
|
|
397
|
-
if (!refCt || refFheType === undefined) {
|
|
398
|
-
throw new Error('No reference reencryption data to compare');
|
|
399
|
-
}
|
|
400
|
-
if (att.value.case !== 'reencryption') {
|
|
401
|
-
throw new Error('Expected reencryption attestation but received non-reencryption');
|
|
402
|
-
}
|
|
403
|
-
const reencryption = att.value.value;
|
|
404
|
-
const ct = reencryption.userCiphertext;
|
|
405
|
-
if (!ct) {
|
|
406
|
-
throw new Error('No ciphertext in reencryption');
|
|
407
|
-
}
|
|
408
|
-
const fheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(att.handle));
|
|
409
|
-
// Verify FHE type matches
|
|
410
|
-
if (fheType !== refFheType) {
|
|
411
|
-
throw new Error('FHE types differ across KMS responses');
|
|
412
|
-
}
|
|
413
|
-
// Verify handles match
|
|
414
|
-
if (att.handle !== refAtt.handle) {
|
|
415
|
-
throw new Error('Handles differ across KMS responses');
|
|
416
|
-
}
|
|
417
|
-
// If keypair provided, decrypt and verify plaintext consistency
|
|
418
|
-
if (reencryptKeypair) {
|
|
419
|
-
const refPlaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, refCt);
|
|
420
|
-
const plaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, ct);
|
|
421
|
-
this.verifyPlaintextBytesConsistency(refPlaintext, plaintext);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
return reference;
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Verifies that two plaintext byte arrays are identical.
|
|
429
|
-
* Uses constant-time comparison to prevent timing side-channel attacks.
|
|
430
|
-
*/
|
|
431
|
-
verifyPlaintextBytesConsistency(refBytes, bytes) {
|
|
432
|
-
if (refBytes.length !== bytes.length) {
|
|
433
|
-
throw new Error('Plaintexts length differ across KMS responses');
|
|
434
|
-
}
|
|
435
|
-
// Compare all bytes before deciding to throw, preventing timing side-channel
|
|
436
|
-
let mismatch = 0;
|
|
437
|
-
for (let b = 0; b < refBytes.length; b++) {
|
|
438
|
-
mismatch |= refBytes[b] ^ bytes[b];
|
|
439
|
-
}
|
|
440
|
-
if (mismatch !== 0) {
|
|
441
|
-
throw new Error('Plaintexts differ across KMS responses');
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
verifyPlaintextConsistency(index, reference, thresholdResponses) {
|
|
445
|
-
const refAtt = reference.decryptionAttestations[index];
|
|
446
|
-
if (refAtt.value?.case !== 'plaintext') {
|
|
447
|
-
throw new Error('Expected plaintext attestation');
|
|
448
|
-
}
|
|
449
|
-
const refBytes = refAtt.value.value.value;
|
|
450
|
-
for (let r = 1; r < thresholdResponses.length; r++) {
|
|
451
|
-
const att = thresholdResponses[r].decryptionAttestations[index];
|
|
452
|
-
if (att.value?.case !== 'plaintext') {
|
|
453
|
-
throw new Error('Expected plaintext attestation but received non-plaintext');
|
|
454
|
-
}
|
|
455
|
-
const bytes = att.value.value.value;
|
|
456
|
-
this.verifyPlaintextBytesConsistency(refBytes, bytes);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
async verifyCiphertextConsistency(index, reference, thresholdResponses, reencryptKeypair) {
|
|
460
|
-
const refAtt = reference.decryptionAttestations[index];
|
|
461
|
-
if (refAtt.value?.case !== 'reencryption') {
|
|
462
|
-
throw new Error('Expected reencryption attestation');
|
|
463
|
-
}
|
|
464
|
-
const refReencryption = refAtt.value.value;
|
|
465
|
-
const refCt = refReencryption.userCiphertext;
|
|
466
|
-
if (!refCt) {
|
|
467
|
-
throw new Error('No ciphertext in reference reencryption');
|
|
468
|
-
}
|
|
469
|
-
const refFheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(refAtt.handle));
|
|
470
|
-
for (let r = 1; r < thresholdResponses.length; r++) {
|
|
471
|
-
const att = thresholdResponses[r].decryptionAttestations[index];
|
|
472
|
-
if (att.value?.case !== 'reencryption') {
|
|
473
|
-
throw new Error('Expected reencryption attestation but received non-reencryption');
|
|
474
|
-
}
|
|
475
|
-
const reencryption = att.value.value;
|
|
476
|
-
const ct = reencryption.userCiphertext;
|
|
477
|
-
if (!ct) {
|
|
478
|
-
throw new Error('No ciphertext in reencryption');
|
|
479
|
-
}
|
|
480
|
-
const fheType = (0, handle_js_1.getHandleType)((0, binary_js_1.parseHex)(att.handle));
|
|
481
|
-
// Verify FHE type matches
|
|
482
|
-
if (fheType !== refFheType) {
|
|
483
|
-
throw new Error('FHE types differ across KMS responses');
|
|
484
|
-
}
|
|
485
|
-
// Verify handles match
|
|
486
|
-
if (att.handle !== refAtt.handle) {
|
|
487
|
-
throw new Error('Handles differ across KMS responses');
|
|
488
|
-
}
|
|
489
|
-
// If keypair provided, decrypt and verify plaintext consistency
|
|
490
|
-
if (reencryptKeypair) {
|
|
491
|
-
const refPlaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, refCt);
|
|
492
|
-
const plaintext = await (0, xwing_js_1.decrypt)(reencryptKeypair, ct);
|
|
493
|
-
this.verifyPlaintextBytesConsistency(refPlaintext, plaintext);
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
281
|
}
|
|
498
282
|
exports.KmsQuorumClient = KmsQuorumClient;
|
|
499
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvcnVtQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ttcy9xdW9ydW1DbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsNENBS3NCO0FBTXRCLCtEQUdxQztBQVVyQyw0Q0FBNkM7QUFFN0MsK0NBQTJDO0FBRTNDLDBDQUErQztBQUMvQywyQ0FBMkQ7QUFDM0QsaUVBQThEO0FBTzlEOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxTQUFpQixFQUFFLFdBQW1CO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxJQUFJLFNBQVMsR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUN6QixPQUFPLENBQUMsSUFBSSxDQUNWLGdDQUFnQyxTQUFTLDRCQUE0QixRQUFRLFFBQVEsV0FBVyxZQUFZO1lBQzFHLGdFQUFnRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFhLGVBQWU7SUFDVCxJQUFJLENBQVE7SUFDWixTQUFTLENBQVM7SUFRbkMsaUJBQWlCO0lBQ2pCLFlBQ0Usa0JBQW9FLEVBQ3BFLFNBQWlCO1FBRWpCLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FDL0QsQ0FBQztRQUNKLENBQUM7UUFFRCxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0QsMkZBQTJGO1FBQzNGLElBQ0Us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
|
|
283
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvcnVtQ2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ttcy9xdW9ydW1DbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsNENBS3NCO0FBTXRCLCtEQUdxQztBQVVyQyw0Q0FBNkM7QUFHN0MsMENBQStDO0FBQy9DLDJDQUEyRDtBQUMzRCxpRUFHZ0M7QUFDaEMsaUVBQThEO0FBTzlEOzs7R0FHRztBQUNILFNBQVMsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxXQUFtQjtJQUNwRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakQsSUFBSSxTQUFTLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDYixjQUFjLFNBQVMsa0NBQWtDLFFBQVEsUUFBUSxXQUFXLHlDQUF5QyxDQUM5SCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxNQUFhLGVBQWU7SUFDVCxJQUFJLENBQVE7SUFDWixTQUFTLENBQVM7SUFRbkMsaUJBQWlCO0lBQ2pCLFlBQ0Usa0JBQW9FLEVBQ3BFLFNBQWlCO1FBRWpCLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FDL0QsQ0FBQztRQUNKLENBQUM7UUFFRCxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0QsMkZBQTJGO1FBQzNGLElBQ0Usa0JBQWtCLENBQUMs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
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
import type { AttestedComputeRequest, AttestedComputeResponse, AttestedDecryptResponse, AttestedRevealResponse, DecryptionAttestation as ProtoDecryptionAttestation } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
|
|
3
|
+
import type { XwingKeypair } from '../lite/xwing.js';
|
|
4
|
+
/**
|
|
5
|
+
* Computes a canonical key for a single attestation.
|
|
6
|
+
* For plaintext/reencryption+keypair, the key is handle:hex(value).
|
|
7
|
+
* For reencryption without a keypair (XWing ciphertexts are non-deterministic),
|
|
8
|
+
* falls back to handle:op-type as a structural stand-in.
|
|
9
|
+
*/
|
|
10
|
+
export declare function computeAttestationKey(att: ProtoDecryptionAttestation, reencryptKeypair?: XwingKeypair): Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Validates that all responses in a winning bucket have the same attestation
|
|
13
|
+
* count and types as the quorum-elected reference (bucket[0]).
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateDecryptResponseStructure<T extends AttestedDecryptResponse | AttestedRevealResponse>(bucket: Array<{
|
|
16
|
+
response: T;
|
|
17
|
+
signer: Address;
|
|
18
|
+
}>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Validates that all responses in a winning bucket have a decryption
|
|
21
|
+
* attestation with the same case as the quorum-elected reference (bucket[0]),
|
|
22
|
+
* and that the case is consistent with the request's reencryptPubKey.
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateComputeResponseStructure(bucket: Array<{
|
|
25
|
+
response: AttestedComputeResponse;
|
|
26
|
+
signer: Address;
|
|
27
|
+
}>, request?: AttestedComputeRequest): void;
|
|
28
|
+
/**
|
|
29
|
+
* Verifies decrypt/reveal response consistency using hash-bucket voting.
|
|
30
|
+
* Collects all N responses, buckets them by content key, and returns the
|
|
31
|
+
* winning bucket (the first one with >= threshold votes).
|
|
32
|
+
*
|
|
33
|
+
* This is robust against a faulty first-responding node: even if responses[0]
|
|
34
|
+
* disagrees, a quorum of agreeing responses will form a winning bucket.
|
|
35
|
+
*/
|
|
36
|
+
export declare function verifyDecryptResponseConsistency<T extends AttestedDecryptResponse | AttestedRevealResponse>(allResults: Array<{
|
|
37
|
+
response: T;
|
|
38
|
+
signer: Address;
|
|
39
|
+
}>, threshold: number, reencryptKeypair?: XwingKeypair): Promise<{
|
|
40
|
+
reference: T;
|
|
41
|
+
winningResults: Array<{
|
|
42
|
+
response: T;
|
|
43
|
+
signer: Address;
|
|
44
|
+
}>;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Verifies compute response consistency using hash-bucket voting.
|
|
48
|
+
*/
|
|
49
|
+
export declare function verifyComputeResponseConsistency(allResults: Array<{
|
|
50
|
+
response: AttestedComputeResponse;
|
|
51
|
+
signer: Address;
|
|
52
|
+
}>, threshold: number, request?: AttestedComputeRequest, reencryptKeypair?: XwingKeypair): Promise<{
|
|
53
|
+
reference: AttestedComputeResponse;
|
|
54
|
+
winningResults: Array<{
|
|
55
|
+
response: AttestedComputeResponse;
|
|
56
|
+
signer: Address;
|
|
57
|
+
}>;
|
|
58
|
+
}>;
|