/* Copyright 2018 0KIMS association. This file is part of snarkJS. snarkJS is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. snarkJS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with snarkJS. If not, see . */ // Format of the output // Hash of the last contribution 64 Bytes // 2^N*2-1 TauG1 Points (compressed) // 2^N TauG2 Points (compressed) // 2^N AlphaTauG1 Points (compressed) // 2^N BetaTauG1 Points (compressed) // Public Key // BetaG2 (compressed) // G1*s (compressed) // G1*s*tau (compressed) // G1*t (compressed) // G1*t*alpha (compressed) // G1*u (compressed) // G1*u*beta (compressed) // G2*sp*tau (compressed) // G2*tp*alpha (compressed) // G2*up*beta (compressed) import * as fastFile from "fastfile"; import Blake2b from "blake2b-wasm"; import * as utils from "./zkey_utils.js"; import * as misc from "./misc.js"; import { applyKeyToChallengeSection } from "./mpc_applykey.js"; import { hashPubKey } from "./zkey_utils.js"; import { hashToG2 as hashToG2 } from "./keypair.js"; export default async function bellmanContribute(curve, challengeFilename, responesFileName, entropy, logger) { await Blake2b.ready(); const rng = await misc.getRandomRng(entropy); const delta = curve.Fr.fromRng(rng); const invDelta = curve.Fr.inv(delta); const sG1 = curve.G1.F.n8*2; const sG2 = curve.G2.F.n8*2; const fdFrom = await fastFile.readExisting(challengeFilename); const fdTo = await fastFile.createOverride(responesFileName); await copy(sG1); // alpha1 await copy(sG1); // beta1 await copy(sG2); // beta2 await copy(sG2); // gamma2 const oldDelta1 = await readG1(); const delta1 = curve.G1.timesFr(oldDelta1, delta); await writeG1(delta1); const oldDelta2 = await readG2(); const delta2 = curve.G2.timesFr(oldDelta2, delta); await writeG2(delta2); // IC const nIC = await fdFrom.readUBE32(); await fdTo.writeUBE32(nIC); await copy(nIC*sG1); // H const nH = await fdFrom.readUBE32(); await fdTo.writeUBE32(nH); await applyKeyToChallengeSection(fdFrom, fdTo, null, curve, "G1", nH, invDelta, curve.Fr.e(1), "UNCOMPRESSED", "H", logger); // L const nL = await fdFrom.readUBE32(); await fdTo.writeUBE32(nL); await applyKeyToChallengeSection(fdFrom, fdTo, null, curve, "G1", nL, invDelta, curve.Fr.e(1), "UNCOMPRESSED", "L", logger); // A const nA = await fdFrom.readUBE32(); await fdTo.writeUBE32(nA); await copy(nA*sG1); // B1 const nB1 = await fdFrom.readUBE32(); await fdTo.writeUBE32(nB1); await copy(nB1*sG1); // B2 const nB2 = await fdFrom.readUBE32(); await fdTo.writeUBE32(nB2); await copy(nB2*sG2); ////////// /// Read contributions ////////// const transcriptHasher = Blake2b(64); const mpcParams = {}; // csHash mpcParams.csHash = await fdFrom.read(64); transcriptHasher.update(mpcParams.csHash); const nConttributions = await fdFrom.readUBE32(); mpcParams.contributions = []; for (let i=0; i