162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Cryptographic API. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * DES & Triple DES EDE Cipher Algorithms. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (c) 2005 Dag Arne Osvik <da@osvik.no> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/bitops.h> 1162306a36Sopenharmony_ci#include <linux/compiler.h> 1262306a36Sopenharmony_ci#include <linux/crypto.h> 1362306a36Sopenharmony_ci#include <linux/errno.h> 1462306a36Sopenharmony_ci#include <linux/fips.h> 1562306a36Sopenharmony_ci#include <linux/init.h> 1662306a36Sopenharmony_ci#include <linux/module.h> 1762306a36Sopenharmony_ci#include <linux/string.h> 1862306a36Sopenharmony_ci#include <linux/types.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <asm/unaligned.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <crypto/des.h> 2362306a36Sopenharmony_ci#include <crypto/internal/des.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define ROL(x, r) ((x) = rol32((x), (r))) 2662306a36Sopenharmony_ci#define ROR(x, r) ((x) = ror32((x), (r))) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Lookup tables for key expansion */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic const u8 pc1[256] = { 3162306a36Sopenharmony_ci 0x00, 0x00, 0x40, 0x04, 0x10, 0x10, 0x50, 0x14, 3262306a36Sopenharmony_ci 0x04, 0x40, 0x44, 0x44, 0x14, 0x50, 0x54, 0x54, 3362306a36Sopenharmony_ci 0x02, 0x02, 0x42, 0x06, 0x12, 0x12, 0x52, 0x16, 3462306a36Sopenharmony_ci 0x06, 0x42, 0x46, 0x46, 0x16, 0x52, 0x56, 0x56, 3562306a36Sopenharmony_ci 0x80, 0x08, 0xc0, 0x0c, 0x90, 0x18, 0xd0, 0x1c, 3662306a36Sopenharmony_ci 0x84, 0x48, 0xc4, 0x4c, 0x94, 0x58, 0xd4, 0x5c, 3762306a36Sopenharmony_ci 0x82, 0x0a, 0xc2, 0x0e, 0x92, 0x1a, 0xd2, 0x1e, 3862306a36Sopenharmony_ci 0x86, 0x4a, 0xc6, 0x4e, 0x96, 0x5a, 0xd6, 0x5e, 3962306a36Sopenharmony_ci 0x20, 0x20, 0x60, 0x24, 0x30, 0x30, 0x70, 0x34, 4062306a36Sopenharmony_ci 0x24, 0x60, 0x64, 0x64, 0x34, 0x70, 0x74, 0x74, 4162306a36Sopenharmony_ci 0x22, 0x22, 0x62, 0x26, 0x32, 0x32, 0x72, 0x36, 4262306a36Sopenharmony_ci 0x26, 0x62, 0x66, 0x66, 0x36, 0x72, 0x76, 0x76, 4362306a36Sopenharmony_ci 0xa0, 0x28, 0xe0, 0x2c, 0xb0, 0x38, 0xf0, 0x3c, 4462306a36Sopenharmony_ci 0xa4, 0x68, 0xe4, 0x6c, 0xb4, 0x78, 0xf4, 0x7c, 4562306a36Sopenharmony_ci 0xa2, 0x2a, 0xe2, 0x2e, 0xb2, 0x3a, 0xf2, 0x3e, 4662306a36Sopenharmony_ci 0xa6, 0x6a, 0xe6, 0x6e, 0xb6, 0x7a, 0xf6, 0x7e, 4762306a36Sopenharmony_ci 0x08, 0x80, 0x48, 0x84, 0x18, 0x90, 0x58, 0x94, 4862306a36Sopenharmony_ci 0x0c, 0xc0, 0x4c, 0xc4, 0x1c, 0xd0, 0x5c, 0xd4, 4962306a36Sopenharmony_ci 0x0a, 0x82, 0x4a, 0x86, 0x1a, 0x92, 0x5a, 0x96, 5062306a36Sopenharmony_ci 0x0e, 0xc2, 0x4e, 0xc6, 0x1e, 0xd2, 0x5e, 0xd6, 5162306a36Sopenharmony_ci 0x88, 0x88, 0xc8, 0x8c, 0x98, 0x98, 0xd8, 0x9c, 5262306a36Sopenharmony_ci 0x8c, 0xc8, 0xcc, 0xcc, 0x9c, 0xd8, 0xdc, 0xdc, 5362306a36Sopenharmony_ci 0x8a, 0x8a, 0xca, 0x8e, 0x9a, 0x9a, 0xda, 0x9e, 5462306a36Sopenharmony_ci 0x8e, 0xca, 0xce, 0xce, 0x9e, 0xda, 0xde, 0xde, 5562306a36Sopenharmony_ci 0x28, 0xa0, 0x68, 0xa4, 0x38, 0xb0, 0x78, 0xb4, 5662306a36Sopenharmony_ci 0x2c, 0xe0, 0x6c, 0xe4, 0x3c, 0xf0, 0x7c, 0xf4, 5762306a36Sopenharmony_ci 0x2a, 0xa2, 0x6a, 0xa6, 0x3a, 0xb2, 0x7a, 0xb6, 5862306a36Sopenharmony_ci 0x2e, 0xe2, 0x6e, 0xe6, 0x3e, 0xf2, 0x7e, 0xf6, 5962306a36Sopenharmony_ci 0xa8, 0xa8, 0xe8, 0xac, 0xb8, 0xb8, 0xf8, 0xbc, 6062306a36Sopenharmony_ci 0xac, 0xe8, 0xec, 0xec, 0xbc, 0xf8, 0xfc, 0xfc, 6162306a36Sopenharmony_ci 0xaa, 0xaa, 0xea, 0xae, 0xba, 0xba, 0xfa, 0xbe, 6262306a36Sopenharmony_ci 0xae, 0xea, 0xee, 0xee, 0xbe, 0xfa, 0xfe, 0xfe 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic const u8 rs[256] = { 6662306a36Sopenharmony_ci 0x00, 0x00, 0x80, 0x80, 0x02, 0x02, 0x82, 0x82, 6762306a36Sopenharmony_ci 0x04, 0x04, 0x84, 0x84, 0x06, 0x06, 0x86, 0x86, 6862306a36Sopenharmony_ci 0x08, 0x08, 0x88, 0x88, 0x0a, 0x0a, 0x8a, 0x8a, 6962306a36Sopenharmony_ci 0x0c, 0x0c, 0x8c, 0x8c, 0x0e, 0x0e, 0x8e, 0x8e, 7062306a36Sopenharmony_ci 0x10, 0x10, 0x90, 0x90, 0x12, 0x12, 0x92, 0x92, 7162306a36Sopenharmony_ci 0x14, 0x14, 0x94, 0x94, 0x16, 0x16, 0x96, 0x96, 7262306a36Sopenharmony_ci 0x18, 0x18, 0x98, 0x98, 0x1a, 0x1a, 0x9a, 0x9a, 7362306a36Sopenharmony_ci 0x1c, 0x1c, 0x9c, 0x9c, 0x1e, 0x1e, 0x9e, 0x9e, 7462306a36Sopenharmony_ci 0x20, 0x20, 0xa0, 0xa0, 0x22, 0x22, 0xa2, 0xa2, 7562306a36Sopenharmony_ci 0x24, 0x24, 0xa4, 0xa4, 0x26, 0x26, 0xa6, 0xa6, 7662306a36Sopenharmony_ci 0x28, 0x28, 0xa8, 0xa8, 0x2a, 0x2a, 0xaa, 0xaa, 7762306a36Sopenharmony_ci 0x2c, 0x2c, 0xac, 0xac, 0x2e, 0x2e, 0xae, 0xae, 7862306a36Sopenharmony_ci 0x30, 0x30, 0xb0, 0xb0, 0x32, 0x32, 0xb2, 0xb2, 7962306a36Sopenharmony_ci 0x34, 0x34, 0xb4, 0xb4, 0x36, 0x36, 0xb6, 0xb6, 8062306a36Sopenharmony_ci 0x38, 0x38, 0xb8, 0xb8, 0x3a, 0x3a, 0xba, 0xba, 8162306a36Sopenharmony_ci 0x3c, 0x3c, 0xbc, 0xbc, 0x3e, 0x3e, 0xbe, 0xbe, 8262306a36Sopenharmony_ci 0x40, 0x40, 0xc0, 0xc0, 0x42, 0x42, 0xc2, 0xc2, 8362306a36Sopenharmony_ci 0x44, 0x44, 0xc4, 0xc4, 0x46, 0x46, 0xc6, 0xc6, 8462306a36Sopenharmony_ci 0x48, 0x48, 0xc8, 0xc8, 0x4a, 0x4a, 0xca, 0xca, 8562306a36Sopenharmony_ci 0x4c, 0x4c, 0xcc, 0xcc, 0x4e, 0x4e, 0xce, 0xce, 8662306a36Sopenharmony_ci 0x50, 0x50, 0xd0, 0xd0, 0x52, 0x52, 0xd2, 0xd2, 8762306a36Sopenharmony_ci 0x54, 0x54, 0xd4, 0xd4, 0x56, 0x56, 0xd6, 0xd6, 8862306a36Sopenharmony_ci 0x58, 0x58, 0xd8, 0xd8, 0x5a, 0x5a, 0xda, 0xda, 8962306a36Sopenharmony_ci 0x5c, 0x5c, 0xdc, 0xdc, 0x5e, 0x5e, 0xde, 0xde, 9062306a36Sopenharmony_ci 0x60, 0x60, 0xe0, 0xe0, 0x62, 0x62, 0xe2, 0xe2, 9162306a36Sopenharmony_ci 0x64, 0x64, 0xe4, 0xe4, 0x66, 0x66, 0xe6, 0xe6, 9262306a36Sopenharmony_ci 0x68, 0x68, 0xe8, 0xe8, 0x6a, 0x6a, 0xea, 0xea, 9362306a36Sopenharmony_ci 0x6c, 0x6c, 0xec, 0xec, 0x6e, 0x6e, 0xee, 0xee, 9462306a36Sopenharmony_ci 0x70, 0x70, 0xf0, 0xf0, 0x72, 0x72, 0xf2, 0xf2, 9562306a36Sopenharmony_ci 0x74, 0x74, 0xf4, 0xf4, 0x76, 0x76, 0xf6, 0xf6, 9662306a36Sopenharmony_ci 0x78, 0x78, 0xf8, 0xf8, 0x7a, 0x7a, 0xfa, 0xfa, 9762306a36Sopenharmony_ci 0x7c, 0x7c, 0xfc, 0xfc, 0x7e, 0x7e, 0xfe, 0xfe 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic const u32 pc2[1024] = { 10162306a36Sopenharmony_ci 0x00000000, 0x00000000, 0x00000000, 0x00000000, 10262306a36Sopenharmony_ci 0x00040000, 0x00000000, 0x04000000, 0x00100000, 10362306a36Sopenharmony_ci 0x00400000, 0x00000008, 0x00000800, 0x40000000, 10462306a36Sopenharmony_ci 0x00440000, 0x00000008, 0x04000800, 0x40100000, 10562306a36Sopenharmony_ci 0x00000400, 0x00000020, 0x08000000, 0x00000100, 10662306a36Sopenharmony_ci 0x00040400, 0x00000020, 0x0c000000, 0x00100100, 10762306a36Sopenharmony_ci 0x00400400, 0x00000028, 0x08000800, 0x40000100, 10862306a36Sopenharmony_ci 0x00440400, 0x00000028, 0x0c000800, 0x40100100, 10962306a36Sopenharmony_ci 0x80000000, 0x00000010, 0x00000000, 0x00800000, 11062306a36Sopenharmony_ci 0x80040000, 0x00000010, 0x04000000, 0x00900000, 11162306a36Sopenharmony_ci 0x80400000, 0x00000018, 0x00000800, 0x40800000, 11262306a36Sopenharmony_ci 0x80440000, 0x00000018, 0x04000800, 0x40900000, 11362306a36Sopenharmony_ci 0x80000400, 0x00000030, 0x08000000, 0x00800100, 11462306a36Sopenharmony_ci 0x80040400, 0x00000030, 0x0c000000, 0x00900100, 11562306a36Sopenharmony_ci 0x80400400, 0x00000038, 0x08000800, 0x40800100, 11662306a36Sopenharmony_ci 0x80440400, 0x00000038, 0x0c000800, 0x40900100, 11762306a36Sopenharmony_ci 0x10000000, 0x00000000, 0x00200000, 0x00001000, 11862306a36Sopenharmony_ci 0x10040000, 0x00000000, 0x04200000, 0x00101000, 11962306a36Sopenharmony_ci 0x10400000, 0x00000008, 0x00200800, 0x40001000, 12062306a36Sopenharmony_ci 0x10440000, 0x00000008, 0x04200800, 0x40101000, 12162306a36Sopenharmony_ci 0x10000400, 0x00000020, 0x08200000, 0x00001100, 12262306a36Sopenharmony_ci 0x10040400, 0x00000020, 0x0c200000, 0x00101100, 12362306a36Sopenharmony_ci 0x10400400, 0x00000028, 0x08200800, 0x40001100, 12462306a36Sopenharmony_ci 0x10440400, 0x00000028, 0x0c200800, 0x40101100, 12562306a36Sopenharmony_ci 0x90000000, 0x00000010, 0x00200000, 0x00801000, 12662306a36Sopenharmony_ci 0x90040000, 0x00000010, 0x04200000, 0x00901000, 12762306a36Sopenharmony_ci 0x90400000, 0x00000018, 0x00200800, 0x40801000, 12862306a36Sopenharmony_ci 0x90440000, 0x00000018, 0x04200800, 0x40901000, 12962306a36Sopenharmony_ci 0x90000400, 0x00000030, 0x08200000, 0x00801100, 13062306a36Sopenharmony_ci 0x90040400, 0x00000030, 0x0c200000, 0x00901100, 13162306a36Sopenharmony_ci 0x90400400, 0x00000038, 0x08200800, 0x40801100, 13262306a36Sopenharmony_ci 0x90440400, 0x00000038, 0x0c200800, 0x40901100, 13362306a36Sopenharmony_ci 0x00000200, 0x00080000, 0x00000000, 0x00000004, 13462306a36Sopenharmony_ci 0x00040200, 0x00080000, 0x04000000, 0x00100004, 13562306a36Sopenharmony_ci 0x00400200, 0x00080008, 0x00000800, 0x40000004, 13662306a36Sopenharmony_ci 0x00440200, 0x00080008, 0x04000800, 0x40100004, 13762306a36Sopenharmony_ci 0x00000600, 0x00080020, 0x08000000, 0x00000104, 13862306a36Sopenharmony_ci 0x00040600, 0x00080020, 0x0c000000, 0x00100104, 13962306a36Sopenharmony_ci 0x00400600, 0x00080028, 0x08000800, 0x40000104, 14062306a36Sopenharmony_ci 0x00440600, 0x00080028, 0x0c000800, 0x40100104, 14162306a36Sopenharmony_ci 0x80000200, 0x00080010, 0x00000000, 0x00800004, 14262306a36Sopenharmony_ci 0x80040200, 0x00080010, 0x04000000, 0x00900004, 14362306a36Sopenharmony_ci 0x80400200, 0x00080018, 0x00000800, 0x40800004, 14462306a36Sopenharmony_ci 0x80440200, 0x00080018, 0x04000800, 0x40900004, 14562306a36Sopenharmony_ci 0x80000600, 0x00080030, 0x08000000, 0x00800104, 14662306a36Sopenharmony_ci 0x80040600, 0x00080030, 0x0c000000, 0x00900104, 14762306a36Sopenharmony_ci 0x80400600, 0x00080038, 0x08000800, 0x40800104, 14862306a36Sopenharmony_ci 0x80440600, 0x00080038, 0x0c000800, 0x40900104, 14962306a36Sopenharmony_ci 0x10000200, 0x00080000, 0x00200000, 0x00001004, 15062306a36Sopenharmony_ci 0x10040200, 0x00080000, 0x04200000, 0x00101004, 15162306a36Sopenharmony_ci 0x10400200, 0x00080008, 0x00200800, 0x40001004, 15262306a36Sopenharmony_ci 0x10440200, 0x00080008, 0x04200800, 0x40101004, 15362306a36Sopenharmony_ci 0x10000600, 0x00080020, 0x08200000, 0x00001104, 15462306a36Sopenharmony_ci 0x10040600, 0x00080020, 0x0c200000, 0x00101104, 15562306a36Sopenharmony_ci 0x10400600, 0x00080028, 0x08200800, 0x40001104, 15662306a36Sopenharmony_ci 0x10440600, 0x00080028, 0x0c200800, 0x40101104, 15762306a36Sopenharmony_ci 0x90000200, 0x00080010, 0x00200000, 0x00801004, 15862306a36Sopenharmony_ci 0x90040200, 0x00080010, 0x04200000, 0x00901004, 15962306a36Sopenharmony_ci 0x90400200, 0x00080018, 0x00200800, 0x40801004, 16062306a36Sopenharmony_ci 0x90440200, 0x00080018, 0x04200800, 0x40901004, 16162306a36Sopenharmony_ci 0x90000600, 0x00080030, 0x08200000, 0x00801104, 16262306a36Sopenharmony_ci 0x90040600, 0x00080030, 0x0c200000, 0x00901104, 16362306a36Sopenharmony_ci 0x90400600, 0x00080038, 0x08200800, 0x40801104, 16462306a36Sopenharmony_ci 0x90440600, 0x00080038, 0x0c200800, 0x40901104, 16562306a36Sopenharmony_ci 0x00000002, 0x00002000, 0x20000000, 0x00000001, 16662306a36Sopenharmony_ci 0x00040002, 0x00002000, 0x24000000, 0x00100001, 16762306a36Sopenharmony_ci 0x00400002, 0x00002008, 0x20000800, 0x40000001, 16862306a36Sopenharmony_ci 0x00440002, 0x00002008, 0x24000800, 0x40100001, 16962306a36Sopenharmony_ci 0x00000402, 0x00002020, 0x28000000, 0x00000101, 17062306a36Sopenharmony_ci 0x00040402, 0x00002020, 0x2c000000, 0x00100101, 17162306a36Sopenharmony_ci 0x00400402, 0x00002028, 0x28000800, 0x40000101, 17262306a36Sopenharmony_ci 0x00440402, 0x00002028, 0x2c000800, 0x40100101, 17362306a36Sopenharmony_ci 0x80000002, 0x00002010, 0x20000000, 0x00800001, 17462306a36Sopenharmony_ci 0x80040002, 0x00002010, 0x24000000, 0x00900001, 17562306a36Sopenharmony_ci 0x80400002, 0x00002018, 0x20000800, 0x40800001, 17662306a36Sopenharmony_ci 0x80440002, 0x00002018, 0x24000800, 0x40900001, 17762306a36Sopenharmony_ci 0x80000402, 0x00002030, 0x28000000, 0x00800101, 17862306a36Sopenharmony_ci 0x80040402, 0x00002030, 0x2c000000, 0x00900101, 17962306a36Sopenharmony_ci 0x80400402, 0x00002038, 0x28000800, 0x40800101, 18062306a36Sopenharmony_ci 0x80440402, 0x00002038, 0x2c000800, 0x40900101, 18162306a36Sopenharmony_ci 0x10000002, 0x00002000, 0x20200000, 0x00001001, 18262306a36Sopenharmony_ci 0x10040002, 0x00002000, 0x24200000, 0x00101001, 18362306a36Sopenharmony_ci 0x10400002, 0x00002008, 0x20200800, 0x40001001, 18462306a36Sopenharmony_ci 0x10440002, 0x00002008, 0x24200800, 0x40101001, 18562306a36Sopenharmony_ci 0x10000402, 0x00002020, 0x28200000, 0x00001101, 18662306a36Sopenharmony_ci 0x10040402, 0x00002020, 0x2c200000, 0x00101101, 18762306a36Sopenharmony_ci 0x10400402, 0x00002028, 0x28200800, 0x40001101, 18862306a36Sopenharmony_ci 0x10440402, 0x00002028, 0x2c200800, 0x40101101, 18962306a36Sopenharmony_ci 0x90000002, 0x00002010, 0x20200000, 0x00801001, 19062306a36Sopenharmony_ci 0x90040002, 0x00002010, 0x24200000, 0x00901001, 19162306a36Sopenharmony_ci 0x90400002, 0x00002018, 0x20200800, 0x40801001, 19262306a36Sopenharmony_ci 0x90440002, 0x00002018, 0x24200800, 0x40901001, 19362306a36Sopenharmony_ci 0x90000402, 0x00002030, 0x28200000, 0x00801101, 19462306a36Sopenharmony_ci 0x90040402, 0x00002030, 0x2c200000, 0x00901101, 19562306a36Sopenharmony_ci 0x90400402, 0x00002038, 0x28200800, 0x40801101, 19662306a36Sopenharmony_ci 0x90440402, 0x00002038, 0x2c200800, 0x40901101, 19762306a36Sopenharmony_ci 0x00000202, 0x00082000, 0x20000000, 0x00000005, 19862306a36Sopenharmony_ci 0x00040202, 0x00082000, 0x24000000, 0x00100005, 19962306a36Sopenharmony_ci 0x00400202, 0x00082008, 0x20000800, 0x40000005, 20062306a36Sopenharmony_ci 0x00440202, 0x00082008, 0x24000800, 0x40100005, 20162306a36Sopenharmony_ci 0x00000602, 0x00082020, 0x28000000, 0x00000105, 20262306a36Sopenharmony_ci 0x00040602, 0x00082020, 0x2c000000, 0x00100105, 20362306a36Sopenharmony_ci 0x00400602, 0x00082028, 0x28000800, 0x40000105, 20462306a36Sopenharmony_ci 0x00440602, 0x00082028, 0x2c000800, 0x40100105, 20562306a36Sopenharmony_ci 0x80000202, 0x00082010, 0x20000000, 0x00800005, 20662306a36Sopenharmony_ci 0x80040202, 0x00082010, 0x24000000, 0x00900005, 20762306a36Sopenharmony_ci 0x80400202, 0x00082018, 0x20000800, 0x40800005, 20862306a36Sopenharmony_ci 0x80440202, 0x00082018, 0x24000800, 0x40900005, 20962306a36Sopenharmony_ci 0x80000602, 0x00082030, 0x28000000, 0x00800105, 21062306a36Sopenharmony_ci 0x80040602, 0x00082030, 0x2c000000, 0x00900105, 21162306a36Sopenharmony_ci 0x80400602, 0x00082038, 0x28000800, 0x40800105, 21262306a36Sopenharmony_ci 0x80440602, 0x00082038, 0x2c000800, 0x40900105, 21362306a36Sopenharmony_ci 0x10000202, 0x00082000, 0x20200000, 0x00001005, 21462306a36Sopenharmony_ci 0x10040202, 0x00082000, 0x24200000, 0x00101005, 21562306a36Sopenharmony_ci 0x10400202, 0x00082008, 0x20200800, 0x40001005, 21662306a36Sopenharmony_ci 0x10440202, 0x00082008, 0x24200800, 0x40101005, 21762306a36Sopenharmony_ci 0x10000602, 0x00082020, 0x28200000, 0x00001105, 21862306a36Sopenharmony_ci 0x10040602, 0x00082020, 0x2c200000, 0x00101105, 21962306a36Sopenharmony_ci 0x10400602, 0x00082028, 0x28200800, 0x40001105, 22062306a36Sopenharmony_ci 0x10440602, 0x00082028, 0x2c200800, 0x40101105, 22162306a36Sopenharmony_ci 0x90000202, 0x00082010, 0x20200000, 0x00801005, 22262306a36Sopenharmony_ci 0x90040202, 0x00082010, 0x24200000, 0x00901005, 22362306a36Sopenharmony_ci 0x90400202, 0x00082018, 0x20200800, 0x40801005, 22462306a36Sopenharmony_ci 0x90440202, 0x00082018, 0x24200800, 0x40901005, 22562306a36Sopenharmony_ci 0x90000602, 0x00082030, 0x28200000, 0x00801105, 22662306a36Sopenharmony_ci 0x90040602, 0x00082030, 0x2c200000, 0x00901105, 22762306a36Sopenharmony_ci 0x90400602, 0x00082038, 0x28200800, 0x40801105, 22862306a36Sopenharmony_ci 0x90440602, 0x00082038, 0x2c200800, 0x40901105, 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci 0x00000000, 0x00000000, 0x00000000, 0x00000000, 23162306a36Sopenharmony_ci 0x00000000, 0x00000008, 0x00080000, 0x10000000, 23262306a36Sopenharmony_ci 0x02000000, 0x00000000, 0x00000080, 0x00001000, 23362306a36Sopenharmony_ci 0x02000000, 0x00000008, 0x00080080, 0x10001000, 23462306a36Sopenharmony_ci 0x00004000, 0x00000000, 0x00000040, 0x00040000, 23562306a36Sopenharmony_ci 0x00004000, 0x00000008, 0x00080040, 0x10040000, 23662306a36Sopenharmony_ci 0x02004000, 0x00000000, 0x000000c0, 0x00041000, 23762306a36Sopenharmony_ci 0x02004000, 0x00000008, 0x000800c0, 0x10041000, 23862306a36Sopenharmony_ci 0x00020000, 0x00008000, 0x08000000, 0x00200000, 23962306a36Sopenharmony_ci 0x00020000, 0x00008008, 0x08080000, 0x10200000, 24062306a36Sopenharmony_ci 0x02020000, 0x00008000, 0x08000080, 0x00201000, 24162306a36Sopenharmony_ci 0x02020000, 0x00008008, 0x08080080, 0x10201000, 24262306a36Sopenharmony_ci 0x00024000, 0x00008000, 0x08000040, 0x00240000, 24362306a36Sopenharmony_ci 0x00024000, 0x00008008, 0x08080040, 0x10240000, 24462306a36Sopenharmony_ci 0x02024000, 0x00008000, 0x080000c0, 0x00241000, 24562306a36Sopenharmony_ci 0x02024000, 0x00008008, 0x080800c0, 0x10241000, 24662306a36Sopenharmony_ci 0x00000000, 0x01000000, 0x00002000, 0x00000020, 24762306a36Sopenharmony_ci 0x00000000, 0x01000008, 0x00082000, 0x10000020, 24862306a36Sopenharmony_ci 0x02000000, 0x01000000, 0x00002080, 0x00001020, 24962306a36Sopenharmony_ci 0x02000000, 0x01000008, 0x00082080, 0x10001020, 25062306a36Sopenharmony_ci 0x00004000, 0x01000000, 0x00002040, 0x00040020, 25162306a36Sopenharmony_ci 0x00004000, 0x01000008, 0x00082040, 0x10040020, 25262306a36Sopenharmony_ci 0x02004000, 0x01000000, 0x000020c0, 0x00041020, 25362306a36Sopenharmony_ci 0x02004000, 0x01000008, 0x000820c0, 0x10041020, 25462306a36Sopenharmony_ci 0x00020000, 0x01008000, 0x08002000, 0x00200020, 25562306a36Sopenharmony_ci 0x00020000, 0x01008008, 0x08082000, 0x10200020, 25662306a36Sopenharmony_ci 0x02020000, 0x01008000, 0x08002080, 0x00201020, 25762306a36Sopenharmony_ci 0x02020000, 0x01008008, 0x08082080, 0x10201020, 25862306a36Sopenharmony_ci 0x00024000, 0x01008000, 0x08002040, 0x00240020, 25962306a36Sopenharmony_ci 0x00024000, 0x01008008, 0x08082040, 0x10240020, 26062306a36Sopenharmony_ci 0x02024000, 0x01008000, 0x080020c0, 0x00241020, 26162306a36Sopenharmony_ci 0x02024000, 0x01008008, 0x080820c0, 0x10241020, 26262306a36Sopenharmony_ci 0x00000400, 0x04000000, 0x00100000, 0x00000004, 26362306a36Sopenharmony_ci 0x00000400, 0x04000008, 0x00180000, 0x10000004, 26462306a36Sopenharmony_ci 0x02000400, 0x04000000, 0x00100080, 0x00001004, 26562306a36Sopenharmony_ci 0x02000400, 0x04000008, 0x00180080, 0x10001004, 26662306a36Sopenharmony_ci 0x00004400, 0x04000000, 0x00100040, 0x00040004, 26762306a36Sopenharmony_ci 0x00004400, 0x04000008, 0x00180040, 0x10040004, 26862306a36Sopenharmony_ci 0x02004400, 0x04000000, 0x001000c0, 0x00041004, 26962306a36Sopenharmony_ci 0x02004400, 0x04000008, 0x001800c0, 0x10041004, 27062306a36Sopenharmony_ci 0x00020400, 0x04008000, 0x08100000, 0x00200004, 27162306a36Sopenharmony_ci 0x00020400, 0x04008008, 0x08180000, 0x10200004, 27262306a36Sopenharmony_ci 0x02020400, 0x04008000, 0x08100080, 0x00201004, 27362306a36Sopenharmony_ci 0x02020400, 0x04008008, 0x08180080, 0x10201004, 27462306a36Sopenharmony_ci 0x00024400, 0x04008000, 0x08100040, 0x00240004, 27562306a36Sopenharmony_ci 0x00024400, 0x04008008, 0x08180040, 0x10240004, 27662306a36Sopenharmony_ci 0x02024400, 0x04008000, 0x081000c0, 0x00241004, 27762306a36Sopenharmony_ci 0x02024400, 0x04008008, 0x081800c0, 0x10241004, 27862306a36Sopenharmony_ci 0x00000400, 0x05000000, 0x00102000, 0x00000024, 27962306a36Sopenharmony_ci 0x00000400, 0x05000008, 0x00182000, 0x10000024, 28062306a36Sopenharmony_ci 0x02000400, 0x05000000, 0x00102080, 0x00001024, 28162306a36Sopenharmony_ci 0x02000400, 0x05000008, 0x00182080, 0x10001024, 28262306a36Sopenharmony_ci 0x00004400, 0x05000000, 0x00102040, 0x00040024, 28362306a36Sopenharmony_ci 0x00004400, 0x05000008, 0x00182040, 0x10040024, 28462306a36Sopenharmony_ci 0x02004400, 0x05000000, 0x001020c0, 0x00041024, 28562306a36Sopenharmony_ci 0x02004400, 0x05000008, 0x001820c0, 0x10041024, 28662306a36Sopenharmony_ci 0x00020400, 0x05008000, 0x08102000, 0x00200024, 28762306a36Sopenharmony_ci 0x00020400, 0x05008008, 0x08182000, 0x10200024, 28862306a36Sopenharmony_ci 0x02020400, 0x05008000, 0x08102080, 0x00201024, 28962306a36Sopenharmony_ci 0x02020400, 0x05008008, 0x08182080, 0x10201024, 29062306a36Sopenharmony_ci 0x00024400, 0x05008000, 0x08102040, 0x00240024, 29162306a36Sopenharmony_ci 0x00024400, 0x05008008, 0x08182040, 0x10240024, 29262306a36Sopenharmony_ci 0x02024400, 0x05008000, 0x081020c0, 0x00241024, 29362306a36Sopenharmony_ci 0x02024400, 0x05008008, 0x081820c0, 0x10241024, 29462306a36Sopenharmony_ci 0x00000800, 0x00010000, 0x20000000, 0x00000010, 29562306a36Sopenharmony_ci 0x00000800, 0x00010008, 0x20080000, 0x10000010, 29662306a36Sopenharmony_ci 0x02000800, 0x00010000, 0x20000080, 0x00001010, 29762306a36Sopenharmony_ci 0x02000800, 0x00010008, 0x20080080, 0x10001010, 29862306a36Sopenharmony_ci 0x00004800, 0x00010000, 0x20000040, 0x00040010, 29962306a36Sopenharmony_ci 0x00004800, 0x00010008, 0x20080040, 0x10040010, 30062306a36Sopenharmony_ci 0x02004800, 0x00010000, 0x200000c0, 0x00041010, 30162306a36Sopenharmony_ci 0x02004800, 0x00010008, 0x200800c0, 0x10041010, 30262306a36Sopenharmony_ci 0x00020800, 0x00018000, 0x28000000, 0x00200010, 30362306a36Sopenharmony_ci 0x00020800, 0x00018008, 0x28080000, 0x10200010, 30462306a36Sopenharmony_ci 0x02020800, 0x00018000, 0x28000080, 0x00201010, 30562306a36Sopenharmony_ci 0x02020800, 0x00018008, 0x28080080, 0x10201010, 30662306a36Sopenharmony_ci 0x00024800, 0x00018000, 0x28000040, 0x00240010, 30762306a36Sopenharmony_ci 0x00024800, 0x00018008, 0x28080040, 0x10240010, 30862306a36Sopenharmony_ci 0x02024800, 0x00018000, 0x280000c0, 0x00241010, 30962306a36Sopenharmony_ci 0x02024800, 0x00018008, 0x280800c0, 0x10241010, 31062306a36Sopenharmony_ci 0x00000800, 0x01010000, 0x20002000, 0x00000030, 31162306a36Sopenharmony_ci 0x00000800, 0x01010008, 0x20082000, 0x10000030, 31262306a36Sopenharmony_ci 0x02000800, 0x01010000, 0x20002080, 0x00001030, 31362306a36Sopenharmony_ci 0x02000800, 0x01010008, 0x20082080, 0x10001030, 31462306a36Sopenharmony_ci 0x00004800, 0x01010000, 0x20002040, 0x00040030, 31562306a36Sopenharmony_ci 0x00004800, 0x01010008, 0x20082040, 0x10040030, 31662306a36Sopenharmony_ci 0x02004800, 0x01010000, 0x200020c0, 0x00041030, 31762306a36Sopenharmony_ci 0x02004800, 0x01010008, 0x200820c0, 0x10041030, 31862306a36Sopenharmony_ci 0x00020800, 0x01018000, 0x28002000, 0x00200030, 31962306a36Sopenharmony_ci 0x00020800, 0x01018008, 0x28082000, 0x10200030, 32062306a36Sopenharmony_ci 0x02020800, 0x01018000, 0x28002080, 0x00201030, 32162306a36Sopenharmony_ci 0x02020800, 0x01018008, 0x28082080, 0x10201030, 32262306a36Sopenharmony_ci 0x00024800, 0x01018000, 0x28002040, 0x00240030, 32362306a36Sopenharmony_ci 0x00024800, 0x01018008, 0x28082040, 0x10240030, 32462306a36Sopenharmony_ci 0x02024800, 0x01018000, 0x280020c0, 0x00241030, 32562306a36Sopenharmony_ci 0x02024800, 0x01018008, 0x280820c0, 0x10241030, 32662306a36Sopenharmony_ci 0x00000c00, 0x04010000, 0x20100000, 0x00000014, 32762306a36Sopenharmony_ci 0x00000c00, 0x04010008, 0x20180000, 0x10000014, 32862306a36Sopenharmony_ci 0x02000c00, 0x04010000, 0x20100080, 0x00001014, 32962306a36Sopenharmony_ci 0x02000c00, 0x04010008, 0x20180080, 0x10001014, 33062306a36Sopenharmony_ci 0x00004c00, 0x04010000, 0x20100040, 0x00040014, 33162306a36Sopenharmony_ci 0x00004c00, 0x04010008, 0x20180040, 0x10040014, 33262306a36Sopenharmony_ci 0x02004c00, 0x04010000, 0x201000c0, 0x00041014, 33362306a36Sopenharmony_ci 0x02004c00, 0x04010008, 0x201800c0, 0x10041014, 33462306a36Sopenharmony_ci 0x00020c00, 0x04018000, 0x28100000, 0x00200014, 33562306a36Sopenharmony_ci 0x00020c00, 0x04018008, 0x28180000, 0x10200014, 33662306a36Sopenharmony_ci 0x02020c00, 0x04018000, 0x28100080, 0x00201014, 33762306a36Sopenharmony_ci 0x02020c00, 0x04018008, 0x28180080, 0x10201014, 33862306a36Sopenharmony_ci 0x00024c00, 0x04018000, 0x28100040, 0x00240014, 33962306a36Sopenharmony_ci 0x00024c00, 0x04018008, 0x28180040, 0x10240014, 34062306a36Sopenharmony_ci 0x02024c00, 0x04018000, 0x281000c0, 0x00241014, 34162306a36Sopenharmony_ci 0x02024c00, 0x04018008, 0x281800c0, 0x10241014, 34262306a36Sopenharmony_ci 0x00000c00, 0x05010000, 0x20102000, 0x00000034, 34362306a36Sopenharmony_ci 0x00000c00, 0x05010008, 0x20182000, 0x10000034, 34462306a36Sopenharmony_ci 0x02000c00, 0x05010000, 0x20102080, 0x00001034, 34562306a36Sopenharmony_ci 0x02000c00, 0x05010008, 0x20182080, 0x10001034, 34662306a36Sopenharmony_ci 0x00004c00, 0x05010000, 0x20102040, 0x00040034, 34762306a36Sopenharmony_ci 0x00004c00, 0x05010008, 0x20182040, 0x10040034, 34862306a36Sopenharmony_ci 0x02004c00, 0x05010000, 0x201020c0, 0x00041034, 34962306a36Sopenharmony_ci 0x02004c00, 0x05010008, 0x201820c0, 0x10041034, 35062306a36Sopenharmony_ci 0x00020c00, 0x05018000, 0x28102000, 0x00200034, 35162306a36Sopenharmony_ci 0x00020c00, 0x05018008, 0x28182000, 0x10200034, 35262306a36Sopenharmony_ci 0x02020c00, 0x05018000, 0x28102080, 0x00201034, 35362306a36Sopenharmony_ci 0x02020c00, 0x05018008, 0x28182080, 0x10201034, 35462306a36Sopenharmony_ci 0x00024c00, 0x05018000, 0x28102040, 0x00240034, 35562306a36Sopenharmony_ci 0x00024c00, 0x05018008, 0x28182040, 0x10240034, 35662306a36Sopenharmony_ci 0x02024c00, 0x05018000, 0x281020c0, 0x00241034, 35762306a36Sopenharmony_ci 0x02024c00, 0x05018008, 0x281820c0, 0x10241034 35862306a36Sopenharmony_ci}; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci/* S-box lookup tables */ 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistatic const u32 S1[64] = { 36362306a36Sopenharmony_ci 0x01010400, 0x00000000, 0x00010000, 0x01010404, 36462306a36Sopenharmony_ci 0x01010004, 0x00010404, 0x00000004, 0x00010000, 36562306a36Sopenharmony_ci 0x00000400, 0x01010400, 0x01010404, 0x00000400, 36662306a36Sopenharmony_ci 0x01000404, 0x01010004, 0x01000000, 0x00000004, 36762306a36Sopenharmony_ci 0x00000404, 0x01000400, 0x01000400, 0x00010400, 36862306a36Sopenharmony_ci 0x00010400, 0x01010000, 0x01010000, 0x01000404, 36962306a36Sopenharmony_ci 0x00010004, 0x01000004, 0x01000004, 0x00010004, 37062306a36Sopenharmony_ci 0x00000000, 0x00000404, 0x00010404, 0x01000000, 37162306a36Sopenharmony_ci 0x00010000, 0x01010404, 0x00000004, 0x01010000, 37262306a36Sopenharmony_ci 0x01010400, 0x01000000, 0x01000000, 0x00000400, 37362306a36Sopenharmony_ci 0x01010004, 0x00010000, 0x00010400, 0x01000004, 37462306a36Sopenharmony_ci 0x00000400, 0x00000004, 0x01000404, 0x00010404, 37562306a36Sopenharmony_ci 0x01010404, 0x00010004, 0x01010000, 0x01000404, 37662306a36Sopenharmony_ci 0x01000004, 0x00000404, 0x00010404, 0x01010400, 37762306a36Sopenharmony_ci 0x00000404, 0x01000400, 0x01000400, 0x00000000, 37862306a36Sopenharmony_ci 0x00010004, 0x00010400, 0x00000000, 0x01010004 37962306a36Sopenharmony_ci}; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cistatic const u32 S2[64] = { 38262306a36Sopenharmony_ci 0x80108020, 0x80008000, 0x00008000, 0x00108020, 38362306a36Sopenharmony_ci 0x00100000, 0x00000020, 0x80100020, 0x80008020, 38462306a36Sopenharmony_ci 0x80000020, 0x80108020, 0x80108000, 0x80000000, 38562306a36Sopenharmony_ci 0x80008000, 0x00100000, 0x00000020, 0x80100020, 38662306a36Sopenharmony_ci 0x00108000, 0x00100020, 0x80008020, 0x00000000, 38762306a36Sopenharmony_ci 0x80000000, 0x00008000, 0x00108020, 0x80100000, 38862306a36Sopenharmony_ci 0x00100020, 0x80000020, 0x00000000, 0x00108000, 38962306a36Sopenharmony_ci 0x00008020, 0x80108000, 0x80100000, 0x00008020, 39062306a36Sopenharmony_ci 0x00000000, 0x00108020, 0x80100020, 0x00100000, 39162306a36Sopenharmony_ci 0x80008020, 0x80100000, 0x80108000, 0x00008000, 39262306a36Sopenharmony_ci 0x80100000, 0x80008000, 0x00000020, 0x80108020, 39362306a36Sopenharmony_ci 0x00108020, 0x00000020, 0x00008000, 0x80000000, 39462306a36Sopenharmony_ci 0x00008020, 0x80108000, 0x00100000, 0x80000020, 39562306a36Sopenharmony_ci 0x00100020, 0x80008020, 0x80000020, 0x00100020, 39662306a36Sopenharmony_ci 0x00108000, 0x00000000, 0x80008000, 0x00008020, 39762306a36Sopenharmony_ci 0x80000000, 0x80100020, 0x80108020, 0x00108000 39862306a36Sopenharmony_ci}; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cistatic const u32 S3[64] = { 40162306a36Sopenharmony_ci 0x00000208, 0x08020200, 0x00000000, 0x08020008, 40262306a36Sopenharmony_ci 0x08000200, 0x00000000, 0x00020208, 0x08000200, 40362306a36Sopenharmony_ci 0x00020008, 0x08000008, 0x08000008, 0x00020000, 40462306a36Sopenharmony_ci 0x08020208, 0x00020008, 0x08020000, 0x00000208, 40562306a36Sopenharmony_ci 0x08000000, 0x00000008, 0x08020200, 0x00000200, 40662306a36Sopenharmony_ci 0x00020200, 0x08020000, 0x08020008, 0x00020208, 40762306a36Sopenharmony_ci 0x08000208, 0x00020200, 0x00020000, 0x08000208, 40862306a36Sopenharmony_ci 0x00000008, 0x08020208, 0x00000200, 0x08000000, 40962306a36Sopenharmony_ci 0x08020200, 0x08000000, 0x00020008, 0x00000208, 41062306a36Sopenharmony_ci 0x00020000, 0x08020200, 0x08000200, 0x00000000, 41162306a36Sopenharmony_ci 0x00000200, 0x00020008, 0x08020208, 0x08000200, 41262306a36Sopenharmony_ci 0x08000008, 0x00000200, 0x00000000, 0x08020008, 41362306a36Sopenharmony_ci 0x08000208, 0x00020000, 0x08000000, 0x08020208, 41462306a36Sopenharmony_ci 0x00000008, 0x00020208, 0x00020200, 0x08000008, 41562306a36Sopenharmony_ci 0x08020000, 0x08000208, 0x00000208, 0x08020000, 41662306a36Sopenharmony_ci 0x00020208, 0x00000008, 0x08020008, 0x00020200 41762306a36Sopenharmony_ci}; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_cistatic const u32 S4[64] = { 42062306a36Sopenharmony_ci 0x00802001, 0x00002081, 0x00002081, 0x00000080, 42162306a36Sopenharmony_ci 0x00802080, 0x00800081, 0x00800001, 0x00002001, 42262306a36Sopenharmony_ci 0x00000000, 0x00802000, 0x00802000, 0x00802081, 42362306a36Sopenharmony_ci 0x00000081, 0x00000000, 0x00800080, 0x00800001, 42462306a36Sopenharmony_ci 0x00000001, 0x00002000, 0x00800000, 0x00802001, 42562306a36Sopenharmony_ci 0x00000080, 0x00800000, 0x00002001, 0x00002080, 42662306a36Sopenharmony_ci 0x00800081, 0x00000001, 0x00002080, 0x00800080, 42762306a36Sopenharmony_ci 0x00002000, 0x00802080, 0x00802081, 0x00000081, 42862306a36Sopenharmony_ci 0x00800080, 0x00800001, 0x00802000, 0x00802081, 42962306a36Sopenharmony_ci 0x00000081, 0x00000000, 0x00000000, 0x00802000, 43062306a36Sopenharmony_ci 0x00002080, 0x00800080, 0x00800081, 0x00000001, 43162306a36Sopenharmony_ci 0x00802001, 0x00002081, 0x00002081, 0x00000080, 43262306a36Sopenharmony_ci 0x00802081, 0x00000081, 0x00000001, 0x00002000, 43362306a36Sopenharmony_ci 0x00800001, 0x00002001, 0x00802080, 0x00800081, 43462306a36Sopenharmony_ci 0x00002001, 0x00002080, 0x00800000, 0x00802001, 43562306a36Sopenharmony_ci 0x00000080, 0x00800000, 0x00002000, 0x00802080 43662306a36Sopenharmony_ci}; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_cistatic const u32 S5[64] = { 43962306a36Sopenharmony_ci 0x00000100, 0x02080100, 0x02080000, 0x42000100, 44062306a36Sopenharmony_ci 0x00080000, 0x00000100, 0x40000000, 0x02080000, 44162306a36Sopenharmony_ci 0x40080100, 0x00080000, 0x02000100, 0x40080100, 44262306a36Sopenharmony_ci 0x42000100, 0x42080000, 0x00080100, 0x40000000, 44362306a36Sopenharmony_ci 0x02000000, 0x40080000, 0x40080000, 0x00000000, 44462306a36Sopenharmony_ci 0x40000100, 0x42080100, 0x42080100, 0x02000100, 44562306a36Sopenharmony_ci 0x42080000, 0x40000100, 0x00000000, 0x42000000, 44662306a36Sopenharmony_ci 0x02080100, 0x02000000, 0x42000000, 0x00080100, 44762306a36Sopenharmony_ci 0x00080000, 0x42000100, 0x00000100, 0x02000000, 44862306a36Sopenharmony_ci 0x40000000, 0x02080000, 0x42000100, 0x40080100, 44962306a36Sopenharmony_ci 0x02000100, 0x40000000, 0x42080000, 0x02080100, 45062306a36Sopenharmony_ci 0x40080100, 0x00000100, 0x02000000, 0x42080000, 45162306a36Sopenharmony_ci 0x42080100, 0x00080100, 0x42000000, 0x42080100, 45262306a36Sopenharmony_ci 0x02080000, 0x00000000, 0x40080000, 0x42000000, 45362306a36Sopenharmony_ci 0x00080100, 0x02000100, 0x40000100, 0x00080000, 45462306a36Sopenharmony_ci 0x00000000, 0x40080000, 0x02080100, 0x40000100 45562306a36Sopenharmony_ci}; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_cistatic const u32 S6[64] = { 45862306a36Sopenharmony_ci 0x20000010, 0x20400000, 0x00004000, 0x20404010, 45962306a36Sopenharmony_ci 0x20400000, 0x00000010, 0x20404010, 0x00400000, 46062306a36Sopenharmony_ci 0x20004000, 0x00404010, 0x00400000, 0x20000010, 46162306a36Sopenharmony_ci 0x00400010, 0x20004000, 0x20000000, 0x00004010, 46262306a36Sopenharmony_ci 0x00000000, 0x00400010, 0x20004010, 0x00004000, 46362306a36Sopenharmony_ci 0x00404000, 0x20004010, 0x00000010, 0x20400010, 46462306a36Sopenharmony_ci 0x20400010, 0x00000000, 0x00404010, 0x20404000, 46562306a36Sopenharmony_ci 0x00004010, 0x00404000, 0x20404000, 0x20000000, 46662306a36Sopenharmony_ci 0x20004000, 0x00000010, 0x20400010, 0x00404000, 46762306a36Sopenharmony_ci 0x20404010, 0x00400000, 0x00004010, 0x20000010, 46862306a36Sopenharmony_ci 0x00400000, 0x20004000, 0x20000000, 0x00004010, 46962306a36Sopenharmony_ci 0x20000010, 0x20404010, 0x00404000, 0x20400000, 47062306a36Sopenharmony_ci 0x00404010, 0x20404000, 0x00000000, 0x20400010, 47162306a36Sopenharmony_ci 0x00000010, 0x00004000, 0x20400000, 0x00404010, 47262306a36Sopenharmony_ci 0x00004000, 0x00400010, 0x20004010, 0x00000000, 47362306a36Sopenharmony_ci 0x20404000, 0x20000000, 0x00400010, 0x20004010 47462306a36Sopenharmony_ci}; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_cistatic const u32 S7[64] = { 47762306a36Sopenharmony_ci 0x00200000, 0x04200002, 0x04000802, 0x00000000, 47862306a36Sopenharmony_ci 0x00000800, 0x04000802, 0x00200802, 0x04200800, 47962306a36Sopenharmony_ci 0x04200802, 0x00200000, 0x00000000, 0x04000002, 48062306a36Sopenharmony_ci 0x00000002, 0x04000000, 0x04200002, 0x00000802, 48162306a36Sopenharmony_ci 0x04000800, 0x00200802, 0x00200002, 0x04000800, 48262306a36Sopenharmony_ci 0x04000002, 0x04200000, 0x04200800, 0x00200002, 48362306a36Sopenharmony_ci 0x04200000, 0x00000800, 0x00000802, 0x04200802, 48462306a36Sopenharmony_ci 0x00200800, 0x00000002, 0x04000000, 0x00200800, 48562306a36Sopenharmony_ci 0x04000000, 0x00200800, 0x00200000, 0x04000802, 48662306a36Sopenharmony_ci 0x04000802, 0x04200002, 0x04200002, 0x00000002, 48762306a36Sopenharmony_ci 0x00200002, 0x04000000, 0x04000800, 0x00200000, 48862306a36Sopenharmony_ci 0x04200800, 0x00000802, 0x00200802, 0x04200800, 48962306a36Sopenharmony_ci 0x00000802, 0x04000002, 0x04200802, 0x04200000, 49062306a36Sopenharmony_ci 0x00200800, 0x00000000, 0x00000002, 0x04200802, 49162306a36Sopenharmony_ci 0x00000000, 0x00200802, 0x04200000, 0x00000800, 49262306a36Sopenharmony_ci 0x04000002, 0x04000800, 0x00000800, 0x00200002 49362306a36Sopenharmony_ci}; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_cistatic const u32 S8[64] = { 49662306a36Sopenharmony_ci 0x10001040, 0x00001000, 0x00040000, 0x10041040, 49762306a36Sopenharmony_ci 0x10000000, 0x10001040, 0x00000040, 0x10000000, 49862306a36Sopenharmony_ci 0x00040040, 0x10040000, 0x10041040, 0x00041000, 49962306a36Sopenharmony_ci 0x10041000, 0x00041040, 0x00001000, 0x00000040, 50062306a36Sopenharmony_ci 0x10040000, 0x10000040, 0x10001000, 0x00001040, 50162306a36Sopenharmony_ci 0x00041000, 0x00040040, 0x10040040, 0x10041000, 50262306a36Sopenharmony_ci 0x00001040, 0x00000000, 0x00000000, 0x10040040, 50362306a36Sopenharmony_ci 0x10000040, 0x10001000, 0x00041040, 0x00040000, 50462306a36Sopenharmony_ci 0x00041040, 0x00040000, 0x10041000, 0x00001000, 50562306a36Sopenharmony_ci 0x00000040, 0x10040040, 0x00001000, 0x00041040, 50662306a36Sopenharmony_ci 0x10001000, 0x00000040, 0x10000040, 0x10040000, 50762306a36Sopenharmony_ci 0x10040040, 0x10000000, 0x00040000, 0x10001040, 50862306a36Sopenharmony_ci 0x00000000, 0x10041040, 0x00040040, 0x10000040, 50962306a36Sopenharmony_ci 0x10040000, 0x10001000, 0x10001040, 0x00000000, 51062306a36Sopenharmony_ci 0x10041040, 0x00041000, 0x00041000, 0x00001040, 51162306a36Sopenharmony_ci 0x00001040, 0x00040040, 0x10000000, 0x10041000 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci/* Encryption components: IP, FP, and round function */ 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci#define IP(L, R, T) \ 51762306a36Sopenharmony_ci ROL(R, 4); \ 51862306a36Sopenharmony_ci T = L; \ 51962306a36Sopenharmony_ci L ^= R; \ 52062306a36Sopenharmony_ci L &= 0xf0f0f0f0; \ 52162306a36Sopenharmony_ci R ^= L; \ 52262306a36Sopenharmony_ci L ^= T; \ 52362306a36Sopenharmony_ci ROL(R, 12); \ 52462306a36Sopenharmony_ci T = L; \ 52562306a36Sopenharmony_ci L ^= R; \ 52662306a36Sopenharmony_ci L &= 0xffff0000; \ 52762306a36Sopenharmony_ci R ^= L; \ 52862306a36Sopenharmony_ci L ^= T; \ 52962306a36Sopenharmony_ci ROR(R, 14); \ 53062306a36Sopenharmony_ci T = L; \ 53162306a36Sopenharmony_ci L ^= R; \ 53262306a36Sopenharmony_ci L &= 0xcccccccc; \ 53362306a36Sopenharmony_ci R ^= L; \ 53462306a36Sopenharmony_ci L ^= T; \ 53562306a36Sopenharmony_ci ROL(R, 6); \ 53662306a36Sopenharmony_ci T = L; \ 53762306a36Sopenharmony_ci L ^= R; \ 53862306a36Sopenharmony_ci L &= 0xff00ff00; \ 53962306a36Sopenharmony_ci R ^= L; \ 54062306a36Sopenharmony_ci L ^= T; \ 54162306a36Sopenharmony_ci ROR(R, 7); \ 54262306a36Sopenharmony_ci T = L; \ 54362306a36Sopenharmony_ci L ^= R; \ 54462306a36Sopenharmony_ci L &= 0xaaaaaaaa; \ 54562306a36Sopenharmony_ci R ^= L; \ 54662306a36Sopenharmony_ci L ^= T; \ 54762306a36Sopenharmony_ci ROL(L, 1); 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci#define FP(L, R, T) \ 55062306a36Sopenharmony_ci ROR(L, 1); \ 55162306a36Sopenharmony_ci T = L; \ 55262306a36Sopenharmony_ci L ^= R; \ 55362306a36Sopenharmony_ci L &= 0xaaaaaaaa; \ 55462306a36Sopenharmony_ci R ^= L; \ 55562306a36Sopenharmony_ci L ^= T; \ 55662306a36Sopenharmony_ci ROL(R, 7); \ 55762306a36Sopenharmony_ci T = L; \ 55862306a36Sopenharmony_ci L ^= R; \ 55962306a36Sopenharmony_ci L &= 0xff00ff00; \ 56062306a36Sopenharmony_ci R ^= L; \ 56162306a36Sopenharmony_ci L ^= T; \ 56262306a36Sopenharmony_ci ROR(R, 6); \ 56362306a36Sopenharmony_ci T = L; \ 56462306a36Sopenharmony_ci L ^= R; \ 56562306a36Sopenharmony_ci L &= 0xcccccccc; \ 56662306a36Sopenharmony_ci R ^= L; \ 56762306a36Sopenharmony_ci L ^= T; \ 56862306a36Sopenharmony_ci ROL(R, 14); \ 56962306a36Sopenharmony_ci T = L; \ 57062306a36Sopenharmony_ci L ^= R; \ 57162306a36Sopenharmony_ci L &= 0xffff0000; \ 57262306a36Sopenharmony_ci R ^= L; \ 57362306a36Sopenharmony_ci L ^= T; \ 57462306a36Sopenharmony_ci ROR(R, 12); \ 57562306a36Sopenharmony_ci T = L; \ 57662306a36Sopenharmony_ci L ^= R; \ 57762306a36Sopenharmony_ci L &= 0xf0f0f0f0; \ 57862306a36Sopenharmony_ci R ^= L; \ 57962306a36Sopenharmony_ci L ^= T; \ 58062306a36Sopenharmony_ci ROR(R, 4); 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci#define ROUND(L, R, A, B, K, d) \ 58362306a36Sopenharmony_ci B = K[0]; A = K[1]; K += d; \ 58462306a36Sopenharmony_ci B ^= R; A ^= R; \ 58562306a36Sopenharmony_ci B &= 0x3f3f3f3f; ROR(A, 4); \ 58662306a36Sopenharmony_ci L ^= S8[0xff & B]; A &= 0x3f3f3f3f; \ 58762306a36Sopenharmony_ci L ^= S6[0xff & (B >> 8)]; B >>= 16; \ 58862306a36Sopenharmony_ci L ^= S7[0xff & A]; \ 58962306a36Sopenharmony_ci L ^= S5[0xff & (A >> 8)]; A >>= 16; \ 59062306a36Sopenharmony_ci L ^= S4[0xff & B]; \ 59162306a36Sopenharmony_ci L ^= S2[0xff & (B >> 8)]; \ 59262306a36Sopenharmony_ci L ^= S3[0xff & A]; \ 59362306a36Sopenharmony_ci L ^= S1[0xff & (A >> 8)]; 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci/* 59662306a36Sopenharmony_ci * PC2 lookup tables are organized as 2 consecutive sets of 4 interleaved 59762306a36Sopenharmony_ci * tables of 128 elements. One set is for C_i and the other for D_i, while 59862306a36Sopenharmony_ci * the 4 interleaved tables correspond to four 7-bit subsets of C_i or D_i. 59962306a36Sopenharmony_ci * 60062306a36Sopenharmony_ci * After PC1 each of the variables a,b,c,d contains a 7 bit subset of C_i 60162306a36Sopenharmony_ci * or D_i in bits 7-1 (bit 0 being the least significant). 60262306a36Sopenharmony_ci */ 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci#define T1(x) pt[2 * (x) + 0] 60562306a36Sopenharmony_ci#define T2(x) pt[2 * (x) + 1] 60662306a36Sopenharmony_ci#define T3(x) pt[2 * (x) + 2] 60762306a36Sopenharmony_ci#define T4(x) pt[2 * (x) + 3] 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci#define DES_PC2(a, b, c, d) (T4(d) | T3(c) | T2(b) | T1(a)) 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci/* 61262306a36Sopenharmony_ci * Encryption key expansion 61362306a36Sopenharmony_ci * 61462306a36Sopenharmony_ci * RFC2451: Weak key checks SHOULD be performed. 61562306a36Sopenharmony_ci * 61662306a36Sopenharmony_ci * FIPS 74: 61762306a36Sopenharmony_ci * 61862306a36Sopenharmony_ci * Keys having duals are keys which produce all zeros, all ones, or 61962306a36Sopenharmony_ci * alternating zero-one patterns in the C and D registers after Permuted 62062306a36Sopenharmony_ci * Choice 1 has operated on the key. 62162306a36Sopenharmony_ci * 62262306a36Sopenharmony_ci */ 62362306a36Sopenharmony_cistatic unsigned long des_ekey(u32 *pe, const u8 *k) 62462306a36Sopenharmony_ci{ 62562306a36Sopenharmony_ci /* K&R: long is at least 32 bits */ 62662306a36Sopenharmony_ci unsigned long a, b, c, d, w; 62762306a36Sopenharmony_ci const u32 *pt = pc2; 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ci d = k[4]; d &= 0x0e; d <<= 4; d |= k[0] & 0x1e; d = pc1[d]; 63062306a36Sopenharmony_ci c = k[5]; c &= 0x0e; c <<= 4; c |= k[1] & 0x1e; c = pc1[c]; 63162306a36Sopenharmony_ci b = k[6]; b &= 0x0e; b <<= 4; b |= k[2] & 0x1e; b = pc1[b]; 63262306a36Sopenharmony_ci a = k[7]; a &= 0x0e; a <<= 4; a |= k[3] & 0x1e; a = pc1[a]; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci pe[15 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; 63562306a36Sopenharmony_ci pe[14 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 63662306a36Sopenharmony_ci pe[13 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 63762306a36Sopenharmony_ci pe[12 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 63862306a36Sopenharmony_ci pe[11 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 63962306a36Sopenharmony_ci pe[10 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 64062306a36Sopenharmony_ci pe[ 9 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 64162306a36Sopenharmony_ci pe[ 8 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; 64262306a36Sopenharmony_ci pe[ 7 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 64362306a36Sopenharmony_ci pe[ 6 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 64462306a36Sopenharmony_ci pe[ 5 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 64562306a36Sopenharmony_ci pe[ 4 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 64662306a36Sopenharmony_ci pe[ 3 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 64762306a36Sopenharmony_ci pe[ 2 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 64862306a36Sopenharmony_ci pe[ 1 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; 64962306a36Sopenharmony_ci pe[ 0 * 2 + 0] = DES_PC2(b, c, d, a); 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci /* Check if first half is weak */ 65262306a36Sopenharmony_ci w = (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]); 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci /* Skip to next table set */ 65562306a36Sopenharmony_ci pt += 512; 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ci d = k[0]; d &= 0xe0; d >>= 4; d |= k[4] & 0xf0; d = pc1[d + 1]; 65862306a36Sopenharmony_ci c = k[1]; c &= 0xe0; c >>= 4; c |= k[5] & 0xf0; c = pc1[c + 1]; 65962306a36Sopenharmony_ci b = k[2]; b &= 0xe0; b >>= 4; b |= k[6] & 0xf0; b = pc1[b + 1]; 66062306a36Sopenharmony_ci a = k[3]; a &= 0xe0; a >>= 4; a |= k[7] & 0xf0; a = pc1[a + 1]; 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci /* Check if second half is weak */ 66362306a36Sopenharmony_ci w |= (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]); 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci pe[15 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; 66662306a36Sopenharmony_ci pe[14 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 66762306a36Sopenharmony_ci pe[13 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 66862306a36Sopenharmony_ci pe[12 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 66962306a36Sopenharmony_ci pe[11 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 67062306a36Sopenharmony_ci pe[10 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 67162306a36Sopenharmony_ci pe[ 9 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 67262306a36Sopenharmony_ci pe[ 8 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; 67362306a36Sopenharmony_ci pe[ 7 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 67462306a36Sopenharmony_ci pe[ 6 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 67562306a36Sopenharmony_ci pe[ 5 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 67662306a36Sopenharmony_ci pe[ 4 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 67762306a36Sopenharmony_ci pe[ 3 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 67862306a36Sopenharmony_ci pe[ 2 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 67962306a36Sopenharmony_ci pe[ 1 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; 68062306a36Sopenharmony_ci pe[ 0 * 2 + 1] = DES_PC2(b, c, d, a); 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci /* Fixup: 2413 5768 -> 1357 2468 */ 68362306a36Sopenharmony_ci for (d = 0; d < 16; ++d) { 68462306a36Sopenharmony_ci a = pe[2 * d]; 68562306a36Sopenharmony_ci b = pe[2 * d + 1]; 68662306a36Sopenharmony_ci c = a ^ b; 68762306a36Sopenharmony_ci c &= 0xffff0000; 68862306a36Sopenharmony_ci a ^= c; 68962306a36Sopenharmony_ci b ^= c; 69062306a36Sopenharmony_ci ROL(b, 18); 69162306a36Sopenharmony_ci pe[2 * d] = a; 69262306a36Sopenharmony_ci pe[2 * d + 1] = b; 69362306a36Sopenharmony_ci } 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci /* Zero if weak key */ 69662306a36Sopenharmony_ci return w; 69762306a36Sopenharmony_ci} 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ciint des_expand_key(struct des_ctx *ctx, const u8 *key, unsigned int keylen) 70062306a36Sopenharmony_ci{ 70162306a36Sopenharmony_ci if (keylen != DES_KEY_SIZE) 70262306a36Sopenharmony_ci return -EINVAL; 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci return des_ekey(ctx->expkey, key) ? 0 : -ENOKEY; 70562306a36Sopenharmony_ci} 70662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(des_expand_key); 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci/* 70962306a36Sopenharmony_ci * Decryption key expansion 71062306a36Sopenharmony_ci * 71162306a36Sopenharmony_ci * No weak key checking is performed, as this is only used by triple DES 71262306a36Sopenharmony_ci * 71362306a36Sopenharmony_ci */ 71462306a36Sopenharmony_cistatic void dkey(u32 *pe, const u8 *k) 71562306a36Sopenharmony_ci{ 71662306a36Sopenharmony_ci /* K&R: long is at least 32 bits */ 71762306a36Sopenharmony_ci unsigned long a, b, c, d; 71862306a36Sopenharmony_ci const u32 *pt = pc2; 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci d = k[4]; d &= 0x0e; d <<= 4; d |= k[0] & 0x1e; d = pc1[d]; 72162306a36Sopenharmony_ci c = k[5]; c &= 0x0e; c <<= 4; c |= k[1] & 0x1e; c = pc1[c]; 72262306a36Sopenharmony_ci b = k[6]; b &= 0x0e; b <<= 4; b |= k[2] & 0x1e; b = pc1[b]; 72362306a36Sopenharmony_ci a = k[7]; a &= 0x0e; a <<= 4; a |= k[3] & 0x1e; a = pc1[a]; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci pe[ 0 * 2] = DES_PC2(a, b, c, d); d = rs[d]; 72662306a36Sopenharmony_ci pe[ 1 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 72762306a36Sopenharmony_ci pe[ 2 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 72862306a36Sopenharmony_ci pe[ 3 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 72962306a36Sopenharmony_ci pe[ 4 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 73062306a36Sopenharmony_ci pe[ 5 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 73162306a36Sopenharmony_ci pe[ 6 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 73262306a36Sopenharmony_ci pe[ 7 * 2] = DES_PC2(d, a, b, c); c = rs[c]; 73362306a36Sopenharmony_ci pe[ 8 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 73462306a36Sopenharmony_ci pe[ 9 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 73562306a36Sopenharmony_ci pe[10 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 73662306a36Sopenharmony_ci pe[11 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 73762306a36Sopenharmony_ci pe[12 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 73862306a36Sopenharmony_ci pe[13 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 73962306a36Sopenharmony_ci pe[14 * 2] = DES_PC2(c, d, a, b); b = rs[b]; 74062306a36Sopenharmony_ci pe[15 * 2] = DES_PC2(b, c, d, a); 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_ci /* Skip to next table set */ 74362306a36Sopenharmony_ci pt += 512; 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci d = k[0]; d &= 0xe0; d >>= 4; d |= k[4] & 0xf0; d = pc1[d + 1]; 74662306a36Sopenharmony_ci c = k[1]; c &= 0xe0; c >>= 4; c |= k[5] & 0xf0; c = pc1[c + 1]; 74762306a36Sopenharmony_ci b = k[2]; b &= 0xe0; b >>= 4; b |= k[6] & 0xf0; b = pc1[b + 1]; 74862306a36Sopenharmony_ci a = k[3]; a &= 0xe0; a >>= 4; a |= k[7] & 0xf0; a = pc1[a + 1]; 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci pe[ 0 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; 75162306a36Sopenharmony_ci pe[ 1 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 75262306a36Sopenharmony_ci pe[ 2 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 75362306a36Sopenharmony_ci pe[ 3 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 75462306a36Sopenharmony_ci pe[ 4 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 75562306a36Sopenharmony_ci pe[ 5 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b]; 75662306a36Sopenharmony_ci pe[ 6 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d]; 75762306a36Sopenharmony_ci pe[ 7 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; 75862306a36Sopenharmony_ci pe[ 8 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 75962306a36Sopenharmony_ci pe[ 9 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 76062306a36Sopenharmony_ci pe[10 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 76162306a36Sopenharmony_ci pe[11 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 76262306a36Sopenharmony_ci pe[12 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a]; 76362306a36Sopenharmony_ci pe[13 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c]; 76462306a36Sopenharmony_ci pe[14 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; 76562306a36Sopenharmony_ci pe[15 * 2 + 1] = DES_PC2(b, c, d, a); 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ci /* Fixup: 2413 5768 -> 1357 2468 */ 76862306a36Sopenharmony_ci for (d = 0; d < 16; ++d) { 76962306a36Sopenharmony_ci a = pe[2 * d]; 77062306a36Sopenharmony_ci b = pe[2 * d + 1]; 77162306a36Sopenharmony_ci c = a ^ b; 77262306a36Sopenharmony_ci c &= 0xffff0000; 77362306a36Sopenharmony_ci a ^= c; 77462306a36Sopenharmony_ci b ^= c; 77562306a36Sopenharmony_ci ROL(b, 18); 77662306a36Sopenharmony_ci pe[2 * d] = a; 77762306a36Sopenharmony_ci pe[2 * d + 1] = b; 77862306a36Sopenharmony_ci } 77962306a36Sopenharmony_ci} 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_civoid des_encrypt(const struct des_ctx *ctx, u8 *dst, const u8 *src) 78262306a36Sopenharmony_ci{ 78362306a36Sopenharmony_ci const u32 *K = ctx->expkey; 78462306a36Sopenharmony_ci u32 L, R, A, B; 78562306a36Sopenharmony_ci int i; 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_ci L = get_unaligned_le32(src); 78862306a36Sopenharmony_ci R = get_unaligned_le32(src + 4); 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci IP(L, R, A); 79162306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 79262306a36Sopenharmony_ci ROUND(L, R, A, B, K, 2); 79362306a36Sopenharmony_ci ROUND(R, L, A, B, K, 2); 79462306a36Sopenharmony_ci } 79562306a36Sopenharmony_ci FP(R, L, A); 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci put_unaligned_le32(R, dst); 79862306a36Sopenharmony_ci put_unaligned_le32(L, dst + 4); 79962306a36Sopenharmony_ci} 80062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(des_encrypt); 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_civoid des_decrypt(const struct des_ctx *ctx, u8 *dst, const u8 *src) 80362306a36Sopenharmony_ci{ 80462306a36Sopenharmony_ci const u32 *K = ctx->expkey + DES_EXPKEY_WORDS - 2; 80562306a36Sopenharmony_ci u32 L, R, A, B; 80662306a36Sopenharmony_ci int i; 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci L = get_unaligned_le32(src); 80962306a36Sopenharmony_ci R = get_unaligned_le32(src + 4); 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_ci IP(L, R, A); 81262306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 81362306a36Sopenharmony_ci ROUND(L, R, A, B, K, -2); 81462306a36Sopenharmony_ci ROUND(R, L, A, B, K, -2); 81562306a36Sopenharmony_ci } 81662306a36Sopenharmony_ci FP(R, L, A); 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_ci put_unaligned_le32(R, dst); 81962306a36Sopenharmony_ci put_unaligned_le32(L, dst + 4); 82062306a36Sopenharmony_ci} 82162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(des_decrypt); 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ciint des3_ede_expand_key(struct des3_ede_ctx *ctx, const u8 *key, 82462306a36Sopenharmony_ci unsigned int keylen) 82562306a36Sopenharmony_ci{ 82662306a36Sopenharmony_ci u32 *pe = ctx->expkey; 82762306a36Sopenharmony_ci int err; 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci if (keylen != DES3_EDE_KEY_SIZE) 83062306a36Sopenharmony_ci return -EINVAL; 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ci err = des3_ede_verify_key(key, keylen, true); 83362306a36Sopenharmony_ci if (err && err != -ENOKEY) 83462306a36Sopenharmony_ci return err; 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci des_ekey(pe, key); pe += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; 83762306a36Sopenharmony_ci dkey(pe, key); pe += DES_EXPKEY_WORDS; key += DES_KEY_SIZE; 83862306a36Sopenharmony_ci des_ekey(pe, key); 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci return err; 84162306a36Sopenharmony_ci} 84262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(des3_ede_expand_key); 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_civoid des3_ede_encrypt(const struct des3_ede_ctx *dctx, u8 *dst, const u8 *src) 84562306a36Sopenharmony_ci{ 84662306a36Sopenharmony_ci const u32 *K = dctx->expkey; 84762306a36Sopenharmony_ci u32 L, R, A, B; 84862306a36Sopenharmony_ci int i; 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci L = get_unaligned_le32(src); 85162306a36Sopenharmony_ci R = get_unaligned_le32(src + 4); 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci IP(L, R, A); 85462306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 85562306a36Sopenharmony_ci ROUND(L, R, A, B, K, 2); 85662306a36Sopenharmony_ci ROUND(R, L, A, B, K, 2); 85762306a36Sopenharmony_ci } 85862306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 85962306a36Sopenharmony_ci ROUND(R, L, A, B, K, 2); 86062306a36Sopenharmony_ci ROUND(L, R, A, B, K, 2); 86162306a36Sopenharmony_ci } 86262306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 86362306a36Sopenharmony_ci ROUND(L, R, A, B, K, 2); 86462306a36Sopenharmony_ci ROUND(R, L, A, B, K, 2); 86562306a36Sopenharmony_ci } 86662306a36Sopenharmony_ci FP(R, L, A); 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci put_unaligned_le32(R, dst); 86962306a36Sopenharmony_ci put_unaligned_le32(L, dst + 4); 87062306a36Sopenharmony_ci} 87162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(des3_ede_encrypt); 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_civoid des3_ede_decrypt(const struct des3_ede_ctx *dctx, u8 *dst, const u8 *src) 87462306a36Sopenharmony_ci{ 87562306a36Sopenharmony_ci const u32 *K = dctx->expkey + DES3_EDE_EXPKEY_WORDS - 2; 87662306a36Sopenharmony_ci u32 L, R, A, B; 87762306a36Sopenharmony_ci int i; 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci L = get_unaligned_le32(src); 88062306a36Sopenharmony_ci R = get_unaligned_le32(src + 4); 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci IP(L, R, A); 88362306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 88462306a36Sopenharmony_ci ROUND(L, R, A, B, K, -2); 88562306a36Sopenharmony_ci ROUND(R, L, A, B, K, -2); 88662306a36Sopenharmony_ci } 88762306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 88862306a36Sopenharmony_ci ROUND(R, L, A, B, K, -2); 88962306a36Sopenharmony_ci ROUND(L, R, A, B, K, -2); 89062306a36Sopenharmony_ci } 89162306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 89262306a36Sopenharmony_ci ROUND(L, R, A, B, K, -2); 89362306a36Sopenharmony_ci ROUND(R, L, A, B, K, -2); 89462306a36Sopenharmony_ci } 89562306a36Sopenharmony_ci FP(R, L, A); 89662306a36Sopenharmony_ci 89762306a36Sopenharmony_ci put_unaligned_le32(R, dst); 89862306a36Sopenharmony_ci put_unaligned_le32(L, dst + 4); 89962306a36Sopenharmony_ci} 90062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(des3_ede_decrypt); 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 903