// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Cryptographic API .
*
* DES & Triple DES EDE Cipher Algorithms .
*
* Copyright ( c ) 2005 Dag Arne Osvik < da @ osvik . no >
*/
#include <crypto/des.h>
#include <crypto/internal/des.h>
#include <linux/bitops.h>
#include <linux/compiler.h>
#include <linux/crypto.h>
#include <linux/errno.h>
#include <linux/export.h>
#include <linux/fips.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/unaligned.h>
#define ROL(x, r) ((x) = rol32((x), (r)))
#define ROR(x, r) ((x) = ror32((x), (r)))
/* Lookup tables for key expansion */
static const u8 pc1[256 ] = {
0 x00, 0 x00, 0 x40, 0 x04, 0 x10, 0 x10, 0 x50, 0 x14,
0 x04, 0 x40, 0 x44, 0 x44, 0 x14, 0 x50, 0 x54, 0 x54,
0 x02, 0 x02, 0 x42, 0 x06, 0 x12, 0 x12, 0 x52, 0 x16,
0 x06, 0 x42, 0 x46, 0 x46, 0 x16, 0 x52, 0 x56, 0 x56,
0 x80, 0 x08, 0 xc0, 0 x0c, 0 x90, 0 x18, 0 xd0, 0 x1c,
0 x84, 0 x48, 0 xc4, 0 x4c, 0 x94, 0 x58, 0 xd4, 0 x5c,
0 x82, 0 x0a, 0 xc2, 0 x0e, 0 x92, 0 x1a, 0 xd2, 0 x1e,
0 x86, 0 x4a, 0 xc6, 0 x4e, 0 x96, 0 x5a, 0 xd6, 0 x5e,
0 x20, 0 x20, 0 x60, 0 x24, 0 x30, 0 x30, 0 x70, 0 x34,
0 x24, 0 x60, 0 x64, 0 x64, 0 x34, 0 x70, 0 x74, 0 x74,
0 x22, 0 x22, 0 x62, 0 x26, 0 x32, 0 x32, 0 x72, 0 x36,
0 x26, 0 x62, 0 x66, 0 x66, 0 x36, 0 x72, 0 x76, 0 x76,
0 xa0, 0 x28, 0 xe0, 0 x2c, 0 xb0, 0 x38, 0 xf0, 0 x3c,
0 xa4, 0 x68, 0 xe4, 0 x6c, 0 xb4, 0 x78, 0 xf4, 0 x7c,
0 xa2, 0 x2a, 0 xe2, 0 x2e, 0 xb2, 0 x3a, 0 xf2, 0 x3e,
0 xa6, 0 x6a, 0 xe6, 0 x6e, 0 xb6, 0 x7a, 0 xf6, 0 x7e,
0 x08, 0 x80, 0 x48, 0 x84, 0 x18, 0 x90, 0 x58, 0 x94,
0 x0c, 0 xc0, 0 x4c, 0 xc4, 0 x1c, 0 xd0, 0 x5c, 0 xd4,
0 x0a, 0 x82, 0 x4a, 0 x86, 0 x1a, 0 x92, 0 x5a, 0 x96,
0 x0e, 0 xc2, 0 x4e, 0 xc6, 0 x1e, 0 xd2, 0 x5e, 0 xd6,
0 x88, 0 x88, 0 xc8, 0 x8c, 0 x98, 0 x98, 0 xd8, 0 x9c,
0 x8c, 0 xc8, 0 xcc, 0 xcc, 0 x9c, 0 xd8, 0 xdc, 0 xdc,
0 x8a, 0 x8a, 0 xca, 0 x8e, 0 x9a, 0 x9a, 0 xda, 0 x9e,
0 x8e, 0 xca, 0 xce, 0 xce, 0 x9e, 0 xda, 0 xde, 0 xde,
0 x28, 0 xa0, 0 x68, 0 xa4, 0 x38, 0 xb0, 0 x78, 0 xb4,
0 x2c, 0 xe0, 0 x6c, 0 xe4, 0 x3c, 0 xf0, 0 x7c, 0 xf4,
0 x2a, 0 xa2, 0 x6a, 0 xa6, 0 x3a, 0 xb2, 0 x7a, 0 xb6,
0 x2e, 0 xe2, 0 x6e, 0 xe6, 0 x3e, 0 xf2, 0 x7e, 0 xf6,
0 xa8, 0 xa8, 0 xe8, 0 xac, 0 xb8, 0 xb8, 0 xf8, 0 xbc,
0 xac, 0 xe8, 0 xec, 0 xec, 0 xbc, 0 xf8, 0 xfc, 0 xfc,
0 xaa, 0 xaa, 0 xea, 0 xae, 0 xba, 0 xba, 0 xfa, 0 xbe,
0 xae, 0 xea, 0 xee, 0 xee, 0 xbe, 0 xfa, 0 xfe, 0 xfe
};
static const u8 rs[256 ] = {
0 x00, 0 x00, 0 x80, 0 x80, 0 x02, 0 x02, 0 x82, 0 x82,
0 x04, 0 x04, 0 x84, 0 x84, 0 x06, 0 x06, 0 x86, 0 x86,
0 x08, 0 x08, 0 x88, 0 x88, 0 x0a, 0 x0a, 0 x8a, 0 x8a,
0 x0c, 0 x0c, 0 x8c, 0 x8c, 0 x0e, 0 x0e, 0 x8e, 0 x8e,
0 x10, 0 x10, 0 x90, 0 x90, 0 x12, 0 x12, 0 x92, 0 x92,
0 x14, 0 x14, 0 x94, 0 x94, 0 x16, 0 x16, 0 x96, 0 x96,
0 x18, 0 x18, 0 x98, 0 x98, 0 x1a, 0 x1a, 0 x9a, 0 x9a,
0 x1c, 0 x1c, 0 x9c, 0 x9c, 0 x1e, 0 x1e, 0 x9e, 0 x9e,
0 x20, 0 x20, 0 xa0, 0 xa0, 0 x22, 0 x22, 0 xa2, 0 xa2,
0 x24, 0 x24, 0 xa4, 0 xa4, 0 x26, 0 x26, 0 xa6, 0 xa6,
0 x28, 0 x28, 0 xa8, 0 xa8, 0 x2a, 0 x2a, 0 xaa, 0 xaa,
0 x2c, 0 x2c, 0 xac, 0 xac, 0 x2e, 0 x2e, 0 xae, 0 xae,
0 x30, 0 x30, 0 xb0, 0 xb0, 0 x32, 0 x32, 0 xb2, 0 xb2,
0 x34, 0 x34, 0 xb4, 0 xb4, 0 x36, 0 x36, 0 xb6, 0 xb6,
0 x38, 0 x38, 0 xb8, 0 xb8, 0 x3a, 0 x3a, 0 xba, 0 xba,
0 x3c, 0 x3c, 0 xbc, 0 xbc, 0 x3e, 0 x3e, 0 xbe, 0 xbe,
0 x40, 0 x40, 0 xc0, 0 xc0, 0 x42, 0 x42, 0 xc2, 0 xc2,
0 x44, 0 x44, 0 xc4, 0 xc4, 0 x46, 0 x46, 0 xc6, 0 xc6,
0 x48, 0 x48, 0 xc8, 0 xc8, 0 x4a, 0 x4a, 0 xca, 0 xca,
0 x4c, 0 x4c, 0 xcc, 0 xcc, 0 x4e, 0 x4e, 0 xce, 0 xce,
0 x50, 0 x50, 0 xd0, 0 xd0, 0 x52, 0 x52, 0 xd2, 0 xd2,
0 x54, 0 x54, 0 xd4, 0 xd4, 0 x56, 0 x56, 0 xd6, 0 xd6,
0 x58, 0 x58, 0 xd8, 0 xd8, 0 x5a, 0 x5a, 0 xda, 0 xda,
0 x5c, 0 x5c, 0 xdc, 0 xdc, 0 x5e, 0 x5e, 0 xde, 0 xde,
0 x60, 0 x60, 0 xe0, 0 xe0, 0 x62, 0 x62, 0 xe2, 0 xe2,
0 x64, 0 x64, 0 xe4, 0 xe4, 0 x66, 0 x66, 0 xe6, 0 xe6,
0 x68, 0 x68, 0 xe8, 0 xe8, 0 x6a, 0 x6a, 0 xea, 0 xea,
0 x6c, 0 x6c, 0 xec, 0 xec, 0 x6e, 0 x6e, 0 xee, 0 xee,
0 x70, 0 x70, 0 xf0, 0 xf0, 0 x72, 0 x72, 0 xf2, 0 xf2,
0 x74, 0 x74, 0 xf4, 0 xf4, 0 x76, 0 x76, 0 xf6, 0 xf6,
0 x78, 0 x78, 0 xf8, 0 xf8, 0 x7a, 0 x7a, 0 xfa, 0 xfa,
0 x7c, 0 x7c, 0 xfc, 0 xfc, 0 x7e, 0 x7e, 0 xfe, 0 xfe
};
static const u32 pc2[1024 ] = {
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00040000, 0 x00000000, 0 x04000000, 0 x00100000,
0 x00400000, 0 x00000008, 0 x00000800, 0 x40000000,
0 x00440000, 0 x00000008, 0 x04000800, 0 x40100000,
0 x00000400, 0 x00000020, 0 x08000000, 0 x00000100,
0 x00040400, 0 x00000020, 0 x0c000000, 0 x00100100,
0 x00400400, 0 x00000028, 0 x08000800, 0 x40000100,
0 x00440400, 0 x00000028, 0 x0c000800, 0 x40100100,
0 x80000000, 0 x00000010, 0 x00000000, 0 x00800000,
0 x80040000, 0 x00000010, 0 x04000000, 0 x00900000,
0 x80400000, 0 x00000018, 0 x00000800, 0 x40800000,
0 x80440000, 0 x00000018, 0 x04000800, 0 x40900000,
0 x80000400, 0 x00000030, 0 x08000000, 0 x00800100,
0 x80040400, 0 x00000030, 0 x0c000000, 0 x00900100,
0 x80400400, 0 x00000038, 0 x08000800, 0 x40800100,
0 x80440400, 0 x00000038, 0 x0c000800, 0 x40900100,
0 x10000000, 0 x00000000, 0 x00200000, 0 x00001000,
0 x10040000, 0 x00000000, 0 x04200000, 0 x00101000,
0 x10400000, 0 x00000008, 0 x00200800, 0 x40001000,
0 x10440000, 0 x00000008, 0 x04200800, 0 x40101000,
0 x10000400, 0 x00000020, 0 x08200000, 0 x00001100,
0 x10040400, 0 x00000020, 0 x0c200000, 0 x00101100,
0 x10400400, 0 x00000028, 0 x08200800, 0 x40001100,
0 x10440400, 0 x00000028, 0 x0c200800, 0 x40101100,
0 x90000000, 0 x00000010, 0 x00200000, 0 x00801000,
0 x90040000, 0 x00000010, 0 x04200000, 0 x00901000,
0 x90400000, 0 x00000018, 0 x00200800, 0 x40801000,
0 x90440000, 0 x00000018, 0 x04200800, 0 x40901000,
0 x90000400, 0 x00000030, 0 x08200000, 0 x00801100,
0 x90040400, 0 x00000030, 0 x0c200000, 0 x00901100,
0 x90400400, 0 x00000038, 0 x08200800, 0 x40801100,
0 x90440400, 0 x00000038, 0 x0c200800, 0 x40901100,
0 x00000200, 0 x00080000, 0 x00000000, 0 x00000004,
0 x00040200, 0 x00080000, 0 x04000000, 0 x00100004,
0 x00400200, 0 x00080008, 0 x00000800, 0 x40000004,
0 x00440200, 0 x00080008, 0 x04000800, 0 x40100004,
0 x00000600, 0 x00080020, 0 x08000000, 0 x00000104,
0 x00040600, 0 x00080020, 0 x0c000000, 0 x00100104,
0 x00400600, 0 x00080028, 0 x08000800, 0 x40000104,
0 x00440600, 0 x00080028, 0 x0c000800, 0 x40100104,
0 x80000200, 0 x00080010, 0 x00000000, 0 x00800004,
0 x80040200, 0 x00080010, 0 x04000000, 0 x00900004,
0 x80400200, 0 x00080018, 0 x00000800, 0 x40800004,
0 x80440200, 0 x00080018, 0 x04000800, 0 x40900004,
0 x80000600, 0 x00080030, 0 x08000000, 0 x00800104,
0 x80040600, 0 x00080030, 0 x0c000000, 0 x00900104,
0 x80400600, 0 x00080038, 0 x08000800, 0 x40800104,
0 x80440600, 0 x00080038, 0 x0c000800, 0 x40900104,
0 x10000200, 0 x00080000, 0 x00200000, 0 x00001004,
0 x10040200, 0 x00080000, 0 x04200000, 0 x00101004,
0 x10400200, 0 x00080008, 0 x00200800, 0 x40001004,
0 x10440200, 0 x00080008, 0 x04200800, 0 x40101004,
0 x10000600, 0 x00080020, 0 x08200000, 0 x00001104,
0 x10040600, 0 x00080020, 0 x0c200000, 0 x00101104,
0 x10400600, 0 x00080028, 0 x08200800, 0 x40001104,
0 x10440600, 0 x00080028, 0 x0c200800, 0 x40101104,
0 x90000200, 0 x00080010, 0 x00200000, 0 x00801004,
0 x90040200, 0 x00080010, 0 x04200000, 0 x00901004,
0 x90400200, 0 x00080018, 0 x00200800, 0 x40801004,
0 x90440200, 0 x00080018, 0 x04200800, 0 x40901004,
0 x90000600, 0 x00080030, 0 x08200000, 0 x00801104,
0 x90040600, 0 x00080030, 0 x0c200000, 0 x00901104,
0 x90400600, 0 x00080038, 0 x08200800, 0 x40801104,
0 x90440600, 0 x00080038, 0 x0c200800, 0 x40901104,
0 x00000002, 0 x00002000, 0 x20000000, 0 x00000001,
0 x00040002, 0 x00002000, 0 x24000000, 0 x00100001,
0 x00400002, 0 x00002008, 0 x20000800, 0 x40000001,
0 x00440002, 0 x00002008, 0 x24000800, 0 x40100001,
0 x00000402, 0 x00002020, 0 x28000000, 0 x00000101,
0 x00040402, 0 x00002020, 0 x2c000000, 0 x00100101,
0 x00400402, 0 x00002028, 0 x28000800, 0 x40000101,
0 x00440402, 0 x00002028, 0 x2c000800, 0 x40100101,
0 x80000002, 0 x00002010, 0 x20000000, 0 x00800001,
0 x80040002, 0 x00002010, 0 x24000000, 0 x00900001,
0 x80400002, 0 x00002018, 0 x20000800, 0 x40800001,
0 x80440002, 0 x00002018, 0 x24000800, 0 x40900001,
0 x80000402, 0 x00002030, 0 x28000000, 0 x00800101,
0 x80040402, 0 x00002030, 0 x2c000000, 0 x00900101,
0 x80400402, 0 x00002038, 0 x28000800, 0 x40800101,
0 x80440402, 0 x00002038, 0 x2c000800, 0 x40900101,
0 x10000002, 0 x00002000, 0 x20200000, 0 x00001001,
0 x10040002, 0 x00002000, 0 x24200000, 0 x00101001,
0 x10400002, 0 x00002008, 0 x20200800, 0 x40001001,
0 x10440002, 0 x00002008, 0 x24200800, 0 x40101001,
0 x10000402, 0 x00002020, 0 x28200000, 0 x00001101,
0 x10040402, 0 x00002020, 0 x2c200000, 0 x00101101,
0 x10400402, 0 x00002028, 0 x28200800, 0 x40001101,
0 x10440402, 0 x00002028, 0 x2c200800, 0 x40101101,
0 x90000002, 0 x00002010, 0 x20200000, 0 x00801001,
0 x90040002, 0 x00002010, 0 x24200000, 0 x00901001,
0 x90400002, 0 x00002018, 0 x20200800, 0 x40801001,
0 x90440002, 0 x00002018, 0 x24200800, 0 x40901001,
0 x90000402, 0 x00002030, 0 x28200000, 0 x00801101,
0 x90040402, 0 x00002030, 0 x2c200000, 0 x00901101,
0 x90400402, 0 x00002038, 0 x28200800, 0 x40801101,
0 x90440402, 0 x00002038, 0 x2c200800, 0 x40901101,
0 x00000202, 0 x00082000, 0 x20000000, 0 x00000005,
0 x00040202, 0 x00082000, 0 x24000000, 0 x00100005,
0 x00400202, 0 x00082008, 0 x20000800, 0 x40000005,
0 x00440202, 0 x00082008, 0 x24000800, 0 x40100005,
0 x00000602, 0 x00082020, 0 x28000000, 0 x00000105,
0 x00040602, 0 x00082020, 0 x2c000000, 0 x00100105,
0 x00400602, 0 x00082028, 0 x28000800, 0 x40000105,
0 x00440602, 0 x00082028, 0 x2c000800, 0 x40100105,
0 x80000202, 0 x00082010, 0 x20000000, 0 x00800005,
0 x80040202, 0 x00082010, 0 x24000000, 0 x00900005,
0 x80400202, 0 x00082018, 0 x20000800, 0 x40800005,
0 x80440202, 0 x00082018, 0 x24000800, 0 x40900005,
0 x80000602, 0 x00082030, 0 x28000000, 0 x00800105,
0 x80040602, 0 x00082030, 0 x2c000000, 0 x00900105,
0 x80400602, 0 x00082038, 0 x28000800, 0 x40800105,
0 x80440602, 0 x00082038, 0 x2c000800, 0 x40900105,
0 x10000202, 0 x00082000, 0 x20200000, 0 x00001005,
0 x10040202, 0 x00082000, 0 x24200000, 0 x00101005,
0 x10400202, 0 x00082008, 0 x20200800, 0 x40001005,
0 x10440202, 0 x00082008, 0 x24200800, 0 x40101005,
0 x10000602, 0 x00082020, 0 x28200000, 0 x00001105,
0 x10040602, 0 x00082020, 0 x2c200000, 0 x00101105,
0 x10400602, 0 x00082028, 0 x28200800, 0 x40001105,
0 x10440602, 0 x00082028, 0 x2c200800, 0 x40101105,
0 x90000202, 0 x00082010, 0 x20200000, 0 x00801005,
0 x90040202, 0 x00082010, 0 x24200000, 0 x00901005,
0 x90400202, 0 x00082018, 0 x20200800, 0 x40801005,
0 x90440202, 0 x00082018, 0 x24200800, 0 x40901005,
0 x90000602, 0 x00082030, 0 x28200000, 0 x00801105,
0 x90040602, 0 x00082030, 0 x2c200000, 0 x00901105,
0 x90400602, 0 x00082038, 0 x28200800, 0 x40801105,
0 x90440602, 0 x00082038, 0 x2c200800, 0 x40901105,
0 x00000000, 0 x00000000, 0 x00000000, 0 x00000000,
0 x00000000, 0 x00000008, 0 x00080000, 0 x10000000,
0 x02000000, 0 x00000000, 0 x00000080, 0 x00001000,
0 x02000000, 0 x00000008, 0 x00080080, 0 x10001000,
0 x00004000, 0 x00000000, 0 x00000040, 0 x00040000,
0 x00004000, 0 x00000008, 0 x00080040, 0 x10040000,
0 x02004000, 0 x00000000, 0 x000000c0, 0 x00041000,
0 x02004000, 0 x00000008, 0 x000800c0, 0 x10041000,
0 x00020000, 0 x00008000, 0 x08000000, 0 x00200000,
0 x00020000, 0 x00008008, 0 x08080000, 0 x10200000,
0 x02020000, 0 x00008000, 0 x08000080, 0 x00201000,
0 x02020000, 0 x00008008, 0 x08080080, 0 x10201000,
0 x00024000, 0 x00008000, 0 x08000040, 0 x00240000,
0 x00024000, 0 x00008008, 0 x08080040, 0 x10240000,
0 x02024000, 0 x00008000, 0 x080000c0, 0 x00241000,
0 x02024000, 0 x00008008, 0 x080800c0, 0 x10241000,
0 x00000000, 0 x01000000, 0 x00002000, 0 x00000020,
0 x00000000, 0 x01000008, 0 x00082000, 0 x10000020,
0 x02000000, 0 x01000000, 0 x00002080, 0 x00001020,
0 x02000000, 0 x01000008, 0 x00082080, 0 x10001020,
0 x00004000, 0 x01000000, 0 x00002040, 0 x00040020,
0 x00004000, 0 x01000008, 0 x00082040, 0 x10040020,
0 x02004000, 0 x01000000, 0 x000020c0, 0 x00041020,
0 x02004000, 0 x01000008, 0 x000820c0, 0 x10041020,
0 x00020000, 0 x01008000, 0 x08002000, 0 x00200020,
0 x00020000, 0 x01008008, 0 x08082000, 0 x10200020,
0 x02020000, 0 x01008000, 0 x08002080, 0 x00201020,
0 x02020000, 0 x01008008, 0 x08082080, 0 x10201020,
0 x00024000, 0 x01008000, 0 x08002040, 0 x00240020,
0 x00024000, 0 x01008008, 0 x08082040, 0 x10240020,
0 x02024000, 0 x01008000, 0 x080020c0, 0 x00241020,
0 x02024000, 0 x01008008, 0 x080820c0, 0 x10241020,
0 x00000400, 0 x04000000, 0 x00100000, 0 x00000004,
0 x00000400, 0 x04000008, 0 x00180000, 0 x10000004,
0 x02000400, 0 x04000000, 0 x00100080, 0 x00001004,
0 x02000400, 0 x04000008, 0 x00180080, 0 x10001004,
0 x00004400, 0 x04000000, 0 x00100040, 0 x00040004,
0 x00004400, 0 x04000008, 0 x00180040, 0 x10040004,
0 x02004400, 0 x04000000, 0 x001000c0, 0 x00041004,
0 x02004400, 0 x04000008, 0 x001800c0, 0 x10041004,
0 x00020400, 0 x04008000, 0 x08100000, 0 x00200004,
0 x00020400, 0 x04008008, 0 x08180000, 0 x10200004,
0 x02020400, 0 x04008000, 0 x08100080, 0 x00201004,
0 x02020400, 0 x04008008, 0 x08180080, 0 x10201004,
0 x00024400, 0 x04008000, 0 x08100040, 0 x00240004,
0 x00024400, 0 x04008008, 0 x08180040, 0 x10240004,
0 x02024400, 0 x04008000, 0 x081000c0, 0 x00241004,
0 x02024400, 0 x04008008, 0 x081800c0, 0 x10241004,
0 x00000400, 0 x05000000, 0 x00102000, 0 x00000024,
0 x00000400, 0 x05000008, 0 x00182000, 0 x10000024,
0 x02000400, 0 x05000000, 0 x00102080, 0 x00001024,
0 x02000400, 0 x05000008, 0 x00182080, 0 x10001024,
0 x00004400, 0 x05000000, 0 x00102040, 0 x00040024,
0 x00004400, 0 x05000008, 0 x00182040, 0 x10040024,
0 x02004400, 0 x05000000, 0 x001020c0, 0 x00041024,
0 x02004400, 0 x05000008, 0 x001820c0, 0 x10041024,
0 x00020400, 0 x05008000, 0 x08102000, 0 x00200024,
0 x00020400, 0 x05008008, 0 x08182000, 0 x10200024,
0 x02020400, 0 x05008000, 0 x08102080, 0 x00201024,
0 x02020400, 0 x05008008, 0 x08182080, 0 x10201024,
0 x00024400, 0 x05008000, 0 x08102040, 0 x00240024,
0 x00024400, 0 x05008008, 0 x08182040, 0 x10240024,
0 x02024400, 0 x05008000, 0 x081020c0, 0 x00241024,
0 x02024400, 0 x05008008, 0 x081820c0, 0 x10241024,
0 x00000800, 0 x00010000, 0 x20000000, 0 x00000010,
0 x00000800, 0 x00010008, 0 x20080000, 0 x10000010,
0 x02000800, 0 x00010000, 0 x20000080, 0 x00001010,
0 x02000800, 0 x00010008, 0 x20080080, 0 x10001010,
0 x00004800, 0 x00010000, 0 x20000040, 0 x00040010,
0 x00004800, 0 x00010008, 0 x20080040, 0 x10040010,
0 x02004800, 0 x00010000, 0 x200000c0, 0 x00041010,
0 x02004800, 0 x00010008, 0 x200800c0, 0 x10041010,
0 x00020800, 0 x00018000, 0 x28000000, 0 x00200010,
0 x00020800, 0 x00018008, 0 x28080000, 0 x10200010,
0 x02020800, 0 x00018000, 0 x28000080, 0 x00201010,
0 x02020800, 0 x00018008, 0 x28080080, 0 x10201010,
0 x00024800, 0 x00018000, 0 x28000040, 0 x00240010,
0 x00024800, 0 x00018008, 0 x28080040, 0 x10240010,
0 x02024800, 0 x00018000, 0 x280000c0, 0 x00241010,
0 x02024800, 0 x00018008, 0 x280800c0, 0 x10241010,
0 x00000800, 0 x01010000, 0 x20002000, 0 x00000030,
0 x00000800, 0 x01010008, 0 x20082000, 0 x10000030,
0 x02000800, 0 x01010000, 0 x20002080, 0 x00001030,
0 x02000800, 0 x01010008, 0 x20082080, 0 x10001030,
0 x00004800, 0 x01010000, 0 x20002040, 0 x00040030,
0 x00004800, 0 x01010008, 0 x20082040, 0 x10040030,
0 x02004800, 0 x01010000, 0 x200020c0, 0 x00041030,
0 x02004800, 0 x01010008, 0 x200820c0, 0 x10041030,
0 x00020800, 0 x01018000, 0 x28002000, 0 x00200030,
0 x00020800, 0 x01018008, 0 x28082000, 0 x10200030,
0 x02020800, 0 x01018000, 0 x28002080, 0 x00201030,
0 x02020800, 0 x01018008, 0 x28082080, 0 x10201030,
0 x00024800, 0 x01018000, 0 x28002040, 0 x00240030,
0 x00024800, 0 x01018008, 0 x28082040, 0 x10240030,
0 x02024800, 0 x01018000, 0 x280020c0, 0 x00241030,
0 x02024800, 0 x01018008, 0 x280820c0, 0 x10241030,
0 x00000c00, 0 x04010000, 0 x20100000, 0 x00000014,
0 x00000c00, 0 x04010008, 0 x20180000, 0 x10000014,
0 x02000c00, 0 x04010000, 0 x20100080, 0 x00001014,
0 x02000c00, 0 x04010008, 0 x20180080, 0 x10001014,
0 x00004c00, 0 x04010000, 0 x20100040, 0 x00040014,
0 x00004c00, 0 x04010008, 0 x20180040, 0 x10040014,
0 x02004c00, 0 x04010000, 0 x201000c0, 0 x00041014,
0 x02004c00, 0 x04010008, 0 x201800c0, 0 x10041014,
0 x00020c00, 0 x04018000, 0 x28100000, 0 x00200014,
0 x00020c00, 0 x04018008, 0 x28180000, 0 x10200014,
0 x02020c00, 0 x04018000, 0 x28100080, 0 x00201014,
0 x02020c00, 0 x04018008, 0 x28180080, 0 x10201014,
0 x00024c00, 0 x04018000, 0 x28100040, 0 x00240014,
0 x00024c00, 0 x04018008, 0 x28180040, 0 x10240014,
0 x02024c00, 0 x04018000, 0 x281000c0, 0 x00241014,
0 x02024c00, 0 x04018008, 0 x281800c0, 0 x10241014,
0 x00000c00, 0 x05010000, 0 x20102000, 0 x00000034,
0 x00000c00, 0 x05010008, 0 x20182000, 0 x10000034,
0 x02000c00, 0 x05010000, 0 x20102080, 0 x00001034,
0 x02000c00, 0 x05010008, 0 x20182080, 0 x10001034,
0 x00004c00, 0 x05010000, 0 x20102040, 0 x00040034,
0 x00004c00, 0 x05010008, 0 x20182040, 0 x10040034,
0 x02004c00, 0 x05010000, 0 x201020c0, 0 x00041034,
0 x02004c00, 0 x05010008, 0 x201820c0, 0 x10041034,
0 x00020c00, 0 x05018000, 0 x28102000, 0 x00200034,
0 x00020c00, 0 x05018008, 0 x28182000, 0 x10200034,
0 x02020c00, 0 x05018000, 0 x28102080, 0 x00201034,
0 x02020c00, 0 x05018008, 0 x28182080, 0 x10201034,
0 x00024c00, 0 x05018000, 0 x28102040, 0 x00240034,
0 x00024c00, 0 x05018008, 0 x28182040, 0 x10240034,
0 x02024c00, 0 x05018000, 0 x281020c0, 0 x00241034,
0 x02024c00, 0 x05018008, 0 x281820c0, 0 x10241034
};
/* S-box lookup tables */
static const u32 S1[64 ] = {
0 x01010400, 0 x00000000, 0 x00010000, 0 x01010404,
0 x01010004, 0 x00010404, 0 x00000004, 0 x00010000,
0 x00000400, 0 x01010400, 0 x01010404, 0 x00000400,
0 x01000404, 0 x01010004, 0 x01000000, 0 x00000004,
0 x00000404, 0 x01000400, 0 x01000400, 0 x00010400,
0 x00010400, 0 x01010000, 0 x01010000, 0 x01000404,
0 x00010004, 0 x01000004, 0 x01000004, 0 x00010004,
0 x00000000, 0 x00000404, 0 x00010404, 0 x01000000,
0 x00010000, 0 x01010404, 0 x00000004, 0 x01010000,
0 x01010400, 0 x01000000, 0 x01000000, 0 x00000400,
0 x01010004, 0 x00010000, 0 x00010400, 0 x01000004,
0 x00000400, 0 x00000004, 0 x01000404, 0 x00010404,
0 x01010404, 0 x00010004, 0 x01010000, 0 x01000404,
0 x01000004, 0 x00000404, 0 x00010404, 0 x01010400,
0 x00000404, 0 x01000400, 0 x01000400, 0 x00000000,
0 x00010004, 0 x00010400, 0 x00000000, 0 x01010004
};
static const u32 S2[64 ] = {
0 x80108020, 0 x80008000, 0 x00008000, 0 x00108020,
0 x00100000, 0 x00000020, 0 x80100020, 0 x80008020,
0 x80000020, 0 x80108020, 0 x80108000, 0 x80000000,
0 x80008000, 0 x00100000, 0 x00000020, 0 x80100020,
0 x00108000, 0 x00100020, 0 x80008020, 0 x00000000,
0 x80000000, 0 x00008000, 0 x00108020, 0 x80100000,
0 x00100020, 0 x80000020, 0 x00000000, 0 x00108000,
0 x00008020, 0 x80108000, 0 x80100000, 0 x00008020,
0 x00000000, 0 x00108020, 0 x80100020, 0 x00100000,
0 x80008020, 0 x80100000, 0 x80108000, 0 x00008000,
0 x80100000, 0 x80008000, 0 x00000020, 0 x80108020,
0 x00108020, 0 x00000020, 0 x00008000, 0 x80000000,
0 x00008020, 0 x80108000, 0 x00100000, 0 x80000020,
0 x00100020, 0 x80008020, 0 x80000020, 0 x00100020,
0 x00108000, 0 x00000000, 0 x80008000, 0 x00008020,
0 x80000000, 0 x80100020, 0 x80108020, 0 x00108000
};
static const u32 S3[64 ] = {
0 x00000208, 0 x08020200, 0 x00000000, 0 x08020008,
0 x08000200, 0 x00000000, 0 x00020208, 0 x08000200,
0 x00020008, 0 x08000008, 0 x08000008, 0 x00020000,
0 x08020208, 0 x00020008, 0 x08020000, 0 x00000208,
0 x08000000, 0 x00000008, 0 x08020200, 0 x00000200,
0 x00020200, 0 x08020000, 0 x08020008, 0 x00020208,
0 x08000208, 0 x00020200, 0 x00020000, 0 x08000208,
0 x00000008, 0 x08020208, 0 x00000200, 0 x08000000,
0 x08020200, 0 x08000000, 0 x00020008, 0 x00000208,
0 x00020000, 0 x08020200, 0 x08000200, 0 x00000000,
0 x00000200, 0 x00020008, 0 x08020208, 0 x08000200,
0 x08000008, 0 x00000200, 0 x00000000, 0 x08020008,
0 x08000208, 0 x00020000, 0 x08000000, 0 x08020208,
0 x00000008, 0 x00020208, 0 x00020200, 0 x08000008,
0 x08020000, 0 x08000208, 0 x00000208, 0 x08020000,
0 x00020208, 0 x00000008, 0 x08020008, 0 x00020200
};
static const u32 S4[64 ] = {
0 x00802001, 0 x00002081, 0 x00002081, 0 x00000080,
0 x00802080, 0 x00800081, 0 x00800001, 0 x00002001,
0 x00000000, 0 x00802000, 0 x00802000, 0 x00802081,
0 x00000081, 0 x00000000, 0 x00800080, 0 x00800001,
0 x00000001, 0 x00002000, 0 x00800000, 0 x00802001,
0 x00000080, 0 x00800000, 0 x00002001, 0 x00002080,
0 x00800081, 0 x00000001, 0 x00002080, 0 x00800080,
0 x00002000, 0 x00802080, 0 x00802081, 0 x00000081,
0 x00800080, 0 x00800001, 0 x00802000, 0 x00802081,
0 x00000081, 0 x00000000, 0 x00000000, 0 x00802000,
0 x00002080, 0 x00800080, 0 x00800081, 0 x00000001,
0 x00802001, 0 x00002081, 0 x00002081, 0 x00000080,
0 x00802081, 0 x00000081, 0 x00000001, 0 x00002000,
0 x00800001, 0 x00002001, 0 x00802080, 0 x00800081,
0 x00002001, 0 x00002080, 0 x00800000, 0 x00802001,
0 x00000080, 0 x00800000, 0 x00002000, 0 x00802080
};
static const u32 S5[64 ] = {
0 x00000100, 0 x02080100, 0 x02080000, 0 x42000100,
0 x00080000, 0 x00000100, 0 x40000000, 0 x02080000,
0 x40080100, 0 x00080000, 0 x02000100, 0 x40080100,
0 x42000100, 0 x42080000, 0 x00080100, 0 x40000000,
0 x02000000, 0 x40080000, 0 x40080000, 0 x00000000,
0 x40000100, 0 x42080100, 0 x42080100, 0 x02000100,
0 x42080000, 0 x40000100, 0 x00000000, 0 x42000000,
0 x02080100, 0 x02000000, 0 x42000000, 0 x00080100,
0 x00080000, 0 x42000100, 0 x00000100, 0 x02000000,
0 x40000000, 0 x02080000, 0 x42000100, 0 x40080100,
0 x02000100, 0 x40000000, 0 x42080000, 0 x02080100,
0 x40080100, 0 x00000100, 0 x02000000, 0 x42080000,
0 x42080100, 0 x00080100, 0 x42000000, 0 x42080100,
0 x02080000, 0 x00000000, 0 x40080000, 0 x42000000,
0 x00080100, 0 x02000100, 0 x40000100, 0 x00080000,
0 x00000000, 0 x40080000, 0 x02080100, 0 x40000100
};
static const u32 S6[64 ] = {
0 x20000010, 0 x20400000, 0 x00004000, 0 x20404010,
0 x20400000, 0 x00000010, 0 x20404010, 0 x00400000,
0 x20004000, 0 x00404010, 0 x00400000, 0 x20000010,
0 x00400010, 0 x20004000, 0 x20000000, 0 x00004010,
0 x00000000, 0 x00400010, 0 x20004010, 0 x00004000,
0 x00404000, 0 x20004010, 0 x00000010, 0 x20400010,
0 x20400010, 0 x00000000, 0 x00404010, 0 x20404000,
0 x00004010, 0 x00404000, 0 x20404000, 0 x20000000,
0 x20004000, 0 x00000010, 0 x20400010, 0 x00404000,
0 x20404010, 0 x00400000, 0 x00004010, 0 x20000010,
0 x00400000, 0 x20004000, 0 x20000000, 0 x00004010,
0 x20000010, 0 x20404010, 0 x00404000, 0 x20400000,
0 x00404010, 0 x20404000, 0 x00000000, 0 x20400010,
0 x00000010, 0 x00004000, 0 x20400000, 0 x00404010,
0 x00004000, 0 x00400010, 0 x20004010, 0 x00000000,
0 x20404000, 0 x20000000, 0 x00400010, 0 x20004010
};
static const u32 S7[64 ] = {
0 x00200000, 0 x04200002, 0 x04000802, 0 x00000000,
0 x00000800, 0 x04000802, 0 x00200802, 0 x04200800,
0 x04200802, 0 x00200000, 0 x00000000, 0 x04000002,
0 x00000002, 0 x04000000, 0 x04200002, 0 x00000802,
0 x04000800, 0 x00200802, 0 x00200002, 0 x04000800,
0 x04000002, 0 x04200000, 0 x04200800, 0 x00200002,
0 x04200000, 0 x00000800, 0 x00000802, 0 x04200802,
0 x00200800, 0 x00000002, 0 x04000000, 0 x00200800,
0 x04000000, 0 x00200800, 0 x00200000, 0 x04000802,
0 x04000802, 0 x04200002, 0 x04200002, 0 x00000002,
0 x00200002, 0 x04000000, 0 x04000800, 0 x00200000,
0 x04200800, 0 x00000802, 0 x00200802, 0 x04200800,
0 x00000802, 0 x04000002, 0 x04200802, 0 x04200000,
0 x00200800, 0 x00000000, 0 x00000002, 0 x04200802,
0 x00000000, 0 x00200802, 0 x04200000, 0 x00000800,
0 x04000002, 0 x04000800, 0 x00000800, 0 x00200002
};
static const u32 S8[64 ] = {
0 x10001040, 0 x00001000, 0 x00040000, 0 x10041040,
0 x10000000, 0 x10001040, 0 x00000040, 0 x10000000,
0 x00040040, 0 x10040000, 0 x10041040, 0 x00041000,
0 x10041000, 0 x00041040, 0 x00001000, 0 x00000040,
0 x10040000, 0 x10000040, 0 x10001000, 0 x00001040,
0 x00041000, 0 x00040040, 0 x10040040, 0 x10041000,
0 x00001040, 0 x00000000, 0 x00000000, 0 x10040040,
0 x10000040, 0 x10001000, 0 x00041040, 0 x00040000,
0 x00041040, 0 x00040000, 0 x10041000, 0 x00001000,
0 x00000040, 0 x10040040, 0 x00001000, 0 x00041040,
0 x10001000, 0 x00000040, 0 x10000040, 0 x10040000,
0 x10040040, 0 x10000000, 0 x00040000, 0 x10001040,
0 x00000000, 0 x10041040, 0 x00040040, 0 x10000040,
0 x10040000, 0 x10001000, 0 x10001040, 0 x00000000,
0 x10041040, 0 x00041000, 0 x00041000, 0 x00001040,
0 x00001040, 0 x00040040, 0 x10000000, 0 x10041000
};
/* Encryption components: IP, FP, and round function */
#define IP(L, R, T) \
ROL(R, 4 ); \
T = L; \
L ^= R; \
L &= 0 xf0f0f0f0; \
R ^= L; \
L ^= T; \
ROL(R, 12 ); \
T = L; \
L ^= R; \
L &= 0 xffff0000; \
R ^= L; \
L ^= T; \
ROR(R, 14 ); \
T = L; \
L ^= R; \
L &= 0 xcccccccc; \
R ^= L; \
L ^= T; \
ROL(R, 6 ); \
T = L; \
L ^= R; \
L &= 0 xff00ff00; \
R ^= L; \
L ^= T; \
ROR(R, 7 ); \
T = L; \
L ^= R; \
L &= 0 xaaaaaaaa; \
R ^= L; \
L ^= T; \
ROL(L, 1 );
#define FP(L, R, T) \
ROR(L, 1 ); \
T = L; \
L ^= R; \
L &= 0 xaaaaaaaa; \
R ^= L; \
L ^= T; \
ROL(R, 7 ); \
T = L; \
L ^= R; \
L &= 0 xff00ff00; \
R ^= L; \
L ^= T; \
ROR(R, 6 ); \
T = L; \
L ^= R; \
L &= 0 xcccccccc; \
R ^= L; \
L ^= T; \
ROL(R, 14 ); \
T = L; \
L ^= R; \
L &= 0 xffff0000; \
R ^= L; \
L ^= T; \
ROR(R, 12 ); \
T = L; \
L ^= R; \
L &= 0 xf0f0f0f0; \
R ^= L; \
L ^= T; \
ROR(R, 4 );
#define ROUND(L, R, A, B, K, d) \
B = K[0 ]; A = K[1 ]; K += d; \
B ^= R; A ^= R; \
B &= 0 x3f3f3f3f; ROR(A, 4 ); \
L ^= S8[0 xff & B]; A &= 0 x3f3f3f3f; \
L ^= S6[0 xff & (B >> 8 )]; B >>= 16 ; \
L ^= S7[0 xff & A]; \
L ^= S5[0 xff & (A >> 8 )]; A >>= 16 ; \
L ^= S4[0 xff & B]; \
L ^= S2[0 xff & (B >> 8 )]; \
L ^= S3[0 xff & A]; \
L ^= S1[0 xff & (A >> 8 )];
/*
* PC2 lookup tables are organized as 2 consecutive sets of 4 interleaved
* tables of 128 elements . One set is for C_i and the other for D_i , while
* the 4 interleaved tables correspond to four 7 - bit subsets of C_i or D_i .
*
* After PC1 each of the variables a , b , c , d contains a 7 bit subset of C_i
* or D_i in bits 7 - 1 ( bit 0 being the least significant ) .
*/
#define T1(x) pt[2 * (x) + 0 ]
#define T2(x) pt[2 * (x) + 1 ]
#define T3(x) pt[2 * (x) + 2 ]
#define T4(x) pt[2 * (x) + 3 ]
#define DES_PC2(a, b, c, d) (T4(d) | T3(c) | T2(b) | T1(a))
/*
* Encryption key expansion
*
* RFC2451 : Weak key checks SHOULD be performed .
*
* FIPS 74 :
*
* Keys having duals are keys which produce all zeros , all ones , or
* alternating zero - one patterns in the C and D registers after Permuted
* Choice 1 has operated on the key .
*
*/
static unsigned long des_ekey(u32 *pe, const u8 *k)
{
/* K&R: long is at least 32 bits */
unsigned long a, b, c, d, w;
const u32 *pt = pc2;
d = k[4 ]; d &= 0 x0e; d <<= 4 ; d |= k[0 ] & 0 x1e; d = pc1[d];
c = k[5 ]; c &= 0 x0e; c <<= 4 ; c |= k[1 ] & 0 x1e; c = pc1[c];
b = k[6 ]; b &= 0 x0e; b <<= 4 ; b |= k[2 ] & 0 x1e; b = pc1[b];
a = k[7 ]; a &= 0 x0e; a <<= 4 ; a |= k[3 ] & 0 x1e; a = pc1[a];
pe[15 * 2 + 0 ] = DES_PC2(a, b, c, d); d = rs[d];
pe[14 * 2 + 0 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[13 * 2 + 0 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[12 * 2 + 0 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[11 * 2 + 0 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[10 * 2 + 0 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 9 * 2 + 0 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 8 * 2 + 0 ] = DES_PC2(d, a, b, c); c = rs[c];
pe[ 7 * 2 + 0 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 6 * 2 + 0 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[ 5 * 2 + 0 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 4 * 2 + 0 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[ 3 * 2 + 0 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 2 * 2 + 0 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[ 1 * 2 + 0 ] = DES_PC2(c, d, a, b); b = rs[b];
pe[ 0 * 2 + 0 ] = DES_PC2(b, c, d, a);
/* Check if first half is weak */
w = (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
/* Skip to next table set */
pt += 512 ;
d = k[0 ]; d &= 0 xe0; d >>= 4 ; d |= k[4 ] & 0 xf0; d = pc1[d + 1 ];
c = k[1 ]; c &= 0 xe0; c >>= 4 ; c |= k[5 ] & 0 xf0; c = pc1[c + 1 ];
b = k[2 ]; b &= 0 xe0; b >>= 4 ; b |= k[6 ] & 0 xf0; b = pc1[b + 1 ];
a = k[3 ]; a &= 0 xe0; a >>= 4 ; a |= k[7 ] & 0 xf0; a = pc1[a + 1 ];
/* Check if second half is weak */
w |= (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
pe[15 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d];
pe[14 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[13 * 2 + 1 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[12 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[11 * 2 + 1 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[10 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 9 * 2 + 1 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 8 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c];
pe[ 7 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 6 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[ 5 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 4 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[ 3 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 2 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[ 1 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b];
pe[ 0 * 2 + 1 ] = DES_PC2(b, c, d, a);
/* Fixup: 2413 5768 -> 1357 2468 */
for (d = 0 ; d < 16 ; ++d) {
a = pe[2 * d];
b = pe[2 * d + 1 ];
c = a ^ b;
c &= 0 xffff0000;
a ^= c;
b ^= c;
ROL(b, 18 );
pe[2 * d] = a;
pe[2 * d + 1 ] = b;
}
/* Zero if weak key */
return w;
}
int des_expand_key(struct des_ctx *ctx, const u8 *key, unsigned int keylen)
{
if (keylen != DES_KEY_SIZE)
return -EINVAL;
return des_ekey(ctx->expkey, key) ? 0 : -ENOKEY;
}
EXPORT_SYMBOL_GPL(des_expand_key);
/*
* Decryption key expansion
*
* No weak key checking is performed , as this is only used by triple DES
*
*/
static void dkey(u32 *pe, const u8 *k)
{
/* K&R: long is at least 32 bits */
unsigned long a, b, c, d;
const u32 *pt = pc2;
d = k[4 ]; d &= 0 x0e; d <<= 4 ; d |= k[0 ] & 0 x1e; d = pc1[d];
c = k[5 ]; c &= 0 x0e; c <<= 4 ; c |= k[1 ] & 0 x1e; c = pc1[c];
b = k[6 ]; b &= 0 x0e; b <<= 4 ; b |= k[2 ] & 0 x1e; b = pc1[b];
a = k[7 ]; a &= 0 x0e; a <<= 4 ; a |= k[3 ] & 0 x1e; a = pc1[a];
pe[ 0 * 2 ] = DES_PC2(a, b, c, d); d = rs[d];
pe[ 1 * 2 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 2 * 2 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 3 * 2 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 4 * 2 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 5 * 2 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 6 * 2 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 7 * 2 ] = DES_PC2(d, a, b, c); c = rs[c];
pe[ 8 * 2 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 9 * 2 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[10 * 2 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[11 * 2 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[12 * 2 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[13 * 2 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[14 * 2 ] = DES_PC2(c, d, a, b); b = rs[b];
pe[15 * 2 ] = DES_PC2(b, c, d, a);
/* Skip to next table set */
pt += 512 ;
d = k[0 ]; d &= 0 xe0; d >>= 4 ; d |= k[4 ] & 0 xf0; d = pc1[d + 1 ];
c = k[1 ]; c &= 0 xe0; c >>= 4 ; c |= k[5 ] & 0 xf0; c = pc1[c + 1 ];
b = k[2 ]; b &= 0 xe0; b >>= 4 ; b |= k[6 ] & 0 xf0; b = pc1[b + 1 ];
a = k[3 ]; a &= 0 xe0; a >>= 4 ; a |= k[7 ] & 0 xf0; a = pc1[a + 1 ];
pe[ 0 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d];
pe[ 1 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 2 * 2 + 1 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 3 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 4 * 2 + 1 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 5 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
pe[ 6 * 2 + 1 ] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
pe[ 7 * 2 + 1 ] = DES_PC2(d, a, b, c); c = rs[c];
pe[ 8 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[ 9 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[10 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[11 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[12 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
pe[13 * 2 + 1 ] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
pe[14 * 2 + 1 ] = DES_PC2(c, d, a, b); b = rs[b];
pe[15 * 2 + 1 ] = DES_PC2(b, c, d, a);
/* Fixup: 2413 5768 -> 1357 2468 */
for (d = 0 ; d < 16 ; ++d) {
a = pe[2 * d];
b = pe[2 * d + 1 ];
c = a ^ b;
c &= 0 xffff0000;
a ^= c;
b ^= c;
ROL(b, 18 );
pe[2 * d] = a;
pe[2 * d + 1 ] = b;
}
}
void des_encrypt(const struct des_ctx *ctx, u8 *dst, const u8 *src)
{
const u32 *K = ctx->expkey;
u32 L, R, A, B;
int i;
L = get_unaligned_le32(src);
R = get_unaligned_le32(src + 4 );
IP(L, R, A);
for (i = 0 ; i < 8 ; i++) {
ROUND(L, R, A, B, K, 2 );
ROUND(R, L, A, B, K, 2 );
}
FP(R, L, A);
put_unaligned_le32(R, dst);
put_unaligned_le32(L, dst + 4 );
}
EXPORT_SYMBOL_GPL(des_encrypt);
void des_decrypt(const struct des_ctx *ctx, u8 *dst, const u8 *src)
{
const u32 *K = ctx->expkey + DES_EXPKEY_WORDS - 2 ;
u32 L, R, A, B;
int i;
L = get_unaligned_le32(src);
R = get_unaligned_le32(src + 4 );
IP(L, R, A);
for (i = 0 ; i < 8 ; i++) {
ROUND(L, R, A, B, K, -2 );
ROUND(R, L, A, B, K, -2 );
}
FP(R, L, A);
put_unaligned_le32(R, dst);
put_unaligned_le32(L, dst + 4 );
}
EXPORT_SYMBOL_GPL(des_decrypt);
int des3_ede_expand_key(struct des3_ede_ctx *ctx, const u8 *key,
unsigned int keylen)
{
u32 *pe = ctx->expkey;
int err;
if (keylen != DES3_EDE_KEY_SIZE)
return -EINVAL;
err = des3_ede_verify_key(key, keylen, true );
if (err && err != -ENOKEY)
return err;
des_ekey(pe, key); pe += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
dkey(pe, key); pe += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
des_ekey(pe, key);
return err;
}
EXPORT_SYMBOL_GPL(des3_ede_expand_key);
void des3_ede_encrypt(const struct des3_ede_ctx *dctx, u8 *dst, const u8 *src)
{
const u32 *K = dctx->expkey;
u32 L, R, A, B;
int i;
L = get_unaligned_le32(src);
R = get_unaligned_le32(src + 4 );
IP(L, R, A);
for (i = 0 ; i < 8 ; i++) {
ROUND(L, R, A, B, K, 2 );
ROUND(R, L, A, B, K, 2 );
}
for (i = 0 ; i < 8 ; i++) {
ROUND(R, L, A, B, K, 2 );
ROUND(L, R, A, B, K, 2 );
}
for (i = 0 ; i < 8 ; i++) {
ROUND(L, R, A, B, K, 2 );
ROUND(R, L, A, B, K, 2 );
}
FP(R, L, A);
put_unaligned_le32(R, dst);
put_unaligned_le32(L, dst + 4 );
}
EXPORT_SYMBOL_GPL(des3_ede_encrypt);
void des3_ede_decrypt(const struct des3_ede_ctx *dctx, u8 *dst, const u8 *src)
{
const u32 *K = dctx->expkey + DES3_EDE_EXPKEY_WORDS - 2 ;
u32 L, R, A, B;
int i;
L = get_unaligned_le32(src);
R = get_unaligned_le32(src + 4 );
IP(L, R, A);
for (i = 0 ; i < 8 ; i++) {
ROUND(L, R, A, B, K, -2 );
ROUND(R, L, A, B, K, -2 );
}
for (i = 0 ; i < 8 ; i++) {
ROUND(R, L, A, B, K, -2 );
ROUND(L, R, A, B, K, -2 );
}
for (i = 0 ; i < 8 ; i++) {
ROUND(L, R, A, B, K, -2 );
ROUND(R, L, A, B, K, -2 );
}
FP(R, L, A);
put_unaligned_le32(R, dst);
put_unaligned_le32(L, dst + 4 );
}
EXPORT_SYMBOL_GPL(des3_ede_decrypt);
MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms" );
MODULE_LICENSE("GPL" );
Messung V0.5 in Prozent C=99 H=78 G=88
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-09-27)
¤
*© Formatika GbR, Deutschland