feat: updates

This commit is contained in:
2023-09-07 08:38:26 +08:00
parent 8939237d99
commit 1230601ed2
5 changed files with 40 additions and 27 deletions

View File

@@ -3,14 +3,13 @@ use std::fs::File;
use std::io::{Read, Write};
use std::path::PathBuf;
use base64::Engine;
use openpgp_card::crypto_data::Cryptogram;
use openpgp_card::OpenPgp;
use rust_util::{debugging, failure, opt_result, simple_error, success, util_term, XResult};
use crate::{file, util};
use crate::card::get_card;
use crate::spec::{TinyEncryptEnvelop, TinyEncryptMeta};
use crate::spec::{TinyEncryptEnvelop, TinyEncryptEnvelopType, TinyEncryptMeta};
use crate::util::{decode_base64, TINY_ENC_FILE_EXT};
pub fn decrypt(path: &PathBuf, pin: &Option<String>) -> XResult<()> {
@@ -51,26 +50,22 @@ fn decrypt_file(file_in: &mut File, file_out: &mut File, key: &[u8], nonce: &[u8
let len = opt_result!(file_in.read(&mut buffer), "Read file failed: {}");
if len == 0 {
let last_block = opt_result!(decryptor.finalize(), "Decrypt file failed: {}");
if !last_block.is_empty() {
opt_result!(file_out.write_all(&last_block), "Write file failed: {}");
}
opt_result!(file_out.write_all(&last_block), "Write file failed: {}");
success!("Decrypt finished, total bytes: {}", total_len);
break;
} else {
total_len += len;
let decrypted = decryptor.update(&buffer[0..len]);
if !decrypted.is_empty() {
opt_result!(file_out.write_all(&decrypted), "Write file failed: {}");
}
opt_result!(file_out.write_all(&decrypted), "Write file failed: {}");
}
}
Ok(total_len)
}
fn try_decrypt_key(envelop: &TinyEncryptEnvelop, pin: &Option<String>) -> XResult<Vec<u8>> {
match envelop.r#type.to_lowercase().as_str() {
"pgp" => try_decrypt_key_pgp(envelop, pin),
unknown_type => return simple_error!("Unknown or not supported type: {}", unknown_type)
match envelop.r#type {
TinyEncryptEnvelopType::Pgp => try_decrypt_key_pgp(envelop, pin),
unknown_type => return simple_error!("Unknown or not supported type: {}", unknown_type.get_name())
}
}
@@ -124,13 +119,13 @@ fn select_envelop(meta: &TinyEncryptMeta) -> XResult<&TinyEncryptEnvelop> {
success!("Found {} envelops:", envelops.len());
if envelops.len() == 1 {
let selected_envelop = &envelops[0];
success!("Auto selected envelop: #{} {}", 1, selected_envelop.r#type.to_uppercase());
success!("Auto selected envelop: #{} {}", 1, selected_envelop.r#type.get_upper_name());
return Ok(selected_envelop);
}
envelops.iter().enumerate().for_each(|(i, envelop)| {
println!("#{} {}{}", i + 1,
envelop.r#type.to_uppercase(),
envelop.r#type.get_upper_name(),
if envelop.kid.is_empty() {
"".into()
} else {
@@ -141,6 +136,6 @@ fn select_envelop(meta: &TinyEncryptMeta) -> XResult<&TinyEncryptEnvelop> {
let envelop_number = util::read_number("Please select an envelop:", 1, envelops.len());
let selected_envelop = &envelops[envelop_number - 1];
success!("Selected envelop: #{} {}", envelop_number, selected_envelop.r#type.to_uppercase());
success!("Selected envelop: #{} {}", envelop_number, selected_envelop.r#type.get_upper_name());
Ok(selected_envelop)
}