1*0957b409SSimon J. Gerraty /*
2*0957b409SSimon J. Gerraty * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3*0957b409SSimon J. Gerraty *
4*0957b409SSimon J. Gerraty * Permission is hereby granted, free of charge, to any person obtaining
5*0957b409SSimon J. Gerraty * a copy of this software and associated documentation files (the
6*0957b409SSimon J. Gerraty * "Software"), to deal in the Software without restriction, including
7*0957b409SSimon J. Gerraty * without limitation the rights to use, copy, modify, merge, publish,
8*0957b409SSimon J. Gerraty * distribute, sublicense, and/or sell copies of the Software, and to
9*0957b409SSimon J. Gerraty * permit persons to whom the Software is furnished to do so, subject to
10*0957b409SSimon J. Gerraty * the following conditions:
11*0957b409SSimon J. Gerraty *
12*0957b409SSimon J. Gerraty * The above copyright notice and this permission notice shall be
13*0957b409SSimon J. Gerraty * included in all copies or substantial portions of the Software.
14*0957b409SSimon J. Gerraty *
15*0957b409SSimon J. Gerraty * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*0957b409SSimon J. Gerraty * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*0957b409SSimon J. Gerraty * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*0957b409SSimon J. Gerraty * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19*0957b409SSimon J. Gerraty * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20*0957b409SSimon J. Gerraty * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21*0957b409SSimon J. Gerraty * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*0957b409SSimon J. Gerraty * SOFTWARE.
23*0957b409SSimon J. Gerraty */
24*0957b409SSimon J. Gerraty
25*0957b409SSimon J. Gerraty #include "inner.h"
26*0957b409SSimon J. Gerraty
27*0957b409SSimon J. Gerraty /*
28*0957b409SSimon J. Gerraty * PC2left[x] tells where bit x goes when applying PC-2. 'x' is a bit
29*0957b409SSimon J. Gerraty * position in the left rotated key word. Both position are in normal
30*0957b409SSimon J. Gerraty * order (rightmost bit is 0).
31*0957b409SSimon J. Gerraty */
32*0957b409SSimon J. Gerraty static const unsigned char PC2left[] = {
33*0957b409SSimon J. Gerraty 16, 3, 7, 24, 20, 11, 24,
34*0957b409SSimon J. Gerraty 13, 2, 10, 24, 22, 5, 15,
35*0957b409SSimon J. Gerraty 23, 1, 9, 21, 12, 24, 6,
36*0957b409SSimon J. Gerraty 4, 14, 18, 8, 17, 0, 19
37*0957b409SSimon J. Gerraty };
38*0957b409SSimon J. Gerraty
39*0957b409SSimon J. Gerraty /*
40*0957b409SSimon J. Gerraty * Similar to PC2left[x], for the right rotated key word.
41*0957b409SSimon J. Gerraty */
42*0957b409SSimon J. Gerraty static const unsigned char PC2right[] = {
43*0957b409SSimon J. Gerraty 8, 18, 24, 6, 22, 15, 3,
44*0957b409SSimon J. Gerraty 10, 12, 19, 5, 14, 11, 24,
45*0957b409SSimon J. Gerraty 4, 23, 16, 9, 24, 20, 2,
46*0957b409SSimon J. Gerraty 24, 7, 13, 0, 21, 17, 1
47*0957b409SSimon J. Gerraty };
48*0957b409SSimon J. Gerraty
49*0957b409SSimon J. Gerraty /*
50*0957b409SSimon J. Gerraty * S-boxes and PC-1 merged.
51*0957b409SSimon J. Gerraty */
52*0957b409SSimon J. Gerraty static const uint32_t S1[] = {
53*0957b409SSimon J. Gerraty 0x00808200, 0x00000000, 0x00008000, 0x00808202,
54*0957b409SSimon J. Gerraty 0x00808002, 0x00008202, 0x00000002, 0x00008000,
55*0957b409SSimon J. Gerraty 0x00000200, 0x00808200, 0x00808202, 0x00000200,
56*0957b409SSimon J. Gerraty 0x00800202, 0x00808002, 0x00800000, 0x00000002,
57*0957b409SSimon J. Gerraty 0x00000202, 0x00800200, 0x00800200, 0x00008200,
58*0957b409SSimon J. Gerraty 0x00008200, 0x00808000, 0x00808000, 0x00800202,
59*0957b409SSimon J. Gerraty 0x00008002, 0x00800002, 0x00800002, 0x00008002,
60*0957b409SSimon J. Gerraty 0x00000000, 0x00000202, 0x00008202, 0x00800000,
61*0957b409SSimon J. Gerraty 0x00008000, 0x00808202, 0x00000002, 0x00808000,
62*0957b409SSimon J. Gerraty 0x00808200, 0x00800000, 0x00800000, 0x00000200,
63*0957b409SSimon J. Gerraty 0x00808002, 0x00008000, 0x00008200, 0x00800002,
64*0957b409SSimon J. Gerraty 0x00000200, 0x00000002, 0x00800202, 0x00008202,
65*0957b409SSimon J. Gerraty 0x00808202, 0x00008002, 0x00808000, 0x00800202,
66*0957b409SSimon J. Gerraty 0x00800002, 0x00000202, 0x00008202, 0x00808200,
67*0957b409SSimon J. Gerraty 0x00000202, 0x00800200, 0x00800200, 0x00000000,
68*0957b409SSimon J. Gerraty 0x00008002, 0x00008200, 0x00000000, 0x00808002
69*0957b409SSimon J. Gerraty };
70*0957b409SSimon J. Gerraty
71*0957b409SSimon J. Gerraty static const uint32_t S2[] = {
72*0957b409SSimon J. Gerraty 0x40084010, 0x40004000, 0x00004000, 0x00084010,
73*0957b409SSimon J. Gerraty 0x00080000, 0x00000010, 0x40080010, 0x40004010,
74*0957b409SSimon J. Gerraty 0x40000010, 0x40084010, 0x40084000, 0x40000000,
75*0957b409SSimon J. Gerraty 0x40004000, 0x00080000, 0x00000010, 0x40080010,
76*0957b409SSimon J. Gerraty 0x00084000, 0x00080010, 0x40004010, 0x00000000,
77*0957b409SSimon J. Gerraty 0x40000000, 0x00004000, 0x00084010, 0x40080000,
78*0957b409SSimon J. Gerraty 0x00080010, 0x40000010, 0x00000000, 0x00084000,
79*0957b409SSimon J. Gerraty 0x00004010, 0x40084000, 0x40080000, 0x00004010,
80*0957b409SSimon J. Gerraty 0x00000000, 0x00084010, 0x40080010, 0x00080000,
81*0957b409SSimon J. Gerraty 0x40004010, 0x40080000, 0x40084000, 0x00004000,
82*0957b409SSimon J. Gerraty 0x40080000, 0x40004000, 0x00000010, 0x40084010,
83*0957b409SSimon J. Gerraty 0x00084010, 0x00000010, 0x00004000, 0x40000000,
84*0957b409SSimon J. Gerraty 0x00004010, 0x40084000, 0x00080000, 0x40000010,
85*0957b409SSimon J. Gerraty 0x00080010, 0x40004010, 0x40000010, 0x00080010,
86*0957b409SSimon J. Gerraty 0x00084000, 0x00000000, 0x40004000, 0x00004010,
87*0957b409SSimon J. Gerraty 0x40000000, 0x40080010, 0x40084010, 0x00084000
88*0957b409SSimon J. Gerraty };
89*0957b409SSimon J. Gerraty
90*0957b409SSimon J. Gerraty static const uint32_t S3[] = {
91*0957b409SSimon J. Gerraty 0x00000104, 0x04010100, 0x00000000, 0x04010004,
92*0957b409SSimon J. Gerraty 0x04000100, 0x00000000, 0x00010104, 0x04000100,
93*0957b409SSimon J. Gerraty 0x00010004, 0x04000004, 0x04000004, 0x00010000,
94*0957b409SSimon J. Gerraty 0x04010104, 0x00010004, 0x04010000, 0x00000104,
95*0957b409SSimon J. Gerraty 0x04000000, 0x00000004, 0x04010100, 0x00000100,
96*0957b409SSimon J. Gerraty 0x00010100, 0x04010000, 0x04010004, 0x00010104,
97*0957b409SSimon J. Gerraty 0x04000104, 0x00010100, 0x00010000, 0x04000104,
98*0957b409SSimon J. Gerraty 0x00000004, 0x04010104, 0x00000100, 0x04000000,
99*0957b409SSimon J. Gerraty 0x04010100, 0x04000000, 0x00010004, 0x00000104,
100*0957b409SSimon J. Gerraty 0x00010000, 0x04010100, 0x04000100, 0x00000000,
101*0957b409SSimon J. Gerraty 0x00000100, 0x00010004, 0x04010104, 0x04000100,
102*0957b409SSimon J. Gerraty 0x04000004, 0x00000100, 0x00000000, 0x04010004,
103*0957b409SSimon J. Gerraty 0x04000104, 0x00010000, 0x04000000, 0x04010104,
104*0957b409SSimon J. Gerraty 0x00000004, 0x00010104, 0x00010100, 0x04000004,
105*0957b409SSimon J. Gerraty 0x04010000, 0x04000104, 0x00000104, 0x04010000,
106*0957b409SSimon J. Gerraty 0x00010104, 0x00000004, 0x04010004, 0x00010100
107*0957b409SSimon J. Gerraty };
108*0957b409SSimon J. Gerraty
109*0957b409SSimon J. Gerraty static const uint32_t S4[] = {
110*0957b409SSimon J. Gerraty 0x80401000, 0x80001040, 0x80001040, 0x00000040,
111*0957b409SSimon J. Gerraty 0x00401040, 0x80400040, 0x80400000, 0x80001000,
112*0957b409SSimon J. Gerraty 0x00000000, 0x00401000, 0x00401000, 0x80401040,
113*0957b409SSimon J. Gerraty 0x80000040, 0x00000000, 0x00400040, 0x80400000,
114*0957b409SSimon J. Gerraty 0x80000000, 0x00001000, 0x00400000, 0x80401000,
115*0957b409SSimon J. Gerraty 0x00000040, 0x00400000, 0x80001000, 0x00001040,
116*0957b409SSimon J. Gerraty 0x80400040, 0x80000000, 0x00001040, 0x00400040,
117*0957b409SSimon J. Gerraty 0x00001000, 0x00401040, 0x80401040, 0x80000040,
118*0957b409SSimon J. Gerraty 0x00400040, 0x80400000, 0x00401000, 0x80401040,
119*0957b409SSimon J. Gerraty 0x80000040, 0x00000000, 0x00000000, 0x00401000,
120*0957b409SSimon J. Gerraty 0x00001040, 0x00400040, 0x80400040, 0x80000000,
121*0957b409SSimon J. Gerraty 0x80401000, 0x80001040, 0x80001040, 0x00000040,
122*0957b409SSimon J. Gerraty 0x80401040, 0x80000040, 0x80000000, 0x00001000,
123*0957b409SSimon J. Gerraty 0x80400000, 0x80001000, 0x00401040, 0x80400040,
124*0957b409SSimon J. Gerraty 0x80001000, 0x00001040, 0x00400000, 0x80401000,
125*0957b409SSimon J. Gerraty 0x00000040, 0x00400000, 0x00001000, 0x00401040
126*0957b409SSimon J. Gerraty };
127*0957b409SSimon J. Gerraty
128*0957b409SSimon J. Gerraty static const uint32_t S5[] = {
129*0957b409SSimon J. Gerraty 0x00000080, 0x01040080, 0x01040000, 0x21000080,
130*0957b409SSimon J. Gerraty 0x00040000, 0x00000080, 0x20000000, 0x01040000,
131*0957b409SSimon J. Gerraty 0x20040080, 0x00040000, 0x01000080, 0x20040080,
132*0957b409SSimon J. Gerraty 0x21000080, 0x21040000, 0x00040080, 0x20000000,
133*0957b409SSimon J. Gerraty 0x01000000, 0x20040000, 0x20040000, 0x00000000,
134*0957b409SSimon J. Gerraty 0x20000080, 0x21040080, 0x21040080, 0x01000080,
135*0957b409SSimon J. Gerraty 0x21040000, 0x20000080, 0x00000000, 0x21000000,
136*0957b409SSimon J. Gerraty 0x01040080, 0x01000000, 0x21000000, 0x00040080,
137*0957b409SSimon J. Gerraty 0x00040000, 0x21000080, 0x00000080, 0x01000000,
138*0957b409SSimon J. Gerraty 0x20000000, 0x01040000, 0x21000080, 0x20040080,
139*0957b409SSimon J. Gerraty 0x01000080, 0x20000000, 0x21040000, 0x01040080,
140*0957b409SSimon J. Gerraty 0x20040080, 0x00000080, 0x01000000, 0x21040000,
141*0957b409SSimon J. Gerraty 0x21040080, 0x00040080, 0x21000000, 0x21040080,
142*0957b409SSimon J. Gerraty 0x01040000, 0x00000000, 0x20040000, 0x21000000,
143*0957b409SSimon J. Gerraty 0x00040080, 0x01000080, 0x20000080, 0x00040000,
144*0957b409SSimon J. Gerraty 0x00000000, 0x20040000, 0x01040080, 0x20000080
145*0957b409SSimon J. Gerraty };
146*0957b409SSimon J. Gerraty
147*0957b409SSimon J. Gerraty static const uint32_t S6[] = {
148*0957b409SSimon J. Gerraty 0x10000008, 0x10200000, 0x00002000, 0x10202008,
149*0957b409SSimon J. Gerraty 0x10200000, 0x00000008, 0x10202008, 0x00200000,
150*0957b409SSimon J. Gerraty 0x10002000, 0x00202008, 0x00200000, 0x10000008,
151*0957b409SSimon J. Gerraty 0x00200008, 0x10002000, 0x10000000, 0x00002008,
152*0957b409SSimon J. Gerraty 0x00000000, 0x00200008, 0x10002008, 0x00002000,
153*0957b409SSimon J. Gerraty 0x00202000, 0x10002008, 0x00000008, 0x10200008,
154*0957b409SSimon J. Gerraty 0x10200008, 0x00000000, 0x00202008, 0x10202000,
155*0957b409SSimon J. Gerraty 0x00002008, 0x00202000, 0x10202000, 0x10000000,
156*0957b409SSimon J. Gerraty 0x10002000, 0x00000008, 0x10200008, 0x00202000,
157*0957b409SSimon J. Gerraty 0x10202008, 0x00200000, 0x00002008, 0x10000008,
158*0957b409SSimon J. Gerraty 0x00200000, 0x10002000, 0x10000000, 0x00002008,
159*0957b409SSimon J. Gerraty 0x10000008, 0x10202008, 0x00202000, 0x10200000,
160*0957b409SSimon J. Gerraty 0x00202008, 0x10202000, 0x00000000, 0x10200008,
161*0957b409SSimon J. Gerraty 0x00000008, 0x00002000, 0x10200000, 0x00202008,
162*0957b409SSimon J. Gerraty 0x00002000, 0x00200008, 0x10002008, 0x00000000,
163*0957b409SSimon J. Gerraty 0x10202000, 0x10000000, 0x00200008, 0x10002008
164*0957b409SSimon J. Gerraty };
165*0957b409SSimon J. Gerraty
166*0957b409SSimon J. Gerraty static const uint32_t S7[] = {
167*0957b409SSimon J. Gerraty 0x00100000, 0x02100001, 0x02000401, 0x00000000,
168*0957b409SSimon J. Gerraty 0x00000400, 0x02000401, 0x00100401, 0x02100400,
169*0957b409SSimon J. Gerraty 0x02100401, 0x00100000, 0x00000000, 0x02000001,
170*0957b409SSimon J. Gerraty 0x00000001, 0x02000000, 0x02100001, 0x00000401,
171*0957b409SSimon J. Gerraty 0x02000400, 0x00100401, 0x00100001, 0x02000400,
172*0957b409SSimon J. Gerraty 0x02000001, 0x02100000, 0x02100400, 0x00100001,
173*0957b409SSimon J. Gerraty 0x02100000, 0x00000400, 0x00000401, 0x02100401,
174*0957b409SSimon J. Gerraty 0x00100400, 0x00000001, 0x02000000, 0x00100400,
175*0957b409SSimon J. Gerraty 0x02000000, 0x00100400, 0x00100000, 0x02000401,
176*0957b409SSimon J. Gerraty 0x02000401, 0x02100001, 0x02100001, 0x00000001,
177*0957b409SSimon J. Gerraty 0x00100001, 0x02000000, 0x02000400, 0x00100000,
178*0957b409SSimon J. Gerraty 0x02100400, 0x00000401, 0x00100401, 0x02100400,
179*0957b409SSimon J. Gerraty 0x00000401, 0x02000001, 0x02100401, 0x02100000,
180*0957b409SSimon J. Gerraty 0x00100400, 0x00000000, 0x00000001, 0x02100401,
181*0957b409SSimon J. Gerraty 0x00000000, 0x00100401, 0x02100000, 0x00000400,
182*0957b409SSimon J. Gerraty 0x02000001, 0x02000400, 0x00000400, 0x00100001
183*0957b409SSimon J. Gerraty };
184*0957b409SSimon J. Gerraty
185*0957b409SSimon J. Gerraty static const uint32_t S8[] = {
186*0957b409SSimon J. Gerraty 0x08000820, 0x00000800, 0x00020000, 0x08020820,
187*0957b409SSimon J. Gerraty 0x08000000, 0x08000820, 0x00000020, 0x08000000,
188*0957b409SSimon J. Gerraty 0x00020020, 0x08020000, 0x08020820, 0x00020800,
189*0957b409SSimon J. Gerraty 0x08020800, 0x00020820, 0x00000800, 0x00000020,
190*0957b409SSimon J. Gerraty 0x08020000, 0x08000020, 0x08000800, 0x00000820,
191*0957b409SSimon J. Gerraty 0x00020800, 0x00020020, 0x08020020, 0x08020800,
192*0957b409SSimon J. Gerraty 0x00000820, 0x00000000, 0x00000000, 0x08020020,
193*0957b409SSimon J. Gerraty 0x08000020, 0x08000800, 0x00020820, 0x00020000,
194*0957b409SSimon J. Gerraty 0x00020820, 0x00020000, 0x08020800, 0x00000800,
195*0957b409SSimon J. Gerraty 0x00000020, 0x08020020, 0x00000800, 0x00020820,
196*0957b409SSimon J. Gerraty 0x08000800, 0x00000020, 0x08000020, 0x08020000,
197*0957b409SSimon J. Gerraty 0x08020020, 0x08000000, 0x00020000, 0x08000820,
198*0957b409SSimon J. Gerraty 0x00000000, 0x08020820, 0x00020020, 0x08000020,
199*0957b409SSimon J. Gerraty 0x08020000, 0x08000800, 0x08000820, 0x00000000,
200*0957b409SSimon J. Gerraty 0x08020820, 0x00020800, 0x00020800, 0x00000820,
201*0957b409SSimon J. Gerraty 0x00000820, 0x00020020, 0x08000000, 0x08020800
202*0957b409SSimon J. Gerraty };
203*0957b409SSimon J. Gerraty
204*0957b409SSimon J. Gerraty static inline uint32_t
Fconf(uint32_t r0,uint32_t skl,uint32_t skr)205*0957b409SSimon J. Gerraty Fconf(uint32_t r0, uint32_t skl, uint32_t skr)
206*0957b409SSimon J. Gerraty {
207*0957b409SSimon J. Gerraty uint32_t r1;
208*0957b409SSimon J. Gerraty
209*0957b409SSimon J. Gerraty r1 = (r0 << 16) | (r0 >> 16);
210*0957b409SSimon J. Gerraty return
211*0957b409SSimon J. Gerraty S1[((r1 >> 11) ^ (skl >> 18)) & 0x3F]
212*0957b409SSimon J. Gerraty | S2[((r0 >> 23) ^ (skl >> 12)) & 0x3F]
213*0957b409SSimon J. Gerraty | S3[((r0 >> 19) ^ (skl >> 6)) & 0x3F]
214*0957b409SSimon J. Gerraty | S4[((r0 >> 15) ^ (skl )) & 0x3F]
215*0957b409SSimon J. Gerraty | S5[((r0 >> 11) ^ (skr >> 18)) & 0x3F]
216*0957b409SSimon J. Gerraty | S6[((r0 >> 7) ^ (skr >> 12)) & 0x3F]
217*0957b409SSimon J. Gerraty | S7[((r0 >> 3) ^ (skr >> 6)) & 0x3F]
218*0957b409SSimon J. Gerraty | S8[((r1 >> 15) ^ (skr )) & 0x3F];
219*0957b409SSimon J. Gerraty }
220*0957b409SSimon J. Gerraty
221*0957b409SSimon J. Gerraty static void
process_block_unit(uint32_t * pl,uint32_t * pr,const uint32_t * skey)222*0957b409SSimon J. Gerraty process_block_unit(uint32_t *pl, uint32_t *pr, const uint32_t *skey)
223*0957b409SSimon J. Gerraty {
224*0957b409SSimon J. Gerraty int i;
225*0957b409SSimon J. Gerraty uint32_t l, r;
226*0957b409SSimon J. Gerraty
227*0957b409SSimon J. Gerraty l = *pl;
228*0957b409SSimon J. Gerraty r = *pr;
229*0957b409SSimon J. Gerraty for (i = 0; i < 16; i ++) {
230*0957b409SSimon J. Gerraty uint32_t t;
231*0957b409SSimon J. Gerraty
232*0957b409SSimon J. Gerraty t = l ^ Fconf(r, skey[(i << 1) + 0], skey[(i << 1) + 1]);
233*0957b409SSimon J. Gerraty l = r;
234*0957b409SSimon J. Gerraty r = t;
235*0957b409SSimon J. Gerraty }
236*0957b409SSimon J. Gerraty *pl = r;
237*0957b409SSimon J. Gerraty *pr = l;
238*0957b409SSimon J. Gerraty }
239*0957b409SSimon J. Gerraty
240*0957b409SSimon J. Gerraty /* see inner.h */
241*0957b409SSimon J. Gerraty void
br_des_tab_process_block(unsigned num_rounds,const uint32_t * skey,void * block)242*0957b409SSimon J. Gerraty br_des_tab_process_block(unsigned num_rounds, const uint32_t *skey, void *block)
243*0957b409SSimon J. Gerraty {
244*0957b409SSimon J. Gerraty unsigned char *buf;
245*0957b409SSimon J. Gerraty uint32_t l, r;
246*0957b409SSimon J. Gerraty
247*0957b409SSimon J. Gerraty buf = block;
248*0957b409SSimon J. Gerraty l = br_dec32be(buf);
249*0957b409SSimon J. Gerraty r = br_dec32be(buf + 4);
250*0957b409SSimon J. Gerraty br_des_do_IP(&l, &r);
251*0957b409SSimon J. Gerraty while (num_rounds -- > 0) {
252*0957b409SSimon J. Gerraty process_block_unit(&l, &r, skey);
253*0957b409SSimon J. Gerraty skey += 32;
254*0957b409SSimon J. Gerraty }
255*0957b409SSimon J. Gerraty br_des_do_invIP(&l, &r);
256*0957b409SSimon J. Gerraty br_enc32be(buf, l);
257*0957b409SSimon J. Gerraty br_enc32be(buf + 4, r);
258*0957b409SSimon J. Gerraty }
259*0957b409SSimon J. Gerraty
260*0957b409SSimon J. Gerraty static void
keysched_unit(uint32_t * skey,const void * key)261*0957b409SSimon J. Gerraty keysched_unit(uint32_t *skey, const void *key)
262*0957b409SSimon J. Gerraty {
263*0957b409SSimon J. Gerraty int i;
264*0957b409SSimon J. Gerraty
265*0957b409SSimon J. Gerraty br_des_keysched_unit(skey, key);
266*0957b409SSimon J. Gerraty
267*0957b409SSimon J. Gerraty /*
268*0957b409SSimon J. Gerraty * Apply PC-2 to get the 48-bit subkeys.
269*0957b409SSimon J. Gerraty */
270*0957b409SSimon J. Gerraty for (i = 0; i < 16; i ++) {
271*0957b409SSimon J. Gerraty uint32_t xl, xr, ul, ur;
272*0957b409SSimon J. Gerraty int j;
273*0957b409SSimon J. Gerraty
274*0957b409SSimon J. Gerraty xl = skey[(i << 1) + 0];
275*0957b409SSimon J. Gerraty xr = skey[(i << 1) + 1];
276*0957b409SSimon J. Gerraty ul = 0;
277*0957b409SSimon J. Gerraty ur = 0;
278*0957b409SSimon J. Gerraty for (j = 0; j < 28; j ++) {
279*0957b409SSimon J. Gerraty ul |= (xl & 1) << PC2left[j];
280*0957b409SSimon J. Gerraty ur |= (xr & 1) << PC2right[j];
281*0957b409SSimon J. Gerraty xl >>= 1;
282*0957b409SSimon J. Gerraty xr >>= 1;
283*0957b409SSimon J. Gerraty }
284*0957b409SSimon J. Gerraty skey[(i << 1) + 0] = ul;
285*0957b409SSimon J. Gerraty skey[(i << 1) + 1] = ur;
286*0957b409SSimon J. Gerraty }
287*0957b409SSimon J. Gerraty }
288*0957b409SSimon J. Gerraty
289*0957b409SSimon J. Gerraty /* see inner.h */
290*0957b409SSimon J. Gerraty unsigned
br_des_tab_keysched(uint32_t * skey,const void * key,size_t key_len)291*0957b409SSimon J. Gerraty br_des_tab_keysched(uint32_t *skey, const void *key, size_t key_len)
292*0957b409SSimon J. Gerraty {
293*0957b409SSimon J. Gerraty switch (key_len) {
294*0957b409SSimon J. Gerraty case 8:
295*0957b409SSimon J. Gerraty keysched_unit(skey, key);
296*0957b409SSimon J. Gerraty return 1;
297*0957b409SSimon J. Gerraty case 16:
298*0957b409SSimon J. Gerraty keysched_unit(skey, key);
299*0957b409SSimon J. Gerraty keysched_unit(skey + 32, (const unsigned char *)key + 8);
300*0957b409SSimon J. Gerraty br_des_rev_skey(skey + 32);
301*0957b409SSimon J. Gerraty memcpy(skey + 64, skey, 32 * sizeof *skey);
302*0957b409SSimon J. Gerraty return 3;
303*0957b409SSimon J. Gerraty default:
304*0957b409SSimon J. Gerraty keysched_unit(skey, key);
305*0957b409SSimon J. Gerraty keysched_unit(skey + 32, (const unsigned char *)key + 8);
306*0957b409SSimon J. Gerraty br_des_rev_skey(skey + 32);
307*0957b409SSimon J. Gerraty keysched_unit(skey + 64, (const unsigned char *)key + 16);
308*0957b409SSimon J. Gerraty return 3;
309*0957b409SSimon J. Gerraty }
310*0957b409SSimon J. Gerraty }
311