Wraphelp.c revision ff559fab
1ff559fabSmrg/*
2ff559fabSmrg * $Xorg: A8Eq.c,v 1.4 2001/02/09 02:03:48 xorgcvs Exp $
3ff559fabSmrg *
4ff559fabSmrg */
5ff559fabSmrg
6ff559fabSmrg#ifdef HAVE_CONFIG_H
7ff559fabSmrg#include <config.h>
8ff559fabSmrg#endif
9ff559fabSmrg#include <sys/types.h>
10ff559fabSmrg#include <X11/Xmd.h>
11ff559fabSmrg#include "Wrap.h"
12ff559fabSmrg
13ff559fabSmrg/* des routines for non-usa - eay 10/9/1991 eay@psych.psy.uq.oz.au
14ff559fabSmrg * These routines were written for speed not size so they are bigger than
15ff559fabSmrg * needed.  I have removed some of the loop unrolling, this will reduce
16ff559fabSmrg * code size at the expense of some speed.
17ff559fabSmrg * 25/9/1991 eay - much faster _XdmcpAuthSetup (4 times faster).
18ff559fabSmrg * 19/9/1991 eay - cleaned up the IP and FP code.
19ff559fabSmrg * 10/9/1991 eay - first release.
20ff559fabSmrg * The des routines this file has been made from can be found in
21ff559fabSmrg * ftp.psy.uq.oz.au /pub/DES
22ff559fabSmrg * This particular version derived from OpenBSD Revsion 1.3.
23ff559fabSmrg */
24ff559fabSmrg
25ff559fabSmrg/*
26ff559fabSmrg *
27ff559fabSmrg * Export Requirements.
28ff559fabSmrg * You may not export or re-export this software or any copy or
29ff559fabSmrg * adaptation in violation of any applicable laws or regulations.
30ff559fabSmrg *
31ff559fabSmrg * Without limiting the generality of the foregoing, hardware, software,
32ff559fabSmrg * technology or services provided under this license agreement may not
33ff559fabSmrg * be exported, reexported, transferred or downloaded to or within (or to
34ff559fabSmrg * a national resident of) countries under U.S. economic embargo
35ff559fabSmrg * including the following countries:
36ff559fabSmrg *
37ff559fabSmrg * Cuba, Iran, Libya, North Korea, Sudan and Syria. This list is subject
38ff559fabSmrg * to change.
39ff559fabSmrg *
40ff559fabSmrg * Hardware, software, technology or services may not be exported,
41ff559fabSmrg * reexported, transferred or downloaded to persons or entities listed on
42ff559fabSmrg * the U.S. Department of Commerce Denied Persons List, Entity List of
43ff559fabSmrg * proliferation concern or on any U.S. Treasury Department Designated
44ff559fabSmrg * Nationals exclusion list, or to parties directly or indirectly
45ff559fabSmrg * involved in the development or production of nuclear, chemical,
46ff559fabSmrg * biological weapons or in missile technology programs as specified in
47ff559fabSmrg * the U.S. Export Administration Regulations (15 CFR 744).
48ff559fabSmrg *
49ff559fabSmrg * By accepting this license agreement you confirm that you are not
50ff559fabSmrg * located in (or a national resident of) any country under U.S. economic
51ff559fabSmrg * embargo, not identified on any U.S. Department of Commerce Denied
52ff559fabSmrg * Persons List, Entity List or Treasury Department Designated Nationals
53ff559fabSmrg * exclusion list, and not directly or indirectly involved in the
54ff559fabSmrg * development or production of nuclear, chemical, biological weapons or
55ff559fabSmrg * in missile technology programs as specified in the U.S. Export
56ff559fabSmrg * Administration Regulations.
57ff559fabSmrg *
58ff559fabSmrg *
59ff559fabSmrg * Local Country Import Requirements. The software you are about to
60ff559fabSmrg * download contains cryptography technology. Some countries regulate the
61ff559fabSmrg * import, use and/or export of certain products with cryptography. The
62ff559fabSmrg * X.org Foundation makes no claims as to the applicability of local
63ff559fabSmrg * country import, use and/or export regulations in relation to the
64ff559fabSmrg * download of this product. If you are located outside the U.S. and
65ff559fabSmrg * Canada you are advised to consult your local country regulations to
66ff559fabSmrg * insure compliance.
67ff559fabSmrg */
68ff559fabSmrg
69ff559fabSmrgstatic const CARD32 skb[8][64] = {
70ff559fabSmrg	/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
71ff559fabSmrg	{ 0x00000000,0x00000010,0x20000000,0x20000010,
72ff559fabSmrg	  0x00010000,0x00010010,0x20010000,0x20010010,
73ff559fabSmrg	  0x00000800,0x00000810,0x20000800,0x20000810,
74ff559fabSmrg	  0x00010800,0x00010810,0x20010800,0x20010810,
75ff559fabSmrg	  0x00000020,0x00000030,0x20000020,0x20000030,
76ff559fabSmrg	  0x00010020,0x00010030,0x20010020,0x20010030,
77ff559fabSmrg	  0x00000820,0x00000830,0x20000820,0x20000830,
78ff559fabSmrg	  0x00010820,0x00010830,0x20010820,0x20010830,
79ff559fabSmrg	  0x00080000,0x00080010,0x20080000,0x20080010,
80ff559fabSmrg	  0x00090000,0x00090010,0x20090000,0x20090010,
81ff559fabSmrg	  0x00080800,0x00080810,0x20080800,0x20080810,
82ff559fabSmrg	  0x00090800,0x00090810,0x20090800,0x20090810,
83ff559fabSmrg	  0x00080020,0x00080030,0x20080020,0x20080030,
84ff559fabSmrg	  0x00090020,0x00090030,0x20090020,0x20090030,
85ff559fabSmrg	  0x00080820,0x00080830,0x20080820,0x20080830,
86ff559fabSmrg	  0x00090820,0x00090830,0x20090820,0x20090830 },
87ff559fabSmrg	/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
88ff559fabSmrg	{ 0x00000000,0x02000000,0x00002000,0x02002000,
89ff559fabSmrg	  0x00200000,0x02200000,0x00202000,0x02202000,
90ff559fabSmrg	  0x00000004,0x02000004,0x00002004,0x02002004,
91ff559fabSmrg	  0x00200004,0x02200004,0x00202004,0x02202004,
92ff559fabSmrg	  0x00000400,0x02000400,0x00002400,0x02002400,
93ff559fabSmrg	  0x00200400,0x02200400,0x00202400,0x02202400,
94ff559fabSmrg	  0x00000404,0x02000404,0x00002404,0x02002404,
95ff559fabSmrg	  0x00200404,0x02200404,0x00202404,0x02202404,
96ff559fabSmrg	  0x10000000,0x12000000,0x10002000,0x12002000,
97ff559fabSmrg	  0x10200000,0x12200000,0x10202000,0x12202000,
98ff559fabSmrg	  0x10000004,0x12000004,0x10002004,0x12002004,
99ff559fabSmrg	  0x10200004,0x12200004,0x10202004,0x12202004,
100ff559fabSmrg	  0x10000400,0x12000400,0x10002400,0x12002400,
101ff559fabSmrg	  0x10200400,0x12200400,0x10202400,0x12202400,
102ff559fabSmrg	  0x10000404,0x12000404,0x10002404,0x12002404,
103ff559fabSmrg	  0x10200404,0x12200404,0x10202404,0x12202404 },
104ff559fabSmrg	/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
105ff559fabSmrg	{ 0x00000000,0x00000001,0x00040000,0x00040001,
106ff559fabSmrg	  0x01000000,0x01000001,0x01040000,0x01040001,
107ff559fabSmrg	  0x00000002,0x00000003,0x00040002,0x00040003,
108ff559fabSmrg	  0x01000002,0x01000003,0x01040002,0x01040003,
109ff559fabSmrg	  0x00000200,0x00000201,0x00040200,0x00040201,
110ff559fabSmrg	  0x01000200,0x01000201,0x01040200,0x01040201,
111ff559fabSmrg	  0x00000202,0x00000203,0x00040202,0x00040203,
112ff559fabSmrg	  0x01000202,0x01000203,0x01040202,0x01040203,
113ff559fabSmrg	  0x08000000,0x08000001,0x08040000,0x08040001,
114ff559fabSmrg	  0x09000000,0x09000001,0x09040000,0x09040001,
115ff559fabSmrg	  0x08000002,0x08000003,0x08040002,0x08040003,
116ff559fabSmrg	  0x09000002,0x09000003,0x09040002,0x09040003,
117ff559fabSmrg	  0x08000200,0x08000201,0x08040200,0x08040201,
118ff559fabSmrg	  0x09000200,0x09000201,0x09040200,0x09040201,
119ff559fabSmrg	  0x08000202,0x08000203,0x08040202,0x08040203,
120ff559fabSmrg	  0x09000202,0x09000203,0x09040202,0x09040203 },
121ff559fabSmrg	/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
122ff559fabSmrg	{ 0x00000000,0x00100000,0x00000100,0x00100100,
123ff559fabSmrg	  0x00000008,0x00100008,0x00000108,0x00100108,
124ff559fabSmrg	  0x00001000,0x00101000,0x00001100,0x00101100,
125ff559fabSmrg	  0x00001008,0x00101008,0x00001108,0x00101108,
126ff559fabSmrg	  0x04000000,0x04100000,0x04000100,0x04100100,
127ff559fabSmrg	  0x04000008,0x04100008,0x04000108,0x04100108,
128ff559fabSmrg	  0x04001000,0x04101000,0x04001100,0x04101100,
129ff559fabSmrg	  0x04001008,0x04101008,0x04001108,0x04101108,
130ff559fabSmrg	  0x00020000,0x00120000,0x00020100,0x00120100,
131ff559fabSmrg	  0x00020008,0x00120008,0x00020108,0x00120108,
132ff559fabSmrg	  0x00021000,0x00121000,0x00021100,0x00121100,
133ff559fabSmrg	  0x00021008,0x00121008,0x00021108,0x00121108,
134ff559fabSmrg	  0x04020000,0x04120000,0x04020100,0x04120100,
135ff559fabSmrg	  0x04020008,0x04120008,0x04020108,0x04120108,
136ff559fabSmrg	  0x04021000,0x04121000,0x04021100,0x04121100,
137ff559fabSmrg	  0x04021008,0x04121008,0x04021108,0x04121108 },
138ff559fabSmrg	/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
139ff559fabSmrg	{ 0x00000000,0x10000000,0x00010000,0x10010000,
140ff559fabSmrg	  0x00000004,0x10000004,0x00010004,0x10010004,
141ff559fabSmrg	  0x20000000,0x30000000,0x20010000,0x30010000,
142ff559fabSmrg	  0x20000004,0x30000004,0x20010004,0x30010004,
143ff559fabSmrg	  0x00100000,0x10100000,0x00110000,0x10110000,
144ff559fabSmrg	  0x00100004,0x10100004,0x00110004,0x10110004,
145ff559fabSmrg	  0x20100000,0x30100000,0x20110000,0x30110000,
146ff559fabSmrg	  0x20100004,0x30100004,0x20110004,0x30110004,
147ff559fabSmrg	  0x00001000,0x10001000,0x00011000,0x10011000,
148ff559fabSmrg	  0x00001004,0x10001004,0x00011004,0x10011004,
149ff559fabSmrg	  0x20001000,0x30001000,0x20011000,0x30011000,
150ff559fabSmrg	  0x20001004,0x30001004,0x20011004,0x30011004,
151ff559fabSmrg	  0x00101000,0x10101000,0x00111000,0x10111000,
152ff559fabSmrg	  0x00101004,0x10101004,0x00111004,0x10111004,
153ff559fabSmrg	  0x20101000,0x30101000,0x20111000,0x30111000,
154ff559fabSmrg	  0x20101004,0x30101004,0x20111004,0x30111004 },
155ff559fabSmrg	/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
156ff559fabSmrg	{ 0x00000000,0x08000000,0x00000008,0x08000008,
157ff559fabSmrg	  0x00000400,0x08000400,0x00000408,0x08000408,
158ff559fabSmrg	  0x00020000,0x08020000,0x00020008,0x08020008,
159ff559fabSmrg	  0x00020400,0x08020400,0x00020408,0x08020408,
160ff559fabSmrg	  0x00000001,0x08000001,0x00000009,0x08000009,
161ff559fabSmrg	  0x00000401,0x08000401,0x00000409,0x08000409,
162ff559fabSmrg	  0x00020001,0x08020001,0x00020009,0x08020009,
163ff559fabSmrg	  0x00020401,0x08020401,0x00020409,0x08020409,
164ff559fabSmrg	  0x02000000,0x0A000000,0x02000008,0x0A000008,
165ff559fabSmrg	  0x02000400,0x0A000400,0x02000408,0x0A000408,
166ff559fabSmrg	  0x02020000,0x0A020000,0x02020008,0x0A020008,
167ff559fabSmrg	  0x02020400,0x0A020400,0x02020408,0x0A020408,
168ff559fabSmrg	  0x02000001,0x0A000001,0x02000009,0x0A000009,
169ff559fabSmrg	  0x02000401,0x0A000401,0x02000409,0x0A000409,
170ff559fabSmrg	  0x02020001,0x0A020001,0x02020009,0x0A020009,
171ff559fabSmrg	  0x02020401,0x0A020401,0x02020409,0x0A020409 },
172ff559fabSmrg	/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
173ff559fabSmrg	{ 0x00000000,0x00000100,0x00080000,0x00080100,
174ff559fabSmrg	  0x01000000,0x01000100,0x01080000,0x01080100,
175ff559fabSmrg	  0x00000010,0x00000110,0x00080010,0x00080110,
176ff559fabSmrg	  0x01000010,0x01000110,0x01080010,0x01080110,
177ff559fabSmrg	  0x00200000,0x00200100,0x00280000,0x00280100,
178ff559fabSmrg	  0x01200000,0x01200100,0x01280000,0x01280100,
179ff559fabSmrg	  0x00200010,0x00200110,0x00280010,0x00280110,
180ff559fabSmrg	  0x01200010,0x01200110,0x01280010,0x01280110,
181ff559fabSmrg	  0x00000200,0x00000300,0x00080200,0x00080300,
182ff559fabSmrg	  0x01000200,0x01000300,0x01080200,0x01080300,
183ff559fabSmrg	  0x00000210,0x00000310,0x00080210,0x00080310,
184ff559fabSmrg	  0x01000210,0x01000310,0x01080210,0x01080310,
185ff559fabSmrg	  0x00200200,0x00200300,0x00280200,0x00280300,
186ff559fabSmrg	  0x01200200,0x01200300,0x01280200,0x01280300,
187ff559fabSmrg	  0x00200210,0x00200310,0x00280210,0x00280310,
188ff559fabSmrg	  0x01200210,0x01200310,0x01280210,0x01280310 },
189ff559fabSmrg	  /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
190ff559fabSmrg	{ 0x00000000,0x04000000,0x00040000,0x04040000,
191ff559fabSmrg	  0x00000002,0x04000002,0x00040002,0x04040002,
192ff559fabSmrg	  0x00002000,0x04002000,0x00042000,0x04042000,
193ff559fabSmrg	  0x00002002,0x04002002,0x00042002,0x04042002,
194ff559fabSmrg	  0x00000020,0x04000020,0x00040020,0x04040020,
195ff559fabSmrg	  0x00000022,0x04000022,0x00040022,0x04040022,
196ff559fabSmrg	  0x00002020,0x04002020,0x00042020,0x04042020,
197ff559fabSmrg	  0x00002022,0x04002022,0x00042022,0x04042022,
198ff559fabSmrg	  0x00000800,0x04000800,0x00040800,0x04040800,
199ff559fabSmrg	  0x00000802,0x04000802,0x00040802,0x04040802,
200ff559fabSmrg	  0x00002800,0x04002800,0x00042800,0x04042800,
201ff559fabSmrg	  0x00002802,0x04002802,0x00042802,0x04042802,
202ff559fabSmrg	  0x00000820,0x04000820,0x00040820,0x04040820,
203ff559fabSmrg	  0x00000822,0x04000822,0x00040822,0x04040822,
204ff559fabSmrg	  0x00002820,0x04002820,0x00042820,0x04042820,
205ff559fabSmrg	  0x00002822,0x04002822,0x00042822,0x04042822 }
206ff559fabSmrg};
207ff559fabSmrg
208ff559fabSmrg
209ff559fabSmrgstatic const CARD32 SPtrans[8][64] = {
210ff559fabSmrg	/* nibble 0 */
211ff559fabSmrg	{ 0x00410100, 0x00010000, 0x40400000, 0x40410100,
212ff559fabSmrg	  0x00400000, 0x40010100, 0x40010000, 0x40400000,
213ff559fabSmrg	  0x40010100, 0x00410100, 0x00410000, 0x40000100,
214ff559fabSmrg	  0x40400100, 0x00400000, 0x00000000, 0x40010000,
215ff559fabSmrg	  0x00010000, 0x40000000, 0x00400100, 0x00010100,
216ff559fabSmrg	  0x40410100, 0x00410000, 0x40000100, 0x00400100,
217ff559fabSmrg	  0x40000000, 0x00000100, 0x00010100, 0x40410000,
218ff559fabSmrg	  0x00000100, 0x40400100, 0x40410000, 0x00000000,
219ff559fabSmrg	  0x00000000, 0x40410100, 0x00400100, 0x40010000,
220ff559fabSmrg	  0x00410100, 0x00010000, 0x40000100, 0x00400100,
221ff559fabSmrg	  0x40410000, 0x00000100, 0x00010100, 0x40400000,
222ff559fabSmrg	  0x40010100, 0x40000000, 0x40400000, 0x00410000,
223ff559fabSmrg	  0x40410100, 0x00010100, 0x00410000, 0x40400100,
224ff559fabSmrg	  0x00400000, 0x40000100, 0x40010000, 0x00000000,
225ff559fabSmrg	  0x00010000, 0x00400000, 0x40400100, 0x00410100,
226ff559fabSmrg	  0x40000000, 0x40410000, 0x00000100, 0x40010100 },
227ff559fabSmrg
228ff559fabSmrg	/* nibble 1 */
229ff559fabSmrg	{ 0x08021002, 0x00000000, 0x00021000, 0x08020000,
230ff559fabSmrg	  0x08000002, 0x00001002, 0x08001000, 0x00021000,
231ff559fabSmrg	  0x00001000, 0x08020002, 0x00000002, 0x08001000,
232ff559fabSmrg	  0x00020002, 0x08021000, 0x08020000, 0x00000002,
233ff559fabSmrg	  0x00020000, 0x08001002, 0x08020002, 0x00001000,
234ff559fabSmrg	  0x00021002, 0x08000000, 0x00000000, 0x00020002,
235ff559fabSmrg	  0x08001002, 0x00021002, 0x08021000, 0x08000002,
236ff559fabSmrg	  0x08000000, 0x00020000, 0x00001002, 0x08021002,
237ff559fabSmrg	  0x00020002, 0x08021000, 0x08001000, 0x00021002,
238ff559fabSmrg	  0x08021002, 0x00020002, 0x08000002, 0x00000000,
239ff559fabSmrg	  0x08000000, 0x00001002, 0x00020000, 0x08020002,
240ff559fabSmrg	  0x00001000, 0x08000000, 0x00021002, 0x08001002,
241ff559fabSmrg	  0x08021000, 0x00001000, 0x00000000, 0x08000002,
242ff559fabSmrg	  0x00000002, 0x08021002, 0x00021000, 0x08020000,
243ff559fabSmrg	  0x08020002, 0x00020000, 0x00001002, 0x08001000,
244ff559fabSmrg	  0x08001002, 0x00000002, 0x08020000, 0x00021000 },
245ff559fabSmrg
246ff559fabSmrg	/* nibble 2 */
247ff559fabSmrg	{ 0x20800000, 0x00808020, 0x00000020, 0x20800020,
248ff559fabSmrg	  0x20008000, 0x00800000, 0x20800020, 0x00008020,
249ff559fabSmrg	  0x00800020, 0x00008000, 0x00808000, 0x20000000,
250ff559fabSmrg	  0x20808020, 0x20000020, 0x20000000, 0x20808000,
251ff559fabSmrg	  0x00000000, 0x20008000, 0x00808020, 0x00000020,
252ff559fabSmrg	  0x20000020, 0x20808020, 0x00008000, 0x20800000,
253ff559fabSmrg	  0x20808000, 0x00800020, 0x20008020, 0x00808000,
254ff559fabSmrg	  0x00008020, 0x00000000, 0x00800000, 0x20008020,
255ff559fabSmrg	  0x00808020, 0x00000020, 0x20000000, 0x00008000,
256ff559fabSmrg	  0x20000020, 0x20008000, 0x00808000, 0x20800020,
257ff559fabSmrg	  0x00000000, 0x00808020, 0x00008020, 0x20808000,
258ff559fabSmrg	  0x20008000, 0x00800000, 0x20808020, 0x20000000,
259ff559fabSmrg	  0x20008020, 0x20800000, 0x00800000, 0x20808020,
260ff559fabSmrg	  0x00008000, 0x00800020, 0x20800020, 0x00008020,
261ff559fabSmrg	  0x00800020, 0x00000000, 0x20808000, 0x20000020,
262ff559fabSmrg	  0x20800000, 0x20008020, 0x00000020, 0x00808000 },
263ff559fabSmrg
264ff559fabSmrg	/* nibble 3 */
265ff559fabSmrg	{ 0x00080201, 0x02000200, 0x00000001, 0x02080201,
266ff559fabSmrg	  0x00000000, 0x02080000, 0x02000201, 0x00080001,
267ff559fabSmrg	  0x02080200, 0x02000001, 0x02000000, 0x00000201,
268ff559fabSmrg	  0x02000001, 0x00080201, 0x00080000, 0x02000000,
269ff559fabSmrg	  0x02080001, 0x00080200, 0x00000200, 0x00000001,
270ff559fabSmrg	  0x00080200, 0x02000201, 0x02080000, 0x00000200,
271ff559fabSmrg	  0x00000201, 0x00000000, 0x00080001, 0x02080200,
272ff559fabSmrg	  0x02000200, 0x02080001, 0x02080201, 0x00080000,
273ff559fabSmrg	  0x02080001, 0x00000201, 0x00080000, 0x02000001,
274ff559fabSmrg	  0x00080200, 0x02000200, 0x00000001, 0x02080000,
275ff559fabSmrg	  0x02000201, 0x00000000, 0x00000200, 0x00080001,
276ff559fabSmrg	  0x00000000, 0x02080001, 0x02080200, 0x00000200,
277ff559fabSmrg	  0x02000000, 0x02080201, 0x00080201, 0x00080000,
278ff559fabSmrg	  0x02080201, 0x00000001, 0x02000200, 0x00080201,
279ff559fabSmrg	  0x00080001, 0x00080200, 0x02080000, 0x02000201,
280ff559fabSmrg	  0x00000201, 0x02000000, 0x02000001, 0x02080200 },
281ff559fabSmrg
282ff559fabSmrg	/* nibble 4 */
283ff559fabSmrg	{ 0x01000000, 0x00002000, 0x00000080, 0x01002084,
284ff559fabSmrg	  0x01002004, 0x01000080, 0x00002084, 0x01002000,
285ff559fabSmrg	  0x00002000, 0x00000004, 0x01000004, 0x00002080,
286ff559fabSmrg	  0x01000084, 0x01002004, 0x01002080, 0x00000000,
287ff559fabSmrg	  0x00002080, 0x01000000, 0x00002004, 0x00000084,
288ff559fabSmrg	  0x01000080, 0x00002084, 0x00000000, 0x01000004,
289ff559fabSmrg	  0x00000004, 0x01000084, 0x01002084, 0x00002004,
290ff559fabSmrg	  0x01002000, 0x00000080, 0x00000084, 0x01002080,
291ff559fabSmrg	  0x01002080, 0x01000084, 0x00002004, 0x01002000,
292ff559fabSmrg	  0x00002000, 0x00000004, 0x01000004, 0x01000080,
293ff559fabSmrg	  0x01000000, 0x00002080, 0x01002084, 0x00000000,
294ff559fabSmrg	  0x00002084, 0x01000000, 0x00000080, 0x00002004,
295ff559fabSmrg	  0x01000084, 0x00000080, 0x00000000, 0x01002084,
296ff559fabSmrg	  0x01002004, 0x01002080, 0x00000084, 0x00002000,
297ff559fabSmrg	  0x00002080, 0x01002004, 0x01000080, 0x00000084,
298ff559fabSmrg	  0x00000004, 0x00002084, 0x01002000, 0x01000004 },
299ff559fabSmrg
300ff559fabSmrg	/* nibble 5 */
301ff559fabSmrg	{ 0x10000008, 0x00040008, 0x00000000, 0x10040400,
302ff559fabSmrg	  0x00040008, 0x00000400, 0x10000408, 0x00040000,
303ff559fabSmrg	  0x00000408, 0x10040408, 0x00040400, 0x10000000,
304ff559fabSmrg	  0x10000400, 0x10000008, 0x10040000, 0x00040408,
305ff559fabSmrg	  0x00040000, 0x10000408, 0x10040008, 0x00000000,
306ff559fabSmrg	  0x00000400, 0x00000008, 0x10040400, 0x10040008,
307ff559fabSmrg	  0x10040408, 0x10040000, 0x10000000, 0x00000408,
308ff559fabSmrg	  0x00000008, 0x00040400, 0x00040408, 0x10000400,
309ff559fabSmrg	  0x00000408, 0x10000000, 0x10000400, 0x00040408,
310ff559fabSmrg	  0x10040400, 0x00040008, 0x00000000, 0x10000400,
311ff559fabSmrg	  0x10000000, 0x00000400, 0x10040008, 0x00040000,
312ff559fabSmrg	  0x00040008, 0x10040408, 0x00040400, 0x00000008,
313ff559fabSmrg	  0x10040408, 0x00040400, 0x00040000, 0x10000408,
314ff559fabSmrg	  0x10000008, 0x10040000, 0x00040408, 0x00000000,
315ff559fabSmrg	  0x00000400, 0x10000008, 0x10000408, 0x10040400,
316ff559fabSmrg	  0x10040000, 0x00000408, 0x00000008, 0x10040008 },
317ff559fabSmrg
318ff559fabSmrg	/* nibble 6 */
319ff559fabSmrg	{ 0x00000800, 0x00000040, 0x00200040, 0x80200000,
320ff559fabSmrg	  0x80200840, 0x80000800, 0x00000840, 0x00000000,
321ff559fabSmrg	  0x00200000, 0x80200040, 0x80000040, 0x00200800,
322ff559fabSmrg	  0x80000000, 0x00200840, 0x00200800, 0x80000040,
323ff559fabSmrg	  0x80200040, 0x00000800, 0x80000800, 0x80200840,
324ff559fabSmrg	  0x00000000, 0x00200040, 0x80200000, 0x00000840,
325ff559fabSmrg	  0x80200800, 0x80000840, 0x00200840, 0x80000000,
326ff559fabSmrg	  0x80000840, 0x80200800, 0x00000040, 0x00200000,
327ff559fabSmrg	  0x80000840, 0x00200800, 0x80200800, 0x80000040,
328ff559fabSmrg	  0x00000800, 0x00000040, 0x00200000, 0x80200800,
329ff559fabSmrg	  0x80200040, 0x80000840, 0x00000840, 0x00000000,
330ff559fabSmrg	  0x00000040, 0x80200000, 0x80000000, 0x00200040,
331ff559fabSmrg	  0x00000000, 0x80200040, 0x00200040, 0x00000840,
332ff559fabSmrg	  0x80000040, 0x00000800, 0x80200840, 0x00200000,
333ff559fabSmrg	  0x00200840, 0x80000000, 0x80000800, 0x80200840,
334ff559fabSmrg	  0x80200000, 0x00200840, 0x00200800, 0x80000800 },
335ff559fabSmrg
336ff559fabSmrg	/* nibble 7 */
337ff559fabSmrg	{ 0x04100010, 0x04104000, 0x00004010, 0x00000000,
338ff559fabSmrg	  0x04004000, 0x00100010, 0x04100000, 0x04104010,
339ff559fabSmrg	  0x00000010, 0x04000000, 0x00104000, 0x00004010,
340ff559fabSmrg	  0x00104010, 0x04004010, 0x04000010, 0x04100000,
341ff559fabSmrg	  0x00004000, 0x00104010, 0x00100010, 0x04004000,
342ff559fabSmrg	  0x04104010, 0x04000010, 0x00000000, 0x00104000,
343ff559fabSmrg	  0x04000000, 0x00100000, 0x04004010, 0x04100010,
344ff559fabSmrg	  0x00100000, 0x00004000, 0x04104000, 0x00000010,
345ff559fabSmrg	  0x00100000, 0x00004000, 0x04000010, 0x04104010,
346ff559fabSmrg	  0x00004010, 0x04000000, 0x00000000, 0x00104000,
347ff559fabSmrg	  0x04100010, 0x04004010, 0x04004000, 0x00100010,
348ff559fabSmrg	  0x04104000, 0x00000010, 0x00100010, 0x04004000,
349ff559fabSmrg	  0x04104010, 0x00100000, 0x04100000, 0x04000010,
350ff559fabSmrg	  0x00104000, 0x00004010, 0x04004010, 0x04100000,
351ff559fabSmrg	  0x00000010, 0x04104000, 0x00104010, 0x00000000,
352ff559fabSmrg	  0x04000000, 0x04100010, 0x00004000, 0x00104010}
353ff559fabSmrg};
354ff559fabSmrg
355ff559fabSmrg#define ITERATIONS 16
356ff559fabSmrg#define HALF_ITERATIONS 8
357ff559fabSmrg
358ff559fabSmrg#define c2l(c,l)	(l =((CARD32)(*((c)++)))    , \
359ff559fabSmrg			 l|=((CARD32)(*((c)++)))<< 8, \
360ff559fabSmrg			 l|=((CARD32)(*((c)++)))<<16, \
361ff559fabSmrg			 l|=((CARD32)(*((c)++)))<<24)
362ff559fabSmrg
363ff559fabSmrg#define l2c(l,c)	(*((c)++)=(CARD8)(((l)    )&0xff), \
364ff559fabSmrg			 *((c)++)=(CARD8)(((l)>> 8)&0xff), \
365ff559fabSmrg			 *((c)++)=(CARD8)(((l)>>16)&0xff), \
366ff559fabSmrg			 *((c)++)=(CARD8)(((l)>>24)&0xff))
367ff559fabSmrg
368ff559fabSmrg#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
369ff559fabSmrg	(b)^=(t),\
370ff559fabSmrg	(a)^=((t)<<(n)))
371ff559fabSmrg
372ff559fabSmrg#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
373ff559fabSmrg	(a)=(a)^(t)^(t>>(16-(n))))\
374ff559fabSmrg
375ff559fabSmrgstatic const char shifts2[16] = {0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
376ff559fabSmrg
377ff559fabSmrgvoid _XdmcpAuthSetup(auth_cblock key, auth_wrapper_schedule schedule)
378ff559fabSmrg{
379ff559fabSmrg	CARD32 c,d,t,s;
380ff559fabSmrg	CARD8 *in;
381ff559fabSmrg	CARD32 *k;
382ff559fabSmrg	int i;
383ff559fabSmrg
384ff559fabSmrg	k=(CARD32 *)schedule;
385ff559fabSmrg	in=(CARD8 *)key;
386ff559fabSmrg
387ff559fabSmrg	c2l(in,c);
388ff559fabSmrg	c2l(in,d);
389ff559fabSmrg
390ff559fabSmrg	/* do PC1 in 60 simple operations */
391ff559fabSmrg	PERM_OP(d,c,t,4,0x0f0f0f0f);
392ff559fabSmrg	HPERM_OP(c,t,-2, 0xcccc0000);
393ff559fabSmrg	HPERM_OP(c,t,-1, 0xaaaa0000);
394ff559fabSmrg	HPERM_OP(c,t, 8, 0x00ff0000);
395ff559fabSmrg	HPERM_OP(c,t,-1, 0xaaaa0000);
396ff559fabSmrg	HPERM_OP(d,t,-8, 0xff000000);
397ff559fabSmrg	HPERM_OP(d,t, 8, 0x00ff0000);
398ff559fabSmrg	HPERM_OP(d,t, 2, 0x33330000);
399ff559fabSmrg	d=((d&0x00aa00aa)<<7)|((d&0x55005500)>>7)|(d&0xaa55aa55);
400ff559fabSmrg	d=(d>>8)|((c&0xf0000000)>>4);
401ff559fabSmrg	c&=0x0fffffff;
402ff559fabSmrg
403ff559fabSmrg	for (i=0; i<ITERATIONS; i++) {
404ff559fabSmrg		if (shifts2[i]) {
405ff559fabSmrg			c=((c>>2)|(c<<26)); d=((d>>2)|(d<<26));
406ff559fabSmrg		} else {
407ff559fabSmrg			c=((c>>1)|(c<<27)); d=((d>>1)|(d<<27));
408ff559fabSmrg		}
409ff559fabSmrg		c&=0x0fffffff;
410ff559fabSmrg		d&=0x0fffffff;
411ff559fabSmrg		/* could be a few less shifts but I am to lazy at this
412ff559fabSmrg		 * point in time to investigate */
413ff559fabSmrg		s=	skb[0][ (c    )&0x3f		    ]|
414ff559fabSmrg			skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
415ff559fabSmrg			skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
416ff559fabSmrg			skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
417ff559fabSmrg					      ((c>>22)&0x38)];
418ff559fabSmrg		t=	skb[4][ (d    )&0x3f		    ]|
419ff559fabSmrg			skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
420ff559fabSmrg			skb[6][ (d>>15)&0x3f		    ]|
421ff559fabSmrg			skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];
422ff559fabSmrg
423ff559fabSmrg		/* table contained 0213 4657 */
424ff559fabSmrg		*(k++)=((t<<16)|(s&0x0000ffff));
425ff559fabSmrg		s=     ((s>>16)|(t&0xffff0000));
426ff559fabSmrg
427ff559fabSmrg		s=(s<<4)|(s>>28);
428ff559fabSmrg		*(k++)=s;
429ff559fabSmrg	}
430ff559fabSmrg	return;
431ff559fabSmrg}
432ff559fabSmrg
433ff559fabSmrg#define D_ENCRYPT(L,R,S)	\
434ff559fabSmrg	t=(R<<1)|(R>>31); \
435ff559fabSmrg	u=(t^s[S  ]); \
436ff559fabSmrg	t=(t^s[S+1]); \
437ff559fabSmrg	t=(t>>4)|(t<<28); \
438ff559fabSmrg	L^=	SPtrans[1][(t	 )&0x3f]| \
439ff559fabSmrg		SPtrans[3][(t>> 8)&0x3f]| \
440ff559fabSmrg		SPtrans[5][(t>>16)&0x3f]| \
441ff559fabSmrg		SPtrans[7][(t>>24)&0x3f]| \
442ff559fabSmrg		SPtrans[0][(u	 )&0x3f]| \
443ff559fabSmrg		SPtrans[2][(u>> 8)&0x3f]| \
444ff559fabSmrg		SPtrans[4][(u>>16)&0x3f]| \
445ff559fabSmrg		SPtrans[6][(u>>24)&0x3f];
446ff559fabSmrg
447ff559fabSmrg
448ff559fabSmrgvoid _XdmcpAuthDoIt(auth_cblock input, auth_cblock output,
449ff559fabSmrg    auth_wrapper_schedule ks, int encrypt)
450ff559fabSmrg{
451ff559fabSmrg	CARD32 l,r,t,u;
452ff559fabSmrg	CARD32 *s;
453ff559fabSmrg	CARD8 *in,*out;
454ff559fabSmrg	int i;
455ff559fabSmrg
456ff559fabSmrg	in=(CARD8 *)input;
457ff559fabSmrg	out=(CARD8 *)output;
458ff559fabSmrg	c2l(in,l);
459ff559fabSmrg	c2l(in,r);
460ff559fabSmrg
461ff559fabSmrg	/* do IP */
462ff559fabSmrg	PERM_OP(r,l,t, 4,0x0f0f0f0f);
463ff559fabSmrg	PERM_OP(l,r,t,16,0x0000ffff);
464ff559fabSmrg	PERM_OP(r,l,t, 2,0x33333333);
465ff559fabSmrg	PERM_OP(l,r,t, 8,0x00ff00ff);
466ff559fabSmrg	PERM_OP(r,l,t, 1,0x55555555);
467ff559fabSmrg	/* r and l are reversed - remember that :-) */
468ff559fabSmrg	t=l;
469ff559fabSmrg	l=r;
470ff559fabSmrg	r=t;
471ff559fabSmrg
472ff559fabSmrg	s=(CARD32 *)ks;
473ff559fabSmrg
474ff559fabSmrg	if (encrypt) {
475ff559fabSmrg		for (i=0; i<(ITERATIONS*2); i+=4) {
476ff559fabSmrg			D_ENCRYPT(l,r,	i); /*	1 */
477ff559fabSmrg			D_ENCRYPT(r,l,	i+2); /*  2 */
478ff559fabSmrg		}
479ff559fabSmrg	} else {
480ff559fabSmrg		for (i=(ITERATIONS*2)-2; i >= 0; i-=4) {
481ff559fabSmrg			D_ENCRYPT(l,r,	i); /*	1 */
482ff559fabSmrg			D_ENCRYPT(r,l,	i-2); /*  2 */
483ff559fabSmrg		}
484ff559fabSmrg	}
485ff559fabSmrg
486ff559fabSmrg	/* swap l and r
487ff559fabSmrg	 * we will not do the swap so just remember they are
488ff559fabSmrg	 * reversed for the rest of the subroutine
489ff559fabSmrg	 * luckily by FP fixes this problem :-) */
490ff559fabSmrg
491ff559fabSmrg	PERM_OP(r,l,t, 1,0x55555555);
492ff559fabSmrg	PERM_OP(l,r,t, 8,0x00ff00ff);
493ff559fabSmrg	PERM_OP(r,l,t, 2,0x33333333);
494ff559fabSmrg	PERM_OP(l,r,t,16,0x0000ffff);
495ff559fabSmrg	PERM_OP(r,l,t, 4,0x0f0f0f0f);
496ff559fabSmrg
497ff559fabSmrg	l2c(l,out);
498ff559fabSmrg	l2c(r,out);
499ff559fabSmrg	return;
500ff559fabSmrg}
501