1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
extern crate secp256k1 as libsecp256k1;

pub fn sign(message: &[u8; 32], secret_key: &[u8; 32]) -> Result<[u8; 64], ()> {
    let msg = libsecp256k1::Message::parse(message);
    match libsecp256k1::SecretKey::parse(secret_key) {
        Ok(sk) => match libsecp256k1::sign(&msg, &sk) {
            Ok((sig, _)) => Ok(sig.serialize()),
            Err(_) => Err(())
        },
        Err(_) => Err(())
    }
}

pub fn verify(message: &[u8; 32], signature: &[u8; 64], public_key: &[u8; 65]) -> Result<bool, ()> {
    let msg = libsecp256k1::Message::parse(message);
    let sig = libsecp256k1::Signature::parse(signature);
    match libsecp256k1::PublicKey::parse(public_key) {
        Ok(pk) => Ok(libsecp256k1::verify(&msg, &sig, &pk)),
        Err(_) => Err(())
    }
}