diff --git a/Cargo.toml b/Cargo.toml index 99a8fdb..a3562af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,7 +54,7 @@ chacha20poly1305 = { version = "0.10.1", features = ["stream"] } cuid2 = "0.1.2" fake = { version = "2.9.2", features = ['derive', 'uuid', 'chrono'] } futures-util = "0.3.30" -indicatif = "0.17.8" +indicatif = { version = "0.17.8", features = ["tokio"] } log = "0.4.21" mime_guess = "2.0.4" once_cell = { version = "1.19.0" } diff --git a/cli/src/util/crypto.rs b/cli/src/util/crypto.rs index 1c3046a..bdcc909 100644 --- a/cli/src/util/crypto.rs +++ b/cli/src/util/crypto.rs @@ -1,25 +1,11 @@ -use anyhow::anyhow; -use chacha20poly1305::{ - aead::{ - stream::{DecryptorBE32, EncryptorBE32}, - KeyInit, - }, - XChaCha20Poly1305, -}; -use indicatif::ProgressBar; +use super::progress::progress_bar; use sdk::util::{ - crypto::{decrypt_file, encrypt_file, KeyNonce, DECRYPT_BUFFER_LEN, ENCRYPT_BUFFER_LEN}, + crypto::{decrypt, decrypt_file, encrypt, encrypt_file, KeyNonce}, file::{add_extension, add_parent_dir, rm_extra_extension}, random::generate_random_string_with_prefix, }; - use std::path::{Path, PathBuf}; -use tokio::{ - fs::File, - io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}, -}; - -use super::progress::progress_bar; +use tokio::fs::File; pub async fn encrypt_upload_file( key_nonce: &KeyNonce, @@ -94,7 +80,7 @@ pub async fn encrypt_file_with_progress_bar( let writer = File::create(destination_file).await?; let total_size = reader.metadata().await?.len(); let pb = progress_bar(total_size)?; - encrypt_with_progress_bar(key_nonce, reader, writer, pb).await?; + encrypt(key_nonce, pb.wrap_async_read(reader), writer).await?; Ok(()) } @@ -107,87 +93,7 @@ pub async fn decrypt_file_with_progress_bar( let writer = File::create(destination_file).await?; let total_size = reader.metadata().await?.len(); let pb = progress_bar(total_size)?; - decrypt_with_progress_bar(key_nonce, reader, writer, pb).await?; - Ok(()) -} - -pub async fn encrypt_with_progress_bar( - KeyNonce { key, nonce }: &KeyNonce, - mut reader: R, - mut writer: W, - pb: ProgressBar, -) -> anyhow::Result<()> -where - R: AsyncRead + Unpin, - W: AsyncWrite + Unpin, -{ - let mut buffer = [0u8; ENCRYPT_BUFFER_LEN]; - let mut stream_encryptor = - EncryptorBE32::from_aead(XChaCha20Poly1305::new(key), (*nonce).as_ref().into()); - let mut total_read = 0; - loop { - let read_count = reader.read(&mut buffer).await?; - total_read += read_count; - pb.set_position(total_read as u64); - if read_count == ENCRYPT_BUFFER_LEN { - let ciphertext = stream_encryptor - .encrypt_next(buffer.as_slice()) - .map_err(|err| anyhow!("Encrypting file failed, Error: {err}"))?; - writer.write_all(&ciphertext).await?; - } else if read_count == 0 { - pb.finish_with_message("Encrypt completed successfully."); - break; - } else { - let ciphertext = stream_encryptor - .encrypt_last(&buffer[..read_count]) - .map_err(|err| anyhow!("Encrypting file failed, Error: {err}"))?; - writer.write_all(&ciphertext).await?; - pb.finish_with_message("Encrypt completed successfully."); - break; - } - } - writer.flush().await?; - - Ok(()) -} - -pub async fn decrypt_with_progress_bar( - KeyNonce { key, nonce }: &KeyNonce, - mut reader: R, - mut writer: W, - pb: ProgressBar, -) -> anyhow::Result<()> -where - R: AsyncRead + Unpin, - W: AsyncWrite + Unpin, -{ - let mut buffer = [0u8; DECRYPT_BUFFER_LEN]; - let mut stream_decryptor = - DecryptorBE32::from_aead(XChaCha20Poly1305::new(key), nonce.as_ref().into()); - let mut total_read = 0; - loop { - let read_count = reader.read(&mut buffer).await?; - total_read += read_count; - pb.set_position(total_read as u64); - if read_count == DECRYPT_BUFFER_LEN { - let plaintext = stream_decryptor - .decrypt_next(buffer.as_slice()) - .map_err(|err| anyhow!("Decrypting file failed, Error: {err}"))?; - writer.write_all(&plaintext).await?; - } else if read_count == 0 { - pb.finish_with_message("Decrypt completed successfully."); - break; - } else { - let plaintext = stream_decryptor - .decrypt_last(&buffer[..read_count]) - .map_err(|err| anyhow!("Decrypting file failed, Error: {err}"))?; - writer.write_all(&plaintext).await?; - pb.finish_with_message("Decrypt completed successfully."); - break; - } - } - writer.flush().await?; - + decrypt(key_nonce, pb.wrap_async_read(reader), writer).await?; Ok(()) }