@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.
Files changed (48) hide show
  1. package/dest/browser/barretenberg/backend.d.ts +12 -8
  2. package/dest/browser/barretenberg/backend.d.ts.map +1 -1
  3. package/dest/browser/barretenberg-threads.js +1 -1
  4. package/dest/browser/barretenberg.js +1 -1
  5. package/dest/browser/barretenberg_api/index.d.ts +18 -27
  6. package/dest/browser/barretenberg_api/index.d.ts.map +1 -1
  7. package/dest/browser/index.js +2226 -254
  8. package/dest/node/barretenberg/backend.d.ts +12 -8
  9. package/dest/node/barretenberg/backend.d.ts.map +1 -1
  10. package/dest/node/barretenberg/backend.js +64 -15
  11. package/dest/node/barretenberg_api/index.d.ts +18 -27
  12. package/dest/node/barretenberg_api/index.d.ts.map +1 -1
  13. package/dest/node/barretenberg_api/index.js +110 -190
  14. package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  15. package/dest/node/bindgen/mappings.d.ts.map +1 -1
  16. package/dest/node/bindgen/mappings.js +2 -1
  17. package/dest/node/bindgen/typescript.d.ts.map +1 -1
  18. package/dest/node/bindgen/typescript.js +3 -2
  19. package/dest/node/main.d.ts +0 -1
  20. package/dest/node/main.d.ts.map +1 -1
  21. package/dest/node/main.js +41 -38
  22. package/dest/node-cjs/barretenberg/backend.d.ts +12 -8
  23. package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
  24. package/dest/node-cjs/barretenberg/backend.js +64 -15
  25. package/dest/node-cjs/barretenberg_api/index.d.ts +18 -27
  26. package/dest/node-cjs/barretenberg_api/index.d.ts.map +1 -1
  27. package/dest/node-cjs/barretenberg_api/index.js +109 -189
  28. package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
  29. package/dest/node-cjs/bindgen/mappings.d.ts.map +1 -1
  30. package/dest/node-cjs/bindgen/mappings.js +2 -1
  31. package/dest/node-cjs/bindgen/typescript.d.ts.map +1 -1
  32. package/dest/node-cjs/bindgen/typescript.js +3 -2
  33. package/dest/node-cjs/main.d.ts +0 -1
  34. package/dest/node-cjs/main.d.ts.map +1 -1
  35. package/dest/node-cjs/main.js +42 -40
  36. package/package.json +2 -2
  37. package/src/barretenberg/backend.ts +86 -18
  38. package/src/barretenberg_api/index.ts +171 -338
  39. package/src/bindgen/mappings.ts +1 -0
  40. package/src/bindgen/typescript.ts +2 -1
  41. package/src/main.ts +43 -42
  42. package/dest/node/barretenberg/schnorr.test.d.ts +0 -2
  43. package/dest/node/barretenberg/schnorr.test.d.ts.map +0 -1
  44. package/dest/node/barretenberg/schnorr.test.js +0 -113
  45. package/dest/node-cjs/barretenberg/schnorr.test.d.ts +0 -2
  46. package/dest/node-cjs/barretenberg/schnorr.test.d.ts.map +0 -1
  47. package/dest/node-cjs/barretenberg/schnorr.test.js +0 -115
  48. package/src/barretenberg/schnorr.test.ts +0 -182
@@ -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
- : api.acirProveUltraHonk.bind(api);
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
- : api.acirWriteVkUltraHonk.bind(api);
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
- : api.acirVerifyUltraHonk.bind(api);
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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=schnorr.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=schnorr.test.d.ts.map
@@ -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
- });