@@ -56,8 +56,13 @@ pub async fn verify_eip1271(
5656 }
5757 } ) ?;
5858
59- if result[ ..4 ] == MAGIC_VALUE . to_be_bytes ( ) . to_vec ( ) {
60- Ok ( true )
59+ let magic = result. get ( ..4 ) ;
60+ if let Some ( magic) = magic {
61+ if magic == MAGIC_VALUE . to_be_bytes ( ) . to_vec ( ) {
62+ Ok ( true )
63+ } else {
64+ Err ( CacaoError :: Verification )
65+ }
6166 } else {
6267 Err ( CacaoError :: Verification )
6368 }
@@ -67,16 +72,21 @@ pub async fn verify_eip1271(
6772mod test {
6873 use {
6974 super :: * ,
70- crate :: auth:: cacao:: signature:: { eip191:: eip191_bytes, strip_hex_prefix} ,
75+ crate :: auth:: cacao:: signature:: {
76+ eip191:: eip191_bytes,
77+ strip_hex_prefix,
78+ test_helpers:: { deploy_contract, message_hash, sign_message, spawn_anvil} ,
79+ } ,
7180 alloy_primitives:: address,
81+ k256:: ecdsa:: SigningKey ,
7282 sha3:: { Digest , Keccak256 } ,
7383 } ;
7484
7585 // Manual test. Paste address, signature, message, and project ID to verify
7686 // function
7787 #[ tokio:: test]
7888 #[ ignore]
79- async fn test_eip1271 ( ) {
89+ async fn test_eip1271_manual ( ) {
8090 let address = address ! ( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ) ;
8191 let signature = "xxx" ;
8292 let signature = data_encoding:: HEXLOWER_PERMISSIVE
@@ -94,4 +104,89 @@ mod test {
94104 . await
95105 . unwrap( ) ) ;
96106 }
107+
108+ #[ tokio:: test]
109+ async fn test_eip1271_pass ( ) {
110+ let ( _anvil, rpc_url, private_key) = spawn_anvil ( ) . await ;
111+ let contract_address = deploy_contract ( & rpc_url, & private_key) . await ;
112+
113+ let message = "xxx" ;
114+ let signature = sign_message ( message, & private_key) ;
115+
116+ assert ! (
117+ verify_eip1271( signature, contract_address, & message_hash( message) , rpc_url)
118+ . await
119+ . unwrap( )
120+ ) ;
121+ }
122+
123+ #[ tokio:: test]
124+ async fn test_eip1271_wrong_signature ( ) {
125+ let ( _anvil, rpc_url, private_key) = spawn_anvil ( ) . await ;
126+ let contract_address = deploy_contract ( & rpc_url, & private_key) . await ;
127+
128+ let message = "xxx" ;
129+ let mut signature = sign_message ( message, & private_key) ;
130+ * signature. first_mut ( ) . unwrap ( ) = signature. first ( ) . unwrap ( ) . wrapping_add ( 1 ) ;
131+
132+ assert ! ( matches!(
133+ verify_eip1271( signature, contract_address, & message_hash( message) , rpc_url) . await ,
134+ Err ( CacaoError :: Verification )
135+ ) ) ;
136+ }
137+
138+ #[ tokio:: test]
139+ async fn test_eip1271_fail_wrong_signer ( ) {
140+ let ( anvil, rpc_url, private_key) = spawn_anvil ( ) . await ;
141+ let contract_address = deploy_contract ( & rpc_url, & private_key) . await ;
142+
143+ let message = "xxx" ;
144+ let signature = sign_message (
145+ message,
146+ & SigningKey :: from_bytes ( & anvil. keys ( ) . get ( 1 ) . unwrap ( ) . to_bytes ( ) ) . unwrap ( ) ,
147+ ) ;
148+
149+ assert ! ( matches!(
150+ verify_eip1271( signature, contract_address, & message_hash( message) , rpc_url) . await ,
151+ Err ( CacaoError :: Verification )
152+ ) ) ;
153+ }
154+
155+ #[ tokio:: test]
156+ async fn test_eip1271_fail_wrong_contract_address ( ) {
157+ let ( _anvil, rpc_url, private_key) = spawn_anvil ( ) . await ;
158+ let mut contract_address = deploy_contract ( & rpc_url, & private_key) . await ;
159+
160+ * contract_address. 0 . first_mut ( ) . unwrap ( ) =
161+ contract_address. 0 . first ( ) . unwrap ( ) . wrapping_add ( 1 ) ;
162+
163+ let message = "xxx" ;
164+ let signature = sign_message ( message, & private_key) ;
165+
166+ assert ! ( matches!(
167+ verify_eip1271( signature, contract_address, & message_hash( message) , rpc_url) . await ,
168+ Err ( CacaoError :: Verification )
169+ ) ) ;
170+ }
171+
172+ #[ tokio:: test]
173+ async fn test_eip1271_wrong_message ( ) {
174+ let ( _anvil, rpc_url, private_key) = spawn_anvil ( ) . await ;
175+ let contract_address = deploy_contract ( & rpc_url, & private_key) . await ;
176+
177+ let message = "xxx" ;
178+ let signature = sign_message ( message, & private_key) ;
179+
180+ let message2 = "yyy" ;
181+ assert ! ( matches!(
182+ verify_eip1271(
183+ signature,
184+ contract_address,
185+ & message_hash( message2) ,
186+ rpc_url
187+ )
188+ . await ,
189+ Err ( CacaoError :: Verification )
190+ ) ) ;
191+ }
97192}
0 commit comments