use crate::csprng;
use rand::Rng;
use serde::{Deserialize, Serialize};
use serde_with::{base64::Base64, serde_as};
#[doc(hidden)]
pub mod cipher;
mod key_derivation;
mod private_key;
pub use cipher::Cipher;
pub(crate) use cipher::{AES_GCM_256, X25519, X_CHACHA20_POLY1305};
#[doc(hidden)]
pub use key_derivation::Deriver;
pub(crate) use key_derivation::{ARGON_2_ID, BALLOON_HASH};
pub use key_derivation::{KeyDerivation, Seed};
pub use private_key::{AccessKey, DerivedPrivateKey, PrivateKey};
#[serde_as]
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
#[serde(rename_all = "lowercase")]
pub enum Nonce {
Nonce12(#[serde_as(as = "Base64")] [u8; 12]),
Nonce24(#[serde_as(as = "Base64")] [u8; 24]),
}
impl Nonce {
pub fn new_random_12() -> Nonce {
let val: [u8; 12] = csprng().gen();
Nonce::Nonce12(val)
}
pub fn new_random_24() -> Nonce {
let val: [u8; 24] = csprng().gen();
Nonce::Nonce24(val)
}
}
impl Default for Nonce {
fn default() -> Self {
Nonce::Nonce24([0; 24])
}
}
impl AsRef<[u8]> for Nonce {
fn as_ref(&self) -> &[u8] {
match self {
Nonce::Nonce12(ref val) => val,
Nonce::Nonce24(ref val) => val,
}
}
}
#[serde_as]
#[derive(Serialize, Deserialize, Default, Debug, Eq, PartialEq, Clone)]
pub struct AeadPack {
pub nonce: Nonce,
#[serde_as(as = "Base64")]
pub ciphertext: Vec<u8>,
}