Skip to main content

multiversx_sc/contract_base/wrappers/
crypto_wrapper.rs

1use core::marker::PhantomData;
2
3use crate::{
4    api::{CryptoApi, CryptoApiImpl, KECCAK256_RESULT_LEN, SHA256_RESULT_LEN},
5    types::{ManagedBuffer, ManagedByteArray, ManagedType, ManagedVec, MessageHashType},
6};
7
8#[derive(Default)]
9pub struct CryptoWrapper<A>
10where
11    A: CryptoApi,
12{
13    _phantom: PhantomData<A>,
14}
15
16impl<A> CryptoWrapper<A>
17where
18    A: CryptoApi,
19{
20    pub fn new() -> Self {
21        CryptoWrapper {
22            _phantom: PhantomData,
23        }
24    }
25
26    pub fn sha256<B: core::borrow::Borrow<ManagedBuffer<A>>>(
27        &self,
28        data: B,
29    ) -> ManagedByteArray<A, SHA256_RESULT_LEN> {
30        unsafe {
31            let result = ManagedByteArray::new_uninit();
32            A::crypto_api_impl().sha256_managed(result.get_handle(), data.borrow().get_handle());
33            result
34        }
35    }
36
37    pub fn keccak256<B: core::borrow::Borrow<ManagedBuffer<A>>>(
38        &self,
39        data: B,
40    ) -> ManagedByteArray<A, KECCAK256_RESULT_LEN> {
41        unsafe {
42            let result = ManagedByteArray::new_uninit();
43            A::crypto_api_impl().keccak256_managed(result.get_handle(), data.borrow().get_handle());
44            result
45        }
46    }
47
48    pub fn ripemd160<B: core::borrow::Borrow<ManagedBuffer<A>>>(
49        &self,
50        data: B,
51    ) -> ManagedByteArray<A, { crate::api::RIPEMD_RESULT_LEN }> {
52        unsafe {
53            let result = ManagedByteArray::new_uninit();
54            A::crypto_api_impl().ripemd160_managed(result.get_handle(), data.borrow().get_handle());
55            result
56        }
57    }
58
59    pub fn verify_bls(
60        &self,
61        key: &ManagedBuffer<A>,
62        message: &ManagedBuffer<A>,
63        signature: &ManagedBuffer<A>,
64    ) {
65        A::crypto_api_impl().verify_bls_managed(
66            key.get_handle(),
67            message.get_handle(),
68            signature.get_handle(),
69        )
70    }
71
72    /// Calls the Vm to verify ed25519 signature.
73    ///
74    /// Does not return result, will fail tx directly!
75    ///
76    /// The error comes straight form the VM, the message is "invalid signature".
77    pub fn verify_ed25519(
78        &self,
79        key: &ManagedBuffer<A>,
80        message: &ManagedBuffer<A>,
81        signature: &ManagedBuffer<A>,
82    ) {
83        A::crypto_api_impl().verify_ed25519_managed(
84            key.get_handle(),
85            message.get_handle(),
86            signature.get_handle(),
87        )
88    }
89
90    /// Note: the signature is minimum 2 bytes in length,
91    /// the second byte encodes the length of the remaining signature bytes.
92    pub fn verify_secp256k1(
93        &self,
94        key: &ManagedBuffer<A>,
95        message: &ManagedBuffer<A>,
96        signature: &ManagedBuffer<A>,
97    ) -> bool {
98        A::crypto_api_impl().verify_secp256k1_managed(
99            key.get_handle(),
100            message.get_handle(),
101            signature.get_handle(),
102        )
103    }
104
105    pub fn verify_custom_secp256k1(
106        &self,
107        key: &ManagedBuffer<A>,
108        message: &ManagedBuffer<A>,
109        signature: &ManagedBuffer<A>,
110        hash_type: MessageHashType,
111    ) -> bool {
112        A::crypto_api_impl().verify_custom_secp256k1_managed(
113            key.get_handle(),
114            message.get_handle(),
115            signature.get_handle(),
116            hash_type,
117        )
118    }
119
120    pub fn encode_secp256k1_der_signature(
121        &self,
122        r: &ManagedBuffer<A>,
123        s: &ManagedBuffer<A>,
124    ) -> ManagedBuffer<A> {
125        unsafe {
126            let result = ManagedBuffer::new_uninit();
127            A::crypto_api_impl().encode_secp256k1_der_signature_managed(
128                r.get_handle(),
129                s.get_handle(),
130                result.get_handle(),
131            );
132            result
133        }
134    }
135
136    /// Calls the Vm to verify secp256r1 signature.
137    ///
138    /// Does not return result, will fail tx directly!
139    pub fn verify_secp256r1(
140        &self,
141        key: &ManagedBuffer<A>,
142        message: &ManagedBuffer<A>,
143        signature: &ManagedBuffer<A>,
144    ) {
145        A::crypto_api_impl().verify_secp256r1_managed(
146            key.get_handle(),
147            message.get_handle(),
148            signature.get_handle(),
149        )
150    }
151
152    /// Calls the Vm to verify BLS signature share.
153    ///
154    /// Does not return result, will fail tx directly!
155    pub fn verify_bls_signature_share(
156        &self,
157        key: &ManagedBuffer<A>,
158        message: &ManagedBuffer<A>,
159        signature: &ManagedBuffer<A>,
160    ) {
161        A::crypto_api_impl().verify_bls_signature_share_managed(
162            key.get_handle(),
163            message.get_handle(),
164            signature.get_handle(),
165        )
166    }
167
168    /// Calls the Vm to verify BLS aggregated signature.
169    ///
170    /// Does not return result, will fail tx directly!
171    pub fn verify_bls_aggregated_signature(
172        &self,
173        keys: &ManagedVec<A, ManagedBuffer<A>>,
174        message: &ManagedBuffer<A>,
175        signature: &ManagedBuffer<A>,
176    ) {
177        A::crypto_api_impl().verify_bls_aggregated_signature_managed(
178            keys.get_handle(),
179            message.get_handle(),
180            signature.get_handle(),
181        )
182    }
183}