ex3_crypto/verify/
utils.rs1#[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}