/* This file is part of DarkFi (https://dark.fi)
*
* Copyright (C) 2020-2025 Dyne.org foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
use crypto_box::{
aead::{Aead, AeadCore},
ChaChaBox,
};
use rand::rngs::OsRng;
/// Encrypt given data using the given `ChaChaBox`.
/// Returns base58-encoded string of the ciphertext.
/// Panics if encryption fails.
///
/// The encryption format we're using with `ChaChaBox` is `nonce||ciphertext`,
/// where nonce is 24 bytes large, and the remaining data should be the ciphertext.
pub fn encrypt(salt_box: &ChaChaBox, plaintext: &[u8]) -> String {
// Generate the nonce
let nonce = ChaChaBox::generate_nonce(&mut OsRng);
// Encrypt
let mut ciphertext = salt_box.encrypt(&nonce, plaintext).unwrap();
// Concatenate
let mut concat = Vec::with_capacity(24 + ciphertext.len());
concat.append(&mut nonce.as_slice().to_vec());
concat.append(&mut ciphertext);
// Encode
bs58::encode(concat).into_string()
}
/// Attempt to decrypt given ciphertext using the given `ChaChaBox`.
/// Returns a `Vec` on success, and `None` on failure.
///
/// The encryption format we're using with `ChaChaBox` is `nonce||ciphertext`,
/// where nonce is 24 bytes large, and the remaining data should be the ciphertext.
pub fn try_decrypt(salt_box: &ChaChaBox, ciphertext: &[u8]) -> Option> {
// Make sure we have enough bytes to work with
if ciphertext.len() < 25 {
return None
}
match salt_box.decrypt((&ciphertext[0..24]).into(), &ciphertext[24..]) {
Ok(v) => Some(v),
Err(_) => None,
}
}