@@ -34,35 +34,40 @@ lazy_static! {
3434 static ref MINA_SRS : SRS <Vesta > = SRS :: <Vesta >:: create( Fq :: SRS_DEPTH ) ;
3535}
3636
37- // TODO(xqft): check proof size
38- const MAX_PROOF_SIZE : usize = 48 * 1024 ;
39- const MAX_PUB_INPUT_SIZE : usize = 6 * 1024 ;
40-
4137#[ no_mangle]
4238pub extern "C" fn verify_mina_state_ffi (
43- proof_buffer : & [ u8 ; MAX_PROOF_SIZE ] ,
39+ proof_bytes : * const u8 ,
4440 proof_len : usize ,
45- pub_input_buffer : & [ u8 ; MAX_PUB_INPUT_SIZE ] ,
41+ pub_input_bytes : * const u8 ,
4642 pub_input_len : usize ,
4743) -> bool {
48- let Some ( proof_buffer_slice ) = proof_buffer . get ( ..proof_len ) else {
49- error ! ( "Proof length argument is greater than max proof size " ) ;
44+ if proof_bytes . is_null ( ) || pub_input_bytes . is_null ( ) {
45+ error ! ( "Input buffer null " ) ;
5046 return false ;
51- } ;
47+ }
5248
53- let Some ( pub_input_buffer_slice ) = pub_input_buffer . get ( .. pub_input_len) else {
54- error ! ( "Public input length argument is greater than max public input size" ) ;
49+ if proof_len == 0 || pub_input_len == 0 {
50+ error ! ( "Input buffer length zero size" ) ;
5551 return false ;
56- } ;
52+ }
53+
54+ let proof_bytes = unsafe { std:: slice:: from_raw_parts ( proof_bytes, proof_len as usize ) } ;
55+
56+ let pub_input_bytes =
57+ unsafe { std:: slice:: from_raw_parts ( pub_input_bytes, proof_len as usize ) } ;
58+
59+ verify_mina_state ( proof_bytes, pub_input_bytes)
60+ }
5761
58- let proof: MinaStateProof = match bincode:: deserialize ( proof_buffer_slice) {
62+ pub fn verify_mina_state ( proof_bytes : & [ u8 ] , pub_input_bytes : & [ u8 ] ) -> bool {
63+ let proof: MinaStateProof = match bincode:: deserialize ( proof_bytes) {
5964 Ok ( proof) => proof,
6065 Err ( err) => {
6166 error ! ( "Failed to deserialize state proof: {}" , err) ;
6267 return false ;
6368 }
6469 } ;
65- let pub_inputs: MinaStatePubInputs = match bincode:: deserialize ( pub_input_buffer_slice ) {
70+ let pub_inputs: MinaStatePubInputs = match bincode:: deserialize ( pub_input_bytes ) {
6671 Ok ( pub_inputs) => pub_inputs,
6772 Err ( err) => {
6873 error ! ( "Failed to deserialize state pub inputs: {}" , err) ;
@@ -228,7 +233,7 @@ mod test {
228233
229234 #[ test]
230235 fn valid_mina_state_proof_verifies ( ) {
231- let mut proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
236+ let mut proof_buffer = [ 0u8 ; PROOF_BYTES . len ( ) ] ;
232237 let proof_size = PROOF_BYTES . len ( ) ;
233238 assert ! ( proof_size <= proof_buffer. len( ) ) ;
234239 proof_buffer[ ..proof_size] . clone_from_slice ( PROOF_BYTES ) ;
@@ -245,7 +250,7 @@ mod test {
245250
246251 #[ test]
247252 fn mina_state_proof_with_bad_bridge_tip_hash_does_not_verify ( ) {
248- let mut proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
253+ let mut proof_buffer = [ 0u8 ; PROOF_BYTES . len ( ) ] ;
249254 let proof_size = PROOF_BYTES . len ( ) ;
250255 assert ! ( proof_size <= proof_buffer. len( ) ) ;
251256 proof_buffer[ ..proof_size] . clone_from_slice ( PROOF_BYTES ) ;
@@ -262,7 +267,7 @@ mod test {
262267
263268 #[ test]
264269 fn empty_mina_state_proof_does_not_verify ( ) {
265- let proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
270+ let proof_buffer = [ 0u8 ; PROOF_BYTES . len ( ) ] ;
266271 let proof_size = PROOF_BYTES . len ( ) ;
267272
268273 let mut pub_input_buffer = [ 0u8 ; super :: MAX_PUB_INPUT_SIZE ] ;
@@ -277,7 +282,7 @@ mod test {
277282
278283 #[ test]
279284 fn valid_mina_state_proof_with_empty_pub_input_does_not_verify ( ) {
280- let mut proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
285+ let mut proof_buffer = [ 0u8 ; PROOF_BYTES . len ( ) ] ;
281286 let proof_size = PROOF_BYTES . len ( ) ;
282287 assert ! ( proof_size <= proof_buffer. len( ) ) ;
283288 proof_buffer[ ..proof_size] . clone_from_slice ( PROOF_BYTES ) ;
@@ -292,8 +297,8 @@ mod test {
292297
293298 #[ test]
294299 fn valid_mina_state_proof_with_greater_proof_size_does_not_verify ( ) {
295- let mut proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
296- let wrong_proof_size = super :: MAX_PROOF_SIZE + 1 ;
300+ let mut proof_buffer = [ 0u8 ; PROOF_BYTES . len ( ) ] ;
301+ let wrong_proof_size = PROOF_BYTES . len ( ) + 1 ;
297302 proof_buffer[ ..PROOF_BYTES . len ( ) ] . clone_from_slice ( PROOF_BYTES ) ;
298303
299304 let mut pub_input_buffer = [ 0u8 ; super :: MAX_PUB_INPUT_SIZE ] ;
@@ -312,7 +317,7 @@ mod test {
312317
313318 #[ test]
314319 fn valid_mina_state_proof_with_greater_pub_input_size_does_not_verify ( ) {
315- let mut proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
320+ let mut proof_buffer = [ 0u8 ; PROOF_BYTES . len ( ) ] ;
316321 let proof_size = PROOF_BYTES . len ( ) ;
317322 assert ! ( proof_size <= proof_buffer. len( ) ) ;
318323 proof_buffer[ ..proof_size] . clone_from_slice ( PROOF_BYTES ) ;
0 commit comments