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