Skip to content

Commit 2c37a84

Browse files
authored
Merge pull request #11411 from MinaProtocol/feature/check-public-input-length-kimchi
Update proof-systems to check public input length
2 parents fa2ff28 + 1a3861e commit 2c37a84

9 files changed

+37
-6
lines changed

src/lib/crypto/kimchi_bindings/js/bindings.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,25 +1523,27 @@ var caml_plonk_verifier_index_of_rust = function(x, affine_class) {
15231523
var domain = caml_plonk_domain_of_rust(x.domain);
15241524
var max_poly_size = x.max_poly_size;
15251525
var max_quot_size = x.max_quot_size;
1526+
var public_ = x.public_;
15261527
var srs = free_on_finalize(x.srs);
15271528
var evals = caml_plonk_verification_evals_of_rust(x.evals, affine_class);
15281529
var shifts = caml_plonk_verification_shifts_of_rust(x.shifts);
15291530
// TODO: Handle linearization correctly!
15301531
// var linearization = linearization_of_rust(x.linearization, affine_class);
15311532
var lookup_index = None;
15321533
x.free();
1533-
return [0, domain, max_poly_size, max_quot_size, srs, evals, shifts, None];
1534+
return [0, domain, max_poly_size, max_quot_size, public_, srs, evals, shifts, None];
15341535
};
15351536
// Provides: caml_plonk_verifier_index_to_rust
15361537
// Requires: caml_plonk_domain_to_rust, caml_plonk_verification_evals_to_rust, caml_plonk_verification_shifts_to_rust, free_finalization_registry
15371538
var caml_plonk_verifier_index_to_rust = function(x, klass, domain_class, verification_evals_class, poly_comm_class, mk_affine, verification_shifts_class) {
15381539
var domain = caml_plonk_domain_to_rust(x[1], domain_class);
15391540
var max_poly_size = x[2];
15401541
var max_quot_size = x[3];
1541-
var srs = x[4];
1542-
var evals = caml_plonk_verification_evals_to_rust(x[5], verification_evals_class, poly_comm_class, mk_affine);
1543-
var shifts = caml_plonk_verification_shifts_to_rust(x[6], verification_shifts_class);
1544-
return new klass(domain, max_poly_size, max_quot_size, srs, evals, shifts);
1542+
var public_ = x[4];
1543+
var srs = x[5];
1544+
var evals = caml_plonk_verification_evals_to_rust(x[6], verification_evals_class, poly_comm_class, mk_affine);
1545+
var shifts = caml_plonk_verification_shifts_to_rust(x[7], verification_shifts_class);
1546+
return new klass(domain, max_poly_size, max_quot_size, public_, srs, evals, shifts);
15451547
};
15461548

15471549

