Modify fields encryption, can selectively encrypt and fields that are not decrypted stay as they are

This commit is contained in:
Sosthene 2024-10-07 11:15:22 +02:00
parent 3c15b41699
commit 7a4344608e

View File

@ -92,6 +92,7 @@ pub trait Pcd<'a>: Serialize + Deserialize<'a> {
fn encrypt_fields( fn encrypt_fields(
&self, &self,
fields_to_encrypt: &[String],
fields2keys: &mut Map<String, Value>, fields2keys: &mut Map<String, Value>,
fields2cipher: &mut Map<String, Value>, fields2cipher: &mut Map<String, Value>,
) -> Result<()> { ) -> Result<()> {
@ -102,6 +103,7 @@ pub trait Pcd<'a>: Serialize + Deserialize<'a> {
let mut rng = thread_rng(); let mut rng = thread_rng();
for (field, value) in as_map { for (field, value) in as_map {
if fields_to_encrypt.contains(field) {
let aes_key = Aes256Gcm::generate_key(&mut rng); let aes_key = Aes256Gcm::generate_key(&mut rng);
let nonce = Aes256Gcm::generate_nonce(&mut rng); let nonce = Aes256Gcm::generate_nonce(&mut rng);
fields2keys.insert( fields2keys.insert(
@ -124,6 +126,9 @@ pub trait Pcd<'a>: Serialize + Deserialize<'a> {
res.extend_from_slice(&cipher); res.extend_from_slice(&cipher);
fields2cipher.insert(field.to_owned(), Value::String(res.to_lower_hex_string())); fields2cipher.insert(field.to_owned(), Value::String(res.to_lower_hex_string()));
} else {
fields2cipher.insert(field.to_owned(), value.clone());
}
} }
Ok(()) Ok(())
@ -169,7 +174,8 @@ pub trait Pcd<'a>: Serialize + Deserialize<'a> {
fields2plain.insert(field.to_owned(), Value::String(decrypted_value)); fields2plain.insert(field.to_owned(), Value::String(decrypted_value));
} else { } else {
fields2plain.insert(field.to_owned(), Value::Null); // We keep the original value, that allows us to have fields that are always left unencrypted
fields2plain.insert(field.to_owned(), encrypted_value.clone());
} }
} }