elliptic/
curve25519.rs

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
use elliptic_sys::{curve25519_donna, curve25519_keygen, curve25519_sign, curve25519_verify};

pub fn keygen(private_key: &[u8; 32]) -> [u8; 32] {
    let mut public_key = [0u8; 32];
    unsafe {
        curve25519_keygen(public_key.as_mut_ptr(), private_key.as_ptr());
    }
    public_key
}

pub fn sign(private_key: &[u8; 32], message: &[u8], random: &[u8; 64]) -> Option<[u8; 64]> {
    let mut signature = [0u8; 64];
    let result = unsafe {
        curve25519_sign(
            signature.as_mut_ptr(),
            private_key.as_ptr(),
            message.as_ptr(),
            message.len() as u64,
            random.as_ptr()
            )
    };
    if result == 0 {
        Some(signature)
    } else {
        None
    }
}

pub fn verify(signature: &[u8; 64], public_key: &[u8; 32], message: &[u8]) -> bool {
    let result = unsafe {
        curve25519_verify(
            signature.as_ptr(),
            public_key.as_ptr(),
            message.as_ptr(),
            message.len() as u64
            )
    };
    if result == 0 {
        true
    } else {
        false
    }
}

pub fn donna(secret: &[u8; 32], basepoint: &[u8; 32]) -> Option<[u8; 32]> {
    let mut public = [0u8; 32];
    let result = unsafe {
        curve25519_donna(
            public.as_mut_ptr(),
            secret.as_ptr(),
            basepoint.as_ptr(),
            )
    };
    if result == 0 {
        Some(public)
    } else {
        None
    }
}