pub struct SlugCrypt;
pub struct SlugAsyCrypt;
pub struct SlugSignatures;
pub struct SlugED25519Signatures;
pub struct SlugSchnorrSignatures;
pub struct SlugSphincsPlus;
pub struct SlugFalcon1024;
pub struct SlugMLDSA;
pub struct SlugDigest;
pub struct VerifiableRandomFunction;
pub struct SlugCSPRNGAPI;
use bip39::{ErrorKind, Language};
use ed25519_dalek::SignatureError;
use crate::slugcrypt::internals::encrypt::chacha20::*;
use crate::slugcrypt::internals::encrypt::aes256::{EncryptAES256, DecryptAES256};
use crate::slugcrypt::internals::encrypt::aes256;
use crate::slugcrypt::internals::encryption::ecies::*;
use crate::slugcrypt::internals::digest::blake2;
use crate::slugcrypt::internals::digest::sha2;
use crate::slugcrypt::internals::digest::sha3;
use crate::slugcrypt::internals::digest::blake3;
use crate::slugcrypt::internals::digest::digest;
use crate::slugcrypt::internals::csprng::SlugCSPRNG;
use crate::slugcrypt::internals::bip39::SlugMnemonic;
use crate::slugcrypt::internals::signature::ed25519::{ED25519PublicKey, ED25519SecretKey, ED25519Signature};
use crate::slugcrypt::internals::signature::schnorr::{SchnorrIO, SchnorrPreout, SchnorrPublicKey, SchnorrSecretKey, SchnorrSignature, SchnorrVRFProof};
use super::internals::ciphertext::CipherText;
impl SlugCrypt {
pub fn encrypt<T: AsRef<[u8]>>(key: EncryptionKey, data: T) -> Result<(EncryptionCipherText,EncryptionNonce),chacha20poly1305::aead::Error> {
let x = XChaCha20Encrypt::encrypt(key, data.as_ref())?;
return Ok(x)
}
pub fn decrypt(key: EncryptionKey, nonce: EncryptionNonce, data: EncryptionCipherText) -> Result<Vec<u8>,chacha20poly1305::aead::Error> {
let x = XChaCha20Encrypt::decrypt(key, nonce, data)?;
return Ok(x)
}
pub fn encrypt_aes256<T: AsRef<[u8]>>(key: aes256::EncryptionKey, data: T) -> Result<(aes256::AESCipherText,aes256::EncryptionNonce),aes_gcm::Error> {
let x: (aes256::AESCipherText, aes256::EncryptionNonce) = EncryptAES256::encrypt(key, data.as_ref())?;
return Ok(x)
}
pub fn decrypt_aes256(key: aes256::EncryptionKey, nonce: aes256::EncryptionNonce, data: aes256::AESCipherText) -> Result<Vec<u8>,aes_gcm::Error> {
let x = DecryptAES256::decrypt(key, nonce, data)?;
return Ok(x)
}
}
impl SlugDigest {
pub fn blake2b(size: usize, data: &[u8]) -> digest::SlugDigest {
let hasher = blake2::SlugBlake2bHasher::new(size);
let result = hasher.update(data);
return digest::SlugDigest::from_bytes(&result).unwrap()
}
pub fn blake2s(size: usize, data: &[u8]) -> digest::SlugDigest {
let hasher = blake2::SlugBlake2sHasher::new(size);
let result = hasher.update(data);
return digest::SlugDigest::from_bytes(&result).unwrap()
}
pub fn sha2(size: usize, data: &[u8]) -> digest::SlugDigest {
let hasher = sha2::Sha2Hasher::new(size);
let result = hasher.update(data);
return digest::SlugDigest::from_bytes(&result).unwrap()
}
pub fn sha3(size: usize, data: &[u8]) -> digest::SlugDigest {
let hasher = sha3::Sha3Hasher::new(size);
let result = hasher.update(data);
return digest::SlugDigest::from_bytes(&result).unwrap()
}
pub fn blake3(data: &[u8]) -> digest::SlugDigest {
let mut hasher = blake3::Blake3Hasher::new();
let result = hasher.update(data);
return digest::SlugDigest::from_bytes(&result).unwrap()
}
}
impl SlugAsyCrypt {
pub fn encrypt<T: AsRef<[u8]>>(pk: ECPublicKey, data: T) -> Result<super::internals::ciphertext::CipherText, ecies_ed25519::Error> {
let ct: Result<super::internals::ciphertext::CipherText, ecies_ed25519::Error> = ECIESEncrypt::encrypt(&pk, data.as_ref());
return ct
}
pub fn decrypt(sk: ECSecretKey, ct: CipherText) -> Result<super::internals::messages::Message, ecies_ed25519::Error> {
let x: Result<super::internals::messages::Message, ecies_ed25519::Error> = ECIESDecrypt::decrypt(&sk, &ct);
return x
}
}
impl SlugCSPRNGAPI {
pub fn new(pass: &str) -> [u8;32] {
SlugCSPRNG::new(pass)
}
pub fn from_os() -> [u8;32] {
SlugCSPRNG::os_rand()
}
pub fn from_seed_64(bytes: [u8;32]) -> [u8;64] {
SlugCSPRNG::from_seed_64(bytes)
}
pub fn from_seed(bytes: [u8;32]) -> [u8;32] {
SlugCSPRNG::from_seed(bytes)
}
pub fn mnemonic(mnemonic: SlugMnemonic, pass: &str) -> Result<[u8;32],ErrorKind> {
let seed = mnemonic.to_seed(pass)?;
let mut output: [u8;32] = [0u8;32];
output.copy_from_slice(&seed);
Ok(output)
}
}
impl VerifiableRandomFunction {
pub fn generate() -> SchnorrSecretKey {
return SchnorrSecretKey::generate();
}
pub fn create_schnorr_vrf<T: AsRef<[u8]>>(sk: SchnorrSecretKey, msg: T, context: T) -> (SchnorrIO,SchnorrVRFProof,SchnorrPreout) {
return sk.vrf(msg.as_ref(), context.as_ref())
}
pub fn verify_schnorr_vrf<T: AsRef<[u8]>>(pk: SchnorrPublicKey, vrf_io: SchnorrIO, vrf_proof: SchnorrVRFProof, vrf_preout: SchnorrPreout, msg: T, context: T) -> Result<(schnorrkel::vrf::VRFInOut, schnorrkel::vrf::VRFProofBatchable),schnorrkel::SignatureError> {
let x = pk.verify_vrf(vrf_preout, vrf_io, vrf_proof, context.as_ref(), msg.as_ref())?;
return Ok(x)
}
}
impl SlugED25519Signatures {
pub fn generate() -> ED25519SecretKey {
ED25519SecretKey::generate()
}
pub fn generate_securerand(pass: &str) -> ED25519SecretKey {
ED25519SecretKey::generate_securerand(pass)
}
pub fn public_key(sk: ED25519SecretKey) -> Result<ED25519PublicKey, SignatureError>{
let pk = sk.public_key()?;
Ok(pk)
}
pub fn sign<T: AsRef<[u8]>>(sk: ED25519SecretKey, data: T) -> Result<ED25519Signature,SignatureError> {
let signature = sk.sign(data.as_ref())?;
Ok(signature)
}
pub fn verify<T: AsRef<[u8]>>(pk: ED25519PublicKey, signature: ED25519Signature, data: T) -> Result<bool, SignatureError> {
let is_valid = pk.verify(signature, data)?;
Ok(is_valid)
}
}
impl SlugSchnorrSignatures {
pub fn generate() -> SchnorrSecretKey {
let x = SchnorrSecretKey::generate();
return x
}
pub fn sign<T: AsRef<[u8]>>(sk: SchnorrSecretKey, message: T, context: T) -> Result<SchnorrSignature, schnorrkel::SignatureError> {
let sig: SchnorrSignature = sk.sign_with_context(message.as_ref(), context.as_ref())?;
return Ok(sig)
}
}