@aztec/bb.js 0.85.0-nightly.20250417 → 0.85.0-nightly.20250419
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/dest/browser/barretenberg/backend.d.ts +12 -8
- package/dest/browser/barretenberg/backend.d.ts.map +1 -1
- package/dest/browser/barretenberg-threads.js +1 -1
- package/dest/browser/barretenberg.js +1 -1
- package/dest/browser/barretenberg_api/index.d.ts +18 -27
- package/dest/browser/barretenberg_api/index.d.ts.map +1 -1
- package/dest/browser/index.js +2226 -254
- package/dest/node/barretenberg/backend.d.ts +12 -8
- package/dest/node/barretenberg/backend.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.js +64 -15
- package/dest/node/barretenberg_api/index.d.ts +18 -27
- package/dest/node/barretenberg_api/index.d.ts.map +1 -1
- package/dest/node/barretenberg_api/index.js +110 -190
- package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node/bindgen/mappings.d.ts.map +1 -1
- package/dest/node/bindgen/mappings.js +2 -1
- package/dest/node/bindgen/typescript.d.ts.map +1 -1
- package/dest/node/bindgen/typescript.js +3 -2
- package/dest/node/main.d.ts +0 -1
- package/dest/node/main.d.ts.map +1 -1
- package/dest/node/main.js +41 -38
- package/dest/node-cjs/barretenberg/backend.d.ts +12 -8
- package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/backend.js +64 -15
- package/dest/node-cjs/barretenberg_api/index.d.ts +18 -27
- package/dest/node-cjs/barretenberg_api/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_api/index.js +109 -189
- package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node-cjs/bindgen/mappings.d.ts.map +1 -1
- package/dest/node-cjs/bindgen/mappings.js +2 -1
- package/dest/node-cjs/bindgen/typescript.d.ts.map +1 -1
- package/dest/node-cjs/bindgen/typescript.js +3 -2
- package/dest/node-cjs/main.d.ts +0 -1
- package/dest/node-cjs/main.d.ts.map +1 -1
- package/dest/node-cjs/main.js +42 -40
- package/package.json +2 -2
- package/src/barretenberg/backend.ts +86 -18
- package/src/barretenberg_api/index.ts +171 -338
- package/src/bindgen/mappings.ts +1 -0
- package/src/bindgen/typescript.ts +2 -1
- package/src/main.ts +43 -42
- package/dest/node/barretenberg/schnorr.test.d.ts +0 -2
- package/dest/node/barretenberg/schnorr.test.d.ts.map +0 -1
- package/dest/node/barretenberg/schnorr.test.js +0 -113
- package/dest/node-cjs/barretenberg/schnorr.test.d.ts +0 -2
- package/dest/node-cjs/barretenberg/schnorr.test.d.ts.map +0 -1
- package/dest/node-cjs/barretenberg/schnorr.test.js +0 -115
- package/src/barretenberg/schnorr.test.ts +0 -182
package/src/bindgen/mappings.ts
CHANGED
|
@@ -13,6 +13,7 @@ const typeMap: { [key: string]: string } = {
|
|
|
13
13
|
'fq::vec_in_buf': 'Fq[]',
|
|
14
14
|
'fq::vec_out_buf': 'Fq[]',
|
|
15
15
|
'const uint8_t *': 'Uint8Array',
|
|
16
|
+
'uint8_vec_vec_in_buf': 'Uint8Array[]',
|
|
16
17
|
'uint8_t **': 'Uint8Array',
|
|
17
18
|
in_str_buf: 'string',
|
|
18
19
|
out_str_buf: 'string',
|
|
@@ -9,6 +9,7 @@ export function generateTypeScriptCode(filename: string) {
|
|
|
9
9
|
|
|
10
10
|
let output = `// WARNING: FILE CODE GENERATED BY BINDGEN UTILITY. DO NOT EDIT!
|
|
11
11
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
12
|
+
import { BarretenbergWasmMain } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
|
|
12
13
|
import { BarretenbergWasmWorker, BarretenbergWasm } from '../barretenberg_wasm/index.js';
|
|
13
14
|
import { BufferDeserializer, NumberDeserializer, VectorDeserializer, BoolDeserializer, StringDeserializer, serializeBufferable, OutputType } from '../serialize/index.js';
|
|
14
15
|
import { Fr, Fq, Point, Buffer32, Buffer128, Ptr } from '../types/index.js';
|
|
@@ -24,7 +25,7 @@ import { Fr, Fq, Point, Buffer32, Buffer128, Ptr } from '../types/index.js';
|
|
|
24
25
|
function generateClass(functionDeclarations: FunctionDeclaration[]) {
|
|
25
26
|
let output = `
|
|
26
27
|
export class BarretenbergApi {
|
|
27
|
-
constructor(protected wasm: BarretenbergWasmWorker) {}
|
|
28
|
+
constructor(protected wasm: BarretenbergWasmWorker | BarretenbergWasmMain) {}
|
|
28
29
|
|
|
29
30
|
`;
|
|
30
31
|
|
package/src/main.ts
CHANGED
|
@@ -4,9 +4,7 @@ import { Crs, GrumpkinCrs, Barretenberg, RawBuffer } from './index.js';
|
|
|
4
4
|
import createDebug from 'debug';
|
|
5
5
|
import { readFileSync, writeFileSync } from 'fs';
|
|
6
6
|
import { gunzipSync } from 'zlib';
|
|
7
|
-
import { ungzip } from 'pako';
|
|
8
7
|
import { Command } from 'commander';
|
|
9
|
-
import { decode } from '@msgpack/msgpack';
|
|
10
8
|
import { Timer, writeBenchmark } from './benchmark/index.js';
|
|
11
9
|
import path from 'path';
|
|
12
10
|
import { UltraHonkBackendOptions } from './barretenberg/backend.js';
|
|
@@ -46,16 +44,6 @@ function base64ToUint8Array(base64: string) {
|
|
|
46
44
|
return bytes;
|
|
47
45
|
}
|
|
48
46
|
|
|
49
|
-
function readStack(bytecodePath: string, numToDrop = 0) {
|
|
50
|
-
const encodedPackedZippedBytecodeArray = readFileSync(bytecodePath, 'utf-8');
|
|
51
|
-
const packedZippedBytecodeArray = base64ToUint8Array(encodedPackedZippedBytecodeArray);
|
|
52
|
-
const zipped = decode(
|
|
53
|
-
packedZippedBytecodeArray.subarray(0, packedZippedBytecodeArray.length - numToDrop),
|
|
54
|
-
) as Uint8Array[];
|
|
55
|
-
const bytecodeArray = zipped.map((arr: Uint8Array) => ungzip(arr));
|
|
56
|
-
return bytecodeArray;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
47
|
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1126): split this into separate Plonk and Honk functions as their gate count differs
|
|
60
48
|
async function getGatesUltra(bytecodePath: string, recursive: boolean, honkRecursion: boolean, api: Barretenberg) {
|
|
61
49
|
const { total } = await computeCircuitSize(bytecodePath, recursive, honkRecursion, api);
|
|
@@ -222,22 +210,6 @@ export async function proveAndVerifyMegaHonk(
|
|
|
222
210
|
/* eslint-enable camelcase */
|
|
223
211
|
}
|
|
224
212
|
|
|
225
|
-
export async function proveAndVerifyAztecClient(bytecodePath: string, witnessPath: string, crsPath: string) {
|
|
226
|
-
/* eslint-disable camelcase */
|
|
227
|
-
const { api } = await initClientIVC(crsPath);
|
|
228
|
-
try {
|
|
229
|
-
const bytecode = readStack(bytecodePath);
|
|
230
|
-
const witness = readStack(witnessPath);
|
|
231
|
-
|
|
232
|
-
const verified = await api.acirProveAndVerifyAztecClient(bytecode, witness);
|
|
233
|
-
debug(`Verification ${verified ? 'successful' : 'failed'}`);
|
|
234
|
-
return verified;
|
|
235
|
-
} finally {
|
|
236
|
-
await api.destroy();
|
|
237
|
-
}
|
|
238
|
-
/* eslint-enable camelcase */
|
|
239
|
-
}
|
|
240
|
-
|
|
241
213
|
export async function prove(
|
|
242
214
|
bytecodePath: string,
|
|
243
215
|
recursive: boolean,
|
|
@@ -435,7 +407,9 @@ export async function proveUltraHonk(
|
|
|
435
407
|
|
|
436
408
|
const acirProveUltraHonk = options?.keccak
|
|
437
409
|
? api.acirProveUltraKeccakHonk.bind(api)
|
|
438
|
-
:
|
|
410
|
+
: options?.starknet
|
|
411
|
+
? api.acirProveUltraStarknetHonk.bind(api)
|
|
412
|
+
: api.acirProveUltraHonk.bind(api);
|
|
439
413
|
const proof = await acirProveUltraHonk(bytecode, witness);
|
|
440
414
|
|
|
441
415
|
if (outputPath === '-') {
|
|
@@ -463,7 +437,9 @@ export async function writeVkUltraHonk(
|
|
|
463
437
|
|
|
464
438
|
const acirWriteVkUltraHonk = options?.keccak
|
|
465
439
|
? api.acirWriteVkUltraKeccakHonk.bind(api)
|
|
466
|
-
:
|
|
440
|
+
: options?.starknet
|
|
441
|
+
? api.acirWriteVkUltraStarknetHonk.bind(api)
|
|
442
|
+
: api.acirWriteVkUltraHonk.bind(api);
|
|
467
443
|
const vk = await acirWriteVkUltraHonk(bytecode);
|
|
468
444
|
|
|
469
445
|
if (outputPath === '-') {
|
|
@@ -488,7 +464,9 @@ export async function verifyUltraHonk(
|
|
|
488
464
|
try {
|
|
489
465
|
const acirVerifyUltraHonk = options?.keccak
|
|
490
466
|
? api.acirVerifyUltraKeccakHonk.bind(api)
|
|
491
|
-
:
|
|
467
|
+
: options?.starknet
|
|
468
|
+
? api.acirVerifyUltraStarknetHonk.bind(api)
|
|
469
|
+
: api.acirVerifyUltraHonk.bind(api);
|
|
492
470
|
const verified = await acirVerifyUltraHonk(
|
|
493
471
|
Uint8Array.from(readFileSync(proofPath)),
|
|
494
472
|
new RawBuffer(readFileSync(vkPath)),
|
|
@@ -586,17 +564,6 @@ program
|
|
|
586
564
|
process.exit(result ? 0 : 1);
|
|
587
565
|
});
|
|
588
566
|
|
|
589
|
-
program
|
|
590
|
-
.command('client_ivc_prove_and_verify')
|
|
591
|
-
.description('Generate a ClientIVC proof.')
|
|
592
|
-
.option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/acir.msgpack.b64')
|
|
593
|
-
.option('-w, --witness-path <path>', 'Specify the witness path', './target/witnesses.msgpack.b64')
|
|
594
|
-
.action(async ({ bytecodePath, witnessPath }) => {
|
|
595
|
-
const { crsPath } = handleGlobalOptions();
|
|
596
|
-
const result = await proveAndVerifyAztecClient(bytecodePath, witnessPath, crsPath);
|
|
597
|
-
process.exit(result ? 0 : 1);
|
|
598
|
-
});
|
|
599
|
-
|
|
600
567
|
program
|
|
601
568
|
.command('prove')
|
|
602
569
|
.description('Generate a proof and write it to a file.')
|
|
@@ -718,6 +685,18 @@ program
|
|
|
718
685
|
await proveUltraHonk(bytecodePath, witnessPath, crsPath, outputPath, { keccak: true });
|
|
719
686
|
});
|
|
720
687
|
|
|
688
|
+
program
|
|
689
|
+
.command('prove_ultra_starknet_honk')
|
|
690
|
+
.description('Generate a proof and write it to a file.')
|
|
691
|
+
.option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
|
|
692
|
+
.option('-r, --recursive', 'Create a SNARK friendly proof', false)
|
|
693
|
+
.option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.gz')
|
|
694
|
+
.option('-o, --output-path <path>', 'Specify the proof output path', './proofs/proof')
|
|
695
|
+
.action(async ({ bytecodePath, recursive, witnessPath, outputPath, crsPath }) => {
|
|
696
|
+
handleGlobalOptions();
|
|
697
|
+
await proveUltraHonk(bytecodePath, witnessPath, crsPath, outputPath, { starknet: true });
|
|
698
|
+
});
|
|
699
|
+
|
|
721
700
|
program
|
|
722
701
|
.command('write_vk_ultra_honk')
|
|
723
702
|
.description('Output verification key.')
|
|
@@ -738,6 +717,17 @@ program
|
|
|
738
717
|
await writeVkUltraHonk(bytecodePath, crsPath, outputPath, { keccak: true });
|
|
739
718
|
});
|
|
740
719
|
|
|
720
|
+
program
|
|
721
|
+
.command('write_vk_ultra_starknet_honk')
|
|
722
|
+
.description('Output verification key.')
|
|
723
|
+
.option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/program.json')
|
|
724
|
+
.option('-r, --recursive', 'Create a SNARK friendly proof', false)
|
|
725
|
+
.requiredOption('-o, --output-path <path>', 'Specify the path to write the key')
|
|
726
|
+
.action(async ({ bytecodePath, recursive, outputPath, crsPath }) => {
|
|
727
|
+
handleGlobalOptions();
|
|
728
|
+
await writeVkUltraHonk(bytecodePath, crsPath, outputPath, { starknet: true });
|
|
729
|
+
});
|
|
730
|
+
|
|
741
731
|
program
|
|
742
732
|
.command('verify_ultra_honk')
|
|
743
733
|
.description('Verify a proof. Process exists with success or failure code.')
|
|
@@ -760,6 +750,17 @@ program
|
|
|
760
750
|
process.exit(result ? 0 : 1);
|
|
761
751
|
});
|
|
762
752
|
|
|
753
|
+
program
|
|
754
|
+
.command('verify_ultra_starknet_honk')
|
|
755
|
+
.description('Verify a proof. Process exists with success or failure code.')
|
|
756
|
+
.requiredOption('-p, --proof-path <path>', 'Specify the path to the proof')
|
|
757
|
+
.requiredOption('-k, --vk <path>', 'path to a verification key. avoids recomputation.')
|
|
758
|
+
.action(async ({ proofPath, vk }) => {
|
|
759
|
+
const { crsPath } = handleGlobalOptions();
|
|
760
|
+
const result = await verifyUltraHonk(proofPath, vk, crsPath, { starknet: true });
|
|
761
|
+
process.exit(result ? 0 : 1);
|
|
762
|
+
});
|
|
763
|
+
|
|
763
764
|
program
|
|
764
765
|
.command('proof_as_fields_honk')
|
|
765
766
|
.description('Return the proof as fields elements')
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schnorr.test.d.ts","sourceRoot":"","sources":["../../../src/barretenberg/schnorr.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { TextEncoder } from 'util';
|
|
2
|
-
import { Buffer128, Buffer32, Fq, Fr, Point } from '../types/index.js';
|
|
3
|
-
import { Barretenberg } from './index.js';
|
|
4
|
-
import { asyncMap } from '../async_map/index.js';
|
|
5
|
-
describe('schnorr', () => {
|
|
6
|
-
const msg = Buffer.from(new TextEncoder().encode('The quick brown dog jumped over the lazy fox.'));
|
|
7
|
-
let api;
|
|
8
|
-
beforeAll(async () => {
|
|
9
|
-
api = await Barretenberg.new({ threads: 1 });
|
|
10
|
-
}, 30000);
|
|
11
|
-
afterAll(async () => {
|
|
12
|
-
await api.destroy();
|
|
13
|
-
});
|
|
14
|
-
it('should verify signature', async () => {
|
|
15
|
-
const pk = Fr.fromBuffer(new Uint8Array([
|
|
16
|
-
0x0b, 0x9b, 0x3a, 0xde, 0xe6, 0xb3, 0xd8, 0x1b, 0x28, 0xa0, 0x88, 0x6b, 0x2a, 0x84, 0x15, 0xc7, 0xda, 0x31,
|
|
17
|
-
0x29, 0x1a, 0x5e, 0x96, 0xbb, 0x7a, 0x56, 0x63, 0x9e, 0x17, 0x7d, 0x30, 0x1b, 0xeb,
|
|
18
|
-
]));
|
|
19
|
-
const pubKey = await api.schnorrComputePublicKey(pk);
|
|
20
|
-
const [s, e] = await api.schnorrConstructSignature(msg, pk);
|
|
21
|
-
const verified = await api.schnorrVerifySignature(msg, pubKey, s, e);
|
|
22
|
-
expect(verified).toBe(true);
|
|
23
|
-
});
|
|
24
|
-
it('public key negation should work', async () => {
|
|
25
|
-
const publicKeyStr = '0x164f01b1011a1b292217acf53eef4d74f625f6e9bd5edfdb74c56fd81aafeebb21912735f9266a3719f61c1eb747ddee0cac9917f5c807485d356709b529b62c';
|
|
26
|
-
const publicKey = Point.fromString(publicKeyStr);
|
|
27
|
-
// hardcoded expected negated public key
|
|
28
|
-
const expectedInvertedStr = '0x164f01b1011a1b292217acf53eef4d74f625f6e9bd5edfdb74c56fd81aafeebb0ed3273ce80b35f29e5a2997ca397a6f1b874f3083f16948e6ac8e8a3ad649d5';
|
|
29
|
-
const expectedInverted = Point.fromString(expectedInvertedStr);
|
|
30
|
-
// negate - should match expected negated key
|
|
31
|
-
const negatedPublicKey = await api.schnorrNegatePublicKey(publicKey);
|
|
32
|
-
expect(negatedPublicKey.equals(expectedInverted)).toEqual(true);
|
|
33
|
-
// negate again - should be original public key now
|
|
34
|
-
expect((await api.schnorrNegatePublicKey(negatedPublicKey)).equals(publicKey)).toEqual(true);
|
|
35
|
-
});
|
|
36
|
-
it('should create + verify multi signature', async () => {
|
|
37
|
-
// set up multisig accounts
|
|
38
|
-
const numSigners = 7;
|
|
39
|
-
const pks = [...Array(numSigners)].map(() => Fq.random());
|
|
40
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
41
|
-
// round one
|
|
42
|
-
const roundOnePublicOutputs = [];
|
|
43
|
-
const roundOnePrivateOutputs = [];
|
|
44
|
-
for (let i = 0; i < numSigners; ++i) {
|
|
45
|
-
const [publicOutput, privateOutput] = await api.schnorrMultisigConstructSignatureRound1();
|
|
46
|
-
roundOnePublicOutputs.push(publicOutput);
|
|
47
|
-
roundOnePrivateOutputs.push(privateOutput);
|
|
48
|
-
}
|
|
49
|
-
// round two
|
|
50
|
-
const roundTwoOutputs = await asyncMap(pks, async (pk, i) => (await api.schnorrMultisigConstructSignatureRound2(msg, pk, roundOnePrivateOutputs[i], pubKeys, roundOnePublicOutputs))[0]);
|
|
51
|
-
// generate signature
|
|
52
|
-
const [s, e] = await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, roundTwoOutputs);
|
|
53
|
-
const [combinedKey] = await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys);
|
|
54
|
-
expect(combinedKey).not.toEqual(Buffer.alloc(64));
|
|
55
|
-
const verified = await api.schnorrVerifySignature(msg, combinedKey, s, e);
|
|
56
|
-
expect(verified).toBe(true);
|
|
57
|
-
});
|
|
58
|
-
it('should identify invalid multi signature', async () => {
|
|
59
|
-
const pks = [...Array(3)].map(() => Fq.random());
|
|
60
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
61
|
-
const [combinedKey] = await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys);
|
|
62
|
-
const verified = await api.schnorrVerifySignature(msg, combinedKey, Buffer32.random(), Buffer32.random());
|
|
63
|
-
expect(verified).toBe(false);
|
|
64
|
-
});
|
|
65
|
-
it('should not construct invalid multi signature', async () => {
|
|
66
|
-
// set up multisig accounts
|
|
67
|
-
const numSigners = 7;
|
|
68
|
-
const pks = [...Array(numSigners)].map(() => Fq.random());
|
|
69
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
70
|
-
// round one
|
|
71
|
-
const roundOnePublicOutputs = [];
|
|
72
|
-
const roundOnePrivateOutputs = [];
|
|
73
|
-
for (let i = 0; i < numSigners; ++i) {
|
|
74
|
-
const [publicOutput, privateOutput] = await api.schnorrMultisigConstructSignatureRound1();
|
|
75
|
-
roundOnePublicOutputs.push(publicOutput);
|
|
76
|
-
roundOnePrivateOutputs.push(privateOutput);
|
|
77
|
-
}
|
|
78
|
-
// round two
|
|
79
|
-
const roundTwoOutputs = await asyncMap(pks, async (pk, i) => (await api.schnorrMultisigConstructSignatureRound2(msg, pk, roundOnePrivateOutputs[i], pubKeys, roundOnePublicOutputs))[0]);
|
|
80
|
-
// wrong number of data
|
|
81
|
-
{
|
|
82
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys.slice(0, -1), roundOnePublicOutputs.slice(0, -1), roundTwoOutputs.slice(0, -1)))[2]).toBe(false);
|
|
83
|
-
}
|
|
84
|
-
// invalid round two output
|
|
85
|
-
{
|
|
86
|
-
const invalidOutputs = [...roundTwoOutputs];
|
|
87
|
-
invalidOutputs[1] = (await api.schnorrMultisigConstructSignatureRound2(msg, pks[2], // <- Wrong private key.
|
|
88
|
-
roundOnePrivateOutputs[1], pubKeys, roundOnePublicOutputs))[0];
|
|
89
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, invalidOutputs))[2]).toBe(false);
|
|
90
|
-
}
|
|
91
|
-
// contains duplicates
|
|
92
|
-
{
|
|
93
|
-
const invalidOutputs = [...roundTwoOutputs];
|
|
94
|
-
invalidOutputs[1] = roundTwoOutputs[2];
|
|
95
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, invalidOutputs))[2]).toBe(false);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
it('should not create combined key from public keys containing invalid key', async () => {
|
|
99
|
-
const pks = [...Array(5)].map(() => Fq.random());
|
|
100
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
101
|
-
// not a valid point
|
|
102
|
-
{
|
|
103
|
-
pubKeys[1] = new Buffer128(Buffer.alloc(128));
|
|
104
|
-
expect((await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys))[1]).toBe(false);
|
|
105
|
-
}
|
|
106
|
-
// contains duplicates
|
|
107
|
-
{
|
|
108
|
-
pubKeys[1] = pubKeys[2];
|
|
109
|
-
expect((await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys))[1]).toBe(false);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nobm9yci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhcnJldGVuYmVyZy9zY2hub3JyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpELFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxDQUFDO0lBQ25HLElBQUksR0FBaUIsQ0FBQztJQUV0QixTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDbkIsR0FBRyxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVWLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQixNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2QyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUN0QixJQUFJLFVBQVUsQ0FBQztZQUNiLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUs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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schnorr.test.d.ts","sourceRoot":"","sources":["../../../src/barretenberg/schnorr.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const util_1 = require("util");
|
|
4
|
-
const index_js_1 = require("../types/index.js");
|
|
5
|
-
const index_js_2 = require("./index.js");
|
|
6
|
-
const index_js_3 = require("../async_map/index.js");
|
|
7
|
-
describe('schnorr', () => {
|
|
8
|
-
const msg = Buffer.from(new util_1.TextEncoder().encode('The quick brown dog jumped over the lazy fox.'));
|
|
9
|
-
let api;
|
|
10
|
-
beforeAll(async () => {
|
|
11
|
-
api = await index_js_2.Barretenberg.new({ threads: 1 });
|
|
12
|
-
}, 30000);
|
|
13
|
-
afterAll(async () => {
|
|
14
|
-
await api.destroy();
|
|
15
|
-
});
|
|
16
|
-
it('should verify signature', async () => {
|
|
17
|
-
const pk = index_js_1.Fr.fromBuffer(new Uint8Array([
|
|
18
|
-
0x0b, 0x9b, 0x3a, 0xde, 0xe6, 0xb3, 0xd8, 0x1b, 0x28, 0xa0, 0x88, 0x6b, 0x2a, 0x84, 0x15, 0xc7, 0xda, 0x31,
|
|
19
|
-
0x29, 0x1a, 0x5e, 0x96, 0xbb, 0x7a, 0x56, 0x63, 0x9e, 0x17, 0x7d, 0x30, 0x1b, 0xeb,
|
|
20
|
-
]));
|
|
21
|
-
const pubKey = await api.schnorrComputePublicKey(pk);
|
|
22
|
-
const [s, e] = await api.schnorrConstructSignature(msg, pk);
|
|
23
|
-
const verified = await api.schnorrVerifySignature(msg, pubKey, s, e);
|
|
24
|
-
expect(verified).toBe(true);
|
|
25
|
-
});
|
|
26
|
-
it('public key negation should work', async () => {
|
|
27
|
-
const publicKeyStr = '0x164f01b1011a1b292217acf53eef4d74f625f6e9bd5edfdb74c56fd81aafeebb21912735f9266a3719f61c1eb747ddee0cac9917f5c807485d356709b529b62c';
|
|
28
|
-
const publicKey = index_js_1.Point.fromString(publicKeyStr);
|
|
29
|
-
// hardcoded expected negated public key
|
|
30
|
-
const expectedInvertedStr = '0x164f01b1011a1b292217acf53eef4d74f625f6e9bd5edfdb74c56fd81aafeebb0ed3273ce80b35f29e5a2997ca397a6f1b874f3083f16948e6ac8e8a3ad649d5';
|
|
31
|
-
const expectedInverted = index_js_1.Point.fromString(expectedInvertedStr);
|
|
32
|
-
// negate - should match expected negated key
|
|
33
|
-
const negatedPublicKey = await api.schnorrNegatePublicKey(publicKey);
|
|
34
|
-
expect(negatedPublicKey.equals(expectedInverted)).toEqual(true);
|
|
35
|
-
// negate again - should be original public key now
|
|
36
|
-
expect((await api.schnorrNegatePublicKey(negatedPublicKey)).equals(publicKey)).toEqual(true);
|
|
37
|
-
});
|
|
38
|
-
it('should create + verify multi signature', async () => {
|
|
39
|
-
// set up multisig accounts
|
|
40
|
-
const numSigners = 7;
|
|
41
|
-
const pks = [...Array(numSigners)].map(() => index_js_1.Fq.random());
|
|
42
|
-
const pubKeys = await (0, index_js_3.asyncMap)(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
43
|
-
// round one
|
|
44
|
-
const roundOnePublicOutputs = [];
|
|
45
|
-
const roundOnePrivateOutputs = [];
|
|
46
|
-
for (let i = 0; i < numSigners; ++i) {
|
|
47
|
-
const [publicOutput, privateOutput] = await api.schnorrMultisigConstructSignatureRound1();
|
|
48
|
-
roundOnePublicOutputs.push(publicOutput);
|
|
49
|
-
roundOnePrivateOutputs.push(privateOutput);
|
|
50
|
-
}
|
|
51
|
-
// round two
|
|
52
|
-
const roundTwoOutputs = await (0, index_js_3.asyncMap)(pks, async (pk, i) => (await api.schnorrMultisigConstructSignatureRound2(msg, pk, roundOnePrivateOutputs[i], pubKeys, roundOnePublicOutputs))[0]);
|
|
53
|
-
// generate signature
|
|
54
|
-
const [s, e] = await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, roundTwoOutputs);
|
|
55
|
-
const [combinedKey] = await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys);
|
|
56
|
-
expect(combinedKey).not.toEqual(Buffer.alloc(64));
|
|
57
|
-
const verified = await api.schnorrVerifySignature(msg, combinedKey, s, e);
|
|
58
|
-
expect(verified).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
it('should identify invalid multi signature', async () => {
|
|
61
|
-
const pks = [...Array(3)].map(() => index_js_1.Fq.random());
|
|
62
|
-
const pubKeys = await (0, index_js_3.asyncMap)(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
63
|
-
const [combinedKey] = await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys);
|
|
64
|
-
const verified = await api.schnorrVerifySignature(msg, combinedKey, index_js_1.Buffer32.random(), index_js_1.Buffer32.random());
|
|
65
|
-
expect(verified).toBe(false);
|
|
66
|
-
});
|
|
67
|
-
it('should not construct invalid multi signature', async () => {
|
|
68
|
-
// set up multisig accounts
|
|
69
|
-
const numSigners = 7;
|
|
70
|
-
const pks = [...Array(numSigners)].map(() => index_js_1.Fq.random());
|
|
71
|
-
const pubKeys = await (0, index_js_3.asyncMap)(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
72
|
-
// round one
|
|
73
|
-
const roundOnePublicOutputs = [];
|
|
74
|
-
const roundOnePrivateOutputs = [];
|
|
75
|
-
for (let i = 0; i < numSigners; ++i) {
|
|
76
|
-
const [publicOutput, privateOutput] = await api.schnorrMultisigConstructSignatureRound1();
|
|
77
|
-
roundOnePublicOutputs.push(publicOutput);
|
|
78
|
-
roundOnePrivateOutputs.push(privateOutput);
|
|
79
|
-
}
|
|
80
|
-
// round two
|
|
81
|
-
const roundTwoOutputs = await (0, index_js_3.asyncMap)(pks, async (pk, i) => (await api.schnorrMultisigConstructSignatureRound2(msg, pk, roundOnePrivateOutputs[i], pubKeys, roundOnePublicOutputs))[0]);
|
|
82
|
-
// wrong number of data
|
|
83
|
-
{
|
|
84
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys.slice(0, -1), roundOnePublicOutputs.slice(0, -1), roundTwoOutputs.slice(0, -1)))[2]).toBe(false);
|
|
85
|
-
}
|
|
86
|
-
// invalid round two output
|
|
87
|
-
{
|
|
88
|
-
const invalidOutputs = [...roundTwoOutputs];
|
|
89
|
-
invalidOutputs[1] = (await api.schnorrMultisigConstructSignatureRound2(msg, pks[2], // <- Wrong private key.
|
|
90
|
-
roundOnePrivateOutputs[1], pubKeys, roundOnePublicOutputs))[0];
|
|
91
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, invalidOutputs))[2]).toBe(false);
|
|
92
|
-
}
|
|
93
|
-
// contains duplicates
|
|
94
|
-
{
|
|
95
|
-
const invalidOutputs = [...roundTwoOutputs];
|
|
96
|
-
invalidOutputs[1] = roundTwoOutputs[2];
|
|
97
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, invalidOutputs))[2]).toBe(false);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
it('should not create combined key from public keys containing invalid key', async () => {
|
|
101
|
-
const pks = [...Array(5)].map(() => index_js_1.Fq.random());
|
|
102
|
-
const pubKeys = await (0, index_js_3.asyncMap)(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
103
|
-
// not a valid point
|
|
104
|
-
{
|
|
105
|
-
pubKeys[1] = new index_js_1.Buffer128(Buffer.alloc(128));
|
|
106
|
-
expect((await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys))[1]).toBe(false);
|
|
107
|
-
}
|
|
108
|
-
// contains duplicates
|
|
109
|
-
{
|
|
110
|
-
pubKeys[1] = pubKeys[2];
|
|
111
|
-
expect((await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys))[1]).toBe(false);
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nobm9yci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhcnJldGVuYmVyZy9zY2hub3JyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBbUM7QUFDbkMsZ0RBQXVFO0FBQ3ZFLHlDQUEwQztBQUMxQyxvREFBaUQ7QUFFakQsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDdkIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLGtCQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQyxDQUFDO0lBQ25HLElBQUksR0FBaUIsQ0FBQztJQUV0QixTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDbkIsR0FBRyxHQUFHLE1BQU0sdUJBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFVixRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDbEIsTUFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseUJBQXlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkMsTUFBTSxFQUFFLEdBQUcsYUFBRSxDQUFDLFVBQVUsQ0FDdEIsSUFBSSxVQUFVLENBQUM7WUFDYixJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7WUFDMUcsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJ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
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { TextEncoder } from 'util';
|
|
2
|
-
import { Buffer128, Buffer32, Fq, Fr, Point } from '../types/index.js';
|
|
3
|
-
import { Barretenberg } from './index.js';
|
|
4
|
-
import { asyncMap } from '../async_map/index.js';
|
|
5
|
-
|
|
6
|
-
describe('schnorr', () => {
|
|
7
|
-
const msg = Buffer.from(new TextEncoder().encode('The quick brown dog jumped over the lazy fox.'));
|
|
8
|
-
let api: Barretenberg;
|
|
9
|
-
|
|
10
|
-
beforeAll(async () => {
|
|
11
|
-
api = await Barretenberg.new({ threads: 1 });
|
|
12
|
-
}, 30000);
|
|
13
|
-
|
|
14
|
-
afterAll(async () => {
|
|
15
|
-
await api.destroy();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it('should verify signature', async () => {
|
|
19
|
-
const pk = Fr.fromBuffer(
|
|
20
|
-
new Uint8Array([
|
|
21
|
-
0x0b, 0x9b, 0x3a, 0xde, 0xe6, 0xb3, 0xd8, 0x1b, 0x28, 0xa0, 0x88, 0x6b, 0x2a, 0x84, 0x15, 0xc7, 0xda, 0x31,
|
|
22
|
-
0x29, 0x1a, 0x5e, 0x96, 0xbb, 0x7a, 0x56, 0x63, 0x9e, 0x17, 0x7d, 0x30, 0x1b, 0xeb,
|
|
23
|
-
]),
|
|
24
|
-
);
|
|
25
|
-
const pubKey = await api.schnorrComputePublicKey(pk);
|
|
26
|
-
const [s, e] = await api.schnorrConstructSignature(msg, pk);
|
|
27
|
-
const verified = await api.schnorrVerifySignature(msg, pubKey, s, e);
|
|
28
|
-
|
|
29
|
-
expect(verified).toBe(true);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('public key negation should work', async () => {
|
|
33
|
-
const publicKeyStr =
|
|
34
|
-
'0x164f01b1011a1b292217acf53eef4d74f625f6e9bd5edfdb74c56fd81aafeebb21912735f9266a3719f61c1eb747ddee0cac9917f5c807485d356709b529b62c';
|
|
35
|
-
const publicKey = Point.fromString(publicKeyStr);
|
|
36
|
-
// hardcoded expected negated public key
|
|
37
|
-
const expectedInvertedStr =
|
|
38
|
-
'0x164f01b1011a1b292217acf53eef4d74f625f6e9bd5edfdb74c56fd81aafeebb0ed3273ce80b35f29e5a2997ca397a6f1b874f3083f16948e6ac8e8a3ad649d5';
|
|
39
|
-
const expectedInverted = Point.fromString(expectedInvertedStr);
|
|
40
|
-
|
|
41
|
-
// negate - should match expected negated key
|
|
42
|
-
const negatedPublicKey = await api.schnorrNegatePublicKey(publicKey);
|
|
43
|
-
expect(negatedPublicKey.equals(expectedInverted)).toEqual(true);
|
|
44
|
-
// negate again - should be original public key now
|
|
45
|
-
expect((await api.schnorrNegatePublicKey(negatedPublicKey)).equals(publicKey)).toEqual(true);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('should create + verify multi signature', async () => {
|
|
49
|
-
// set up multisig accounts
|
|
50
|
-
const numSigners = 7;
|
|
51
|
-
const pks = [...Array(numSigners)].map(() => Fq.random());
|
|
52
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
53
|
-
|
|
54
|
-
// round one
|
|
55
|
-
const roundOnePublicOutputs: Buffer128[] = [];
|
|
56
|
-
const roundOnePrivateOutputs: Buffer128[] = [];
|
|
57
|
-
for (let i = 0; i < numSigners; ++i) {
|
|
58
|
-
const [publicOutput, privateOutput] = await api.schnorrMultisigConstructSignatureRound1();
|
|
59
|
-
roundOnePublicOutputs.push(publicOutput);
|
|
60
|
-
roundOnePrivateOutputs.push(privateOutput);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// round two
|
|
64
|
-
const roundTwoOutputs = await asyncMap(
|
|
65
|
-
pks,
|
|
66
|
-
async (pk, i) =>
|
|
67
|
-
(
|
|
68
|
-
await api.schnorrMultisigConstructSignatureRound2(
|
|
69
|
-
msg,
|
|
70
|
-
pk,
|
|
71
|
-
roundOnePrivateOutputs[i],
|
|
72
|
-
pubKeys,
|
|
73
|
-
roundOnePublicOutputs,
|
|
74
|
-
)
|
|
75
|
-
)[0],
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
// generate signature
|
|
79
|
-
const [s, e] = await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, roundTwoOutputs)!;
|
|
80
|
-
const [combinedKey] = await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys);
|
|
81
|
-
expect(combinedKey).not.toEqual(Buffer.alloc(64));
|
|
82
|
-
const verified = await api.schnorrVerifySignature(msg, combinedKey, s, e);
|
|
83
|
-
expect(verified).toBe(true);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('should identify invalid multi signature', async () => {
|
|
87
|
-
const pks = [...Array(3)].map(() => Fq.random());
|
|
88
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
89
|
-
const [combinedKey] = await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys);
|
|
90
|
-
|
|
91
|
-
const verified = await api.schnorrVerifySignature(msg, combinedKey, Buffer32.random(), Buffer32.random());
|
|
92
|
-
expect(verified).toBe(false);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('should not construct invalid multi signature', async () => {
|
|
96
|
-
// set up multisig accounts
|
|
97
|
-
const numSigners = 7;
|
|
98
|
-
const pks = [...Array(numSigners)].map(() => Fq.random());
|
|
99
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
100
|
-
|
|
101
|
-
// round one
|
|
102
|
-
const roundOnePublicOutputs: Buffer128[] = [];
|
|
103
|
-
const roundOnePrivateOutputs: Buffer128[] = [];
|
|
104
|
-
for (let i = 0; i < numSigners; ++i) {
|
|
105
|
-
const [publicOutput, privateOutput] = await api.schnorrMultisigConstructSignatureRound1();
|
|
106
|
-
roundOnePublicOutputs.push(publicOutput);
|
|
107
|
-
roundOnePrivateOutputs.push(privateOutput);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// round two
|
|
111
|
-
const roundTwoOutputs = await asyncMap(
|
|
112
|
-
pks,
|
|
113
|
-
async (pk, i) =>
|
|
114
|
-
(
|
|
115
|
-
await api.schnorrMultisigConstructSignatureRound2(
|
|
116
|
-
msg,
|
|
117
|
-
pk,
|
|
118
|
-
roundOnePrivateOutputs[i],
|
|
119
|
-
pubKeys,
|
|
120
|
-
roundOnePublicOutputs,
|
|
121
|
-
)
|
|
122
|
-
)[0],
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
// wrong number of data
|
|
126
|
-
{
|
|
127
|
-
expect(
|
|
128
|
-
(
|
|
129
|
-
await api.schnorrMultisigCombineSignatures(
|
|
130
|
-
msg,
|
|
131
|
-
pubKeys.slice(0, -1),
|
|
132
|
-
roundOnePublicOutputs.slice(0, -1),
|
|
133
|
-
roundTwoOutputs.slice(0, -1),
|
|
134
|
-
)
|
|
135
|
-
)[2],
|
|
136
|
-
).toBe(false);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// invalid round two output
|
|
140
|
-
{
|
|
141
|
-
const invalidOutputs = [...roundTwoOutputs];
|
|
142
|
-
invalidOutputs[1] = (
|
|
143
|
-
await api.schnorrMultisigConstructSignatureRound2(
|
|
144
|
-
msg,
|
|
145
|
-
pks[2], // <- Wrong private key.
|
|
146
|
-
roundOnePrivateOutputs[1],
|
|
147
|
-
pubKeys,
|
|
148
|
-
roundOnePublicOutputs,
|
|
149
|
-
)
|
|
150
|
-
)[0];
|
|
151
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, invalidOutputs))[2]).toBe(
|
|
152
|
-
false,
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// contains duplicates
|
|
157
|
-
{
|
|
158
|
-
const invalidOutputs = [...roundTwoOutputs];
|
|
159
|
-
invalidOutputs[1] = roundTwoOutputs[2];
|
|
160
|
-
expect((await api.schnorrMultisigCombineSignatures(msg, pubKeys, roundOnePublicOutputs, invalidOutputs))[2]).toBe(
|
|
161
|
-
false,
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('should not create combined key from public keys containing invalid key', async () => {
|
|
167
|
-
const pks = [...Array(5)].map(() => Fq.random());
|
|
168
|
-
const pubKeys = await asyncMap(pks, pk => api.schnorrMultisigCreateMultisigPublicKey(pk));
|
|
169
|
-
|
|
170
|
-
// not a valid point
|
|
171
|
-
{
|
|
172
|
-
pubKeys[1] = new Buffer128(Buffer.alloc(128));
|
|
173
|
-
expect((await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys))[1]).toBe(false);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// contains duplicates
|
|
177
|
-
{
|
|
178
|
-
pubKeys[1] = pubKeys[2];
|
|
179
|
-
expect((await api.schnorrMultisigValidateAndCombineSignerPubkeys(pubKeys))[1]).toBe(false);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
});
|