extern crate base64;
extern crate openssl;
use openssl::hash::MessageDigest;
use openssl::pkey::{PKey, Private};
use openssl::sign::{Signer, Verifier};
use base64::{decode, encode};
use crate::key::{KeyError, KeyResult};
#[derive(Debug, Clone)]
pub struct Pkcs8pemBytes {
pub private: Vec<u8>,
pub public: Vec<u8>,
}
impl Pkcs8pemBytes {
pub fn new(private: &[u8], public: &[u8]) -> Pkcs8pemBytes {
Pkcs8pemBytes {
private: private.to_vec(),
public: public.to_vec(),
}
}
}
pub struct Signing;
impl Signing {
pub fn sign(keypair: &PKey<Private>, data: &str) -> KeyResult<String> {
let mut signer = match Signer::new(MessageDigest::sha256(), &keypair) {
Ok(signer) => signer,
Err(_) => return Err(KeyError::SigningError(2000)),
};
match signer.update(data.as_bytes()) {
Ok(_) => (),
Err(_) => {
return Err(KeyError::SigningError(2001));
}
};
let signature_bytes = match signer.sign_to_vec() {
Ok(sig) => sig,
Err(_) => {
return Err(KeyError::SigningError(2002));
}
};
Ok(encode(&signature_bytes))
}
pub fn verify(keypair: &PKey<Private>, data: &str, signature: &str) -> KeyResult<bool> {
let signature_bytes = match decode(signature) {
Ok(bytes) => bytes,
Err(_) => {
return Err(KeyError::SigningError(2003));
}
};
let mut verifier = match Verifier::new(MessageDigest::sha256(), &keypair) {
Ok(verifier) => verifier,
Err(_) => {
return Err(KeyError::SigningError(2004));
}
};
match verifier.update(data.as_bytes()) {
Ok(_) => (),
Err(_) => {
return Err(KeyError::SigningError(2005));
}
};
match verifier.verify(&signature_bytes) {
Ok(result) => return Ok(result),
Err(_) => {
return Err(KeyError::SigningError(2006));
}
};
}
}