pub use crate::CryptoString;
pub use crate::EzNaclError;
use std::fmt;
use std::str::FromStr;
#[derive(Debug, PartialEq)]
#[cfg_attr(feature = "use_serde", derive(serde::Serialize, serde::Deserialize))]
pub enum KeyUsage {
Sign,
Verify,
SignVerify,
Encrypt,
Decrypt,
EncryptDecrypt,
}
impl fmt::Display for KeyUsage {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
KeyUsage::Sign => write!(f, "sign"),
KeyUsage::Verify => write!(f, "verify"),
KeyUsage::SignVerify => write!(f, "signverify"),
KeyUsage::Encrypt => write!(f, "encrypt"),
KeyUsage::Decrypt => write!(f, "decrypt"),
KeyUsage::EncryptDecrypt => write!(f, "encryptdecrypt"),
}
}
}
impl FromStr for KeyUsage {
type Err = ();
fn from_str(input: &str) -> Result<KeyUsage, Self::Err> {
match input.to_lowercase().as_str() {
"sign" => Ok(KeyUsage::Sign),
"verify" => Ok(KeyUsage::Verify),
"signverify" => Ok(KeyUsage::SignVerify),
"encrypt" => Ok(KeyUsage::Encrypt),
"decrypt" => Ok(KeyUsage::Decrypt),
"encryptdecrypt" => Ok(KeyUsage::EncryptDecrypt),
_ => Err(()),
}
}
}
impl std::convert::TryFrom<&str> for KeyUsage {
type Error = EzNaclError;
fn try_from(input: &str) -> Result<Self, Self::Error> {
match input.to_lowercase().as_str() {
"sign" => Ok(KeyUsage::Sign),
"verify" => Ok(KeyUsage::Verify),
"signverify" => Ok(KeyUsage::SignVerify),
"encrypt" => Ok(KeyUsage::Encrypt),
"decrypt" => Ok(KeyUsage::Decrypt),
"encryptdecrypt" => Ok(KeyUsage::EncryptDecrypt),
_ => Err(EzNaclError::ValueError),
}
}
}
pub trait CryptoInfo {
fn get_usage(&self) -> KeyUsage;
fn get_algorithm(&self) -> String;
}
pub trait PublicKey {
fn get_public_key(&self) -> CryptoString;
fn get_public_str(&self) -> String;
fn get_public_bytes(&self) -> Vec<u8>;
}
pub trait PrivateKey {
fn get_private_key(&self) -> CryptoString;
fn get_private_str(&self) -> String;
fn get_private_bytes(&self) -> Vec<u8>;
}
pub trait Encryptor {
fn encrypt(&self, data: &[u8]) -> Result<CryptoString, EzNaclError>;
}
pub trait Decryptor {
fn decrypt(&self, encdata: &CryptoString) -> Result<Vec<u8>, EzNaclError>;
}
pub trait Sign {
fn sign(&self, data: &[u8]) -> Result<CryptoString, EzNaclError>;
}
pub trait VerifySignature {
fn verify(&self, data: &[u8], signature: &CryptoString) -> Result<bool, EzNaclError>;
}
pub fn is_supported_algorithm(name: &str) -> bool {
match name {
"XSALSA20" => true,
"CURVE25519" => true,
"ED25519" => true,
"BLAKE2B-256" | "BLAKE2B-512" | "BLAKE3-256" => true,
"K12-256" | "SHA-256" | "SHA-512" | "SHA3-256" | "SHA3-512" => true,
_ => false,
}
}