ex3_crypto/verify/
utils.rs

1#[macro_export]
2macro_rules! evm_verify {
3    ($msg_prefix:expr, $verify_service_name:ident) => {
4        use crate::keccak256;
5        use crate::secp256k1::Signature;
6        use crate::verify::MessageVerify;
7
8        pub struct $verify_service_name;
9
10        impl MessageVerify for $verify_service_name {
11            fn verify<M, S, P>(
12                message: M,
13                signature: S,
14                pub_key: Option<P>,
15            ) -> crate::Result<Vec<u8>>
16            where
17                M: AsRef<[u8]>,
18                S: AsRef<[u8]>,
19                P: AsRef<[u8]>,
20            { 
21                assert!(pub_key.is_none(), concat!(stringify!($verify_service_name), " message verify not need pub_key"));
22                
23                let message = message.as_ref();
24                let signature = signature.as_ref();
25
26                let signature = Signature::from_slice(signature)?;
27                let prefix = format!($msg_prefix, message.len());
28                let mut prefixed_message = Vec::with_capacity(prefix.len() + message.len());
29                prefixed_message.extend_from_slice(prefix.as_bytes());
30                prefixed_message.extend_from_slice(message);
31                let message = keccak256(prefixed_message.as_slice());
32                let mut rec_id = signature.v();
33
34                if rec_id >= 27 {
35                    rec_id -= 27;
36                }
37
38                let pub_key = signature.recover(&message, Some(rec_id))?;
39                pub_key.verify(&message, &signature)?;
40                Ok(pub_key.serialize(true))
41            }
42        }
43    };
44}