const PC1: [u8; 56] = [
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60,
52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4,
];
const PC2: [u8; 48] = [
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52,
31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32,
];
const ONE_SHIFT_ROUNDS: [u8; 4] = [1, 2, 9, 16];
pub fn permutated_choice_1(key: u64) -> u64 {
let mut permutated_key: u64 = 0;
for (i, pos) in PC1.iter().enumerate() {
let bit = (key >> (pos - 1)) & 1;
permutated_key |= bit << (i as u64);
}
permutated_key
}
pub fn permutated_choice_2(left: u32, right: u32) -> u64 {
let key: u64 = (left as u64) << 28 | right as u64;
let mut permutated_key: u64 = 0;
for (i, pos) in PC2.iter().enumerate() {
let bit = (key >> (pos - 1)) & 1;
permutated_key |= bit << (i as u64);
}
permutated_key
}
pub fn key_shift(left_key: u32, right_key: u32, n: u8) -> (u32, u32) {
if ONE_SHIFT_ROUNDS.contains(&n) {
let lk = (left_key << 1 | left_key >> 27) & 0x0FFFFFFF;
let rk = (right_key << 1 | right_key >> 27) & 0x0FFFFFFF;
(lk, rk)
} else {
let lk = (left_key << 2 | left_key >> 26) & 0x0FFFFFFF;
let rk = (right_key << 2 | right_key >> 26) & 0x0FFFFFFF;
(lk, rk)
}
}