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};
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)
}