smart_contract/
crypto.rs

1#[derive(Copy, Clone, Debug)]
2pub enum SignatureAlgorithm {
3    Ed25519,
4}
5
6#[derive(Copy, Clone, Debug)]
7pub enum HashAlgorithm {
8    Blake2b256,
9    Blake2b512,
10    Sha256,
11    Sha512,
12}
13
14pub const BLAKE2B256_OUTPUT_SIZE: usize = 32;
15pub const BLAKE2B512_OUTPUT_SIZE: usize = 64;
16pub const SHA256_OUTPUT_SIZE: usize = 32;
17pub const SHA512_OUTPUT_SIZE: usize = 64;
18
19pub fn verify(alg: SignatureAlgorithm, pubkey: &[u8], data: &[u8], sig: &[u8]) -> Result<(), ()> {
20    match alg {
21        SignatureAlgorithm::Ed25519 => unsafe {
22            match crate::sys::_verify_ed25519(
23                pubkey.as_ptr(),
24                pubkey.len(),
25                data.as_ptr(),
26                data.len(),
27                sig.as_ptr(),
28                sig.len(),
29            ) {
30                0 => Ok(()),
31                _ => Err(()),
32            }
33        },
34    }
35}
36
37pub fn hash(alg: HashAlgorithm, data: &[u8], out: &mut [u8]) -> Result<(), ()> {
38    let f = match alg {
39        HashAlgorithm::Blake2b256 => crate::sys::_hash_blake2b_256,
40        HashAlgorithm::Blake2b512 => crate::sys::_hash_blake2b_512,
41        HashAlgorithm::Sha256 => crate::sys::_hash_sha256,
42        HashAlgorithm::Sha512 => crate::sys::_hash_sha512,
43    };
44    unsafe {
45        match f(data.as_ptr(), data.len(), out.as_mut_ptr(), out.len()) {
46            0 => Ok(()),
47            _ => Err(()),
48        }
49    }
50}