52 lines
1.3 KiB
Rust
Raw Normal View History

2021-01-24 05:19:35 +01:00
//FIXME: Which TDES Mode should be used by this?
2021-04-27 00:36:46 +02:00
use crate::crypto::cipher::Cipher;
2021-12-26 02:33:05 +01:00
use crate::error::{Error, Result};
use block_modes::block_padding::NoPadding;
use block_modes::{BlockMode, Cbc};
use des::TdesEde2;
2021-01-24 05:19:35 +01:00
type TDesEde2Cbc = Cbc<TdesEde2, NoPadding>;
2021-04-27 00:36:46 +02:00
pub struct Tdes {}
2021-01-24 05:19:35 +01:00
2021-04-27 00:36:46 +02:00
impl Cipher for Tdes {
const BLOCK_SIZE: usize = 8;
const KEY_SIZE: usize = 16;
2021-01-24 05:19:35 +01:00
2021-04-27 00:36:46 +02:00
fn encrypt(data: &[u8], key: &[u8], iv: &[u8]) -> Result<Vec<u8>> {
let cipher = TDesEde2Cbc::new_var(&key, &iv)?;
return Ok(cipher.encrypt_vec(data));
}
2021-01-24 05:19:35 +01:00
2021-04-27 00:36:46 +02:00
fn decrypt(data: &[u8], key: &[u8], iv: &[u8]) -> Result<Vec<u8>> {
let cipher = TDesEde2Cbc::new_var(&key, &iv)?;
2021-01-24 05:19:35 +01:00
2021-04-27 00:36:46 +02:00
let result = cipher.decrypt_vec(data);
return match result {
2021-12-26 02:33:05 +01:00
Ok(data) => Ok(data),
Err(err) => Err(Error::BlockModeError(err)),
};
2021-01-24 05:19:35 +01:00
}
}
#[cfg(test)]
mod tests {
2021-04-27 00:36:46 +02:00
use crate::crypto::cipher::Cipher;
2021-12-26 02:33:05 +01:00
use hex_literal::hex;
2021-01-24 05:19:35 +01:00
#[test]
#[ignore]
fn encrypt() {
let data = hex!("");
let key = hex!("00000000000000000000000000000000");
let iv = hex!("00000000000000000000000000000000");
2021-04-27 00:36:46 +02:00
let data_enc = crate::crypto::cipher::tdes::Tdes::encrypt(&data, &key, &iv).unwrap();
2021-01-24 05:19:35 +01:00
let data_enc_expected = hex!("");
assert_eq!(data_enc, data_enc_expected);
}
2021-12-26 02:33:05 +01:00
}