Skip to content

Commit 5dff8f7

Browse files
author
Julian Ventura
committed
Add merkle tree batch verification panic catch
1 parent d0881ae commit 5dff8f7

File tree

5 files changed

+54
-11
lines changed

5 files changed

+54
-11
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
#include <stdbool.h>
2+
#include <stdint.h>
23

3-
bool verify_merkle_tree_batch_ffi(unsigned char *batch_bytes, unsigned int batch_len, unsigned char *merkle_root);
4+
int32_t verify_merkle_tree_batch_ffi(unsigned char *batch_bytes, unsigned int batch_len, unsigned char *merkle_root);

operator/merkle_tree/lib/src/lib.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use lambdaworks_crypto::merkle_tree::merkle::MerkleTree;
55
use log::error;
66

77
#[no_mangle]
8-
pub extern "C" fn verify_merkle_tree_batch_ffi(
8+
pub extern "C" fn inner_verify_merkle_tree_batch_ffi(
99
batch_ptr: *const u8,
1010
batch_len: usize,
1111
merkle_root: &[u8; 32],
@@ -53,6 +53,22 @@ pub extern "C" fn verify_merkle_tree_batch_ffi(
5353
computed_batch_merkle_tree.root == *merkle_root
5454
}
5555

56+
#[no_mangle]
57+
pub extern "C" fn verify_merkle_tree_batch_ffi(
58+
batch_ptr: *const u8,
59+
batch_len: usize,
60+
merkle_root: &[u8; 32],
61+
) -> i32 {
62+
let result = std::panic::catch_unwind(|| {
63+
inner_verify_merkle_tree_batch_ffi(batch_ptr, batch_len, merkle_root)
64+
});
65+
66+
match result {
67+
Ok(v) => v as i32,
68+
Err(_) => -1,
69+
}
70+
}
71+
5672
#[cfg(test)]
5773
mod tests {
5874
use super::*;
@@ -75,7 +91,7 @@ mod tests {
7591
let result =
7692
verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root);
7793

78-
assert_eq!(result, true);
94+
assert_eq!(result, 1);
7995
}
8096

8197
#[test]
@@ -92,7 +108,7 @@ mod tests {
92108
let result =
93109
verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root);
94110

95-
assert_eq!(result, false);
111+
assert_eq!(result, 0);
96112
}
97113

98114
#[test]
@@ -109,6 +125,6 @@ mod tests {
109125
let result =
110126
verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root);
111127

112-
assert_eq!(result, false);
128+
assert_eq!(result, 0);
113129
}
114130
}

operator/merkle_tree/merkle_tree.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,35 @@ package merkle_tree
88
*/
99
import "C"
1010
import "unsafe"
11+
import "fmt"
1112

12-
func VerifyMerkleTreeBatch(batchBuffer []byte, merkleRootBuffer [32]byte) bool {
13+
func VerifyMerkleTreeBatch(batchBuffer []byte, merkleRootBuffer [32]byte) (isVerified bool, err error) {
14+
// Here we define the return value on failure
15+
isVerified = false
16+
err = nil
1317
if len(batchBuffer) == 0 {
14-
return false
18+
return isVerified, err
1519
}
1620

21+
// This will catch any go panic
22+
defer func() {
23+
rec := recover()
24+
if rec != nil {
25+
err = fmt.Errorf("Panic was caught while verifying merkle tree batch: %s", rec)
26+
}
27+
}()
28+
1729
batchPtr := (*C.uchar)(unsafe.Pointer(&batchBuffer[0]))
1830
merkleRootPtr := (*C.uchar)(unsafe.Pointer(&merkleRootBuffer[0]))
19-
return (bool)(C.verify_merkle_tree_batch_ffi(batchPtr, (C.uint)(len(batchBuffer)), merkleRootPtr))
31+
32+
r := (C.int32_t)(C.verify_merkle_tree_batch_ffi(batchPtr, (C.uint)(len(batchBuffer)), merkleRootPtr))
33+
34+
if r == -1 {
35+
err = fmt.Errorf("Panic happened on FFI while verifying merkle tree batch")
36+
return isVerified, err
37+
}
38+
39+
isVerified = (r == 1)
40+
41+
return isVerified, err
2042
}

operator/merkle_tree/merkle_tree_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ func TestVerifyMerkleTreeBatch(t *testing.T) {
3232
var merkleRoot [32]byte
3333
copy(merkleRoot[:], merkle_root)
3434

35-
if !VerifyMerkleTreeBatch(batchByteValue, merkleRoot) {
35+
verified, err := VerifyMerkleTreeBatch(batchByteValue, merkleRoot)
36+
if err != nil || !verified {
3637
t.Errorf("Batch did not verify Merkle Root")
3738
}
3839

operator/pkg/s3.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,11 @@ func (o *Operator) getBatchFromDataService(ctx context.Context, batchURL string,
9191

9292
// Checks if downloaded merkle root is the same as the expected one
9393
o.Logger.Infof("Verifying batch merkle tree...")
94-
merkle_root_check := merkle_tree.VerifyMerkleTreeBatch(batchBytes, expectedMerkleRoot)
95-
if !merkle_root_check {
94+
merkle_root_check, err := merkle_tree.VerifyMerkleTreeBatch(batchBytes, expectedMerkleRoot)
95+
if err != nil {
96+
o.Logger.Errorf("Error while verifying merkle tree batch")
97+
}
98+
if err != nil || !merkle_root_check {
9699
// try old merkle tree
97100
o.Logger.Infof("Batch merkle tree verification failed. Trying old merkle tree...")
98101
merkle_root_check = merkle_tree_old.VerifyMerkleTreeBatchOld(batchBytes, expectedMerkleRoot)

0 commit comments

Comments
 (0)