1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use crate::ArwenApiImpl;
use elrond_wasm::api::CryptoApi;
use elrond_wasm::types::H256;

extern "C" {
	fn sha256(dataOffset: *const u8, length: i32, resultOffset: *mut u8) -> i32;
	fn keccak256(dataOffset: *const u8, length: i32, resultOffset: *mut u8) -> i32;
	fn verifyBLS(
		keyOffset: *const u8,
		messageOffset: *const u8,
		messageLength: i32,
		sigOffset: *const u8,
	) -> i32;
	fn verifyEd25519(
		keyOffset: *const u8,
		messageOffset: *const u8,
		messageLength: i32,
		sigOffset: *const u8,
	) -> i32;
	fn verifySecp256k1(
		keyOffset: *const u8,
		keyLength: i32,
		messageOffset: *const u8,
		messageLength: i32,
		sigOffset: *const u8,
	) -> i32;
}

impl CryptoApi for ArwenApiImpl {
	fn sha256(&self, data: &[u8]) -> H256 {
		unsafe {
			let mut res = H256::zero();
			sha256(data.as_ptr(), data.len() as i32, res.as_mut_ptr());
			res
		}
	}

	fn keccak256(&self, data: &[u8]) -> H256 {
		unsafe {
			let mut res = H256::zero();
			keccak256(data.as_ptr(), data.len() as i32, res.as_mut_ptr());
			res
		}
	}

	// the verify functions return 0 if valid signature, -1 if invalid

	fn verify_bls(&self, key: &[u8], message: &[u8], signature: &[u8]) -> bool {
		unsafe {
			verifyBLS(
				key.as_ptr(),
				message.as_ptr(),
				message.len() as i32,
				signature.as_ptr(),
			) == 0
		}
	}

	fn verify_ed25519(&self, key: &[u8], message: &[u8], signature: &[u8]) -> bool {
		unsafe {
			verifyEd25519(
				key.as_ptr(),
				message.as_ptr(),
				message.len() as i32,
				signature.as_ptr(),
			) == 0
		}
	}

	fn verify_secp256k1(&self, key: &[u8], message: &[u8], signature: &[u8]) -> bool {
		unsafe {
			verifySecp256k1(
				key.as_ptr(),
				key.len() as i32,
				message.as_ptr(),
				message.len() as i32,
				signature.as_ptr(),
			) == 0
		}
	}
}