Commit e1d5dea1dfbfe484358c40db7f233ed6b5605646

Authored by Dag Arne Osvik
Committed by David S. Miller
1 parent a9df3597fe

[CRYPTO] Add faster DES code from Dag Arne Osvik

I've made a new implementation of DES to replace the old one in the kernel.
It provides faster encryption on all tested processors apart from the original
Pentium, and key setup is many times faster.

                                Speed relative to old kernel implementation
Processor       des_setkey      des_encrypt     des3_ede_setkey des3_ede_encrypt
Pentium
120Mhz          6.8             0.82            7.2             0.86
Pentium III
1.266Ghz        5.6             1.19            5.8             1.34
Pentium M
1.3Ghz          5.7             1.15            6.0             1.31
Pentium 4
2.266Ghz        5.8             1.24            6.0             1.40
Pentium 4E
3Ghz            5.4             1.27            5.5             1.48
StrongARM 1110
206Mhz          4.3             1.03            4.4             1.14
Athlon XP
2Ghz            7.8             1.44            8.1             1.61
Athlon 64
2Ghz            7.8             1.34            8.3             1.49

Signed-off-by: Dag Arne Osvik <da@osvik.no>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 854 additions and 1149 deletions Inline Diff

1 /* 1 /*
2 * Cryptographic API. 2 * Cryptographic API.
3 * 3 *
4 * DES & Triple DES EDE Cipher Algorithms. 4 * DES & Triple DES EDE Cipher Algorithms.
5 * 5 *
6 * Originally released as descore by Dana L. How <how@isl.stanford.edu>. 6 * Copyright (c) 2005 Dag Arne Osvik <da@osvik.no>
7 * Modified by Raimar Falke <rf13@inf.tu-dresden.de> for the Linux-Kernel.
8 * Derived from Cryptoapi and Nettle implementations, adapted for in-place
9 * scatterlist interface. Changed LGPL to GPL per section 3 of the LGPL.
10 * 7 *
11 * Copyright (c) 1992 Dana L. How.
12 * Copyright (c) Raimar Falke <rf13@inf.tu-dresden.de>
13 * Copyright (c) Gisle Sælensminde <gisle@ii.uib.no>
14 * Copyright (C) 2001 Niels Möller.
15 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
16 *
17 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version. 11 * (at your option) any later version.
21 * 12 *
22 */ 13 */
14
15 #include <linux/bitops.h>
23 #include <linux/init.h> 16 #include <linux/init.h>
24 #include <linux/module.h> 17 #include <linux/module.h>
25 #include <linux/mm.h>
26 #include <linux/errno.h> 18 #include <linux/errno.h>
27 #include <asm/scatterlist.h>
28 #include <linux/crypto.h> 19 #include <linux/crypto.h>
29 20
30 #define DES_KEY_SIZE 8 21 #define DES_KEY_SIZE 8
31 #define DES_EXPKEY_WORDS 32 22 #define DES_EXPKEY_WORDS 32
32 #define DES_BLOCK_SIZE 8 23 #define DES_BLOCK_SIZE 8
33 24
34 #define DES3_EDE_KEY_SIZE (3 * DES_KEY_SIZE) 25 #define DES3_EDE_KEY_SIZE (3 * DES_KEY_SIZE)
35 #define DES3_EDE_EXPKEY_WORDS (3 * DES_EXPKEY_WORDS) 26 #define DES3_EDE_EXPKEY_WORDS (3 * DES_EXPKEY_WORDS)
36 #define DES3_EDE_BLOCK_SIZE DES_BLOCK_SIZE 27 #define DES3_EDE_BLOCK_SIZE DES_BLOCK_SIZE
37 28
38 #define ROR(d,c,o) ((d) = (d) >> (c) | (d) << (o)) 29 #define ROL(x, r) ((x) = rol32((x), (r)))
30 #define ROR(x, r) ((x) = ror32((x), (r)))
39 31
40 struct des_ctx { 32 struct des_ctx {
41 u32 expkey[DES_EXPKEY_WORDS]; 33 u32 expkey[DES_EXPKEY_WORDS];
42 }; 34 };
43 35
44 struct des3_ede_ctx { 36 struct des3_ede_ctx {
45 u32 expkey[DES3_EDE_EXPKEY_WORDS]; 37 u32 expkey[DES3_EDE_EXPKEY_WORDS];
46 }; 38 };
47 39
48 static const u32 des_keymap[] = { 40 /* Lookup tables for key expansion */
49 0x02080008, 0x02082000, 0x00002008, 0x00000000,
50 0x02002000, 0x00080008, 0x02080000, 0x02082008,
51 0x00000008, 0x02000000, 0x00082000, 0x00002008,
52 0x00082008, 0x02002008, 0x02000008, 0x02080000,
53 0x00002000, 0x00082008, 0x00080008, 0x02002000,
54 0x02082008, 0x02000008, 0x00000000, 0x00082000,
55 0x02000000, 0x00080000, 0x02002008, 0x02080008,
56 0x00080000, 0x00002000, 0x02082000, 0x00000008,
57 0x00080000, 0x00002000, 0x02000008, 0x02082008,
58 0x00002008, 0x02000000, 0x00000000, 0x00082000,
59 0x02080008, 0x02002008, 0x02002000, 0x00080008,
60 0x02082000, 0x00000008, 0x00080008, 0x02002000,
61 0x02082008, 0x00080000, 0x02080000, 0x02000008,
62 0x00082000, 0x00002008, 0x02002008, 0x02080000,
63 0x00000008, 0x02082000, 0x00082008, 0x00000000,
64 0x02000000, 0x02080008, 0x00002000, 0x00082008,
65 41
66 0x08000004, 0x00020004, 0x00000000, 0x08020200, 42 static const u8 pc1[256] = {
67 0x00020004, 0x00000200, 0x08000204, 0x00020000, 43 0x00, 0x00, 0x40, 0x04, 0x10, 0x10, 0x50, 0x14,
68 0x00000204, 0x08020204, 0x00020200, 0x08000000, 44 0x04, 0x40, 0x44, 0x44, 0x14, 0x50, 0x54, 0x54,
69 0x08000200, 0x08000004, 0x08020000, 0x00020204, 45 0x02, 0x02, 0x42, 0x06, 0x12, 0x12, 0x52, 0x16,
70 0x00020000, 0x08000204, 0x08020004, 0x00000000, 46 0x06, 0x42, 0x46, 0x46, 0x16, 0x52, 0x56, 0x56,
71 0x00000200, 0x00000004, 0x08020200, 0x08020004, 47 0x80, 0x08, 0xc0, 0x0c, 0x90, 0x18, 0xd0, 0x1c,
72 0x08020204, 0x08020000, 0x08000000, 0x00000204, 48 0x84, 0x48, 0xc4, 0x4c, 0x94, 0x58, 0xd4, 0x5c,
73 0x00000004, 0x00020200, 0x00020204, 0x08000200, 49 0x82, 0x0a, 0xc2, 0x0e, 0x92, 0x1a, 0xd2, 0x1e,
74 0x00000204, 0x08000000, 0x08000200, 0x00020204, 50 0x86, 0x4a, 0xc6, 0x4e, 0x96, 0x5a, 0xd6, 0x5e,
75 0x08020200, 0x00020004, 0x00000000, 0x08000200, 51 0x20, 0x20, 0x60, 0x24, 0x30, 0x30, 0x70, 0x34,
76 0x08000000, 0x00000200, 0x08020004, 0x00020000, 52 0x24, 0x60, 0x64, 0x64, 0x34, 0x70, 0x74, 0x74,
77 0x00020004, 0x08020204, 0x00020200, 0x00000004, 53 0x22, 0x22, 0x62, 0x26, 0x32, 0x32, 0x72, 0x36,
78 0x08020204, 0x00020200, 0x00020000, 0x08000204, 54 0x26, 0x62, 0x66, 0x66, 0x36, 0x72, 0x76, 0x76,
79 0x08000004, 0x08020000, 0x00020204, 0x00000000, 55 0xa0, 0x28, 0xe0, 0x2c, 0xb0, 0x38, 0xf0, 0x3c,
80 0x00000200, 0x08000004, 0x08000204, 0x08020200, 56 0xa4, 0x68, 0xe4, 0x6c, 0xb4, 0x78, 0xf4, 0x7c,
81 0x08020000, 0x00000204, 0x00000004, 0x08020004, 57 0xa2, 0x2a, 0xe2, 0x2e, 0xb2, 0x3a, 0xf2, 0x3e,
58 0xa6, 0x6a, 0xe6, 0x6e, 0xb6, 0x7a, 0xf6, 0x7e,
59 0x08, 0x80, 0x48, 0x84, 0x18, 0x90, 0x58, 0x94,
60 0x0c, 0xc0, 0x4c, 0xc4, 0x1c, 0xd0, 0x5c, 0xd4,
61 0x0a, 0x82, 0x4a, 0x86, 0x1a, 0x92, 0x5a, 0x96,
62 0x0e, 0xc2, 0x4e, 0xc6, 0x1e, 0xd2, 0x5e, 0xd6,
63 0x88, 0x88, 0xc8, 0x8c, 0x98, 0x98, 0xd8, 0x9c,
64 0x8c, 0xc8, 0xcc, 0xcc, 0x9c, 0xd8, 0xdc, 0xdc,
65 0x8a, 0x8a, 0xca, 0x8e, 0x9a, 0x9a, 0xda, 0x9e,
66 0x8e, 0xca, 0xce, 0xce, 0x9e, 0xda, 0xde, 0xde,
67 0x28, 0xa0, 0x68, 0xa4, 0x38, 0xb0, 0x78, 0xb4,
68 0x2c, 0xe0, 0x6c, 0xe4, 0x3c, 0xf0, 0x7c, 0xf4,
69 0x2a, 0xa2, 0x6a, 0xa6, 0x3a, 0xb2, 0x7a, 0xb6,
70 0x2e, 0xe2, 0x6e, 0xe6, 0x3e, 0xf2, 0x7e, 0xf6,
71 0xa8, 0xa8, 0xe8, 0xac, 0xb8, 0xb8, 0xf8, 0xbc,
72 0xac, 0xe8, 0xec, 0xec, 0xbc, 0xf8, 0xfc, 0xfc,
73 0xaa, 0xaa, 0xea, 0xae, 0xba, 0xba, 0xfa, 0xbe,
74 0xae, 0xea, 0xee, 0xee, 0xbe, 0xfa, 0xfe, 0xfe
75 };
82 76
83 0x80040100, 0x01000100, 0x80000000, 0x81040100, 77 static const u8 rs[256] = {
84 0x00000000, 0x01040000, 0x81000100, 0x80040000, 78 0x00, 0x00, 0x80, 0x80, 0x02, 0x02, 0x82, 0x82,
85 0x01040100, 0x81000000, 0x01000000, 0x80000100, 79 0x04, 0x04, 0x84, 0x84, 0x06, 0x06, 0x86, 0x86,
86 0x81000000, 0x80040100, 0x00040000, 0x01000000, 80 0x08, 0x08, 0x88, 0x88, 0x0a, 0x0a, 0x8a, 0x8a,
87 0x81040000, 0x00040100, 0x00000100, 0x80000000, 81 0x0c, 0x0c, 0x8c, 0x8c, 0x0e, 0x0e, 0x8e, 0x8e,
88 0x00040100, 0x81000100, 0x01040000, 0x00000100, 82 0x10, 0x10, 0x90, 0x90, 0x12, 0x12, 0x92, 0x92,
89 0x80000100, 0x00000000, 0x80040000, 0x01040100, 83 0x14, 0x14, 0x94, 0x94, 0x16, 0x16, 0x96, 0x96,
90 0x01000100, 0x81040000, 0x81040100, 0x00040000, 84 0x18, 0x18, 0x98, 0x98, 0x1a, 0x1a, 0x9a, 0x9a,
91 0x81040000, 0x80000100, 0x00040000, 0x81000000, 85 0x1c, 0x1c, 0x9c, 0x9c, 0x1e, 0x1e, 0x9e, 0x9e,
92 0x00040100, 0x01000100, 0x80000000, 0x01040000, 86 0x20, 0x20, 0xa0, 0xa0, 0x22, 0x22, 0xa2, 0xa2,
93 0x81000100, 0x00000000, 0x00000100, 0x80040000, 87 0x24, 0x24, 0xa4, 0xa4, 0x26, 0x26, 0xa6, 0xa6,
94 0x00000000, 0x81040000, 0x01040100, 0x00000100, 88 0x28, 0x28, 0xa8, 0xa8, 0x2a, 0x2a, 0xaa, 0xaa,
95 0x01000000, 0x81040100, 0x80040100, 0x00040000, 89 0x2c, 0x2c, 0xac, 0xac, 0x2e, 0x2e, 0xae, 0xae,
96 0x81040100, 0x80000000, 0x01000100, 0x80040100, 90 0x30, 0x30, 0xb0, 0xb0, 0x32, 0x32, 0xb2, 0xb2,
97 0x80040000, 0x00040100, 0x01040000, 0x81000100, 91 0x34, 0x34, 0xb4, 0xb4, 0x36, 0x36, 0xb6, 0xb6,
98 0x80000100, 0x01000000, 0x81000000, 0x01040100, 92 0x38, 0x38, 0xb8, 0xb8, 0x3a, 0x3a, 0xba, 0xba,
93 0x3c, 0x3c, 0xbc, 0xbc, 0x3e, 0x3e, 0xbe, 0xbe,
94 0x40, 0x40, 0xc0, 0xc0, 0x42, 0x42, 0xc2, 0xc2,
95 0x44, 0x44, 0xc4, 0xc4, 0x46, 0x46, 0xc6, 0xc6,
96 0x48, 0x48, 0xc8, 0xc8, 0x4a, 0x4a, 0xca, 0xca,
97 0x4c, 0x4c, 0xcc, 0xcc, 0x4e, 0x4e, 0xce, 0xce,
98 0x50, 0x50, 0xd0, 0xd0, 0x52, 0x52, 0xd2, 0xd2,
99 0x54, 0x54, 0xd4, 0xd4, 0x56, 0x56, 0xd6, 0xd6,
100 0x58, 0x58, 0xd8, 0xd8, 0x5a, 0x5a, 0xda, 0xda,
101 0x5c, 0x5c, 0xdc, 0xdc, 0x5e, 0x5e, 0xde, 0xde,
102 0x60, 0x60, 0xe0, 0xe0, 0x62, 0x62, 0xe2, 0xe2,
103 0x64, 0x64, 0xe4, 0xe4, 0x66, 0x66, 0xe6, 0xe6,
104 0x68, 0x68, 0xe8, 0xe8, 0x6a, 0x6a, 0xea, 0xea,
105 0x6c, 0x6c, 0xec, 0xec, 0x6e, 0x6e, 0xee, 0xee,
106 0x70, 0x70, 0xf0, 0xf0, 0x72, 0x72, 0xf2, 0xf2,
107 0x74, 0x74, 0xf4, 0xf4, 0x76, 0x76, 0xf6, 0xf6,
108 0x78, 0x78, 0xf8, 0xf8, 0x7a, 0x7a, 0xfa, 0xfa,
109 0x7c, 0x7c, 0xfc, 0xfc, 0x7e, 0x7e, 0xfe, 0xfe
110 };
99 111
100 0x04010801, 0x00000000, 0x00010800, 0x04010000, 112 static const u32 pc2[1024] = {
101 0x04000001, 0x00000801, 0x04000800, 0x00010800, 113 0x00000000, 0x00000000, 0x00000000, 0x00000000,
102 0x00000800, 0x04010001, 0x00000001, 0x04000800, 114 0x00040000, 0x00000000, 0x04000000, 0x00100000,
103 0x00010001, 0x04010800, 0x04010000, 0x00000001, 115 0x00400000, 0x00000008, 0x00000800, 0x40000000,
104 0x00010000, 0x04000801, 0x04010001, 0x00000800, 116 0x00440000, 0x00000008, 0x04000800, 0x40100000,
105 0x00010801, 0x04000000, 0x00000000, 0x00010001, 117 0x00000400, 0x00000020, 0x08000000, 0x00000100,
106 0x04000801, 0x00010801, 0x04010800, 0x04000001, 118 0x00040400, 0x00000020, 0x0c000000, 0x00100100,
107 0x04000000, 0x00010000, 0x00000801, 0x04010801, 119 0x00400400, 0x00000028, 0x08000800, 0x40000100,
108 0x00010001, 0x04010800, 0x04000800, 0x00010801, 120 0x00440400, 0x00000028, 0x0c000800, 0x40100100,
109 0x04010801, 0x00010001, 0x04000001, 0x00000000, 121 0x80000000, 0x00000010, 0x00000000, 0x00800000,
110 0x04000000, 0x00000801, 0x00010000, 0x04010001, 122 0x80040000, 0x00000010, 0x04000000, 0x00900000,
111 0x00000800, 0x04000000, 0x00010801, 0x04000801, 123 0x80400000, 0x00000018, 0x00000800, 0x40800000,
112 0x04010800, 0x00000800, 0x00000000, 0x04000001, 124 0x80440000, 0x00000018, 0x04000800, 0x40900000,
113 0x00000001, 0x04010801, 0x00010800, 0x04010000, 125 0x80000400, 0x00000030, 0x08000000, 0x00800100,
114 0x04010001, 0x00010000, 0x00000801, 0x04000800, 126 0x80040400, 0x00000030, 0x0c000000, 0x00900100,
115 0x04000801, 0x00000001, 0x04010000, 0x00010800, 127 0x80400400, 0x00000038, 0x08000800, 0x40800100,
128 0x80440400, 0x00000038, 0x0c000800, 0x40900100,
129 0x10000000, 0x00000000, 0x00200000, 0x00001000,
130 0x10040000, 0x00000000, 0x04200000, 0x00101000,
131 0x10400000, 0x00000008, 0x00200800, 0x40001000,
132 0x10440000, 0x00000008, 0x04200800, 0x40101000,
133 0x10000400, 0x00000020, 0x08200000, 0x00001100,
134 0x10040400, 0x00000020, 0x0c200000, 0x00101100,
135 0x10400400, 0x00000028, 0x08200800, 0x40001100,
136 0x10440400, 0x00000028, 0x0c200800, 0x40101100,
137 0x90000000, 0x00000010, 0x00200000, 0x00801000,
138 0x90040000, 0x00000010, 0x04200000, 0x00901000,
139 0x90400000, 0x00000018, 0x00200800, 0x40801000,
140 0x90440000, 0x00000018, 0x04200800, 0x40901000,
141 0x90000400, 0x00000030, 0x08200000, 0x00801100,
142 0x90040400, 0x00000030, 0x0c200000, 0x00901100,
143 0x90400400, 0x00000038, 0x08200800, 0x40801100,
144 0x90440400, 0x00000038, 0x0c200800, 0x40901100,
145 0x00000200, 0x00080000, 0x00000000, 0x00000004,
146 0x00040200, 0x00080000, 0x04000000, 0x00100004,
147 0x00400200, 0x00080008, 0x00000800, 0x40000004,
148 0x00440200, 0x00080008, 0x04000800, 0x40100004,
149 0x00000600, 0x00080020, 0x08000000, 0x00000104,
150 0x00040600, 0x00080020, 0x0c000000, 0x00100104,
151 0x00400600, 0x00080028, 0x08000800, 0x40000104,
152 0x00440600, 0x00080028, 0x0c000800, 0x40100104,
153 0x80000200, 0x00080010, 0x00000000, 0x00800004,
154 0x80040200, 0x00080010, 0x04000000, 0x00900004,
155 0x80400200, 0x00080018, 0x00000800, 0x40800004,
156 0x80440200, 0x00080018, 0x04000800, 0x40900004,
157 0x80000600, 0x00080030, 0x08000000, 0x00800104,
158 0x80040600, 0x00080030, 0x0c000000, 0x00900104,
159 0x80400600, 0x00080038, 0x08000800, 0x40800104,
160 0x80440600, 0x00080038, 0x0c000800, 0x40900104,
161 0x10000200, 0x00080000, 0x00200000, 0x00001004,
162 0x10040200, 0x00080000, 0x04200000, 0x00101004,
163 0x10400200, 0x00080008, 0x00200800, 0x40001004,
164 0x10440200, 0x00080008, 0x04200800, 0x40101004,
165 0x10000600, 0x00080020, 0x08200000, 0x00001104,
166 0x10040600, 0x00080020, 0x0c200000, 0x00101104,
167 0x10400600, 0x00080028, 0x08200800, 0x40001104,
168 0x10440600, 0x00080028, 0x0c200800, 0x40101104,
169 0x90000200, 0x00080010, 0x00200000, 0x00801004,
170 0x90040200, 0x00080010, 0x04200000, 0x00901004,
171 0x90400200, 0x00080018, 0x00200800, 0x40801004,
172 0x90440200, 0x00080018, 0x04200800, 0x40901004,
173 0x90000600, 0x00080030, 0x08200000, 0x00801104,
174 0x90040600, 0x00080030, 0x0c200000, 0x00901104,
175 0x90400600, 0x00080038, 0x08200800, 0x40801104,
176 0x90440600, 0x00080038, 0x0c200800, 0x40901104,
177 0x00000002, 0x00002000, 0x20000000, 0x00000001,
178 0x00040002, 0x00002000, 0x24000000, 0x00100001,
179 0x00400002, 0x00002008, 0x20000800, 0x40000001,
180 0x00440002, 0x00002008, 0x24000800, 0x40100001,
181 0x00000402, 0x00002020, 0x28000000, 0x00000101,
182 0x00040402, 0x00002020, 0x2c000000, 0x00100101,
183 0x00400402, 0x00002028, 0x28000800, 0x40000101,
184 0x00440402, 0x00002028, 0x2c000800, 0x40100101,
185 0x80000002, 0x00002010, 0x20000000, 0x00800001,
186 0x80040002, 0x00002010, 0x24000000, 0x00900001,
187 0x80400002, 0x00002018, 0x20000800, 0x40800001,
188 0x80440002, 0x00002018, 0x24000800, 0x40900001,
189 0x80000402, 0x00002030, 0x28000000, 0x00800101,
190 0x80040402, 0x00002030, 0x2c000000, 0x00900101,
191 0x80400402, 0x00002038, 0x28000800, 0x40800101,
192 0x80440402, 0x00002038, 0x2c000800, 0x40900101,
193 0x10000002, 0x00002000, 0x20200000, 0x00001001,
194 0x10040002, 0x00002000, 0x24200000, 0x00101001,
195 0x10400002, 0x00002008, 0x20200800, 0x40001001,
196 0x10440002, 0x00002008, 0x24200800, 0x40101001,
197 0x10000402, 0x00002020, 0x28200000, 0x00001101,
198 0x10040402, 0x00002020, 0x2c200000, 0x00101101,
199 0x10400402, 0x00002028, 0x28200800, 0x40001101,
200 0x10440402, 0x00002028, 0x2c200800, 0x40101101,
201 0x90000002, 0x00002010, 0x20200000, 0x00801001,
202 0x90040002, 0x00002010, 0x24200000, 0x00901001,
203 0x90400002, 0x00002018, 0x20200800, 0x40801001,
204 0x90440002, 0x00002018, 0x24200800, 0x40901001,
205 0x90000402, 0x00002030, 0x28200000, 0x00801101,
206 0x90040402, 0x00002030, 0x2c200000, 0x00901101,
207 0x90400402, 0x00002038, 0x28200800, 0x40801101,
208 0x90440402, 0x00002038, 0x2c200800, 0x40901101,
209 0x00000202, 0x00082000, 0x20000000, 0x00000005,
210 0x00040202, 0x00082000, 0x24000000, 0x00100005,
211 0x00400202, 0x00082008, 0x20000800, 0x40000005,
212 0x00440202, 0x00082008, 0x24000800, 0x40100005,
213 0x00000602, 0x00082020, 0x28000000, 0x00000105,
214 0x00040602, 0x00082020, 0x2c000000, 0x00100105,
215 0x00400602, 0x00082028, 0x28000800, 0x40000105,
216 0x00440602, 0x00082028, 0x2c000800, 0x40100105,
217 0x80000202, 0x00082010, 0x20000000, 0x00800005,
218 0x80040202, 0x00082010, 0x24000000, 0x00900005,
219 0x80400202, 0x00082018, 0x20000800, 0x40800005,
220 0x80440202, 0x00082018, 0x24000800, 0x40900005,
221 0x80000602, 0x00082030, 0x28000000, 0x00800105,
222 0x80040602, 0x00082030, 0x2c000000, 0x00900105,
223 0x80400602, 0x00082038, 0x28000800, 0x40800105,
224 0x80440602, 0x00082038, 0x2c000800, 0x40900105,
225 0x10000202, 0x00082000, 0x20200000, 0x00001005,
226 0x10040202, 0x00082000, 0x24200000, 0x00101005,
227 0x10400202, 0x00082008, 0x20200800, 0x40001005,
228 0x10440202, 0x00082008, 0x24200800, 0x40101005,
229 0x10000602, 0x00082020, 0x28200000, 0x00001105,
230 0x10040602, 0x00082020, 0x2c200000, 0x00101105,
231 0x10400602, 0x00082028, 0x28200800, 0x40001105,
232 0x10440602, 0x00082028, 0x2c200800, 0x40101105,
233 0x90000202, 0x00082010, 0x20200000, 0x00801005,
234 0x90040202, 0x00082010, 0x24200000, 0x00901005,
235 0x90400202, 0x00082018, 0x20200800, 0x40801005,
236 0x90440202, 0x00082018, 0x24200800, 0x40901005,
237 0x90000602, 0x00082030, 0x28200000, 0x00801105,
238 0x90040602, 0x00082030, 0x2c200000, 0x00901105,
239 0x90400602, 0x00082038, 0x28200800, 0x40801105,
240 0x90440602, 0x00082038, 0x2c200800, 0x40901105,
116 241
117 0x00000400, 0x00000020, 0x00100020, 0x40100000, 242 0x00000000, 0x00000000, 0x00000000, 0x00000000,
118 0x40100420, 0x40000400, 0x00000420, 0x00000000, 243 0x00000000, 0x00000008, 0x00080000, 0x10000000,
119 0x00100000, 0x40100020, 0x40000020, 0x00100400, 244 0x02000000, 0x00000000, 0x00000080, 0x00001000,
120 0x40000000, 0x00100420, 0x00100400, 0x40000020, 245 0x02000000, 0x00000008, 0x00080080, 0x10001000,
121 0x40100020, 0x00000400, 0x40000400, 0x40100420, 246 0x00004000, 0x00000000, 0x00000040, 0x00040000,
122 0x00000000, 0x00100020, 0x40100000, 0x00000420, 247 0x00004000, 0x00000008, 0x00080040, 0x10040000,
123 0x40100400, 0x40000420, 0x00100420, 0x40000000, 248 0x02004000, 0x00000000, 0x000000c0, 0x00041000,
124 0x40000420, 0x40100400, 0x00000020, 0x00100000, 249 0x02004000, 0x00000008, 0x000800c0, 0x10041000,
125 0x40000420, 0x00100400, 0x40100400, 0x40000020, 250 0x00020000, 0x00008000, 0x08000000, 0x00200000,
126 0x00000400, 0x00000020, 0x00100000, 0x40100400, 251 0x00020000, 0x00008008, 0x08080000, 0x10200000,
127 0x40100020, 0x40000420, 0x00000420, 0x00000000, 252 0x02020000, 0x00008000, 0x08000080, 0x00201000,
128 0x00000020, 0x40100000, 0x40000000, 0x00100020, 253 0x02020000, 0x00008008, 0x08080080, 0x10201000,
129 0x00000000, 0x40100020, 0x00100020, 0x00000420, 254 0x00024000, 0x00008000, 0x08000040, 0x00240000,
130 0x40000020, 0x00000400, 0x40100420, 0x00100000, 255 0x00024000, 0x00008008, 0x08080040, 0x10240000,
131 0x00100420, 0x40000000, 0x40000400, 0x40100420, 256 0x02024000, 0x00008000, 0x080000c0, 0x00241000,
132 0x40100000, 0x00100420, 0x00100400, 0x40000400, 257 0x02024000, 0x00008008, 0x080800c0, 0x10241000,
258 0x00000000, 0x01000000, 0x00002000, 0x00000020,
259 0x00000000, 0x01000008, 0x00082000, 0x10000020,
260 0x02000000, 0x01000000, 0x00002080, 0x00001020,
261 0x02000000, 0x01000008, 0x00082080, 0x10001020,
262 0x00004000, 0x01000000, 0x00002040, 0x00040020,
263 0x00004000, 0x01000008, 0x00082040, 0x10040020,
264 0x02004000, 0x01000000, 0x000020c0, 0x00041020,
265 0x02004000, 0x01000008, 0x000820c0, 0x10041020,
266 0x00020000, 0x01008000, 0x08002000, 0x00200020,
267 0x00020000, 0x01008008, 0x08082000, 0x10200020,
268 0x02020000, 0x01008000, 0x08002080, 0x00201020,
269 0x02020000, 0x01008008, 0x08082080, 0x10201020,
270 0x00024000, 0x01008000, 0x08002040, 0x00240020,
271 0x00024000, 0x01008008, 0x08082040, 0x10240020,
272 0x02024000, 0x01008000, 0x080020c0, 0x00241020,
273 0x02024000, 0x01008008, 0x080820c0, 0x10241020,
274 0x00000400, 0x04000000, 0x00100000, 0x00000004,
275 0x00000400, 0x04000008, 0x00180000, 0x10000004,
276 0x02000400, 0x04000000, 0x00100080, 0x00001004,
277 0x02000400, 0x04000008, 0x00180080, 0x10001004,
278 0x00004400, 0x04000000, 0x00100040, 0x00040004,
279 0x00004400, 0x04000008, 0x00180040, 0x10040004,
280 0x02004400, 0x04000000, 0x001000c0, 0x00041004,
281 0x02004400, 0x04000008, 0x001800c0, 0x10041004,
282 0x00020400, 0x04008000, 0x08100000, 0x00200004,
283 0x00020400, 0x04008008, 0x08180000, 0x10200004,
284 0x02020400, 0x04008000, 0x08100080, 0x00201004,
285 0x02020400, 0x04008008, 0x08180080, 0x10201004,
286 0x00024400, 0x04008000, 0x08100040, 0x00240004,
287 0x00024400, 0x04008008, 0x08180040, 0x10240004,
288 0x02024400, 0x04008000, 0x081000c0, 0x00241004,
289 0x02024400, 0x04008008, 0x081800c0, 0x10241004,
290 0x00000400, 0x05000000, 0x00102000, 0x00000024,
291 0x00000400, 0x05000008, 0x00182000, 0x10000024,
292 0x02000400, 0x05000000, 0x00102080, 0x00001024,
293 0x02000400, 0x05000008, 0x00182080, 0x10001024,
294 0x00004400, 0x05000000, 0x00102040, 0x00040024,
295 0x00004400, 0x05000008, 0x00182040, 0x10040024,
296 0x02004400, 0x05000000, 0x001020c0, 0x00041024,
297 0x02004400, 0x05000008, 0x001820c0, 0x10041024,
298 0x00020400, 0x05008000, 0x08102000, 0x00200024,
299 0x00020400, 0x05008008, 0x08182000, 0x10200024,
300 0x02020400, 0x05008000, 0x08102080, 0x00201024,
301 0x02020400, 0x05008008, 0x08182080, 0x10201024,
302 0x00024400, 0x05008000, 0x08102040, 0x00240024,
303 0x00024400, 0x05008008, 0x08182040, 0x10240024,
304 0x02024400, 0x05008000, 0x081020c0, 0x00241024,
305 0x02024400, 0x05008008, 0x081820c0, 0x10241024,
306 0x00000800, 0x00010000, 0x20000000, 0x00000010,
307 0x00000800, 0x00010008, 0x20080000, 0x10000010,
308 0x02000800, 0x00010000, 0x20000080, 0x00001010,
309 0x02000800, 0x00010008, 0x20080080, 0x10001010,
310 0x00004800, 0x00010000, 0x20000040, 0x00040010,
311 0x00004800, 0x00010008, 0x20080040, 0x10040010,
312 0x02004800, 0x00010000, 0x200000c0, 0x00041010,
313 0x02004800, 0x00010008, 0x200800c0, 0x10041010,
314 0x00020800, 0x00018000, 0x28000000, 0x00200010,
315 0x00020800, 0x00018008, 0x28080000, 0x10200010,
316 0x02020800, 0x00018000, 0x28000080, 0x00201010,
317 0x02020800, 0x00018008, 0x28080080, 0x10201010,
318 0x00024800, 0x00018000, 0x28000040, 0x00240010,
319 0x00024800, 0x00018008, 0x28080040, 0x10240010,
320 0x02024800, 0x00018000, 0x280000c0, 0x00241010,
321 0x02024800, 0x00018008, 0x280800c0, 0x10241010,
322 0x00000800, 0x01010000, 0x20002000, 0x00000030,
323 0x00000800, 0x01010008, 0x20082000, 0x10000030,
324 0x02000800, 0x01010000, 0x20002080, 0x00001030,
325 0x02000800, 0x01010008, 0x20082080, 0x10001030,
326 0x00004800, 0x01010000, 0x20002040, 0x00040030,
327 0x00004800, 0x01010008, 0x20082040, 0x10040030,
328 0x02004800, 0x01010000, 0x200020c0, 0x00041030,
329 0x02004800, 0x01010008, 0x200820c0, 0x10041030,
330 0x00020800, 0x01018000, 0x28002000, 0x00200030,
331 0x00020800, 0x01018008, 0x28082000, 0x10200030,
332 0x02020800, 0x01018000, 0x28002080, 0x00201030,
333 0x02020800, 0x01018008, 0x28082080, 0x10201030,
334 0x00024800, 0x01018000, 0x28002040, 0x00240030,
335 0x00024800, 0x01018008, 0x28082040, 0x10240030,
336 0x02024800, 0x01018000, 0x280020c0, 0x00241030,
337 0x02024800, 0x01018008, 0x280820c0, 0x10241030,
338 0x00000c00, 0x04010000, 0x20100000, 0x00000014,
339 0x00000c00, 0x04010008, 0x20180000, 0x10000014,
340 0x02000c00, 0x04010000, 0x20100080, 0x00001014,
341 0x02000c00, 0x04010008, 0x20180080, 0x10001014,
342 0x00004c00, 0x04010000, 0x20100040, 0x00040014,
343 0x00004c00, 0x04010008, 0x20180040, 0x10040014,
344 0x02004c00, 0x04010000, 0x201000c0, 0x00041014,
345 0x02004c00, 0x04010008, 0x201800c0, 0x10041014,
346 0x00020c00, 0x04018000, 0x28100000, 0x00200014,
347 0x00020c00, 0x04018008, 0x28180000, 0x10200014,
348 0x02020c00, 0x04018000, 0x28100080, 0x00201014,
349 0x02020c00, 0x04018008, 0x28180080, 0x10201014,
350 0x00024c00, 0x04018000, 0x28100040, 0x00240014,
351 0x00024c00, 0x04018008, 0x28180040, 0x10240014,
352 0x02024c00, 0x04018000, 0x281000c0, 0x00241014,
353 0x02024c00, 0x04018008, 0x281800c0, 0x10241014,
354 0x00000c00, 0x05010000, 0x20102000, 0x00000034,
355 0x00000c00, 0x05010008, 0x20182000, 0x10000034,
356 0x02000c00, 0x05010000, 0x20102080, 0x00001034,
357 0x02000c00, 0x05010008, 0x20182080, 0x10001034,
358 0x00004c00, 0x05010000, 0x20102040, 0x00040034,
359 0x00004c00, 0x05010008, 0x20182040, 0x10040034,
360 0x02004c00, 0x05010000, 0x201020c0, 0x00041034,
361 0x02004c00, 0x05010008, 0x201820c0, 0x10041034,
362 0x00020c00, 0x05018000, 0x28102000, 0x00200034,
363 0x00020c00, 0x05018008, 0x28182000, 0x10200034,
364 0x02020c00, 0x05018000, 0x28102080, 0x00201034,
365 0x02020c00, 0x05018008, 0x28182080, 0x10201034,
366 0x00024c00, 0x05018000, 0x28102040, 0x00240034,
367 0x00024c00, 0x05018008, 0x28182040, 0x10240034,
368 0x02024c00, 0x05018000, 0x281020c0, 0x00241034,
369 0x02024c00, 0x05018008, 0x281820c0, 0x10241034
370 };
133 371
134 0x00800000, 0x00001000, 0x00000040, 0x00801042, 372 /* S-box lookup tables */
135 0x00801002, 0x00800040, 0x00001042, 0x00801000,
136 0x00001000, 0x00000002, 0x00800002, 0x00001040,
137 0x00800042, 0x00801002, 0x00801040, 0x00000000,
138 0x00001040, 0x00800000, 0x00001002, 0x00000042,
139 0x00800040, 0x00001042, 0x00000000, 0x00800002,
140 0x00000002, 0x00800042, 0x00801042, 0x00001002,
141 0x00801000, 0x00000040, 0x00000042, 0x00801040,
142 0x00801040, 0x00800042, 0x00001002, 0x00801000,
143 0x00001000, 0x00000002, 0x00800002, 0x00800040,
144 0x00800000, 0x00001040, 0x00801042, 0x00000000,
145 0x00001042, 0x00800000, 0x00000040, 0x00001002,
146 0x00800042, 0x00000040, 0x00000000, 0x00801042,
147 0x00801002, 0x00801040, 0x00000042, 0x00001000,
148 0x00001040, 0x00801002, 0x00800040, 0x00000042,
149 0x00000002, 0x00001042, 0x00801000, 0x00800002,
150 373
151 0x10400000, 0x00404010, 0x00000010, 0x10400010, 374 static const u32 S1[64] = {
152 0x10004000, 0x00400000, 0x10400010, 0x00004010, 375 0x01010400, 0x00000000, 0x00010000, 0x01010404,
153 0x00400010, 0x00004000, 0x00404000, 0x10000000, 376 0x01010004, 0x00010404, 0x00000004, 0x00010000,
154 0x10404010, 0x10000010, 0x10000000, 0x10404000, 377 0x00000400, 0x01010400, 0x01010404, 0x00000400,
155 0x00000000, 0x10004000, 0x00404010, 0x00000010, 378 0x01000404, 0x01010004, 0x01000000, 0x00000004,
156 0x10000010, 0x10404010, 0x00004000, 0x10400000, 379 0x00000404, 0x01000400, 0x01000400, 0x00010400,
157 0x10404000, 0x00400010, 0x10004010, 0x00404000, 380 0x00010400, 0x01010000, 0x01010000, 0x01000404,
158 0x00004010, 0x00000000, 0x00400000, 0x10004010, 381 0x00010004, 0x01000004, 0x01000004, 0x00010004,
159 0x00404010, 0x00000010, 0x10000000, 0x00004000, 382 0x00000000, 0x00000404, 0x00010404, 0x01000000,
160 0x10000010, 0x10004000, 0x00404000, 0x10400010, 383 0x00010000, 0x01010404, 0x00000004, 0x01010000,
161 0x00000000, 0x00404010, 0x00004010, 0x10404000, 384 0x01010400, 0x01000000, 0x01000000, 0x00000400,
162 0x10004000, 0x00400000, 0x10404010, 0x10000000, 385 0x01010004, 0x00010000, 0x00010400, 0x01000004,
163 0x10004010, 0x10400000, 0x00400000, 0x10404010, 386 0x00000400, 0x00000004, 0x01000404, 0x00010404,
164 0x00004000, 0x00400010, 0x10400010, 0x00004010, 387 0x01010404, 0x00010004, 0x01010000, 0x01000404,
165 0x00400010, 0x00000000, 0x10404000, 0x10000010, 388 0x01000004, 0x00000404, 0x00010404, 0x01010400,
166 0x10400000, 0x10004010, 0x00000010, 0x00404000, 389 0x00000404, 0x01000400, 0x01000400, 0x00000000,
390 0x00010004, 0x00010400, 0x00000000, 0x01010004
391 };
167 392
168 0x00208080, 0x00008000, 0x20200000, 0x20208080, 393 static const u32 S2[64] = {
169 0x00200000, 0x20008080, 0x20008000, 0x20200000, 394 0x80108020, 0x80008000, 0x00008000, 0x00108020,
170 0x20008080, 0x00208080, 0x00208000, 0x20000080, 395 0x00100000, 0x00000020, 0x80100020, 0x80008020,
171 0x20200080, 0x00200000, 0x00000000, 0x20008000, 396 0x80000020, 0x80108020, 0x80108000, 0x80000000,
172 0x00008000, 0x20000000, 0x00200080, 0x00008080, 397 0x80008000, 0x00100000, 0x00000020, 0x80100020,
173 0x20208080, 0x00208000, 0x20000080, 0x00200080, 398 0x00108000, 0x00100020, 0x80008020, 0x00000000,
174 0x20000000, 0x00000080, 0x00008080, 0x20208000, 399 0x80000000, 0x00008000, 0x00108020, 0x80100000,
175 0x00000080, 0x20200080, 0x20208000, 0x00000000, 400 0x00100020, 0x80000020, 0x00000000, 0x00108000,
176 0x00000000, 0x20208080, 0x00200080, 0x20008000, 401 0x00008020, 0x80108000, 0x80100000, 0x00008020,
177 0x00208080, 0x00008000, 0x20000080, 0x00200080, 402 0x00000000, 0x00108020, 0x80100020, 0x00100000,
178 0x20208000, 0x00000080, 0x00008080, 0x20200000, 403 0x80008020, 0x80100000, 0x80108000, 0x00008000,
179 0x20008080, 0x20000000, 0x20200000, 0x00208000, 404 0x80100000, 0x80008000, 0x00000020, 0x80108020,
180 0x20208080, 0x00008080, 0x00208000, 0x20200080, 405 0x00108020, 0x00000020, 0x00008000, 0x80000000,
181 0x00200000, 0x20000080, 0x20008000, 0x00000000, 406 0x00008020, 0x80108000, 0x00100000, 0x80000020,
182 0x00008000, 0x00200000, 0x20200080, 0x00208080, 407 0x00100020, 0x80008020, 0x80000020, 0x00100020,
183 0x20000000, 0x20208000, 0x00000080, 0x20008080, 408 0x00108000, 0x00000000, 0x80008000, 0x00008020,
409 0x80000000, 0x80100020, 0x80108020, 0x00108000
184 }; 410 };
185 411
186 static const u8 rotors[] = { 412 static const u32 S3[64] = {
187 34, 13, 5, 46, 47, 18, 32, 41, 11, 53, 33, 20, 413 0x00000208, 0x08020200, 0x00000000, 0x08020008,
188 14, 36, 30, 24, 49, 2, 15, 37, 42, 50, 0, 21, 414 0x08000200, 0x00000000, 0x00020208, 0x08000200,
189 38, 48, 6, 26, 39, 4, 52, 25, 12, 27, 31, 40, 415 0x00020008, 0x08000008, 0x08000008, 0x00020000,
190 1, 17, 28, 29, 23, 51, 35, 7, 3, 22, 9, 43, 416 0x08020208, 0x00020008, 0x08020000, 0x00000208,
417 0x08000000, 0x00000008, 0x08020200, 0x00000200,
418 0x00020200, 0x08020000, 0x08020008, 0x00020208,
419 0x08000208, 0x00020200, 0x00020000, 0x08000208,
420 0x00000008, 0x08020208, 0x00000200, 0x08000000,
421 0x08020200, 0x08000000, 0x00020008, 0x00000208,
422 0x00020000, 0x08020200, 0x08000200, 0x00000000,
423 0x00000200, 0x00020008, 0x08020208, 0x08000200,
424 0x08000008, 0x00000200, 0x00000000, 0x08020008,
425 0x08000208, 0x00020000, 0x08000000, 0x08020208,
426 0x00000008, 0x00020208, 0x00020200, 0x08000008,
427 0x08020000, 0x08000208, 0x00000208, 0x08020000,
428 0x00020208, 0x00000008, 0x08020008, 0x00020200
429 };
191 430
192 41, 20, 12, 53, 54, 25, 39, 48, 18, 31, 40, 27, 431 static const u32 S4[64] = {
193 21, 43, 37, 0, 1, 9, 22, 44, 49, 2, 7, 28, 432 0x00802001, 0x00002081, 0x00002081, 0x00000080,
194 45, 55, 13, 33, 46, 11, 6, 32, 19, 34, 38, 47, 433 0x00802080, 0x00800081, 0x00800001, 0x00002001,
195 8, 24, 35, 36, 30, 3, 42, 14, 10, 29, 16, 50, 434 0x00000000, 0x00802000, 0x00802000, 0x00802081,
435 0x00000081, 0x00000000, 0x00800080, 0x00800001,
436 0x00000001, 0x00002000, 0x00800000, 0x00802001,
437 0x00000080, 0x00800000, 0x00002001, 0x00002080,
438 0x00800081, 0x00000001, 0x00002080, 0x00800080,
439 0x00002000, 0x00802080, 0x00802081, 0x00000081,
440 0x00800080, 0x00800001, 0x00802000, 0x00802081,
441 0x00000081, 0x00000000, 0x00000000, 0x00802000,
442 0x00002080, 0x00800080, 0x00800081, 0x00000001,
443 0x00802001, 0x00002081, 0x00002081, 0x00000080,
444 0x00802081, 0x00000081, 0x00000001, 0x00002000,
445 0x00800001, 0x00002001, 0x00802080, 0x00800081,
446 0x00002001, 0x00002080, 0x00800000, 0x00802001,
447 0x00000080, 0x00800000, 0x00002000, 0x00802080
448 };
196 449
197 55, 34, 26, 38, 11, 39, 53, 5, 32, 45, 54, 41, 450 static const u32 S5[64] = {
198 35, 2, 51, 14, 15, 23, 36, 3, 8, 16, 21, 42, 451 0x00000100, 0x02080100, 0x02080000, 0x42000100,
199 6, 12, 27, 47, 31, 25, 20, 46, 33, 48, 52, 4, 452 0x00080000, 0x00000100, 0x40000000, 0x02080000,
200 22, 7, 49, 50, 44, 17, 1, 28, 24, 43, 30, 9, 453 0x40080100, 0x00080000, 0x02000100, 0x40080100,
454 0x42000100, 0x42080000, 0x00080100, 0x40000000,
455 0x02000000, 0x40080000, 0x40080000, 0x00000000,
456 0x40000100, 0x42080100, 0x42080100, 0x02000100,
457 0x42080000, 0x40000100, 0x00000000, 0x42000000,
458 0x02080100, 0x02000000, 0x42000000, 0x00080100,
459 0x00080000, 0x42000100, 0x00000100, 0x02000000,
460 0x40000000, 0x02080000, 0x42000100, 0x40080100,
461 0x02000100, 0x40000000, 0x42080000, 0x02080100,
462 0x40080100, 0x00000100, 0x02000000, 0x42080000,
463 0x42080100, 0x00080100, 0x42000000, 0x42080100,
464 0x02080000, 0x00000000, 0x40080000, 0x42000000,
465 0x00080100, 0x02000100, 0x40000100, 0x00080000,
466 0x00000000, 0x40080000, 0x02080100, 0x40000100
467 };
201 468
202 12, 48, 40, 52, 25, 53, 38, 19, 46, 6, 11, 55, 469 static const u32 S6[64] = {
203 49, 16, 10, 28, 29, 37, 50, 17, 22, 30, 35, 1, 470 0x20000010, 0x20400000, 0x00004000, 0x20404010,
204 20, 26, 41, 4, 45, 39, 34, 31, 47, 5, 13, 18, 471 0x20400000, 0x00000010, 0x20404010, 0x00400000,
205 36, 21, 8, 9, 3, 0, 15, 42, 7, 2, 44, 23, 472 0x20004000, 0x00404010, 0x00400000, 0x20000010,
473 0x00400010, 0x20004000, 0x20000000, 0x00004010,
474 0x00000000, 0x00400010, 0x20004010, 0x00004000,
475 0x00404000, 0x20004010, 0x00000010, 0x20400010,
476 0x20400010, 0x00000000, 0x00404010, 0x20404000,
477 0x00004010, 0x00404000, 0x20404000, 0x20000000,
478 0x20004000, 0x00000010, 0x20400010, 0x00404000,
479 0x20404010, 0x00400000, 0x00004010, 0x20000010,
480 0x00400000, 0x20004000, 0x20000000, 0x00004010,
481 0x20000010, 0x20404010, 0x00404000, 0x20400000,
482 0x00404010, 0x20404000, 0x00000000, 0x20400010,
483 0x00000010, 0x00004000, 0x20400000, 0x00404010,
484 0x00004000, 0x00400010, 0x20004010, 0x00000000,
485 0x20404000, 0x20000000, 0x00400010, 0x20004010
486 };
206 487
207 26, 5, 54, 13, 39, 38, 52, 33, 31, 20, 25, 12, 488 static const u32 S7[64] = {
208 8, 30, 24, 42, 43, 51, 9, 0, 36, 44, 49, 15, 489 0x00200000, 0x04200002, 0x04000802, 0x00000000,
209 34, 40, 55, 18, 6, 53, 48, 45, 4, 19, 27, 32, 490 0x00000800, 0x04000802, 0x00200802, 0x04200800,
210 50, 35, 22, 23, 17, 14, 29, 1, 21, 16, 3, 37, 491 0x04200802, 0x00200000, 0x00000000, 0x04000002,
492 0x00000002, 0x04000000, 0x04200002, 0x00000802,
493 0x04000800, 0x00200802, 0x00200002, 0x04000800,
494 0x04000002, 0x04200000, 0x04200800, 0x00200002,
495 0x04200000, 0x00000800, 0x00000802, 0x04200802,
496 0x00200800, 0x00000002, 0x04000000, 0x00200800,
497 0x04000000, 0x00200800, 0x00200000, 0x04000802,
498 0x04000802, 0x04200002, 0x04200002, 0x00000002,
499 0x00200002, 0x04000000, 0x04000800, 0x00200000,
500 0x04200800, 0x00000802, 0x00200802, 0x04200800,
501 0x00000802, 0x04000002, 0x04200802, 0x04200000,
502 0x00200800, 0x00000000, 0x00000002, 0x04200802,
503 0x00000000, 0x00200802, 0x04200000, 0x00000800,
504 0x04000002, 0x04000800, 0x00000800, 0x00200002
505 };
211 506
212 40, 19, 11, 27, 53, 52, 13, 47, 45, 34, 39, 26, 507 static const u32 S8[64] = {
213 22, 44, 7, 1, 2, 10, 23, 14, 50, 3, 8, 29, 508 0x10001040, 0x00001000, 0x00040000, 0x10041040,
214 48, 54, 12, 32, 20, 38, 5, 6, 18, 33, 41, 46, 509 0x10000000, 0x10001040, 0x00000040, 0x10000000,
215 9, 49, 36, 37, 0, 28, 43, 15, 35, 30, 17, 51, 510 0x00040040, 0x10040000, 0x10041040, 0x00041000,
511 0x10041000, 0x00041040, 0x00001000, 0x00000040,
512 0x10040000, 0x10000040, 0x10001000, 0x00001040,
513 0x00041000, 0x00040040, 0x10040040, 0x10041000,
514 0x00001040, 0x00000000, 0x00000000, 0x10040040,
515 0x10000040, 0x10001000, 0x00041040, 0x00040000,
516 0x00041040, 0x00040000, 0x10041000, 0x00001000,
517 0x00000040, 0x10040040, 0x00001000, 0x00041040,
518 0x10001000, 0x00000040, 0x10000040, 0x10040000,
519 0x10040040, 0x10000000, 0x00040000, 0x10001040,
520 0x00000000, 0x10041040, 0x00040040, 0x10000040,
521 0x10040000, 0x10001000, 0x10001040, 0x00000000,
522 0x10041040, 0x00041000, 0x00041000, 0x00001040,
523 0x00001040, 0x00040040, 0x10000000, 0x10041000
524 };
216 525
217 54, 33, 25, 41, 38, 13, 27, 4, 6, 48, 53, 40, 526 /* Encryption components: IP, FP, and round function */
218 36, 3, 21, 15, 16, 24, 37, 28, 9, 17, 22, 43,
219 5, 11, 26, 46, 34, 52, 19, 20, 32, 47, 55, 31,
220 23, 8, 50, 51, 14, 42, 2, 29, 49, 44, 0, 10,
221 527
222 11, 47, 39, 55, 52, 27, 41, 18, 20, 5, 38, 54, 528 #define IP(L, R, T) \
223 50, 17, 35, 29, 30, 7, 51, 42, 23, 0, 36, 2, 529 ROL(R, 4); \
224 19, 25, 40, 31, 48, 13, 33, 34, 46, 4, 12, 45, 530 T = L; \
225 37, 22, 9, 10, 28, 1, 16, 43, 8, 3, 14, 24, 531 L ^= R; \
532 L &= 0xf0f0f0f0; \
533 R ^= L; \
534 L ^= T; \
535 ROL(R, 12); \
536 T = L; \
537 L ^= R; \
538 L &= 0xffff0000; \
539 R ^= L; \
540 L ^= T; \
541 ROR(R, 14); \
542 T = L; \
543 L ^= R; \
544 L &= 0xcccccccc; \
545 R ^= L; \
546 L ^= T; \
547 ROL(R, 6); \
548 T = L; \
549 L ^= R; \
550 L &= 0xff00ff00; \
551 R ^= L; \
552 L ^= T; \
553 ROR(R, 7); \
554 T = L; \
555 L ^= R; \
556 L &= 0xaaaaaaaa; \
557 R ^= L; \
558 L ^= T; \
559 ROL(L, 1);
226 560
227 18, 54, 46, 5, 6, 34, 48, 25, 27, 12, 45, 4, 561 #define FP(L, R, T) \
228 2, 24, 42, 36, 37, 14, 3, 49, 30, 7, 43, 9, 562 ROR(L, 1); \
229 26, 32, 47, 38, 55, 20, 40, 41, 53, 11, 19, 52, 563 T = L; \
230 44, 29, 16, 17, 35, 8, 23, 50, 15, 10, 21, 0, 564 L ^= R; \
565 L &= 0xaaaaaaaa; \
566 R ^= L; \
567 L ^= T; \
568 ROL(R, 7); \
569 T = L; \
570 L ^= R; \
571 L &= 0xff00ff00; \
572 R ^= L; \
573 L ^= T; \
574 ROR(R, 6); \
575 T = L; \
576 L ^= R; \
577 L &= 0xcccccccc; \
578 R ^= L; \
579 L ^= T; \
580 ROL(R, 14); \
581 T = L; \
582 L ^= R; \
583 L &= 0xffff0000; \
584 R ^= L; \
585 L ^= T; \
586 ROR(R, 12); \
587 T = L; \
588 L ^= R; \
589 L &= 0xf0f0f0f0; \
590 R ^= L; \
591 L ^= T; \
592 ROR(R, 4);
231 593
232 32, 11, 31, 19, 20, 48, 5, 39, 41, 26, 6, 18, 594 #define ROUND(L, R, A, B, K, d) \
233 16, 7, 1, 50, 51, 28, 17, 8, 44, 21, 2, 23, 595 B = K[0]; A = K[1]; K += d; \
234 40, 46, 4, 52, 12, 34, 54, 55, 38, 25, 33, 13, 596 B ^= R; A ^= R; \
235 3, 43, 30, 0, 49, 22, 37, 9, 29, 24, 35, 14, 597 B &= 0x3f3f3f3f; ROR(A, 4); \
598 L ^= S8[0xff & B]; A &= 0x3f3f3f3f; \
599 L ^= S6[0xff & (B >> 8)]; B >>= 16; \
600 L ^= S7[0xff & A]; \
601 L ^= S5[0xff & (A >> 8)]; A >>= 16; \
602 L ^= S4[0xff & B]; \
603 L ^= S2[0xff & (B >> 8)]; \
604 L ^= S3[0xff & A]; \
605 L ^= S1[0xff & (A >> 8)];
236 606
237 46, 25, 45, 33, 34, 5, 19, 53, 55, 40, 20, 32, 607 /*
238 30, 21, 15, 9, 10, 42, 0, 22, 3, 35, 16, 37, 608 * PC2 lookup tables are organized as 2 consecutive sets of 4 interleaved
239 54, 31, 18, 13, 26, 48, 11, 12, 52, 39, 47, 27, 609 * tables of 128 elements. One set is for C_i and the other for D_i, while
240 17, 2, 44, 14, 8, 36, 51, 23, 43, 7, 49, 28, 610 * the 4 interleaved tables correspond to four 7-bit subsets of C_i or D_i.
611 *
612 * After PC1 each of the variables a,b,c,d contains a 7 bit subset of C_i
613 * or D_i in bits 7-1 (bit 0 being the least significant).
614 */
241 615
242 31, 39, 6, 47, 48, 19, 33, 38, 12, 54, 34, 46, 616 #define T1(x) pt[2 * (x) + 0]
243 44, 35, 29, 23, 24, 1, 14, 36, 17, 49, 30, 51, 617 #define T2(x) pt[2 * (x) + 1]
244 11, 45, 32, 27, 40, 5, 25, 26, 13, 53, 4, 41, 618 #define T3(x) pt[2 * (x) + 2]
245 0, 16, 3, 28, 22, 50, 10, 37, 2, 21, 8, 42, 619 #define T4(x) pt[2 * (x) + 3]
246 620
247 45, 53, 20, 4, 5, 33, 47, 52, 26, 11, 48, 31, 621 #define PC2(a, b, c, d) (T4(d) | T3(c) | T2(b) | T1(a))
248 3, 49, 43, 37, 7, 15, 28, 50, 0, 8, 44, 10,
249 25, 6, 46, 41, 54, 19, 39, 40, 27, 38, 18, 55,
250 14, 30, 17, 42, 36, 9, 24, 51, 16, 35, 22, 1,
251 622
252 6, 38, 34, 18, 19, 47, 4, 13, 40, 25, 5, 45, 623 /*
253 17, 8, 2, 51, 21, 29, 42, 9, 14, 22, 3, 24, 624 * Encryption key expansion
254 39, 20, 31, 55, 11, 33, 53, 54, 41, 52, 32, 12, 625 *
255 28, 44, 0, 1, 50, 23, 7, 10, 30, 49, 36, 15, 626 * RFC2451: Weak key checks SHOULD be performed.
627 *
628 * FIPS 74:
629 *
630 * Keys having duals are keys which produce all zeros, all ones, or
631 * alternating zero-one patterns in the C and D registers after Permuted
632 * Choice 1 has operated on the key.
633 *
634 */
635 static unsigned long ekey(u32 *pe, const u8 *k)
636 {
637 /* K&R: long is at least 32 bits */
638 unsigned long a, b, c, d, w;
639 const u32 *pt = pc2;
256 640
257 20, 52, 48, 32, 33, 4, 18, 27, 54, 39, 19, 6, 641 d = k[4]; d &= 0x0e; d <<= 4; d |= k[0] & 0x1e; d = pc1[d];
258 0, 22, 16, 10, 35, 43, 1, 23, 28, 36, 17, 7, 642 c = k[5]; c &= 0x0e; c <<= 4; c |= k[1] & 0x1e; c = pc1[c];
259 53, 34, 45, 12, 25, 47, 38, 11, 55, 13, 46, 26, 643 b = k[6]; b &= 0x0e; b <<= 4; b |= k[2] & 0x1e; b = pc1[b];
260 42, 3, 14, 15, 9, 37, 21, 24, 44, 8, 50, 29, 644 a = k[7]; a &= 0x0e; a <<= 4; a |= k[3] & 0x1e; a = pc1[a];
261 645
262 27, 6, 55, 39, 40, 11, 25, 34, 4, 46, 26, 13, 646 pe[15 * 2 + 0] = PC2(a, b, c, d); d = rs[d];
263 7, 29, 23, 17, 42, 50, 8, 30, 35, 43, 24, 14, 647 pe[14 * 2 + 0] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
264 31, 41, 52, 19, 32, 54, 45, 18, 5, 20, 53, 33, 648 pe[13 * 2 + 0] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
265 49, 10, 21, 22, 16, 44, 28, 0, 51, 15, 2, 36, 649 pe[12 * 2 + 0] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
266 }; 650 pe[11 * 2 + 0] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
651 pe[10 * 2 + 0] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
652 pe[ 9 * 2 + 0] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
653 pe[ 8 * 2 + 0] = PC2(d, a, b, c); c = rs[c];
654 pe[ 7 * 2 + 0] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
655 pe[ 6 * 2 + 0] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
656 pe[ 5 * 2 + 0] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
657 pe[ 4 * 2 + 0] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
658 pe[ 3 * 2 + 0] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
659 pe[ 2 * 2 + 0] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
660 pe[ 1 * 2 + 0] = PC2(c, d, a, b); b = rs[b];
661 pe[ 0 * 2 + 0] = PC2(b, c, d, a);
267 662
268 static const u8 parity[] = { 663 /* Check if first half is weak */
269 8,1,0,8,0,8,8,0,0,8,8,0,8,0,2,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,3, 664 w = (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
270 0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
271 0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
272 8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
273 0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
274 8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
275 8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
276 4,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,5,0,8,0,8,8,0,0,8,8,0,8,0,6,8,
277 };
278 665
666 /* Skip to next table set */
667 pt += 512;
279 668
280 static void des_small_fips_encrypt(u32 *expkey, u8 *dst, const u8 *src) 669 d = k[0]; d &= 0xe0; d >>= 4; d |= k[4] & 0xf0; d = pc1[d + 1];
281 { 670 c = k[1]; c &= 0xe0; c >>= 4; c |= k[5] & 0xf0; c = pc1[c + 1];
282 u32 x, y, z; 671 b = k[2]; b &= 0xe0; b >>= 4; b |= k[6] & 0xf0; b = pc1[b + 1];
283 672 a = k[3]; a &= 0xe0; a >>= 4; a |= k[7] & 0xf0; a = pc1[a + 1];
284 x = src[7];
285 x <<= 8;
286 x |= src[6];
287 x <<= 8;
288 x |= src[5];
289 x <<= 8;
290 x |= src[4];
291 y = src[3];
292 y <<= 8;
293 y |= src[2];
294 y <<= 8;
295 y |= src[1];
296 y <<= 8;
297 y |= src[0];
298 z = ((x >> 004) ^ y) & 0x0F0F0F0FL;
299 x ^= z << 004;
300 y ^= z;
301 z = ((y >> 020) ^ x) & 0x0000FFFFL;
302 y ^= z << 020;
303 x ^= z;
304 z = ((x >> 002) ^ y) & 0x33333333L;
305 x ^= z << 002;
306 y ^= z;
307 z = ((y >> 010) ^ x) & 0x00FF00FFL;
308 y ^= z << 010;
309 x ^= z;
310 x = x >> 1 | x << 31;
311 z = (x ^ y) & 0x55555555L;
312 y ^= z;
313 x ^= z;
314 y = y >> 1 | y << 31;
315 z = expkey[0];
316 z ^= y;
317 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
318 z >>= 8;
319 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
320 z >>= 8;
321 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
322 z >>= 8;
323 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
324 z = expkey[1];
325 z ^= y;
326 z = z << 4 | z >> 28;
327 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
328 z >>= 8;
329 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
330 z >>= 8;
331 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
332 z >>= 8;
333 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
334 z = expkey[2];
335 z ^= x;
336 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
337 z >>= 8;
338 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
339 z >>= 8;
340 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
341 z >>= 8;
342 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
343 z = expkey[3];
344 z ^= x;
345 z = z << 4 | z >> 28;
346 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
347 z >>= 8;
348 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
349 z >>= 8;
350 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
351 z >>= 8;
352 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
353 z = expkey[4];
354 z ^= y;
355 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
356 z >>= 8;
357 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
358 z >>= 8;
359 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
360 z >>= 8;
361 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
362 z = expkey[5];
363 z ^= y;
364 z = z << 4 | z >> 28;
365 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
366 z >>= 8;
367 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
368 z >>= 8;
369 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
370 z >>= 8;
371 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
372 z = expkey[6];
373 z ^= x;
374 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
375 z >>= 8;
376 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
377 z >>= 8;
378 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
379 z >>= 8;
380 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
381 z = expkey[7];
382 z ^= x;
383 z = z << 4 | z >> 28;
384 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
385 z >>= 8;
386 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
387 z >>= 8;
388 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
389 z >>= 8;
390 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
391 z = expkey[8];
392 z ^= y;
393 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
394 z >>= 8;
395 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
396 z >>= 8;
397 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
398 z >>= 8;
399 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
400 z = expkey[9];
401 z ^= y;
402 z = z << 4 | z >> 28;
403 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
404 z >>= 8;
405 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
406 z >>= 8;
407 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
408 z >>= 8;
409 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
410 z = expkey[10];
411 z ^= x;
412 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
413 z >>= 8;
414 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
415 z >>= 8;
416 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
417 z >>= 8;
418 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
419 z = expkey[11];
420 z ^= x;
421 z = z << 4 | z >> 28;
422 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
423 z >>= 8;
424 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
425 z >>= 8;
426 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
427 z >>= 8;
428 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
429 z = expkey[12];
430 z ^= y;
431 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
432 z >>= 8;
433 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
434 z >>= 8;
435 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
436 z >>= 8;
437 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
438 z = expkey[13];
439 z ^= y;
440 z = z << 4 | z >> 28;
441 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
442 z >>= 8;
443 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
444 z >>= 8;
445 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
446 z >>= 8;
447 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
448 z = expkey[14];
449 z ^= x;
450 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
451 z >>= 8;
452 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
453 z >>= 8;
454 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
455 z >>= 8;
456 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
457 z = expkey[15];
458 z ^= x;
459 z = z << 4 | z >> 28;
460 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
461 z >>= 8;
462 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
463 z >>= 8;
464 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
465 z >>= 8;
466 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
467 z = expkey[16];
468 z ^= y;
469 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
470 z >>= 8;
471 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
472 z >>= 8;
473 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
474 z >>= 8;
475 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
476 z = expkey[17];
477 z ^= y;
478 z = z << 4 | z >> 28;
479 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
480 z >>= 8;
481 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
482 z >>= 8;
483 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
484 z >>= 8;
485 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
486 z = expkey[18];
487 z ^= x;
488 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
489 z >>= 8;
490 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
491 z >>= 8;
492 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
493 z >>= 8;
494 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
495 z = expkey[19];
496 z ^= x;
497 z = z << 4 | z >> 28;
498 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
499 z >>= 8;
500 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
501 z >>= 8;
502 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
503 z >>= 8;
504 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
505 z = expkey[20];
506 z ^= y;
507 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
508 z >>= 8;
509 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
510 z >>= 8;
511 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
512 z >>= 8;
513 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
514 z = expkey[21];
515 z ^= y;
516 z = z << 4 | z >> 28;
517 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
518 z >>= 8;
519 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
520 z >>= 8;
521 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
522 z >>= 8;
523 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
524 z = expkey[22];
525 z ^= x;
526 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
527 z >>= 8;
528 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
529 z >>= 8;
530 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
531 z >>= 8;
532 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
533 z = expkey[23];
534 z ^= x;
535 z = z << 4 | z >> 28;
536 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
537 z >>= 8;
538 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
539 z >>= 8;
540 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
541 z >>= 8;
542 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
543 z = expkey[24];
544 z ^= y;
545 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
546 z >>= 8;
547 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
548 z >>= 8;
549 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
550 z >>= 8;
551 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
552 z = expkey[25];
553 z ^= y;
554 z = z << 4 | z >> 28;
555 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
556 z >>= 8;
557 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
558 z >>= 8;
559 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
560 z >>= 8;
561 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
562 z = expkey[26];
563 z ^= x;
564 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
565 z >>= 8;
566 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
567 z >>= 8;
568 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
569 z >>= 8;
570 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
571 z = expkey[27];
572 z ^= x;
573 z = z << 4 | z >> 28;
574 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
575 z >>= 8;
576 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
577 z >>= 8;
578 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
579 z >>= 8;
580 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
581 z = expkey[28];
582 z ^= y;
583 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
584 z >>= 8;
585 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
586 z >>= 8;
587 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
588 z >>= 8;
589 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
590 z = expkey[29];
591 z ^= y;
592 z = z << 4 | z >> 28;
593 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
594 z >>= 8;
595 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
596 z >>= 8;
597 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
598 z >>= 8;
599 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
600 z = expkey[30];
601 z ^= x;
602 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
603 z >>= 8;
604 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
605 z >>= 8;
606 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
607 z >>= 8;
608 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
609 z = expkey[31];
610 z ^= x;
611 z = z << 4 | z >> 28;
612 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
613 z >>= 8;
614 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
615 z >>= 8;
616 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
617 z >>= 8;
618 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
619 x = x << 1 | x >> 31;
620 z = (x ^ y) & 0x55555555L;
621 y ^= z;
622 x ^= z;
623 y = y << 1 | y >> 31;
624 z = ((x >> 010) ^ y) & 0x00FF00FFL;
625 x ^= z << 010;
626 y ^= z;
627 z = ((y >> 002) ^ x) & 0x33333333L;
628 y ^= z << 002;
629 x ^= z;
630 z = ((x >> 020) ^ y) & 0x0000FFFFL;
631 x ^= z << 020;
632 y ^= z;
633 z = ((y >> 004) ^ x) & 0x0F0F0F0FL;
634 y ^= z << 004;
635 x ^= z;
636 dst[0] = x;
637 x >>= 8;
638 dst[1] = x;
639 x >>= 8;
640 dst[2] = x;
641 x >>= 8;
642 dst[3] = x;
643 dst[4] = y;
644 y >>= 8;
645 dst[5] = y;
646 y >>= 8;
647 dst[6] = y;
648 y >>= 8;
649 dst[7] = y;
650 }
651 673
652 static void des_small_fips_decrypt(u32 *expkey, u8 *dst, const u8 *src) 674 /* Check if second half is weak */
653 { 675 w |= (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
654 u32 x, y, z; 676
655 677 pe[15 * 2 + 1] = PC2(a, b, c, d); d = rs[d];
656 x = src[7]; 678 pe[14 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
657 x <<= 8; 679 pe[13 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
658 x |= src[6]; 680 pe[12 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
659 x <<= 8; 681 pe[11 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
660 x |= src[5]; 682 pe[10 * 2 + 1] = PC2(d, a, b, c); c = rs[c]; b = rs[b];
661 x <<= 8; 683 pe[ 9 * 2 + 1] = PC2(b, c, d, a); a = rs[a]; d = rs[d];
662 x |= src[4]; 684 pe[ 8 * 2 + 1] = PC2(d, a, b, c); c = rs[c];
663 y = src[3]; 685 pe[ 7 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
664 y <<= 8; 686 pe[ 6 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
665 y |= src[2]; 687 pe[ 5 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
666 y <<= 8; 688 pe[ 4 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
667 y |= src[1]; 689 pe[ 3 * 2 + 1] = PC2(c, d, a, b); b = rs[b]; a = rs[a];
668 y <<= 8; 690 pe[ 2 * 2 + 1] = PC2(a, b, c, d); d = rs[d]; c = rs[c];
669 y |= src[0]; 691 pe[ 1 * 2 + 1] = PC2(c, d, a, b); b = rs[b];
670 z = ((x >> 004) ^ y) & 0x0F0F0F0FL; 692 pe[ 0 * 2 + 1] = PC2(b, c, d, a);
671 x ^= z << 004; 693
672 y ^= z; 694 /* Fixup: 2413 5768 -> 1357 2468 */
673 z = ((y >> 020) ^ x) & 0x0000FFFFL; 695 for (d = 0; d < 16; ++d) {
674 y ^= z << 020; 696 a = pe[2 * d];
675 x ^= z; 697 b = pe[2 * d + 1];
676 z = ((x >> 002) ^ y) & 0x33333333L; 698 c = a ^ b;
677 x ^= z << 002; 699 c &= 0xffff0000;
678 y ^= z; 700 a ^= c;
679 z = ((y >> 010) ^ x) & 0x00FF00FFL; 701 b ^= c;
680 y ^= z << 010; 702 ROL(b, 18);
681 x ^= z; 703 pe[2 * d] = a;
682 x = x >> 1 | x << 31; 704 pe[2 * d + 1] = b;
683 z = (x ^ y) & 0x55555555L; 705 }
684 y ^= z; 706
685 x ^= z; 707 /* Zero if weak key */
686 y = y >> 1 | y << 31; 708 return w;
687 z = expkey[31];
688 z ^= y;
689 z = z << 4 | z >> 28;
690 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
691 z >>= 8;
692 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
693 z >>= 8;
694 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
695 z >>= 8;
696 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
697 z = expkey[30];
698 z ^= y;
699 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
700 z >>= 8;
701 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
702 z >>= 8;
703 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
704 z >>= 8;
705 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
706 z = expkey[29];
707 z ^= x;
708 z = z << 4 | z >> 28;
709 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
710 z >>= 8;
711 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
712 z >>= 8;
713 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
714 z >>= 8;
715 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
716 z = expkey[28];
717 z ^= x;
718 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
719 z >>= 8;
720 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
721 z >>= 8;
722 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
723 z >>= 8;
724 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
725 z = expkey[27];
726 z ^= y;
727 z = z << 4 | z >> 28;
728 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
729 z >>= 8;
730 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
731 z >>= 8;
732 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
733 z >>= 8;
734 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
735 z = expkey[26];
736 z ^= y;
737 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
738 z >>= 8;
739 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
740 z >>= 8;
741 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
742 z >>= 8;
743 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
744 z = expkey[25];
745 z ^= x;
746 z = z << 4 | z >> 28;
747 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
748 z >>= 8;
749 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
750 z >>= 8;
751 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
752 z >>= 8;
753 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
754 z = expkey[24];
755 z ^= x;
756 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
757 z >>= 8;
758 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
759 z >>= 8;
760 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
761 z >>= 8;
762 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
763 z = expkey[23];
764 z ^= y;
765 z = z << 4 | z >> 28;
766 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
767 z >>= 8;
768 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
769 z >>= 8;
770 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
771 z >>= 8;
772 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
773 z = expkey[22];
774 z ^= y;
775 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
776 z >>= 8;
777 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
778 z >>= 8;
779 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
780 z >>= 8;
781 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
782 z = expkey[21];
783 z ^= x;
784 z = z << 4 | z >> 28;
785 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
786 z >>= 8;
787 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
788 z >>= 8;
789 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
790 z >>= 8;
791 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
792 z = expkey[20];
793 z ^= x;
794 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
795 z >>= 8;
796 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
797 z >>= 8;
798 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
799 z >>= 8;
800 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
801 z = expkey[19];
802 z ^= y;
803 z = z << 4 | z >> 28;
804 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
805 z >>= 8;
806 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
807 z >>= 8;
808 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
809 z >>= 8;
810 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
811 z = expkey[18];
812 z ^= y;
813 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
814 z >>= 8;
815 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
816 z >>= 8;
817 x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
818 z >>= 8;
819 x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
820 z = expkey[17];
821 z ^= x;
822 z = z << 4 | z >> 28;
823 y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
824 z >>= 8;
825 y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
826 z >>= 8;
827 y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
828 z >>= 8;
829 y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
830 z = expkey[16];
831 z ^= x;
832 y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
833 z >>= 8;
834 y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
835 z >>= 8;
836 y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
837 z >>= 8;
838 y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
839 z = expkey[15];
840 z ^= y;
841 z = z << 4 | z >> 28;
842 x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
843 z >>= 8;
844 x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
845 z >>= 8;
846 x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
847 z >>= 8;
848 x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
849 z = expkey[14];
850 z ^= y;
851 x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
852 z >>= 8;
853 x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));