feat: updates
This commit is contained in:
77
src/cmd_encrypt.rs
Normal file
77
src/cmd_encrypt.rs
Normal file
@@ -0,0 +1,77 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use clap::Args;
|
||||
use rust_util::{debugging, simple_error, XResult};
|
||||
|
||||
use crate::config::{TinyEncryptConfig, TinyEncryptConfigEnvelop};
|
||||
use crate::spec::{TinyEncryptEnvelop, TinyEncryptEnvelopType};
|
||||
use crate::util::TINY_ENC_CONFIG_FILE;
|
||||
|
||||
#[derive(Debug, Args)]
|
||||
pub struct CmdEncrypt {
|
||||
/// Files need to be decrypted
|
||||
pub paths: Vec<PathBuf>,
|
||||
// Comment
|
||||
pub comment: Option<String>,
|
||||
// Encryption profile
|
||||
pub profile: Option<String>,
|
||||
}
|
||||
|
||||
pub fn encrypt(cmd_encrypt: CmdEncrypt) -> XResult<()> {
|
||||
let config = TinyEncryptConfig::load(TINY_ENC_CONFIG_FILE)?;
|
||||
let envelops = config.find_envelops(&cmd_encrypt.profile);
|
||||
if envelops.is_empty() {
|
||||
return simple_error!("Cannot find any valid envelops");
|
||||
}
|
||||
|
||||
let (key, nonce) = make_key_and_nonce();
|
||||
let envelops = encrypt_envelops(&key, &envelops)?;
|
||||
|
||||
debugging!("Envelops: {:?}", envelops);
|
||||
|
||||
println!("Cmd encrypt: {:?}", cmd_encrypt);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn encrypt_envelops(key: &[u8], envelops: &[&TinyEncryptConfigEnvelop]) -> XResult<Vec<TinyEncryptEnvelop>> {
|
||||
let mut encrypted_envelops = vec![];
|
||||
for envelop in envelops {
|
||||
match envelop.r#type {
|
||||
TinyEncryptEnvelopType::Pgp => {
|
||||
encrypted_envelops.push(encrypt_envelop_pgp(key, envelop)?);
|
||||
}
|
||||
TinyEncryptEnvelopType::Ecdh => {
|
||||
encrypted_envelops.push(encrypt_envelop_ecdh(key, envelop)?);
|
||||
}
|
||||
_ => return simple_error!("Not supported type: {:?}", envelop.r#type),
|
||||
}
|
||||
}
|
||||
Ok(encrypted_envelops)
|
||||
}
|
||||
|
||||
fn encrypt_envelop_ecdh(key: &[u8], envelop: &TinyEncryptConfigEnvelop) -> XResult<TinyEncryptEnvelop> {
|
||||
Ok(TinyEncryptEnvelop {
|
||||
r#type: envelop.r#type,
|
||||
kid: envelop.kid.clone(),
|
||||
desc: envelop.desc.clone(),
|
||||
encrypted_key: "".to_string(), // TODO ...
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
fn encrypt_envelop_pgp(key: &[u8], envelop: &TinyEncryptConfigEnvelop) -> XResult<TinyEncryptEnvelop> {
|
||||
Ok(TinyEncryptEnvelop {
|
||||
r#type: envelop.r#type,
|
||||
kid: envelop.kid.clone(),
|
||||
desc: envelop.desc.clone(),
|
||||
encrypted_key: "".to_string(), // TODO ...
|
||||
})
|
||||
}
|
||||
|
||||
fn make_key_and_nonce() -> (Vec<u8>, Vec<u8>) {
|
||||
// TODO use random
|
||||
let key = [0u8; 32];
|
||||
let nonce = [0u8; 12];
|
||||
|
||||
(key.into(), nonce.into())
|
||||
}
|
||||
Reference in New Issue
Block a user