use openssl::rsa::{Rsa, Padding};
use openssl::hash::MessageDigest;
use openssl::sign::Signer;
use openssl::sign::Verifier;
use openssl::pkey::PKey;
use openssl::error::ErrorStack;
use base64::{engine::general_purpose, Engine as _};
use bcrypt::{DEFAULT_COST, hash, verify};
use aes_gcm::{Aes256Gcm, Key, KeyInit, Nonce}; use aes_gcm::aead::Aead;
pub enum UuidFormat {
Normal,
NoUnderline,
NoUnderlineUpperCase
}
pub fn encrypt_use_rsa(plain_text: &[u8], public_key: &[u8]) -> Result<Vec<u8>, ErrorStack> {
let rsa = Rsa::public_key_from_pem(public_key)?; let mut buf = vec![0; rsa.size() as usize];
let len = rsa.public_encrypt(plain_text, &mut buf, Padding::PKCS1)?;
buf.truncate(len); Ok(buf)
}
pub fn decrypt_use_rsa(cipher_text: &[u8], private_key: &[u8]) -> Result<Vec<u8>, ErrorStack> {
let rsa = Rsa::private_key_from_pem(private_key)?; let mut buf = vec![0; rsa.size() as usize];
let len = rsa.private_decrypt(cipher_text, &mut buf, Padding::PKCS1)?;
buf.truncate(len); Ok(buf)
}
pub fn sign_rsa(message: &[u8], private_key: &[u8]) -> Result<Vec<u8>, ErrorStack> {
let rsa = Rsa::private_key_from_pem(private_key)?; let pkey = PKey::from_rsa(rsa)?;
let mut signer = Signer::new(MessageDigest::sha256(), &pkey)?;
signer.update(message)?;
let signature = signer.sign_to_vec()?;
Ok(signature)
}
pub fn verify_rsa(message: &[u8], signature: &[u8], public_key: &[u8]) -> Result<bool, ErrorStack> {
let rsa = Rsa::public_key_from_pem(public_key)?; let pkey = PKey::from_rsa(rsa)?;
let mut verifier = Verifier::new(MessageDigest::sha256(), &pkey)?;
verifier.update(message)?;
let is_valid = verifier.verify(&signature)?;
Ok(is_valid)
}
pub fn encrypt_use_base64<T: AsRef<[u8]>>(input: T) -> String {
let bytes = input.as_ref();
general_purpose::STANDARD.encode(bytes)
}
pub fn decrypt_use_base64(input: &str) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
let decoded_bytes = general_purpose::STANDARD.decode(input)?;
Ok(decoded_bytes)
}
pub fn encrypt_use_bcrypt(password: &str) -> Result<String, bcrypt::BcryptError> {
hash(password, DEFAULT_COST)
}
pub fn verify_use_bcrypt(password: &str, hash: &str) -> Result<bool, bcrypt::BcryptError> {
verify(password, hash)
}
pub fn encrypt_use_aes(key:&str,iv:&str,plain_text:&str)->String{
let key = Key::<Aes256Gcm>::from_slice(key.as_bytes());
let cipher = Aes256Gcm::new(key);
let nonce = Nonce::from_slice(iv.as_bytes());
let ciphertext = cipher.encrypt(nonce, plain_text.as_bytes()).expect("encryption failure");
encrypt_use_base64(ciphertext)
}
pub fn decrypt_use_aes(key:&str,iv:&str,cipher_text:&Vec<u8>)-> String{
let key = Key::<Aes256Gcm>::from_slice(key.as_bytes());
let cipher = Aes256Gcm::new(key);
let nonce = Nonce::from_slice(iv.as_bytes());
let decrypted_text = cipher.decrypt(nonce, cipher_text.as_ref()).expect("decryption failure");
String::from_utf8_lossy(&decrypted_text).to_string()
}
pub fn obtain_uuid(format: UuidFormat) -> String {
match format {
UuidFormat::Normal => uuid::Uuid::new_v4().to_string(),
UuidFormat::NoUnderline => uuid::Uuid::new_v4().to_string().replace("-", ""),
UuidFormat::NoUnderlineUpperCase => uuid::Uuid::new_v4().to_string().replace("-", "").to_uppercase()
}
}