multiversx_chain_vm/vm_hooks/vh_handler/
vh_crypto.rs

1use crate::{crypto_functions, types::RawHandle, vm_hooks::VMHooksHandlerSource};
2
3pub trait VMHooksCrypto: VMHooksHandlerSource {
4    fn sha256_managed(&self, dest: RawHandle, data_handle: RawHandle) {
5        // default implementation used in debugger
6        // the VM has a dedicated hook
7        let mut types = self.m_types_lock();
8        let data = types.mb_get(data_handle);
9        let result_bytes = crypto_functions::sha256(data);
10        types.mb_set(dest, result_bytes[..].to_vec());
11    }
12
13    fn keccak256_managed(&self, dest: RawHandle, data_handle: RawHandle) {
14        // default implementation used in debugger
15        // the VM has a dedicated hook
16        let mut types = self.m_types_lock();
17        let data = types.mb_get(data_handle);
18        let result_bytes = crypto_functions::keccak256(data);
19        types.mb_set(dest, result_bytes[..].to_vec());
20    }
21
22    /// Should crash if the signature is invalid.
23    fn verify_ed25519_managed(&self, key: RawHandle, message: RawHandle, signature: RawHandle) {
24        let types = self.m_types_lock();
25        let key = types.mb_get(key);
26        let message = types.mb_get(message);
27        let signature = types.mb_get(signature);
28        let sig_valid = crypto_functions::verify_ed25519(key, message, signature);
29        if !sig_valid {
30            self.vm_error("invalid signature");
31        }
32    }
33}