use serde::{Deserialize, Serialize};
use std::sync::LazyLock;
use thiserror::Error;
static CACHED_CPU_COUNT: LazyLock<u32> = LazyLock::new(|| (num_cpus::get() as u32).clamp(1, 4));
pub const DEFAULT_CHUNK_SIZE: usize = 1 << 20;
pub const MIN_CHUNK_SIZE: usize = 64 * 1024;
pub const MAX_CHUNK_SIZE: usize = 8 * 1024 * 1024;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub enum AeadAlg {
#[default]
XChaCha20Poly1305 = 1,
Aes256GcmSiv = 2,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub enum KdfAlg {
#[default]
Argon2id = 1,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct KdfParams {
pub t_cost: u32,
pub mem_kib: u32,
pub parallelism: u32,
}
impl Default for KdfParams {
fn default() -> Self {
Self {
t_cost: 3,
mem_kib: 64 * 1024,
parallelism: *CACHED_CPU_COUNT,
}
}
}
#[derive(Debug, Clone)]
pub struct EncryptOptions {
pub alg: AeadAlg,
pub kdf: KdfAlg,
pub kdf_params: KdfParams,
pub armor: bool,
pub force: bool,
pub stream: bool,
pub chunk_size: usize,
}
impl Default for EncryptOptions {
fn default() -> Self {
Self {
alg: AeadAlg::default(),
kdf: KdfAlg::default(),
kdf_params: KdfParams::default(),
armor: false,
force: false,
stream: false,
chunk_size: DEFAULT_CHUNK_SIZE,
}
}
}
impl EncryptOptions {
pub fn with_armor(mut self, on: bool) -> Self {
self.armor = on;
self
}
}
#[derive(Error, Debug)]
pub enum EncFileError {
#[error("I/O error")]
Io(#[from] std::io::Error),
#[error("encryption/decryption failure")]
Crypto,
#[error("unsupported format version {0}")]
UnsupportedVersion(u16),
#[error("unsupported AEAD algorithm id {0}")]
UnsupportedAead(u8),
#[error("unsupported KDF algorithm id {0}")]
UnsupportedKdf(u8),
#[error("malformed file")]
Malformed,
#[error("invalid argument: {0}")]
Invalid(&'static str),
#[error("serialization error")]
Cbor(#[from] ciborium::de::Error<std::io::Error>),
#[error("serialization error")]
CborSer(#[from] ciborium::ser::Error<std::io::Error>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum HashAlg {
#[default]
Blake3,
Sha256,
Sha512,
Sha3_256,
Sha3_512,
Blake2b,
Xxh3_64,
Xxh3_128,
Crc32,
}
pub type KeyMap = std::collections::HashMap<String, Vec<u8>>;