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
#[derive(Copy, Clone, Debug)]
pub enum SignatureAlgorithm {
    Ed25519,
}

#[derive(Copy, Clone, Debug)]
pub enum HashAlgorithm {
    Blake2b256,
    Blake2b512,
    Sha256,
    Sha512,
}

pub const BLAKE2B256_OUTPUT_SIZE: usize = 32;
pub const BLAKE2B512_OUTPUT_SIZE: usize = 64;
pub const SHA256_OUTPUT_SIZE: usize = 32;
pub const SHA512_OUTPUT_SIZE: usize = 64;

pub fn verify(alg: SignatureAlgorithm, pubkey: &[u8], data: &[u8], sig: &[u8]) -> Result<(), ()> {
    match alg {
        SignatureAlgorithm::Ed25519 => unsafe {
            match crate::sys::_verify_ed25519(
                pubkey.as_ptr(),
                pubkey.len(),
                data.as_ptr(),
                data.len(),
                sig.as_ptr(),
                sig.len(),
            ) {
                0 => Ok(()),
                _ => Err(()),
            }
        },
    }
}

pub fn hash(alg: HashAlgorithm, data: &[u8], out: &mut [u8]) -> Result<(), ()> {
    let f = match alg {
        HashAlgorithm::Blake2b256 => crate::sys::_hash_blake2b_256,
        HashAlgorithm::Blake2b512 => crate::sys::_hash_blake2b_512,
        HashAlgorithm::Sha256 => crate::sys::_hash_sha256,
        HashAlgorithm::Sha512 => crate::sys::_hash_sha512,
    };
    unsafe {
        match f(data.as_ptr(), data.len(), out.as_mut_ptr(), out.len()) {
            0 => Ok(()),
            _ => Err(()),
        }
    }
}