@@ -56,8 +56,13 @@ pub async fn verify_eip1271(
56
56
}
57
57
} ) ?;
58
58
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
+ }
61
66
} else {
62
67
Err ( CacaoError :: Verification )
63
68
}
@@ -67,16 +72,21 @@ pub async fn verify_eip1271(
67
72
mod test {
68
73
use {
69
74
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
+ } ,
71
80
alloy_primitives:: address,
81
+ k256:: ecdsa:: SigningKey ,
72
82
sha3:: { Digest , Keccak256 } ,
73
83
} ;
74
84
75
85
// Manual test. Paste address, signature, message, and project ID to verify
76
86
// function
77
87
#[ tokio:: test]
78
88
#[ ignore]
79
- async fn test_eip1271 ( ) {
89
+ async fn test_eip1271_manual ( ) {
80
90
let address = address ! ( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ) ;
81
91
let signature = "xxx" ;
82
92
let signature = data_encoding:: HEXLOWER_PERMISSIVE
@@ -94,4 +104,89 @@ mod test {
94
104
. await
95
105
. unwrap( ) ) ;
96
106
}
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
+ }
97
192
}
0 commit comments