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
use super::Signer;
use crypto::ed25519;
use rand::Rng;

pub struct Ed25519 {
    pub sk: Vec<u8>, //[u8; 64]
    pub pk: Vec<u8>, //[u8; 32]
}

impl Signer for Ed25519 {
    fn get_key_pair() -> Self {
        let seed: [u8; 32] = rand::thread_rng().gen::<[u8; 32]>();
        let (sk, pk) = ed25519::keypair(&seed);
        Self {
            sk: sk.to_vec(),
            pk: pk.to_vec(),
        }
    }

    // return [u8;32]
    fn get_public_key(sk: &[u8]) -> Vec<u8> {
        assert!(sk.len() == 64);
        sk[32..].to_vec()
    }

    // return [u8;64]
    fn sign(sk: &[u8], message: &[u8]) -> Vec<u8> {
        assert!(sk.len() == 64);
        ed25519::signature(message, sk).to_vec()
    }

    fn verify(pk: &[u8], message: &[u8], signature: &[u8]) -> bool {
        assert!(pk.len() == 32);
        ed25519::verify(message, pk, signature)
    }
}

#[test]
pub fn test_sign_ed25519() {
    let msg = "hello forge".as_bytes();

    let key_pair = Ed25519::get_key_pair();
    assert_eq!(key_pair.pk.to_vec(), Ed25519::get_public_key(&key_pair.sk));

    let signature = Ed25519::sign(&key_pair.sk, msg);
    assert!(Ed25519::verify(&key_pair.pk, msg, &signature));
}