-
Notifications
You must be signed in to change notification settings - Fork 396
Expand file tree
/
Copy pathlib.rs
More file actions
129 lines (106 loc) · 3.7 KB
/
lib.rs
File metadata and controls
129 lines (106 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
use aligned_sdk::common::types::{
VerificationCommitmentBatch, VerificationData, VerificationDataCommitment,
};
use lambdaworks_crypto::merkle_tree::merkle::MerkleTree;
use log::error;
fn inner_verify_merkle_tree_batch_ffi(
batch_ptr: *const u8,
batch_len: usize,
merkle_root: &[u8; 32],
) -> bool {
if batch_ptr.is_null() {
error!("Batch buffer null");
return false;
}
if batch_len == 0 {
error!("Batch buffer length 0");
return false;
}
let batch_bytes = unsafe { std::slice::from_raw_parts(batch_ptr, batch_len) };
let reader = std::io::Cursor::new(batch_bytes);
let batch = match ciborium::from_reader::<Vec<VerificationData>, _>(reader) {
Ok(batch) => batch,
Err(_e) => {
// try json
let batch: Vec<VerificationData> = match serde_json::from_slice(batch_bytes) {
Ok(batch) => batch,
Err(_e) => return false,
};
batch
}
};
if batch.is_empty() {
return false;
}
let batch_data_comm: Vec<VerificationDataCommitment> =
batch.into_iter().map(|v| v.into()).collect();
let Some(computed_batch_merkle_tree) =
MerkleTree::<VerificationCommitmentBatch>::build(&batch_data_comm)
else {
error!("Failed to build merkle tree, batch data commitment is empty");
return false;
};
computed_batch_merkle_tree.root == *merkle_root
}
#[no_mangle]
pub extern "C" fn verify_merkle_tree_batch_ffi(
batch_ptr: *const u8,
batch_len: usize,
merkle_root: &[u8; 32],
) -> i32 {
let result = std::panic::catch_unwind(|| {
inner_verify_merkle_tree_batch_ffi(batch_ptr, batch_len, merkle_root)
});
match result {
Ok(v) => v as i32,
Err(_) => -1,
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs::File;
use std::io::Read;
// #[test]
// fn verify_merkle_tree_batch_returns_true() {
// let mut merkle_batch_file = File::open("./test_files/merkle_tree_batch.bin").unwrap();
// let mut bytes_vec = Vec::new();
// merkle_batch_file.read_to_end(&mut bytes_vec).unwrap();
//
// let mut merkle_root_file = File::open("./test_files/merkle_root.bin").unwrap();
// let mut root_vec = Vec::new();
// merkle_root_file.read_to_end(&mut root_vec).unwrap();
//
// let mut merkle_root = [0; 32];
// merkle_root.copy_from_slice(&hex::decode(&root_vec).unwrap());
//
// let result =
// verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root);
//
// assert_eq!(result, 1);
// }
#[test]
fn merkle_batch_len_1_does_not_panic() {
let bytes_vec = vec![1u8];
let mut merkle_root_file = File::open("./test_files/merkle_root.bin").unwrap();
let mut root_vec = Vec::new();
merkle_root_file.read_to_end(&mut root_vec).unwrap();
let mut merkle_root = [0; 32];
merkle_root.copy_from_slice(&hex::decode(&root_vec).unwrap());
let result =
verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root);
assert_eq!(result, 0);
}
#[test]
fn merkle_batch_len_0_does_not_panic() {
let bytes_vec = Vec::new();
let mut merkle_root_file = File::open("./test_files/merkle_root.bin").unwrap();
let mut root_vec = Vec::new();
merkle_root_file.read_to_end(&mut root_vec).unwrap();
let mut merkle_root = [0; 32];
merkle_root.copy_from_slice(&hex::decode(&root_vec).unwrap());
let result =
verify_merkle_tree_batch_ffi(bytes_vec.as_ptr(), bytes_vec.len(), &merkle_root);
assert_eq!(result, 0);
}
}