From ce3290b9ff77f6fa3d5886a261e40b4345d36759 Mon Sep 17 00:00:00 2001 From: Nils1729 <45318774+Nils1729@users.noreply.github.com> Date: Thu, 22 May 2025 12:52:52 +0200 Subject: [PATCH] Add more checks for public inputs (#573) --- src/fflonk_verify.js | 5 +++-- src/groth16_verify.js | 4 +++- src/misc.js | 7 +++++++ src/plonk_verify.js | 9 +++------ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/fflonk_verify.js b/src/fflonk_verify.js index df5f3801..70df0f11 100644 --- a/src/fflonk_verify.js +++ b/src/fflonk_verify.js @@ -18,6 +18,7 @@ */ import * as curves from "./curves.js"; +import { isBigIntArray } from "./misc.js"; import { BigBuffer, utils } from "ffjavascript"; import { Proof } from "./proof.js"; import { Keccak256Transcript } from "./Keccak256Transcript.js"; @@ -42,8 +43,8 @@ export default async function fflonkVerify(_vk_verifier, _publicSignals, _proof, const publicSignals = unstringifyBigInts(_publicSignals); - if (publicSignals.length !== vk.nPublic) { - logger.error("Number of public signals does not match with vk"); + if (!isBigIntArray(publicSignals, vk.nPublic)) { + logger.error("Public signals are not valid."); return false; } diff --git a/src/groth16_verify.js b/src/groth16_verify.js index ed3974e3..a951d761 100644 --- a/src/groth16_verify.js +++ b/src/groth16_verify.js @@ -20,6 +20,7 @@ /* Implementation of this paper: https://eprint.iacr.org/2016/260.pdf */ import { Scalar } from "ffjavascript"; import * as curves from "./curves.js"; +import { isBigIntArray } from "./misc.js"; import { utils } from "ffjavascript"; const {unstringifyBigInts} = utils; @@ -41,7 +42,8 @@ export default async function groth16Verify(_vk_verifier, _publicSignals, _proof const IC = new Uint8Array(curve.G1.F.n8*2 * publicSignals.length); const w = new Uint8Array(curve.Fr.n8 * publicSignals.length); - if (!publicInputsAreValid(curve, publicSignals)) { + if (!isBigIntArray(publicSignals, vk_verifier.nPublic) || + !publicInputsAreValid(curve, publicSignals)) { if (logger) logger.error("Public inputs are not valid."); return false; } diff --git a/src/misc.js b/src/misc.js index 12804fcd..a4597800 100644 --- a/src/misc.js +++ b/src/misc.js @@ -259,3 +259,10 @@ export function stringifyBigIntsWithField(Fr, o) { return o; } } + +export function isBigIntArray(o, n) { + if (!Array.isArray(o) || o.length !== n) { + return false + } + return o.every(e => typeof e === "bigint") +} diff --git a/src/plonk_verify.js b/src/plonk_verify.js index 5070ab00..725efc1e 100644 --- a/src/plonk_verify.js +++ b/src/plonk_verify.js @@ -20,6 +20,7 @@ /* Implementation of this paper: https://eprint.iacr.org/2019/953.pdf */ import * as curves from "./curves.js"; +import { isBigIntArray } from "./misc.js"; import { utils } from "ffjavascript"; import { Keccak256Transcript } from "./Keccak256Transcript.js"; import { Scalar } from "ffjavascript"; @@ -46,17 +47,13 @@ export default async function plonkVerify(_vk_verifier, _publicSignals, _proof, return false; } - if (publicSignals.length != vk_verifier.nPublic) { - if (logger) logger.error("Invalid number of public inputs"); - return false; - } - if (!evaluationsAreValid(curve, proof)) { if (logger) logger.error("Proof evaluations are not valid"); return false; } - if (!publicInputsAreValid(curve, publicSignals)) { + if (!isBigIntArray(publicSignals, vk_verifier.nPublic) || + !publicInputsAreValid(curve, publicSignals)) { if (logger) logger.error("Public inputs are not valid."); return false; }