use super::CryptoType;
use utils::crypto::ed25519::ED25519;
use errors::common::CommonError;


pub struct ED25519Signus {}

impl ED25519Signus {
    pub fn new() -> ED25519Signus {
        ED25519Signus {}
    }
}

impl CryptoType for ED25519Signus {
    fn encrypt(&self, private_key: &[u8], public_key: &[u8], doc: &[u8], nonce: &[u8]) -> Vec<u8> {
        ED25519::encrypt(private_key, public_key, doc, nonce)
    }

    fn decrypt(&self, private_key: &[u8], public_key: &[u8], doc: &[u8], nonce: &[u8]) -> Result<Vec<u8>, CommonError> {
        ED25519::decrypt(private_key, public_key, doc, nonce)
    }

    fn gen_nonce(&self) -> Vec<u8> {
        ED25519::gen_nonce()
    }

    fn create_key_pair_for_signature(&self, seed: Option<&[u8]>) -> Result<(Vec<u8>, Vec<u8>), CommonError> {
        ED25519::create_key_pair_for_signature(seed)
    }

    fn sign(&self, private_key: &[u8], doc: &[u8]) -> Result<Vec<u8>, CommonError> {
        ED25519::sign(private_key, doc)
    }

    fn verify(&self, public_key: &[u8], doc: &[u8], signature: &[u8]) -> Result<bool, CommonError> {
        ED25519::verify(public_key, doc, signature)
    }

    fn verkey_to_public_key(&self, vk: &[u8]) -> Result<Vec<u8>, CommonError> {
        ED25519::vk_to_curve25519(vk)
    }

    fn signkey_to_private_key(&self, sk: &[u8]) -> Result<Vec<u8>, CommonError> {
        ED25519::sk_to_curve25519(sk)
    }
}