multiversx_sc/contract_base/wrappers/
crypto_wrapper.rs1use 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 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 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 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 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 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}