mirror of
https://github.com/kristoferssolo/des-rs.git
synced 2025-12-20 11:04:38 +00:00
96 lines
2.6 KiB
Rust
96 lines
2.6 KiB
Rust
use des_lib::Des;
|
|
use rstest::rstest;
|
|
|
|
const TEST_KEY: u64 = 0x1334_5779_9BBC_DFF1;
|
|
const TEST_PLAINTEXT: u64 = 0x0123_4567_89AB_CDEF;
|
|
const TEST_CIPHERTEXT: u64 = 0x85E8_1354_0F0A_B405;
|
|
|
|
/// Helper to create a test Des instance (use your actual key schedule)
|
|
fn des_instance() -> Des {
|
|
Des::new(TEST_KEY)
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(TEST_PLAINTEXT, TEST_CIPHERTEXT, TEST_KEY)]
|
|
#[case(0, 0x948A_43F9_8A83_4F7E, TEST_KEY)]
|
|
#[case(1, 0x5D59_D446_0749_5A7A, TEST_KEY)]
|
|
#[case(2, 0x751C_4742_B59E_8BBC, TEST_KEY)]
|
|
#[case(10, 0x088C_B289_A93D_9057, TEST_KEY)]
|
|
#[case(100, 0x561B_A6CF_212E_AFE4, TEST_KEY)]
|
|
#[case(1000, 0x4128_8ECA_58D1_9FDC, TEST_KEY)]
|
|
fn encrypt_decrypt_roundtrip(
|
|
#[case] plaintext: u64,
|
|
#[case] expected_ciphertext: u64,
|
|
#[case] key: u64,
|
|
) {
|
|
let des = Des::new(key);
|
|
println!("{plaintext:08b}");
|
|
|
|
let ciphertext = des.encrypt(plaintext);
|
|
let dectrypted = des.decrypt(ciphertext);
|
|
let re_ciphertext = des.encrypt(dectrypted);
|
|
|
|
assert_eq!(
|
|
ciphertext, expected_ciphertext,
|
|
"Encyption failed. Expected 0x{expected_ciphertext:016X}, got 0x{ciphertext:016X}"
|
|
);
|
|
assert_eq!(
|
|
dectrypted, plaintext,
|
|
"Decyption failed. Expected 0x{plaintext:016X}, got 0x{dectrypted:016X}"
|
|
);
|
|
assert_eq!(
|
|
re_ciphertext, expected_ciphertext,
|
|
"Re-encyption failed. Expected 0x{expected_ciphertext:016X}, got 0x{re_ciphertext:016X}"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn weak_keys_rejected() {
|
|
let weak_keys = [0x0101010101010101, 0xFEFEFEFEFEFEFEFE, 0xE001E001E001E001];
|
|
|
|
for key in weak_keys {
|
|
let des = Des::new(key);
|
|
let plaintext = TEST_PLAINTEXT;
|
|
let encrypted = des.encrypt(plaintext);
|
|
let dectrypted = des.decrypt(encrypted);
|
|
assert_eq!(
|
|
dectrypted, plaintext,
|
|
"Weak key {key:016X} failed roundtrip"
|
|
);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn all_zero_paintext() {
|
|
let des = des_instance();
|
|
|
|
let plain = 0;
|
|
let encrypted = des.encrypt(plain);
|
|
let decrypted = des.decrypt(encrypted);
|
|
assert_eq!(decrypted, plain, "All-zero plaintext failed");
|
|
}
|
|
|
|
#[test]
|
|
fn all_one_paintext() {
|
|
let des = des_instance();
|
|
|
|
let plain = u64::MAX;
|
|
let encrypted = des.encrypt(plain);
|
|
let decrypted = des.decrypt(encrypted);
|
|
assert_eq!(decrypted, plain, "All-one plaintext failed");
|
|
}
|
|
|
|
#[test]
|
|
fn different_inputs() {
|
|
let des = des_instance();
|
|
|
|
let plain1 = 1;
|
|
let plain2 = 2;
|
|
let enc1 = des.encrypt(plain1);
|
|
let enc2 = des.encrypt(plain2);
|
|
assert_ne!(
|
|
enc1, enc2,
|
|
"Encryption not deterministic for different inputs"
|
|
);
|
|
}
|