src/lib/crypto/kimchi_bindings/stubs/kimchi_types.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ module VerifierIndex = struct
171171
{ domain : 'fr domain
172172
; max_poly_size : int
173173
; max_quot_size : int
174+
; public : int
174175
; srs : 'srs
175176
; evals : 'poly_comm verification_evals
176177
; shifts : 'fr array

src/lib/crypto/kimchi_bindings/stubs/src/pasta_fp_plonk_verifier_index.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ impl From<VerifierIndex<GAffine>> for CamlPastaFpPlonkVerifierIndex {
2929
},
3030
max_poly_size: vi.max_poly_size as isize,
3131
max_quot_size: vi.max_quot_size as isize,
32+
public: vi.public as isize,
3233
srs: CamlFpSrs(vi.srs.get().expect("have an srs").clone()),
3334
evals: CamlPlonkVerificationEvals {
3435
sigma_comm: vi.sigma_comm.to_vec().iter().map(Into::into).collect(),
@@ -88,6 +89,7 @@ impl From<CamlPastaFpPlonkVerifierIndex> for VerifierIndex<GAffine> {
8889
domain,
8990
max_poly_size: index.max_poly_size as usize,
9091
max_quot_size: index.max_quot_size as usize,
92+
public: index.public as usize,
9193
powers_of_alpha,
9294
srs: {
9395
let res = once_cell::sync::OnceCell::new();
@@ -230,6 +232,7 @@ pub fn caml_pasta_fp_plonk_verifier_index_dummy() -> CamlPastaFpPlonkVerifierInd
230232
},
231233
max_poly_size: 0,
232234
max_quot_size: 0,
235+
public: 0,
233236
srs: CamlFpSrs::new(SRS::create(0)),
234237
evals: CamlPlonkVerificationEvals {
235238
sigma_comm: vec_comm(PERMUTS),

src/lib/crypto/kimchi_bindings/stubs/src/pasta_fq_plonk_verifier_index.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ impl From<VerifierIndex<GAffine>> for CamlPastaFqPlonkVerifierIndex {
2929
},
3030
max_poly_size: vi.max_poly_size as isize,
3131
max_quot_size: vi.max_quot_size as isize,
32+
public: vi.public as isize,
3233
srs: CamlFqSrs(vi.srs.get().expect("have an srs").clone()),
3334
evals: CamlPlonkVerificationEvals {
3435
sigma_comm: vi.sigma_comm.to_vec().iter().map(Into::into).collect(),
@@ -88,6 +89,7 @@ impl From<CamlPastaFqPlonkVerifierIndex> for VerifierIndex<GAffine> {
8889
domain,
8990
max_poly_size: index.max_poly_size as usize,
9091
max_quot_size: index.max_quot_size as usize,
92+
public: index.public as usize,
9193
powers_of_alpha,
9294
srs: {
9395
let res = once_cell::sync::OnceCell::new();
@@ -230,6 +232,7 @@ pub fn caml_pasta_fq_plonk_verifier_index_dummy() -> CamlPastaFqPlonkVerifierInd
230232
},
231233
max_poly_size: 0,
232234
max_quot_size: 0,
235+
public: 0,
233236
srs: CamlFqSrs::new(SRS::create(0)),
234237
evals: CamlPlonkVerificationEvals {
235238
sigma_comm: vec_comm(PERMUTS),

src/lib/crypto/kimchi_bindings/stubs/src/plonk_verifier_index.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ pub struct CamlPlonkVerifierIndex<Fr, SRS, PolyComm> {
144144
pub domain: CamlPlonkDomain<Fr>,
145145
pub max_poly_size: ocaml::Int,
146146
pub max_quot_size: ocaml::Int,
147+
pub public: ocaml::Int,
147148
pub srs: SRS,
148149
pub evals: CamlPlonkVerificationEvals<PolyComm>,
149150
pub shifts: Vec<Fr>,

src/lib/crypto/kimchi_bindings/wasm/src/plonk_verifier_index.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ macro_rules! impl_verification_key {
224224
pub domain: WasmDomain,
225225
pub max_poly_size: i32,
226226
pub max_quot_size: i32,
227+
pub public_: i32,
227228
#[wasm_bindgen(skip)]
228229
pub srs: $WasmSrs,
229230
#[wasm_bindgen(skip)]
@@ -240,6 +241,7 @@ macro_rules! impl_verification_key {
240241
domain: &WasmDomain,
241242
max_poly_size: i32,
242243
max_quot_size: i32,
244+
public_: i32,
243245
srs: &$WasmSrs,
244246
evals: &WasmPlonkVerificationEvals,
245247
shifts: &WasmShifts,
@@ -248,6 +250,7 @@ macro_rules! impl_verification_key {
248250
domain: domain.clone(),
249251
max_poly_size,
250252
max_quot_size,
253+
public_,
251254
srs: srs.clone(),
252255
evals: evals.clone(),
253256
shifts: shifts.clone(),
@@ -286,6 +289,7 @@ macro_rules! impl_verification_key {
286289
},
287290
max_poly_size: vi.max_poly_size as i32,
288291
max_quot_size: vi.max_quot_size as i32,
292+
public_: vi.public as i32,
289293
srs: srs.into(),
290294
evals: WasmPlonkVerificationEvals {
291295
sigma_comm: IntoIterator::into_iter(vi.sigma_comm).map(From::from).collect(),
@@ -359,6 +363,7 @@ macro_rules! impl_verification_key {
359363
pub fn of_wasm(
360364
max_poly_size: i32,
361365
max_quot_size: i32,
366+
public_: i32,
362367
log_size_of_group: i32,
363368
srs: &$WasmSrs,
364369
evals: &WasmPlonkVerificationEvals,
@@ -405,6 +410,7 @@ macro_rules! impl_verification_key {
405410
endo: endo_q,
406411
max_poly_size: max_poly_size as usize,
407412
max_quot_size: max_quot_size as usize,
413+
public: public_ as usize,
408414
zkpm: {
409415
let res = once_cell::sync::OnceCell::new();
410416
res.set(zk_polynomial(domain)).unwrap();
@@ -437,6 +443,7 @@ macro_rules! impl_verification_key {
437443
of_wasm(
438444
index.max_poly_size,
439445
index.max_quot_size,
446+
index.public_,
440447
index.domain.log_size_of_group,
441448
&index.srs,
442449
&index.evals,
@@ -575,6 +582,7 @@ macro_rules! impl_verification_key {
575582
},
576583
max_poly_size: 0,
577584
max_quot_size: 0,
585+
public_: 0,
578586
srs: $WasmSrs(Arc::new(SRS::create(0))),
579587
evals: WasmPlonkVerificationEvals {
580588
sigma_comm: vec_comm(PERMUTS),

src/lib/crypto/proof-systems

src/lib/pickles/side_loaded_verification_key.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,11 @@ module Stable = struct
205205
in
206206
let log2_size = Import.Domain.log2_size d in
207207
let max_quot_size = Common.max_quot_size_int (Import.Domain.size d) in
208+
let public =
209+
let (T (input, conv, _conv_inv)) = Impls.Wrap.input () in
210+
let (Typ typ) = input in
211+
typ.size_in_field_elements
212+
in
208213
(* we only compute the wrap_vk if the srs can be loaded *)
209214
let srs =
210215
try Some (Backend.Tock.Keypair.load_urs ()) with _ -> None
@@ -217,6 +222,7 @@ module Stable = struct
217222
}
218223
; max_poly_size = 1 lsl Nat.to_int Backend.Tock.Rounds.n
219224
; max_quot_size
225+
; public
220226
; srs
221227
; evals =
222228
(let g (x, y) =

src/lib/pickles/verification_key.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ module Verifier_index_json = struct
4949
{ domain : 'fr domain
5050
; max_poly_size : int
5151
; max_quot_size : int
52+
; public : int
5253
; srs : 'sRS
5354
; evals : 'polyComm verification_evals
5455
; shifts : 'fr array
@@ -120,12 +121,18 @@ module Stable = struct
120121
let log2_size = Int.ceil_log2 d.constraints in
121122
let d = Domain.Pow_2_roots_of_unity log2_size in
122123
let max_quot_size = Common.max_quot_size_int (Domain.size d) in
124+
let public =
125+
let (T (input, conv, _conv_inv)) = Impls.Wrap.input () in
126+
let (Typ typ) = input in
127+
typ.size_in_field_elements
128+
in
123129
{ domain =
124130
{ log_size_of_group = log2_size
125131
; group_gen = Backend.Tock.Field.domain_generator log2_size
126132
}
127133
; max_poly_size = 1 lsl Nat.to_int Rounds.Wrap.n
128134
; max_quot_size
135+
; public
129136
; srs
130137
; evals =
131138
(let g (x, y) =

0 commit comments

Comments
 (0)