From f7c8ef237799d5503ffa6b5689a50281f23d7e7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milan=20=C5=A0pinka?= Date: Sun, 2 Feb 2025 02:22:01 +0100 Subject: [PATCH] Make that godforsaken algorithm impl compile --- src/primitive/blockcipher/des.zig | 128 +++++------ test/index.zig | 1 + test/primitive/blockcipher/des.zig | 328 +++++++++++++++++++++++++++++ 3 files changed, 396 insertions(+), 61 deletions(-) create mode 100644 test/primitive/blockcipher/des.zig diff --git a/src/primitive/blockcipher/des.zig b/src/primitive/blockcipher/des.zig index 402626b..80bc97d 100644 --- a/src/primitive/blockcipher/des.zig +++ b/src/primitive/blockcipher/des.zig @@ -10,36 +10,36 @@ pub const DES_N_ROUNDS = 16; pub const DES_SUBKEY_SIZE = 48 / 8; const DES_INITIAL_PERMUTATION = [_]u6{ - 58, 50, 42, 35, 26, 18, 10, 2, - 60, 52, 44, 36, 28, 20, 12, 4, - 62, 54, 46, 38, 30, 22, 14, 6, - 64, 56, 48, 40, 32, 24, 16, 8, - 57, 49, 41, 33, 25, 17, 9, 1, - 59, 51, 43, 35, 27, 19, 11, 3, - 61, 53, 45, 37, 29, 21, 13, 5, - 63, 55, 47, 39, 31, 23, 15, 7, + 58 - 1, 50 - 1, 42 - 1, 35 - 1, 26 - 1, 18 - 1, 10 - 1, 2 - 1, + 60 - 1, 52 - 1, 44 - 1, 36 - 1, 28 - 1, 20 - 1, 12 - 1, 4 - 1, + 62 - 1, 54 - 1, 46 - 1, 38 - 1, 30 - 1, 22 - 1, 14 - 1, 6 - 1, + 64 - 1, 56 - 1, 48 - 1, 40 - 1, 32 - 1, 24 - 1, 16 - 1, 8 - 1, + 57 - 1, 49 - 1, 41 - 1, 33 - 1, 25 - 1, 17 - 1, 9 - 1, 1 - 1, + 59 - 1, 51 - 1, 43 - 1, 35 - 1, 27 - 1, 19 - 1, 11 - 1, 3 - 1, + 61 - 1, 53 - 1, 45 - 1, 37 - 1, 29 - 1, 21 - 1, 13 - 1, 5 - 1, + 63 - 1, 55 - 1, 47 - 1, 39 - 1, 31 - 1, 23 - 1, 15 - 1, 7 - 1, }; const DES_INV_INITIAL_PERMUTATION = [_]u6{ - 40, 8, 48, 16, 56, 24, 64, 32, - 39, 7, 47, 15, 55, 23, 63, 31, - 38, 6, 46, 14, 54, 22, 62, 30, - 37, 5, 45, 13, 53, 21, 61, 29, - 36, 4, 44, 12, 52, 20, 60, 28, - 35, 3, 43, 11, 51, 19, 59, 27, - 34, 2, 42, 10, 50, 18, 58, 26, - 33, 1, 41, 9, 49, 17, 57, 25, + 40 - 1, 8 - 1, 48 - 1, 16 - 1, 56 - 1, 24 - 1, 64 - 1, 32 - 1, + 39 - 1, 7 - 1, 47 - 1, 15 - 1, 55 - 1, 23 - 1, 63 - 1, 31 - 1, + 38 - 1, 6 - 1, 46 - 1, 14 - 1, 54 - 1, 22 - 1, 62 - 1, 30 - 1, + 37 - 1, 5 - 1, 45 - 1, 13 - 1, 53 - 1, 21 - 1, 61 - 1, 29 - 1, + 36 - 1, 4 - 1, 44 - 1, 12 - 1, 52 - 1, 20 - 1, 60 - 1, 28 - 1, + 35 - 1, 3 - 1, 43 - 1, 11 - 1, 51 - 1, 19 - 1, 59 - 1, 27 - 1, + 34 - 1, 2 - 1, 42 - 1, 10 - 1, 50 - 1, 18 - 1, 58 - 1, 26 - 1, + 33 - 1, 1 - 1, 41 - 1, 9 - 1, 49 - 1, 17 - 1, 57 - 1, 25 - 1, }; -const DES_BIT_SELECTION_TABLE_E = [_]u5{ - 32, 1, 2, 3, 4, 5, - 4, 5, 6, 7, 8, 9, - 8, 9, 10, 11, 12, 13, - 12, 13, 14, 15, 16, 17, - 16, 17, 18, 19, 20, 21, - 20, 21, 22, 23, 24, 25, - 24, 25, 26, 27, 28, 29, - 28, 29, 30, 31, 32, 1, +const DES_BIT_SELECTION_TABLE_E = [_]u6{ + 32 - 1, 1 - 1, 2 - 1, 3 - 1, 4 - 1, 5 - 1, + 4 - 1, 5 - 1, 6 - 1, 7 - 1, 8 - 1, 9 - 1, + 8 - 1, 9 - 1, 10 - 1, 11 - 1, 12 - 1, 13 - 1, + 12 - 1, 13 - 1, 14 - 1, 15 - 1, 16 - 1, 17 - 1, + 16 - 1, 17 - 1, 18 - 1, 19 - 1, 20 - 1, 21 - 1, + 20 - 1, 21 - 1, 22 - 1, 23 - 1, 24 - 1, 25 - 1, + 24 - 1, 25 - 1, 26 - 1, 27 - 1, 28 - 1, 29 - 1, + 28 - 1, 29 - 1, 30 - 1, 31 - 1, 32 - 1, 1 - 1, }; const DES_S_BOXES = [8][64]u4{ @@ -53,11 +53,11 @@ const DES_S_BOXES = [8][64]u4{ .{ 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 }, }; -const DES_PERMUTATION_FUNCTION_P = [_]u5{ - 16, 7, 20, 21, 29, 12, 28, 17, - 1, 15, 23, 26, 5, 18, 31, 10, - 2, 8, 24, 14, 32, 27, 3, 9, - 19, 13, 30, 6, 22, 11, 4, 25, +const DES_PERMUTATION_FUNCTION_P = [_]u6{ + 16 - 1, 7 - 1, 20 - 1, 21 - 1, 29 - 1, 12 - 1, 28 - 1, 17 - 1, + 1 - 1, 15 - 1, 23 - 1, 26 - 1, 5 - 1, 18 - 1, 31 - 1, 10 - 1, + 2 - 1, 8 - 1, 24 - 1, 14 - 1, 32 - 1, 27 - 1, 3 - 1, 9 - 1, + 19 - 1, 13 - 1, 30 - 1, 6 - 1, 22 - 1, 11 - 1, 4 - 1, 25 - 1, }; const DES_KS_SHIFT_SCHEDULE = .{ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; @@ -65,26 +65,26 @@ const DES_KS_SHIFT_SCHEDULE = .{ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 // ----------------------------------- ENCRYPTION/DECRYPTION ----------------------------------- // pub fn des_encrypt_block( + key: *const [DES_ENCODED_KEY_SIZE]u8, block_in: *const [DES_BLOCK_SIZE]u8, block_out: *[DES_BLOCK_SIZE]u8, - key: *const [DES_ENCODED_KEY_SIZE]u8, ) void { var state: [DES_BLOCK_SIZE]u8 = undefined; des_initial_permutation(block_in, &state); var expanded_key = des_expand_key(key); - defer @memset(&expanded_key, 0); + defer @memset(&expanded_key, .{ 0, 0, 0, 0, 0, 0 }); for (0..DES_N_ROUNDS) |round| - des_perform_round(&state, expanded_key[round]); + des_perform_round(&state, &expanded_key[round]); des_inv_initial_permutation(&state, block_out); } pub fn des_decrypt_block( + key: *const [DES_ENCODED_KEY_SIZE]u8, block_in: *const [DES_BLOCK_SIZE]u8, block_out: *[DES_BLOCK_SIZE]u8, - key: *const [DES_ENCODED_KEY_SIZE]u8, ) void { var state: [DES_BLOCK_SIZE]u8 = undefined; des_inv_initial_permutation(block_in, &state); @@ -102,52 +102,58 @@ pub fn des_expand_key(key: *const [DES_ENCODED_KEY_SIZE]u8) [DES_N_ROUNDS][DES_S const cd = des_permuted_choice_1(key); // Probably the least stupid software implementation that I could think of. - var c_i = @as(u28, std.mem.readInt(u56, &cd, .big) >> 28); - var d_i = @as(u28, std.mem.readInt(u56, &cd, .big) & 0xfffffff); + var c_i: u28 = @truncate(std.mem.readInt(u56, &cd, .big) >> 28); + var d_i: u28 = @truncate(std.mem.readInt(u56, &cd, .big)); var subkeys: [DES_N_ROUNDS][DES_SUBKEY_SIZE]u8 = undefined; - for (0..DES_N_ROUNDS) |i| { + inline for (0..DES_N_ROUNDS) |i| { c_i = rotate_left(c_i, DES_KS_SHIFT_SCHEDULE[i]); d_i = rotate_left(d_i, DES_KS_SHIFT_SCHEDULE[i]); des_permuted_choice_2(c_i, d_i, &subkeys[i]); } + + return subkeys; } pub fn des_permuted_choice_1(key: *const [DES_ENCODED_KEY_SIZE]u8) [DES_TRUE_KEY_SIZE]u8 { const PC1 = .{ - 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, + 57 - 1, 49 - 1, 41 - 1, 33 - 1, 25 - 1, 17 - 1, 9 - 1, 1 - 1, 58 - 1, 50 - 1, 42 - 1, 34 - 1, 26 - 1, 18 - 1, + 10 - 1, 2 - 1, 59 - 1, 51 - 1, 43 - 1, 35 - 1, 27 - 1, 19 - 1, 11 - 1, 3 - 1, 60 - 1, 52 - 1, 44 - 1, 36 - 1, + 63 - 1, 55 - 1, 47 - 1, 39 - 1, 31 - 1, 23 - 1, 15 - 1, 7 - 1, 62 - 1, 54 - 1, 46 - 1, 38 - 1, 30 - 1, 22 - 1, + 14 - 1, 6 - 1, 61 - 1, 53 - 1, 45 - 1, 37 - 1, 29 - 1, 21 - 1, 13 - 1, 5 - 1, 28 - 1, 20 - 1, 12 - 1, 4 - 1, }; var result: [DES_TRUE_KEY_SIZE]u8 = undefined; - permute_bits(DES_TRUE_KEY_SIZE, key, &result, PC1); + permute_bits(DES_TRUE_KEY_SIZE, key, &result, &PC1); return result; } pub fn des_permuted_choice_2(c: u28, d: u28, out: *[DES_SUBKEY_SIZE]u8) void { const PC2 = .{ - 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, + 14 - 1, 17 - 1, 11 - 1, 24 - 1, 1 - 1, 5 - 1, 3 - 1, 28 - 1, 15 - 1, 6 - 1, 21 - 1, 10 - 1, + 23 - 1, 19 - 1, 12 - 1, 4 - 1, 26 - 1, 8 - 1, 16 - 1, 7 - 1, 27 - 1, 20 - 1, 13 - 1, 2 - 1, + 41 - 1, 52 - 1, 31 - 1, 37 - 1, 47 - 1, 55 - 1, 30 - 1, 40 - 1, 51 - 1, 45 - 1, 33 - 1, 48 - 1, + 44 - 1, 49 - 1, 39 - 1, 56 - 1, 34 - 1, 53 - 1, 46 - 1, 42 - 1, 50 - 1, 36 - 1, 29 - 1, 32 - 1, }; const cd = @as(u56, c) << 28 | @as(u56, d); - const cd_bytes: [DES_TRUE_KEY_SIZE]u8 = undefined; + var cd_bytes: [DES_TRUE_KEY_SIZE]u8 = undefined; std.mem.writeInt(u56, &cd_bytes, cd, .big); - permute_bits(DES_SUBKEY_SIZE, &cd_bytes, out, PC2); + permute_bits(DES_SUBKEY_SIZE, &cd_bytes, out, &PC2); } pub fn des_perform_round(state: *[DES_BLOCK_SIZE]u8, subkey: *[DES_SUBKEY_SIZE]u8) void { - const f_output = des_cipher_function_f(state[DES_BLOCK_SIZE / 2 ..], subkey); - const new_r = xor(DES_BLOCK_SIZE / 2, state[0 .. DES_BLOCK_SIZE / 2], f_output); + var f_output = des_cipher_function_f(state[DES_BLOCK_SIZE / 2 ..], subkey); + const new_r = xor(DES_BLOCK_SIZE / 2, state[0 .. DES_BLOCK_SIZE / 2], &f_output); @memcpy(state[0 .. DES_BLOCK_SIZE / 2], state[DES_BLOCK_SIZE / 2 ..]); @memcpy(state[DES_BLOCK_SIZE / 2 ..], new_r[0..]); } -pub fn des_cipher_function_f(word: [DES_BLOCK_SIZE / 2]u8, subkey: *const [DES_SUBKEY_SIZE]u8) [DES_BLOCK_SIZE / 2]u8 { +pub fn des_cipher_function_f(word: *const [DES_BLOCK_SIZE / 2]u8, subkey: *const [DES_SUBKEY_SIZE]u8) [DES_BLOCK_SIZE / 2]u8 { // The input word is expanded to 48 bits. var expanded_word: [DES_SUBKEY_SIZE]u8 = undefined; permute_bits(DES_SUBKEY_SIZE, word, &expanded_word, &DES_BIT_SELECTION_TABLE_E); @@ -159,11 +165,11 @@ pub fn des_cipher_function_f(word: [DES_BLOCK_SIZE / 2]u8, subkey: *const [DES_S inline for (0..8) |i| { var sbox_input: u6 = @as(u6, get_nth_bit(DES_SUBKEY_SIZE, &expanded_word, i * 6)); - for (1..6) |j| { + inline for (1..6) |j| { sbox_input <<= 1; sbox_input |= @as(u6, get_nth_bit(DES_SUBKEY_SIZE, &expanded_word, i * 6 + j)); } - sbox_output[i / 2] |= DES_S_BOXES[i][sbox_input] << if (i % 2 == 0) 4 else 0; + sbox_output[i / 2] |= @as(u8, DES_S_BOXES[i][sbox_input]) << if (i % 2 == 0) 4 else 0; } var expansion_output: [DES_BLOCK_SIZE / 2]u8 = undefined; @@ -173,49 +179,49 @@ pub fn des_cipher_function_f(word: [DES_BLOCK_SIZE / 2]u8, subkey: *const [DES_S } pub fn des_initial_permutation(in: *const [DES_BLOCK_SIZE]u8, out: *[DES_BLOCK_SIZE]u8) void { - permute_bits(DES_BLOCK_SIZE, in, out, DES_INITIAL_PERMUTATION); + permute_bits(DES_BLOCK_SIZE, in[0..], out, &DES_INITIAL_PERMUTATION); } pub fn des_inv_initial_permutation(in: *const [DES_BLOCK_SIZE]u8, out: *[DES_BLOCK_SIZE]u8) void { - permute_bits(DES_BLOCK_SIZE, in, out, DES_INV_INITIAL_PERMUTATION); + permute_bits(DES_BLOCK_SIZE, in[0..], out, &DES_INV_INITIAL_PERMUTATION); } // ----------------------------------- HELPERS ----------------------------------- // -fn permute_bits(L: comptime_int, in: []u8, out: *[L]u8, key: [8 * L]u6) void { +fn permute_bits(L: comptime_int, in: []const u8, out: *[L]u8, key: *const [8 * L]u6) void { for (0..8 * L) |i| { const pi = key[i]; if (pi >= in.len * 8) @panic("Bit index out of range!"); const bit = get_nth_bit(8, in, pi); - set_nth_bit(8, out, pi, bit); + set_nth_bit(L, out, @intCast(i), bit); } } -fn get_nth_bit(comptime L: u3, bytes: *const [L]u8, n: u6) u1 { - if (L > 8 or n >= L * 8) +fn get_nth_bit(comptime L: u4, bytes: []const u8, n: u6) u1 { + if (L > 8 or n >= bytes.len * 8) @panic("Bit index out of range!"); const byte_idx = n / 8; const bit_idx = n % 8; - return @truncate(bytes[byte_idx] >> (7 - bit_idx)); + return @truncate(bytes[byte_idx] >> @intCast(7 - bit_idx)); } -fn set_nth_bit(comptime L: u3, bytes: *const [8]u8, n: u6, bit: u1) void { - if (n >= L * 8) +fn set_nth_bit(comptime L: u4, bytes: []u8, n: u6, bit: u1) void { + if (L > 8 or n >= bytes.len * 8) @panic("Bit index out of range!"); const byte_idx = n / 8; const bit_idx = n % 8; if (bit == 1) - bytes[byte_idx] |= (1 << (7 - bit_idx)) + bytes[byte_idx] |= (@as(u8, 1) << @intCast(7 - bit_idx)) else - bytes[byte_idx] &= ~(1 << (7 - bit_idx)); + bytes[byte_idx] &= ~(@as(u8, 1) << @intCast(7 - bit_idx)); } -fn xor(L: comptime_int, a: [L]u8, b: [L]u8) [L]u8 { +fn xor(L: comptime_int, a: *const [L]u8, b: *const [L]u8) [L]u8 { var result: [L]u8 = undefined; for (0..L) |i| result[i] = a[i] ^ b[i]; diff --git a/test/index.zig b/test/index.zig index 0f93271..fef0c3d 100644 --- a/test/index.zig +++ b/test/index.zig @@ -1,6 +1,7 @@ comptime { _ = .{ @import("./primitive/blockcipher/aes.zig"), + @import("./primitive/blockcipher/des.zig"), @import("./primitive/blockcipher/operation_modes.zig"), @import("./primitive/digest/sha.zig"), @import("./primitive/streamcipher/chacha20.zig"), diff --git a/test/primitive/blockcipher/des.zig b/test/primitive/blockcipher/des.zig new file mode 100644 index 0000000..577f328 --- /dev/null +++ b/test/primitive/blockcipher/des.zig @@ -0,0 +1,328 @@ +const std = @import("std"); +const testing = std.testing; + +const des = @import("primitive").blockcipher.des; + +test "DES ECB (NBS SP 500-20)" { + const tests = [_]struct { key: u64, pt: u64, ct: u64 }{ + // Initial Permutation and Expansion test + .{ .key = 0x0101010101010101, .pt = 0x95F8A5E5DD31D900, .ct = 0x8000000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xDD7F121CA5015619, .ct = 0x4000000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x2E8653104F3834EA, .ct = 0x2000000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x4BD388FF6CD81D4F, .ct = 0x1000000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x20B9E767B2FB1456, .ct = 0x0800000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x55579380D77138EF, .ct = 0x0400000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x6CC5DEFAAF04512F, .ct = 0x0200000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x0D9F279BA5D87260, .ct = 0x0100000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xD9031B0271BD5A0A, .ct = 0x0080000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x424250B37C3DD951, .ct = 0x0040000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xB8061B7ECD9A21E5, .ct = 0x0020000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xF15D0F286B65BD28, .ct = 0x0010000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xADD0CC8D6E5DEBA1, .ct = 0x0008000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xE6D5F82752AD63D1, .ct = 0x0004000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xECBFE3BD3F591A5E, .ct = 0x0002000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xF356834379D165CD, .ct = 0x0001000000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x2B9F982F20037FA9, .ct = 0x0000800000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x889DE068A16F0BE6, .ct = 0x0000400000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xE19E275D846A1298, .ct = 0x0000200000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x329A8ED523D71AEC, .ct = 0x0000100000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xE7FCE22557D23C97, .ct = 0x0000080000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x12A9F5817FF2D65D, .ct = 0x0000040000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xA484C3AD38DC9C19, .ct = 0x0000020000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xFBE00A8A1EF8AD72, .ct = 0x0000010000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x750D079407521363, .ct = 0x0000008000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x64FEED9C724C2FAF, .ct = 0x0000004000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xF02B263B328E2B60, .ct = 0x0000002000000000 }, + .{ .key = 0x0101010101010101, .pt = 0x9D64555A9A10B852, .ct = 0x0000001000000000 }, + .{ .key = 0x0101010101010101, .pt = 0xD106FF0BED5255D7, .ct = 0x0000000800000000 }, + .{ .key = 0x0101010101010101, .pt = 0xE1652C6B138C64A5, .ct = 0x0000000400000000 }, + .{ .key = 0x0101010101010101, .pt = 0xE428581186EC8F46, .ct = 0x0000000200000000 }, + .{ .key = 0x0101010101010101, .pt = 0xAEB5F5EDE22D1A36, .ct = 0x0000000100000000 }, + .{ .key = 0x0101010101010101, .pt = 0xE943D7568AEC0C5C, .ct = 0x0000000080000000 }, + .{ .key = 0x0101010101010101, .pt = 0xDF98C8276F54B04B, .ct = 0x0000000040000000 }, + .{ .key = 0x0101010101010101, .pt = 0xB160E4680F6C696F, .ct = 0x0000000020000000 }, + .{ .key = 0x0101010101010101, .pt = 0xFA0752B07D9C4AB8, .ct = 0x0000000010000000 }, + .{ .key = 0x0101010101010101, .pt = 0xCA3A2B036DBC8502, .ct = 0x0000000008000000 }, + .{ .key = 0x0101010101010101, .pt = 0x5E0905517BB59BCF, .ct = 0x0000000004000000 }, + .{ .key = 0x0101010101010101, .pt = 0x814EEB3B91D90726, .ct = 0x0000000002000000 }, + .{ .key = 0x0101010101010101, .pt = 0x4D49DB1532919C9F, .ct = 0x0000000001000000 }, + .{ .key = 0x0101010101010101, .pt = 0x25EB5FC3F8CF0621, .ct = 0x0000000000800000 }, + .{ .key = 0x0101010101010101, .pt = 0xAB6A20C0620D1C6F, .ct = 0x0000000000400000 }, + .{ .key = 0x0101010101010101, .pt = 0x79E90DBC98F92CCA, .ct = 0x0000000000200000 }, + .{ .key = 0x0101010101010101, .pt = 0x866ECEDD8072BB0E, .ct = 0x0000000000100000 }, + .{ .key = 0x0101010101010101, .pt = 0x8B54536F2F3E64A8, .ct = 0x0000000000080000 }, + .{ .key = 0x0101010101010101, .pt = 0xEA51D3975595B86B, .ct = 0x0000000000040000 }, + .{ .key = 0x0101010101010101, .pt = 0xCAFFC6AC4542DE31, .ct = 0x0000000000020000 }, + .{ .key = 0x0101010101010101, .pt = 0x8DD45A2DDF90796C, .ct = 0x0000000000010000 }, + .{ .key = 0x0101010101010101, .pt = 0x1029D55E880EC2D0, .ct = 0x0000000000008000 }, + .{ .key = 0x0101010101010101, .pt = 0x5D86CB23639DBEA9, .ct = 0x0000000000004000 }, + .{ .key = 0x0101010101010101, .pt = 0x1D1CA853AE7C0C5F, .ct = 0x0000000000002000 }, + .{ .key = 0x0101010101010101, .pt = 0xCE332329248F3228, .ct = 0x0000000000001000 }, + .{ .key = 0x0101010101010101, .pt = 0x8405D1ABE24FB942, .ct = 0x0000000000000800 }, + .{ .key = 0x0101010101010101, .pt = 0xE643D78090CA4207, .ct = 0x0000000000000400 }, + .{ .key = 0x0101010101010101, .pt = 0x48221B9937748A23, .ct = 0x0000000000000200 }, + .{ .key = 0x0101010101010101, .pt = 0xDD7C0BBD61FAFD54, .ct = 0x0000000000000100 }, + .{ .key = 0x0101010101010101, .pt = 0x2FBC291A570DB5C4, .ct = 0x0000000000000080 }, + .{ .key = 0x0101010101010101, .pt = 0xE07C30D7E4E26E12, .ct = 0x0000000000000040 }, + .{ .key = 0x0101010101010101, .pt = 0x0953E2258E8E90A1, .ct = 0x0000000000000020 }, + .{ .key = 0x0101010101010101, .pt = 0x5B711BC4CEEBF2EE, .ct = 0x0000000000000010 }, + .{ .key = 0x0101010101010101, .pt = 0xCC083F1E6D9E85F6, .ct = 0x0000000000000008 }, + .{ .key = 0x0101010101010101, .pt = 0xD2FD8867D50D2DFE, .ct = 0x0000000000000004 }, + .{ .key = 0x0101010101010101, .pt = 0x06E7EA22CE92708F, .ct = 0x0000000000000002 }, + .{ .key = 0x0101010101010101, .pt = 0x166B40B44ABA4BD6, .ct = 0x0000000000000001 }, + + // Inverse Permutation and Expansion test + .{ .key = 0x0101010101010101, .pt = 0x8000000000000000, .ct = 0x95F8A5E5DD31D900 }, + .{ .key = 0x0101010101010101, .pt = 0x4000000000000000, .ct = 0xDD7F121CA5015619 }, + .{ .key = 0x0101010101010101, .pt = 0x2000000000000000, .ct = 0x2E8653104F3834EA }, + .{ .key = 0x0101010101010101, .pt = 0x1000000000000000, .ct = 0x4BD388FF6CD81D4F }, + .{ .key = 0x0101010101010101, .pt = 0x0800000000000000, .ct = 0x20B9E767B2FB1456 }, + .{ .key = 0x0101010101010101, .pt = 0x0400000000000000, .ct = 0x55579380D77138EF }, + .{ .key = 0x0101010101010101, .pt = 0x0200000000000000, .ct = 0x6CC5DEFAAF04512F }, + .{ .key = 0x0101010101010101, .pt = 0x0100000000000000, .ct = 0x0D9F279BA5D87260 }, + .{ .key = 0x0101010101010101, .pt = 0x0080000000000000, .ct = 0xD9031B0271BD5A0A }, + .{ .key = 0x0101010101010101, .pt = 0x0040000000000000, .ct = 0x424250B37C3DD951 }, + .{ .key = 0x0101010101010101, .pt = 0x0020000000000000, .ct = 0xB8061B7ECD9A21E5 }, + .{ .key = 0x0101010101010101, .pt = 0x0010000000000000, .ct = 0xF15D0F286B65BD28 }, + .{ .key = 0x0101010101010101, .pt = 0x0008000000000000, .ct = 0xADD0CC8D6E5DEBA1 }, + .{ .key = 0x0101010101010101, .pt = 0x0004000000000000, .ct = 0xE6D5F82752AD63D1 }, + .{ .key = 0x0101010101010101, .pt = 0x0002000000000000, .ct = 0xECBFE3BD3F591A5E }, + .{ .key = 0x0101010101010101, .pt = 0x0001000000000000, .ct = 0xF356834379D165CD }, + .{ .key = 0x0101010101010101, .pt = 0x0000800000000000, .ct = 0x2B9F982F20037FA9 }, + .{ .key = 0x0101010101010101, .pt = 0x0000400000000000, .ct = 0x889DE068A16F0BE6 }, + .{ .key = 0x0101010101010101, .pt = 0x0000200000000000, .ct = 0xE19E275D846A1298 }, + .{ .key = 0x0101010101010101, .pt = 0x0000100000000000, .ct = 0x329A8ED523D71AEC }, + .{ .key = 0x0101010101010101, .pt = 0x0000080000000000, .ct = 0xE7FCE22557D23C97 }, + .{ .key = 0x0101010101010101, .pt = 0x0000040000000000, .ct = 0x12A9F5817FF2D65D }, + .{ .key = 0x0101010101010101, .pt = 0x0000020000000000, .ct = 0xA484C3AD38DC9C19 }, + .{ .key = 0x0101010101010101, .pt = 0x0000010000000000, .ct = 0xFBE00A8A1EF8AD72 }, + .{ .key = 0x0101010101010101, .pt = 0x0000008000000000, .ct = 0x750D079407521363 }, + .{ .key = 0x0101010101010101, .pt = 0x0000004000000000, .ct = 0x64FEED9C724C2FAF }, + .{ .key = 0x0101010101010101, .pt = 0x0000002000000000, .ct = 0xF02B263B328E2B60 }, + .{ .key = 0x0101010101010101, .pt = 0x0000001000000000, .ct = 0x9D64555A9A10B852 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000800000000, .ct = 0xD106FF0BED5255D7 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000400000000, .ct = 0xE1652C6B138C64A5 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000200000000, .ct = 0xE428581186EC8F46 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000100000000, .ct = 0xAEB5F5EDE22D1A36 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000080000000, .ct = 0xE943D7568AEC0C5C }, + .{ .key = 0x0101010101010101, .pt = 0x0000000040000000, .ct = 0xDF98C8276F54B04B }, + .{ .key = 0x0101010101010101, .pt = 0x0000000020000000, .ct = 0xB160E4680F6C696F }, + .{ .key = 0x0101010101010101, .pt = 0x0000000010000000, .ct = 0xFA0752B07D9C4AB8 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000008000000, .ct = 0xCA3A2B036DBC8502 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000004000000, .ct = 0x5E0905517BB59BCF }, + .{ .key = 0x0101010101010101, .pt = 0x0000000002000000, .ct = 0x814EEB3B91D90726 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000001000000, .ct = 0x4D49DB1532919C9F }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000800000, .ct = 0x25EB5FC3F8CF0621 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000400000, .ct = 0xAB6A20C0620D1C6F }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000200000, .ct = 0x79E90DBC98F92CCA }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000100000, .ct = 0x866ECEDD8072BB0E }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000080000, .ct = 0x8B54536F2F3E64A8 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000040000, .ct = 0xEA51D3975595B86B }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000020000, .ct = 0xCAFFC6AC4542DE31 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000010000, .ct = 0x8DD45A2DDF90796C }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000008000, .ct = 0x1029D55E880EC2D0 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000004000, .ct = 0x5D86CB23639DBEA9 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000002000, .ct = 0x1D1CA853AE7C0C5F }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000001000, .ct = 0xCE332329248F3228 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000800, .ct = 0x8405D1ABE24FB942 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000400, .ct = 0xE643D78090CA4207 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000200, .ct = 0x48221B9937748A23 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000100, .ct = 0xDD7C0BBD61FAFD54 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000080, .ct = 0x2FBC291A570DB5C4 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000040, .ct = 0xE07C30D7E4E26E12 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000020, .ct = 0x0953E2258E8E90A1 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000010, .ct = 0x5B711BC4CEEBF2EE }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000008, .ct = 0xCC083F1E6D9E85F6 }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000004, .ct = 0xD2FD8867D50D2DFE }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000002, .ct = 0x06E7EA22CE92708F }, + .{ .key = 0x0101010101010101, .pt = 0x0000000000000001, .ct = 0x166B40B44ABA4BD6 }, + + // Key Permutation tests + .{ .key = 0x8001010101010101, .pt = 0x0000000000000000, .ct = 0x95A8D72813DAA94D }, + .{ .key = 0x4001010101010101, .pt = 0x0000000000000000, .ct = 0x0EEC1487DD8C26D5 }, + .{ .key = 0x2001010101010101, .pt = 0x0000000000000000, .ct = 0x7AD16FFB79C45926 }, + .{ .key = 0x1001010101010101, .pt = 0x0000000000000000, .ct = 0xD3746294CA6A6CF3 }, + .{ .key = 0x0801010101010101, .pt = 0x0000000000000000, .ct = 0x809F5F873C1FD761 }, + .{ .key = 0x0401010101010101, .pt = 0x0000000000000000, .ct = 0xC02FAFFEC989D1FC }, + .{ .key = 0x0201010101010101, .pt = 0x0000000000000000, .ct = 0x4615AA1D33E72F10 }, + .{ .key = 0x0180010101010101, .pt = 0x0000000000000000, .ct = 0x2055123350C00858 }, + .{ .key = 0x0140010101010101, .pt = 0x0000000000000000, .ct = 0xDF3B99D6577397C8 }, + .{ .key = 0x0120010101010101, .pt = 0x0000000000000000, .ct = 0x31FE17369B5288C9 }, + .{ .key = 0x0110010101010101, .pt = 0x0000000000000000, .ct = 0xDFDD3CC64DAE1642 }, + .{ .key = 0x0108010101010101, .pt = 0x0000000000000000, .ct = 0x178C83CE2B399D94 }, + .{ .key = 0x0104010101010101, .pt = 0x0000000000000000, .ct = 0x50F636324A9B7F80 }, + .{ .key = 0x0102010101010101, .pt = 0x0000000000000000, .ct = 0xA8468EE3BC18F06D }, + .{ .key = 0x0101800101010101, .pt = 0x0000000000000000, .ct = 0xA2DC9E92FD3CDE92 }, + .{ .key = 0x0101400101010101, .pt = 0x0000000000000000, .ct = 0xCAC09F797D031287 }, + .{ .key = 0x0101200101010101, .pt = 0x0000000000000000, .ct = 0x90BA680B22AEB525 }, + .{ .key = 0x0101100101010101, .pt = 0x0000000000000000, .ct = 0xCE7A24F350E280B6 }, + .{ .key = 0x0101080101010101, .pt = 0x0000000000000000, .ct = 0x882BFF0AA01A0B87 }, + .{ .key = 0x0101040101010101, .pt = 0x0000000000000000, .ct = 0x25610288924511C2 }, + .{ .key = 0x0101020101010101, .pt = 0x0000000000000000, .ct = 0xC71516C29C75D170 }, + .{ .key = 0x0101018001010101, .pt = 0x0000000000000000, .ct = 0x5199C29A52C9F059 }, + .{ .key = 0x0101014001010101, .pt = 0x0000000000000000, .ct = 0xC22F0A294A71F29F }, + .{ .key = 0x0101012001010101, .pt = 0x0000000000000000, .ct = 0xEE371483714C02EA }, + .{ .key = 0x0101011001010101, .pt = 0x0000000000000000, .ct = 0xA81FBD448F9E522F }, + .{ .key = 0x0101010801010101, .pt = 0x0000000000000000, .ct = 0x4F644C92E192DFED }, + .{ .key = 0x0101010401010101, .pt = 0x0000000000000000, .ct = 0x1AFA9A66A6DF92AE }, + .{ .key = 0x0101010201010101, .pt = 0x0000000000000000, .ct = 0xB3C1CC715CB879D8 }, + .{ .key = 0x0101010180010101, .pt = 0x0000000000000000, .ct = 0x19D032E64AB0BD8B }, + .{ .key = 0x0101010140010101, .pt = 0x0000000000000000, .ct = 0x3CFAA7A7DC8720DC }, + .{ .key = 0x0101010120010101, .pt = 0x0000000000000000, .ct = 0xB7265F7F447AC6F3 }, + .{ .key = 0x0101010110010101, .pt = 0x0000000000000000, .ct = 0x9DB73B3C0D163F54 }, + .{ .key = 0x0101010108010101, .pt = 0x0000000000000000, .ct = 0x8181B65BABF4A975 }, + .{ .key = 0x0101010104010101, .pt = 0x0000000000000000, .ct = 0x93C9B64042EAA240 }, + .{ .key = 0x0101010102010101, .pt = 0x0000000000000000, .ct = 0x5570530829705592 }, + .{ .key = 0x0101010101800101, .pt = 0x0000000000000000, .ct = 0x8638809E878787A0 }, + .{ .key = 0x0101010101400101, .pt = 0x0000000000000000, .ct = 0x41B9A79AF79AC208 }, + .{ .key = 0x0101010101200101, .pt = 0x0000000000000000, .ct = 0x7A9BE42F2009A892 }, + .{ .key = 0x0101010101100101, .pt = 0x0000000000000000, .ct = 0x29038D56BA6D2745 }, + .{ .key = 0x0101010101080101, .pt = 0x0000000000000000, .ct = 0x5495C6ABF1E5DF51 }, + .{ .key = 0x0101010101040101, .pt = 0x0000000000000000, .ct = 0xAE13DBD561488933 }, + .{ .key = 0x0101010101020101, .pt = 0x0000000000000000, .ct = 0x024D1FFA8904E389 }, + .{ .key = 0x0101010101018001, .pt = 0x0000000000000000, .ct = 0xD1399712F99BF02E }, + .{ .key = 0x0101010101014001, .pt = 0x0000000000000000, .ct = 0x14C1D7C1CFFEC79E }, + .{ .key = 0x0101010101012001, .pt = 0x0000000000000000, .ct = 0x1DE5279DAE3BED6F }, + .{ .key = 0x0101010101011001, .pt = 0x0000000000000000, .ct = 0xE941A33F85501303 }, + .{ .key = 0x0101010101010801, .pt = 0x0000000000000000, .ct = 0xDA99DBBC9A03F379 }, + .{ .key = 0x0101010101010401, .pt = 0x0000000000000000, .ct = 0xB7FC92F91D8E92E9 }, + .{ .key = 0x0101010101010201, .pt = 0x0000000000000000, .ct = 0xAE8E5CAA3CA04E85 }, + .{ .key = 0x0101010101010180, .pt = 0x0000000000000000, .ct = 0x9CC62DF43B6EED74 }, + .{ .key = 0x0101010101010140, .pt = 0x0000000000000000, .ct = 0xD863DBB5C59A91A0 }, + .{ .key = 0x0101010101010120, .pt = 0x0000000000000000, .ct = 0xA1AB2190545B91D7 }, + .{ .key = 0x0101010101010110, .pt = 0x0000000000000000, .ct = 0x0875041E64C570F7 }, + .{ .key = 0x0101010101010108, .pt = 0x0000000000000000, .ct = 0x5A594528BEBEF1CC }, + .{ .key = 0x0101010101010104, .pt = 0x0000000000000000, .ct = 0xFCDB3291DE21F0C0 }, + .{ .key = 0x0101010101010102, .pt = 0x0000000000000000, .ct = 0x869EFD7F9F265A09 }, + + // Test of right-shifts in Decryption + .{ .key = 0x8001010101010101, .pt = 0x95A8D72813DAA94D, .ct = 0x0000000000000000 }, + .{ .key = 0x4001010101010101, .pt = 0x0EEC1487DD8C26D5, .ct = 0x0000000000000000 }, + .{ .key = 0x2001010101010101, .pt = 0x7AD16FFB79C45926, .ct = 0x0000000000000000 }, + .{ .key = 0x1001010101010101, .pt = 0xD3746294CA6A6CF3, .ct = 0x0000000000000000 }, + .{ .key = 0x0801010101010101, .pt = 0x809F5F873C1FD761, .ct = 0x0000000000000000 }, + .{ .key = 0x0401010101010101, .pt = 0xC02FAFFEC989D1FC, .ct = 0x0000000000000000 }, + .{ .key = 0x0201010101010101, .pt = 0x4615AA1D33E72F10, .ct = 0x0000000000000000 }, + .{ .key = 0x0180010101010101, .pt = 0x2055123350C00858, .ct = 0x0000000000000000 }, + .{ .key = 0x0140010101010101, .pt = 0xDF3B99D6577397C8, .ct = 0x0000000000000000 }, + .{ .key = 0x0120010101010101, .pt = 0x31FE17369B5288C9, .ct = 0x0000000000000000 }, + .{ .key = 0x0110010101010101, .pt = 0xDFDD3CC64DAE1642, .ct = 0x0000000000000000 }, + .{ .key = 0x0108010101010101, .pt = 0x178C83CE2B399D94, .ct = 0x0000000000000000 }, + .{ .key = 0x0104010101010101, .pt = 0x50F636324A9B7F80, .ct = 0x0000000000000000 }, + .{ .key = 0x0102010101010101, .pt = 0xA8468EE3BC18F06D, .ct = 0x0000000000000000 }, + .{ .key = 0x0101800101010101, .pt = 0xA2DC9E92FD3CDE92, .ct = 0x0000000000000000 }, + .{ .key = 0x0101400101010101, .pt = 0xCAC09F797D031287, .ct = 0x0000000000000000 }, + .{ .key = 0x0101200101010101, .pt = 0x90BA680B22AEB525, .ct = 0x0000000000000000 }, + .{ .key = 0x0101100101010101, .pt = 0xCE7A24F350E280B6, .ct = 0x0000000000000000 }, + .{ .key = 0x0101080101010101, .pt = 0x882BFF0AA01A0B87, .ct = 0x0000000000000000 }, + .{ .key = 0x0101040101010101, .pt = 0x25610288924511C2, .ct = 0x0000000000000000 }, + .{ .key = 0x0101020101010101, .pt = 0xC71516C29C75D170, .ct = 0x0000000000000000 }, + .{ .key = 0x0101018001010101, .pt = 0x5199C29A52C9F059, .ct = 0x0000000000000000 }, + .{ .key = 0x0101014001010101, .pt = 0xC22F0A294A71F29F, .ct = 0x0000000000000000 }, + .{ .key = 0x0101012001010101, .pt = 0xEE371483714C02EA, .ct = 0x0000000000000000 }, + .{ .key = 0x0101011001010101, .pt = 0xA81FBD448F9E522F, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010801010101, .pt = 0x4F644C92E192DFED, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010401010101, .pt = 0x1AFA9A66A6DF92AE, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010201010101, .pt = 0xB3C1CC715CB879D8, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010180010101, .pt = 0x19D032E64AB0BD8B, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010140010101, .pt = 0x3CFAA7A7DC8720DC, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010120010101, .pt = 0xB7265F7F447AC6F3, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010110010101, .pt = 0x9DB73B3C0D163F54, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010108010101, .pt = 0x8181B65BABF4A975, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010104010101, .pt = 0x93C9B64042EAA240, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010102010101, .pt = 0x5570530829705592, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101800101, .pt = 0x8638809E878787A0, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101400101, .pt = 0x41B9A79AF79AC208, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101200101, .pt = 0x7A9BE42F2009A892, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101100101, .pt = 0x29038D56BA6D2745, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101080101, .pt = 0x5495C6ABF1E5DF51, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101040101, .pt = 0xAE13DBD561488933, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101020101, .pt = 0x024D1FFA8904E389, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101018001, .pt = 0xD1399712F99BF02E, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101014001, .pt = 0x14C1D7C1CFFEC79E, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101012001, .pt = 0x1DE5279DAE3BED6F, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101011001, .pt = 0xE941A33F85501303, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010801, .pt = 0xDA99DBBC9A03F379, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010401, .pt = 0xB7FC92F91D8E92E9, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010201, .pt = 0xAE8E5CAA3CA04E85, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010180, .pt = 0x9CC62DF43B6EED74, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010140, .pt = 0xD863DBB5C59A91A0, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010120, .pt = 0xA1AB2190545B91D7, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010110, .pt = 0x0875041E64C570F7, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010108, .pt = 0x5A594528BEBEF1CC, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010104, .pt = 0xFCDB3291DE21F0C0, .ct = 0x0000000000000000 }, + .{ .key = 0x0101010101010102, .pt = 0x869EFD7F9F265A09, .ct = 0x0000000000000000 }, + + // Data permutation test + .{ .key = 0x1046913489980131, .pt = 0x0000000000000000, .ct = 0x88D55E54F54C97B4 }, + .{ .key = 0x1007103489988020, .pt = 0x0000000000000000, .ct = 0x0C0CC00C83EA48FD }, + .{ .key = 0x10071034C8980120, .pt = 0x0000000000000000, .ct = 0x83BC8EF3A6570183 }, + .{ .key = 0x1046103489988020, .pt = 0x0000000000000000, .ct = 0xDF725DCAD94EA2E9 }, + .{ .key = 0x1086911519190101, .pt = 0x0000000000000000, .ct = 0xE652B53B550BE8B0 }, + .{ .key = 0x1086911519580101, .pt = 0x0000000000000000, .ct = 0xAF527120C485CBB0 }, + .{ .key = 0x5107B01519580101, .pt = 0x0000000000000000, .ct = 0x0F04CE393DB926D5 }, + .{ .key = 0x1007B01519190101, .pt = 0x0000000000000000, .ct = 0xC9F00FFC74079067 }, + .{ .key = 0x3107915498080101, .pt = 0x0000000000000000, .ct = 0x7CFD82A593252B4E }, + .{ .key = 0x3107919498080101, .pt = 0x0000000000000000, .ct = 0xCB49A2F9E91363E3 }, + .{ .key = 0x10079115B9080140, .pt = 0x0000000000000000, .ct = 0x00B588BE70D23F56 }, + .{ .key = 0x3107911598080140, .pt = 0x0000000000000000, .ct = 0x406A9A6AB43399AE }, + .{ .key = 0x1007D01589980101, .pt = 0x0000000000000000, .ct = 0x6CB773611DCA9ADA }, + .{ .key = 0x9107911589980101, .pt = 0x0000000000000000, .ct = 0x67FD21C17DBB5D70 }, + .{ .key = 0x9107D01589190101, .pt = 0x0000000000000000, .ct = 0x9592CB4110430787 }, + .{ .key = 0x1007D01598980120, .pt = 0x0000000000000000, .ct = 0xA6B7FF68A318DDD3 }, + .{ .key = 0x1007940498190101, .pt = 0x0000000000000000, .ct = 0x4D102196C914CA16 }, + .{ .key = 0x0107910491190401, .pt = 0x0000000000000000, .ct = 0x2DFA9F4573594965 }, + .{ .key = 0x0107910491190101, .pt = 0x0000000000000000, .ct = 0xB46604816C0E0774 }, + .{ .key = 0x0107940491190401, .pt = 0x0000000000000000, .ct = 0x6E7E6221A4F34E87 }, + .{ .key = 0x19079210981A0101, .pt = 0x0000000000000000, .ct = 0xAA85E74643233199 }, + .{ .key = 0x1007911998190801, .pt = 0x0000000000000000, .ct = 0x2E5A19DB4D1962D6 }, + .{ .key = 0x10079119981A0801, .pt = 0x0000000000000000, .ct = 0x23A866A809D30894 }, + .{ .key = 0x1007921098190101, .pt = 0x0000000000000000, .ct = 0xD812D961F017D320 }, + .{ .key = 0x100791159819010B, .pt = 0x0000000000000000, .ct = 0x055605816E58608F }, + .{ .key = 0x1004801598190101, .pt = 0x0000000000000000, .ct = 0xABD88E8B1B7716F1 }, + .{ .key = 0x1004801598190102, .pt = 0x0000000000000000, .ct = 0x537AC95BE69DA1E1 }, + .{ .key = 0x1004801598190108, .pt = 0x0000000000000000, .ct = 0xAED0F6AE3C25CDD8 }, + .{ .key = 0x1002911498100104, .pt = 0x0000000000000000, .ct = 0xB3E35A5EE53E7B8D }, + .{ .key = 0x1002911598190104, .pt = 0x0000000000000000, .ct = 0x61C79C71921A2EF8 }, + .{ .key = 0x1002911598100201, .pt = 0x0000000000000000, .ct = 0xE2F5728F0995013C }, + .{ .key = 0x1002911698100101, .pt = 0x0000000000000000, .ct = 0x1AEAC39A61F0A464 }, + + // S-Box test + .{ .key = 0x7CA110454A1A6E57, .pt = 0x01A1D6D039776742, .ct = 0x690F5B0D9A26939B }, + .{ .key = 0x0131D9619DC1376E, .pt = 0x5CD54CA83DEF57DA, .ct = 0x7A389D10354BD271 }, + .{ .key = 0x07A1133E4A0B2686, .pt = 0x0248D43806F67172, .ct = 0x868EBB51CAB4599A }, + .{ .key = 0x3849674C2602319E, .pt = 0x51454B582DDF440A, .ct = 0x7178876E01F19B2A }, + .{ .key = 0x04B915BA43FEB5B6, .pt = 0x42FD443059577FA2, .ct = 0xAF37FB421F8C4095 }, + .{ .key = 0x0113B970FD34F2CE, .pt = 0x059B5E0851CF143A, .ct = 0x86A560F10EC6D85B }, + .{ .key = 0x0170F175468FB5E6, .pt = 0x0756D8E0774761D2, .ct = 0x0CD3DA020021DC09 }, + .{ .key = 0x43297FAD38E373FE, .pt = 0x762514B829BF486A, .ct = 0xEA676B2CB7DB2B7A }, + .{ .key = 0x07A7137045DA2A16, .pt = 0x3BDD119049372802, .ct = 0xDFD64A815CAF1A0F }, + .{ .key = 0x04689104C2FD3B2F, .pt = 0x26955F6835AF609A, .ct = 0x5C513C9C4886C088 }, + .{ .key = 0x37D06BB516CB7546, .pt = 0x164D5E404F275232, .ct = 0x0A2AEEAE3FF4AB77 }, + .{ .key = 0x1F08260D1AC2465E, .pt = 0x6B056E18759F5CCA, .ct = 0xEF1BF03E5DFA575A }, + .{ .key = 0x584023641ABA6176, .pt = 0x004BD6EF09176062, .ct = 0x88BF0DB6D70DEE56 }, + .{ .key = 0x025816164629B007, .pt = 0x480D39006EE762F2, .ct = 0xA1F9915541020B56 }, + .{ .key = 0x49793EBC79B3258F, .pt = 0x437540C8698F3CFA, .ct = 0x6FBF1CAFCFFD0556 }, + .{ .key = 0x4FB05E1515AB73A7, .pt = 0x072D43A077075292, .ct = 0x2F22E49BAB7CA1AC }, + .{ .key = 0x49E95D6D4CA229BF, .pt = 0x02FE55778117F12A, .ct = 0x5A6B612CC26CCE4A }, + .{ .key = 0x018310DC409B26D6, .pt = 0x1D9D5C5018F728C2, .ct = 0x5F4C038ED12B2E41 }, + .{ .key = 0x1C587F1C13924FEF, .pt = 0x305532286D6F295A, .ct = 0x63FAC0D034D9F793 }, + }; + + var key: [des.DES_ENCODED_KEY_SIZE]u8 = undefined; + var pt: [des.DES_BLOCK_SIZE]u8 = undefined; + var ct: [des.DES_BLOCK_SIZE]u8 = undefined; + var buffer: [des.DES_BLOCK_SIZE]u8 = undefined; + + for (tests) |t| { + std.mem.writeInt(u64, &key, t.key, .big); + std.mem.writeInt(u64, &pt, t.pt, .big); + std.mem.writeInt(u64, &ct, t.ct, .big); + + // Test encryption. + des.des_encrypt_block(&key, &pt, &buffer); + try testing.expectEqualSlices(u8, &ct, &buffer); + + // TODO: Test decryption. + } +}