Skip to content

Commit

Permalink
remove duplicate encrypt util
Browse files Browse the repository at this point in the history
  • Loading branch information
robatipoor committed Mar 14, 2024
1 parent 61ef3ac commit a09593f
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 100 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
Expand Down
104 changes: 5 additions & 99 deletions cli/src/util/crypto.rs
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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(())
}

Expand All @@ -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<R, W>(
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<R, W>(
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(())
}

Expand Down

0 comments on commit a09593f

Please sign in to comment.