1+ use std:: str:: FromStr ;
2+
3+ use base64:: prelude:: * ;
14use kimchi:: mina_curves:: pasta:: Fp ;
5+ use mina_p2p_messages:: binprot:: BinProtRead ;
6+ use mina_p2p_messages:: v2:: { MinaBaseProofStableV2 , StateHash } ;
27use mina_tree:: proofs:: verification:: verify_block;
38use mina_tree:: proofs:: verifier_index:: { get_verifier_index, VerifierKind } ;
49use mina_tree:: verifier:: get_srs;
5- use openmina_block_verifier:: protocol_state;
6- use openmina_block_verifier:: protocol_state_proof;
7-
8- pub mod openmina_block_verifier;
910
1011// TODO: check these
1112const MAX_PROOF_SIZE : usize = 15 * 1024 ;
@@ -25,22 +26,21 @@ pub extern "C" fn verify_protocol_state_proof_ffi(
2526 return false ;
2627 } ;
2728 let protocol_state_hash_base58 = if let Ok ( protocol_state_hash_base58) =
28- std:: str:: from_utf8 ( & public_input_bytes[ ..public_input_len - 1 ] )
29+ std:: str:: from_utf8 ( & public_input_bytes[ ..public_input_len] )
2930 {
3031 protocol_state_hash_base58
3132 } else {
3233 return false ;
3334 } ;
3435
35- let protocol_state_proof = if let Ok ( protocol_state_proof) =
36- protocol_state_proof:: parse_base64 ( protocol_state_proof_base64)
37- {
38- protocol_state_proof
39- } else {
40- return false ;
41- } ;
36+ let protocol_state_proof =
37+ if let Ok ( protocol_state_proof) = parse_protocol_state_proof ( protocol_state_proof_base64) {
38+ protocol_state_proof
39+ } else {
40+ return false ;
41+ } ;
4242 let protocol_state_hash =
43- if let Ok ( protocol_state_hash) = protocol_state :: parse_base58 ( protocol_state_hash_base58) {
43+ if let Ok ( protocol_state_hash) = parse_protocol_state_hash ( protocol_state_hash_base58) {
4444 protocol_state_hash
4545 } else {
4646 return false ;
@@ -58,24 +58,59 @@ pub extern "C" fn verify_protocol_state_proof_ffi(
5858 )
5959}
6060
61+ pub fn parse_protocol_state_proof (
62+ protocol_state_proof_base64 : & str ,
63+ ) -> Result < MinaBaseProofStableV2 , String > {
64+ let protocol_state_proof_binprot = BASE64_URL_SAFE
65+ . decode ( protocol_state_proof_base64. trim_end ( ) )
66+ . map_err ( |err| err. to_string ( ) ) ?;
67+
68+ MinaBaseProofStableV2 :: binprot_read ( & mut protocol_state_proof_binprot. as_slice ( ) )
69+ . map_err ( |err| err. to_string ( ) )
70+ }
71+
72+ pub fn parse_protocol_state_hash ( protocol_state_hash_base58 : & str ) -> Result < Fp , String > {
73+ StateHash :: from_str ( protocol_state_hash_base58. trim_end ( ) )
74+ . map_err ( |err| err. to_string ( ) ) ?
75+ . to_fp ( )
76+ . map_err ( |err| err. to_string ( ) )
77+ }
78+
6179#[ cfg( test) ]
6280mod test {
6381 use super :: * ;
6482
65- const PROTOCOL_STATE_PROOF : & [ u8 ] =
83+ const PROTOCOL_STATE_PROOF_BYTES : & [ u8 ] =
6684 include_bytes ! ( "../../../../batcher/aligned/test_files/mina/protocol_state_proof.proof" ) ;
67- const PROTOCOL_STATE_HASH : & [ u8 ] =
85+ const PROTOCOL_STATE_HASH_BYTES : & [ u8 ] =
6886 include_bytes ! ( "../../../../batcher/aligned/test_files/mina/protocol_state_hash.pub" ) ;
87+ const BAD_PROTOCOL_STATE_HASH_BYTES : & [ u8 ] =
88+ include_bytes ! ( "../../../../batcher/aligned/test_files/mina/bad_protocol_state_hash.pub" ) ;
89+
90+ const PROTOCOL_STATE_PROOF_STR : & str =
91+ include_str ! ( "../../../../batcher/aligned/test_files/mina/protocol_state_proof.proof" ) ;
92+ const PROTOCOL_STATE_HASH_STR : & str =
93+ include_str ! ( "../../../../batcher/aligned/test_files/mina/protocol_state_hash.pub" ) ;
94+
95+ #[ test]
96+ fn parse_protocol_state_proof_does_not_fail ( ) {
97+ parse_protocol_state_proof ( PROTOCOL_STATE_PROOF_STR ) . unwrap ( ) ;
98+ }
99+
100+ #[ test]
101+ fn parse_protocol_state_hash_does_not_fail ( ) {
102+ parse_protocol_state_hash ( PROTOCOL_STATE_HASH_STR ) . unwrap ( ) ;
103+ }
69104
70105 #[ test]
71106 fn protocol_state_proof_verifies ( ) {
72107 let mut proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
73- let proof_size = PROTOCOL_STATE_PROOF . len ( ) ;
74- proof_buffer[ ..proof_size] . clone_from_slice ( PROTOCOL_STATE_PROOF ) ;
108+ let proof_size = PROTOCOL_STATE_PROOF_BYTES . len ( ) ;
109+ proof_buffer[ ..proof_size] . clone_from_slice ( PROTOCOL_STATE_PROOF_BYTES ) ;
75110
76111 let mut pub_input_buffer = [ 0u8 ; super :: MAX_PUB_INPUT_SIZE ] ;
77- let pub_input_size = PROTOCOL_STATE_HASH . len ( ) ;
78- pub_input_buffer[ ..pub_input_size] . clone_from_slice ( PROTOCOL_STATE_HASH ) ;
112+ let pub_input_size = PROTOCOL_STATE_HASH_BYTES . len ( ) ;
113+ pub_input_buffer[ ..pub_input_size] . clone_from_slice ( PROTOCOL_STATE_HASH_BYTES ) ;
79114
80115 let result = verify_protocol_state_proof_ffi (
81116 & proof_buffer,
@@ -85,4 +120,23 @@ mod test {
85120 ) ;
86121 assert ! ( result) ;
87122 }
123+
124+ #[ test]
125+ fn bad_protocol_state_proof_fails ( ) {
126+ let mut proof_buffer = [ 0u8 ; super :: MAX_PROOF_SIZE ] ;
127+ let proof_size = PROTOCOL_STATE_PROOF_BYTES . len ( ) ;
128+ proof_buffer[ ..proof_size] . clone_from_slice ( PROTOCOL_STATE_PROOF_BYTES ) ;
129+
130+ let mut pub_input_buffer = [ 0u8 ; super :: MAX_PUB_INPUT_SIZE ] ;
131+ let pub_input_size = BAD_PROTOCOL_STATE_HASH_BYTES . len ( ) ;
132+ pub_input_buffer[ ..pub_input_size] . clone_from_slice ( BAD_PROTOCOL_STATE_HASH_BYTES ) ;
133+
134+ let result = verify_protocol_state_proof_ffi (
135+ & proof_buffer,
136+ proof_size,
137+ & pub_input_buffer,
138+ pub_input_size,
139+ ) ;
140+ assert ! ( !result) ;
141+ }
88142}
0 commit comments