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>,
pub pk: Vec<u8>,
}
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(),
}
}
fn get_public_key(sk: &[u8]) -> Vec<u8> {
assert!(sk.len() == 64);
sk[32..].to_vec()
}
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));
}