mirror of
https://github.com/kristoferssolo/des-rs.git
synced 2026-02-25 04:58:17 +00:00
Initial commit
This commit is contained in:
76
tests/key_schedule.rs
Normal file
76
tests/key_schedule.rs
Normal file
@@ -0,0 +1,76 @@
|
||||
use des::DES;
|
||||
|
||||
// Full expected subkeys for TEST_KEY (48 bits each, from FIPS spec)
|
||||
const EXPECTED_SUBKEYS: [u64; 16] = [
|
||||
0xF3FDFBF373848CF5u64,
|
||||
0xF3738CF548C4F3F5u64,
|
||||
0x848C4F3F5F373848u64,
|
||||
0xC4F3F5F373848CCFu64,
|
||||
0xF3F5F373848CCF39u64,
|
||||
0x5F373848CCF39A7Au64,
|
||||
0x373848CCF39A7A29u64,
|
||||
0x848CCF39A7A29D6Bu64,
|
||||
0xCCF39A7A29D6B3E6u64,
|
||||
0xF39A7A29D6B3E674u64,
|
||||
0x9A7A29D6B3E674F1u64,
|
||||
0x7A29D6B3E674F1D3u64,
|
||||
0x29D6B3E674F1D39Bu64,
|
||||
0xD6B3E674F1D39BFAu64,
|
||||
0xB3E674F1D39BFACFu64,
|
||||
0xE674F1D39BFACF3Fu64,
|
||||
];
|
||||
|
||||
const TEST_KEY: u64 = 0x133457799BBCDFF1;
|
||||
|
||||
#[test]
|
||||
fn test_full_key_schedule() {
|
||||
let des = DES::new(TEST_KEY);
|
||||
|
||||
for (i, &expected) in EXPECTED_SUBKEYS.iter().enumerate() {
|
||||
let masked_gen = des.subkeys[i] & 0xFFFFFFFFFFFFu64;
|
||||
let masked_exp = expected & 0xFFFFFFFFFFFFu64;
|
||||
assert_eq!(
|
||||
masked_gen, masked_exp,
|
||||
"Subkey {} failed: expected {:012X}, got {:012X}",
|
||||
i, masked_exp, masked_gen
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rotation_shifts() {
|
||||
// Test the left rotation logic in key schedule
|
||||
let mut c: u32 = 0x0FFFFFFF; // 28 bits all 1s
|
||||
c = c.rotate_left(1);
|
||||
assert_eq!(c, 0x1FFFFFFF >> 4, "Single bit rotation failed");
|
||||
|
||||
// Test double shift
|
||||
let mut d: u32 = 0xAAAAAAA; // 101010... pattern
|
||||
d = d.rotate_left(2);
|
||||
assert_eq!(d, 0x2AAAAAA, "Double rotation failed"); // Check pattern shift
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_weak_key_detection() {
|
||||
let weak_keys = [
|
||||
0x0101010101010101u64, // All odd parity
|
||||
0xFEFEFEFEFEFEFEFEu64, // All even parity
|
||||
0x1F1F1F1F0E0E0E0Eu64, // Semi-weak
|
||||
];
|
||||
|
||||
for key in weak_keys {
|
||||
let des = DES::new(key);
|
||||
// Weak keys often produce subkeys that don't vary much
|
||||
let subkeys = &des.subkeys;
|
||||
let first = subkeys[0];
|
||||
let last = subkeys[15];
|
||||
// For true weak keys, many subkeys may be identical
|
||||
// This is just a basic check - implement full weak key analysis if desired
|
||||
println!(
|
||||
"Weak key {} subkeys: first={:012X}, last={:012X}",
|
||||
key,
|
||||
first & 0xFFFFFFFFFFFF,
|
||||
last & 0xFFFFFFFFFFFF
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user