@aztec/bb.js 0.85.0-nightly.20250416 → 0.85.0-nightly.20250418
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 +5 -6
- 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 +15 -27
- package/dest/browser/barretenberg_api/index.d.ts.map +1 -1
- package/dest/browser/index.js +2149 -198
- package/dest/node/barretenberg/backend.d.ts +5 -6
- package/dest/node/barretenberg/backend.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.js +49 -10
- package/dest/node/barretenberg_api/index.d.ts +15 -27
- package/dest/node/barretenberg_api/index.d.ts.map +1 -1
- package/dest/node/barretenberg_api/index.js +93 -194
- 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 +1 -35
- package/dest/node-cjs/barretenberg/backend.d.ts +5 -6
- package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/backend.js +49 -10
- package/dest/node-cjs/barretenberg_api/index.d.ts +15 -27
- package/dest/node-cjs/barretenberg_api/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg_api/index.js +92 -193
- 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 +2 -37
- package/package.json +2 -2
- package/src/barretenberg/backend.ts +64 -11
- package/src/barretenberg_api/index.ts +152 -355
- package/src/bindgen/mappings.ts +1 -0
- package/src/bindgen/typescript.ts +2 -1
- package/src/main.ts +0 -39
- 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/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,
|
|
@@ -586,17 +558,6 @@ program
|
|
|
586
558
|
process.exit(result ? 0 : 1);
|
|
587
559
|
});
|
|
588
560
|
|
|
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
561
|
program
|
|
601
562
|
.command('prove')
|
|
602
563
|
.description('Generate a proof and write it to a file.')
|
|
@@ -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
|
-
});
|