From ac0743b688f5cfc15233f28c512b05682113f876 Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Date: Tue, 10 Sep 2024 13:09:24 +0200 Subject: [PATCH 1/4] fix: guarantee that max prefix length is < min prefix length + child size --- go/ops.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/go/ops.go b/go/ops.go index 5ddecc1a..fffaa1a4 100644 --- a/go/ops.go +++ b/go/ops.go @@ -166,6 +166,10 @@ func (op *InnerOp) CheckAgainstSpec(spec *ProofSpec, b int) error { return errors.New("spec.InnerSpec.ChildSize must be >= 1") } + if spec.InnerSpec.MaxPrefixLength >= spec.InnerSpec.MinPrefixLength+spec.InnerSpec.ChildSize { + return errors.New("spec.InnerSpec.MaxPrefixLength must be < spec.InnerSpec.MinPrefixLength + spec.InnerSpec.ChildSize") + } + // ensures soundness, with suffix having to be of correct length if len(op.Suffix)%int(spec.InnerSpec.ChildSize) != 0 { return fmt.Errorf("InnerOp suffix malformed") From 3d7762d0b6d0723687c5b566ad1023dadc9fdac8 Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Date: Tue, 10 Sep 2024 13:15:06 +0200 Subject: [PATCH 2/4] same fix for rust implementation --- rust/src/verify.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rust/src/verify.rs b/rust/src/verify.rs index ade0b93a..a70610f6 100644 --- a/rust/src/verify.rs +++ b/rust/src/verify.rs @@ -203,7 +203,11 @@ fn ensure_inner(inner: &ics23::InnerOp, spec: &ics23::ProofSpec) -> Result<()> { ); ensure!( inner_spec.child_size > 0, - "spec.InnerSpec.ChildSize must be >= 1" + "spec.inner_spec.child_size must be >= 1" + ); + ensure!( + inner_spec.max_prefix_length < inner_spec.min_prefix_length + inner_spec.child_size, + "spec.inner_spec.max_prefix_length must be < spec.inner_spec.min_prefix_length + spec.inner_spec.child_size" ); ensure!( inner.suffix.len() % (inner_spec.child_size as usize) == 0, From 98f872171e54e773570e85b14f9d123c75bead49 Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Date: Tue, 10 Sep 2024 13:57:50 +0200 Subject: [PATCH 3/4] add test for rust --- rust/src/verify.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/rust/src/verify.rs b/rust/src/verify.rs index a70610f6..aedcf41b 100644 --- a/rust/src/verify.rs +++ b/rust/src/verify.rs @@ -488,6 +488,11 @@ mod tests { depth_limited_spec.min_depth = 2; depth_limited_spec.max_depth = 4; + + let mut max_prefix_length_too_large_spec = api::iavl_spec(); + let inner_spec = max_prefix_length_too_large_spec.inner_spec.as_mut().unwrap(); + inner_spec.max_prefix_length = 100; + let cases: HashMap<&'static str, ExistenceCase> = [ ( "empty proof fails", @@ -616,19 +621,32 @@ mod tests { proof: ExistenceProof { key: b"foo".to_vec(), value: b"bar".to_vec(), - leaf: Some(leaf), + leaf: Some(leaf.clone()), path: vec![ valid_inner.clone(), valid_inner.clone(), valid_inner.clone(), valid_inner.clone(), - valid_inner, + valid_inner.clone(), ], }, spec: depth_limited_spec, valid: false, }, ), + ( + "rejects inner spec with max prefix length >= min prefix lenght + child size", + ExistenceCase { + proof: ExistenceProof { + key: b"foo".to_vec(), + value: b"bar".to_vec(), + leaf: Some(leaf), + path: vec![valid_inner], + }, + spec: max_prefix_length_too_large_spec, + valid: false, + }, + ), ] .into_iter() .collect(); From 277f4f4aa6a140d664965363104e87cbb1b226a5 Mon Sep 17 00:00:00 2001 From: Carlos Rodriguez Date: Wed, 18 Sep 2024 11:05:45 +0200 Subject: [PATCH 4/4] lint --- rust/src/verify.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rust/src/verify.rs b/rust/src/verify.rs index aedcf41b..f9df71fd 100644 --- a/rust/src/verify.rs +++ b/rust/src/verify.rs @@ -487,10 +487,12 @@ mod tests { let mut depth_limited_spec = api::iavl_spec(); depth_limited_spec.min_depth = 2; depth_limited_spec.max_depth = 4; - let mut max_prefix_length_too_large_spec = api::iavl_spec(); - let inner_spec = max_prefix_length_too_large_spec.inner_spec.as_mut().unwrap(); + let inner_spec = max_prefix_length_too_large_spec + .inner_spec + .as_mut() + .unwrap(); inner_spec.max_prefix_length = 100; let cases: HashMap<&'static str, ExistenceCase> = [