- fix Building without Nagra not possible at Nagra_Merlin https://trac.streamboard...
[oscam.git] / cscrypt / des.c
blobe9edd9e10b163fc14b3cf067bd0b787700f691a6
1 // Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
2 // Java port Copyright 1996 Frank O'Dwyer (fod@brd.ie)
3 // Copyright 1996 Rainbow Diamond Limited
4 // All rights reserved.
5 //
6 // The ie.brd.crypto.algorithms.DES package is substantially derived from
7 // part of an SSL implementation written in 'C' by Eric Young (eay@mincom.oz.au).
8 // See below for the terms and conditions that apply to that code. This section
9 // describes the additional terms and conditions for this Java port only:
11 // NOTICE TO USER:
12 // THIS IS A CONTRACT BETWEEN YOU AND RAINBOW DIAMOND LIMITED ("RAINBOW DIAMOND"),
13 // AN IRISH LIMITED COMPANY. BY INSTALLING THIS SOFTWARE, YOU ACCEPT ALL THE
14 // TERMS AND CONDITIONS OF THIS AGREEMENT. ADDITIONALLY, NOTHING OTHER THAN
15 // ACCEPTING THE TERMS OF THIS AGREEMENT ENTITLES YOU TO COPY OR REDISTRIBUTE
16 // THIS SOFTWARE.
18 // This set of classes is FREE FOR COMMERCIAL AND NON-COMMERCIAL USE
19 // as long as the following conditions are adhered to:
21 // Copyright remains with the authors and as such any Copyright notices in
22 // the code are not to be removed. If this code is used in a product,
23 // Eric Young and Rainbow Diamond Limited should be given attribution as the
24 // authors of the parts used. This can be in the form of a textual message at
25 // program startup or in documentation (online or textual) provided with the
26 // package.
28 // Redistribution and use in source and binary forms, with or without
29 // modification, are permitted provided that the following conditions
30 // are met:
31 // 1. Redistributions of source code must retain the copyright
32 // notice, this list of conditions and the following disclaimer.
33 // 2. Redistributions in binary form must reproduce the above copyright
34 // notice, this list of conditions and the following disclaimer in the
35 // documentation and/or other materials provided with the distribution.
36 // 3. All advertising materials mentioning features or use of this software
37 // must display the following acknowledgement:
38 // This product includes software developed by Eric Young (eay@mincom.oz.au)
39 // Java port by Frank O'Dwyer (fod@brd.ie) for Rainbow Diamond Limited.
40 // 4. You agree that the software will not be shipped, transferred or exported
41 // into any country or used in any manner prohibited by applicable export
42 // laws, restrictions or regulations. You agree to indemnify and save
43 // harmless Rainbow Diamond Limited, its employees, and suppliers against
44 // any loss, injury, damage or expense whatsover either to it, or any third
45 // party as a result of your own acts, defaults, or neglect in exporting
46 // or transferring the software.
47 // 5. RAINBOW DIAMOND LIMITED IS PROVIDING YOU WITH THIS SOFTWARE FREE OF CHARGE
48 // FOR DEMONSTRATION PURPOSES ON AN "AS IS" BASIS. RAINBOW DIAMOND AND ITS
49 // SUPPLIERS DO NOT AND CANNOT WARRANT THE PERFORMANCE OR RESULTS YOU MAY
50 // OBTAIN BY USING THE SOFTWARE OR DOCUMENTATION. SAVE FOR ANY WARRANTY WHICH
51 // CANNOT BE EXCLUDED BY COMPULSORY LAW IN IRELAND, RAINBOW DIAMOND AND ITS
52 // SUPPLIERS MAKE NO WARRANTIES OR CONDITIONS, EXPRESS OR IMPLIED, AS TO
53 // NONINFRINGEMENT OF THIRD PARTY RIGHTS, MERCHANTIBILITY, SATISFACTORY QUALITY
54 // OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT WILL RAINBOW DIAMOND
55 // OR ITS SUPPLIERS BE LIABLE TO YOU FOR ANY DAMAGES WHATSOEVER (INCLUDING,
56 // WITHOUT LIMITATION CONSEQUENTIAL, INCIDENTAL OR SPECIAL DAMAGES, INCLUDING
57 // ANY LOST PROFITS OR LOST SAVINGS) ARISING OUT OF THE USE OR INABILITY TO
58 // USE THE SOFTWARE EVEN IF A RAINBOW DIAMOND REPRESENTATIVE HAS BEEN ADVISED
59 // OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY A THIRD PARTY. WHERE
60 // LEGALLY LIABILITY CANNOT BE EXCLUDED, BUT IT MAY BE LIMITED, RAINBOW
61 // DIAMOND'S LIABILITY AND THAT OF ITS SUPPLIERS SHALL BE LIMITED TO THE SUM
62 // OF TWENTY FIVE POUNDS (�25) IN TOTAL.
64 // The contractual rights which you enjoy by virtue of Section 12, 13, 14, and
65 // 15 of the Sale of Goods Act, 1893 (as amended) are in no way prejudiced
66 // by anything contained in this Agreement save (if you are not dealing as
67 // a consumer or in the case of an international sale of goods) to the extent
68 // permitted by law.
70 // Section 39 of the Sale of Goods and Supply of Services Act, 1980 is hereby
71 // excluded with respect to the supply of this software. The contractual rights
72 // which you enjoy by virtue of the provisions of Section 39 of the Sale of Goods
73 // and Supply of Services Act, 1980 are in no way prejudiced by anything contained
74 // in these terms and conditions save to the extent permitted by law.
76 // Rainbow Diamond Limited is acting on behalf its suppliers for the purpose of
77 // disclaiming, excluding and/or restricting obligations, warranties and
78 // liability as provided in this clause 5, but in no other respects and for
79 // no other purpose.
80 // 6. This agreeement is governed by Irish law and you submit to the jurisdiction
81 // of the Irish courts in relation to any matter or dispute arising hereunder.
83 // The licence and distribution terms for any publically available version or
84 // derivative of this code cannot be changed. i.e. this code cannot simply be
85 // copied and put under another distribution licence
86 // [including the GNU Public Licence.]
88 /* original eay copyright notice follows:*/
90 /* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
91 * All rights reserved.
93 * This file is part of an SSL implementation written
94 * by Eric Young (eay@mincom.oz.au).
95 * The implementation was written so as to conform with Netscapes SSL
96 * specification. This library and applications are
97 * FREE FOR COMMERCIAL AND NON-COMMERCIAL USE
98 * as long as the following conditions are aheared to.
100 * Copyright remains Eric Young's, and as such any Copyright notices in
101 * the code are not to be removed. If this code is used in a product,
102 * Eric Young should be given attribution as the author of the parts used.
103 * This can be in the form of a textual message at program startup or
104 * in documentation (online or textual) provided with the package.
106 * Redistribution and use in source and binary forms, with or without
107 * modification, are permitted provided that the following conditions
108 * are met:
109 * 1. Redistributions of source code must retain the copyright
110 * notice, this list of conditions and the following disclaimer.
111 * 2. Redistributions in binary form must reproduce the above copyright
112 * notice, this list of conditions and the following disclaimer in the
113 * documentation and/or other materials provided with the distribution.
114 * 3. All advertising materials mentioning features or use of this software
115 * must display the following acknowledgement:
116 * This product includes software developed by Eric Young (eay@mincom.oz.au)
118 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
119 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
120 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
121 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
122 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
123 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
124 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
125 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
126 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
127 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
128 * SUCH DAMAGE.
130 * The licence and distribution terms for any publically available version or
131 * derivative of this code cannot be changed. i.e. this code cannot simply be
132 * copied and put under another distribution licence
133 * [including the GNU Public Licence.]
136 #include "../globals.h"
137 #include "../oscam-string.h"
138 #include "des.h"
140 static const uint8_t weak_keys[16][8] =
142 // weak keys
143 {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
144 {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
145 {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
146 {0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0},
147 // semi-weak keys
148 {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
149 {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
150 {0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
151 {0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
152 {0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
153 {0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
154 {0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
155 {0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
156 {0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
157 {0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
158 {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
159 {0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}
162 static const uint8_t odd_parity[] =
164 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,
165 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
166 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
167 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
168 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
169 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
170 97, 97, 98, 98, 100,100,103,103,104,104,107,107,109,109,110,110,
171 112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
172 128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
173 145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
174 161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
175 176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
176 193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
177 208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
178 224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
179 241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254
182 static const uint8_t shifts2[16] = {0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
184 static const uint32_t des_skb[8][64] =
187 0x00000000,0x00000010,0x20000000,0x20000010,
188 0x00010000,0x00010010,0x20010000,0x20010010,
189 0x00000800,0x00000810,0x20000800,0x20000810,
190 0x00010800,0x00010810,0x20010800,0x20010810,
191 0x00000020,0x00000030,0x20000020,0x20000030,
192 0x00010020,0x00010030,0x20010020,0x20010030,
193 0x00000820,0x00000830,0x20000820,0x20000830,
194 0x00010820,0x00010830,0x20010820,0x20010830,
195 0x00080000,0x00080010,0x20080000,0x20080010,
196 0x00090000,0x00090010,0x20090000,0x20090010,
197 0x00080800,0x00080810,0x20080800,0x20080810,
198 0x00090800,0x00090810,0x20090800,0x20090810,
199 0x00080020,0x00080030,0x20080020,0x20080030,
200 0x00090020,0x00090030,0x20090020,0x20090030,
201 0x00080820,0x00080830,0x20080820,0x20080830,
202 0x00090820,0x00090830,0x20090820,0x20090830,
205 0x00000000,0x02000000,0x00002000,0x02002000,
206 0x00200000,0x02200000,0x00202000,0x02202000,
207 0x00000004,0x02000004,0x00002004,0x02002004,
208 0x00200004,0x02200004,0x00202004,0x02202004,
209 0x00000400,0x02000400,0x00002400,0x02002400,
210 0x00200400,0x02200400,0x00202400,0x02202400,
211 0x00000404,0x02000404,0x00002404,0x02002404,
212 0x00200404,0x02200404,0x00202404,0x02202404,
213 0x10000000,0x12000000,0x10002000,0x12002000,
214 0x10200000,0x12200000,0x10202000,0x12202000,
215 0x10000004,0x12000004,0x10002004,0x12002004,
216 0x10200004,0x12200004,0x10202004,0x12202004,
217 0x10000400,0x12000400,0x10002400,0x12002400,
218 0x10200400,0x12200400,0x10202400,0x12202400,
219 0x10000404,0x12000404,0x10002404,0x12002404,
220 0x10200404,0x12200404,0x10202404,0x12202404,
223 0x00000000,0x00000001,0x00040000,0x00040001,
224 0x01000000,0x01000001,0x01040000,0x01040001,
225 0x00000002,0x00000003,0x00040002,0x00040003,
226 0x01000002,0x01000003,0x01040002,0x01040003,
227 0x00000200,0x00000201,0x00040200,0x00040201,
228 0x01000200,0x01000201,0x01040200,0x01040201,
229 0x00000202,0x00000203,0x00040202,0x00040203,
230 0x01000202,0x01000203,0x01040202,0x01040203,
231 0x08000000,0x08000001,0x08040000,0x08040001,
232 0x09000000,0x09000001,0x09040000,0x09040001,
233 0x08000002,0x08000003,0x08040002,0x08040003,
234 0x09000002,0x09000003,0x09040002,0x09040003,
235 0x08000200,0x08000201,0x08040200,0x08040201,
236 0x09000200,0x09000201,0x09040200,0x09040201,
237 0x08000202,0x08000203,0x08040202,0x08040203,
238 0x09000202,0x09000203,0x09040202,0x09040203,
241 0x00000000,0x00100000,0x00000100,0x00100100,
242 0x00000008,0x00100008,0x00000108,0x00100108,
243 0x00001000,0x00101000,0x00001100,0x00101100,
244 0x00001008,0x00101008,0x00001108,0x00101108,
245 0x04000000,0x04100000,0x04000100,0x04100100,
246 0x04000008,0x04100008,0x04000108,0x04100108,
247 0x04001000,0x04101000,0x04001100,0x04101100,
248 0x04001008,0x04101008,0x04001108,0x04101108,
249 0x00020000,0x00120000,0x00020100,0x00120100,
250 0x00020008,0x00120008,0x00020108,0x00120108,
251 0x00021000,0x00121000,0x00021100,0x00121100,
252 0x00021008,0x00121008,0x00021108,0x00121108,
253 0x04020000,0x04120000,0x04020100,0x04120100,
254 0x04020008,0x04120008,0x04020108,0x04120108,
255 0x04021000,0x04121000,0x04021100,0x04121100,
256 0x04021008,0x04121008,0x04021108,0x04121108,
259 0x00000000,0x10000000,0x00010000,0x10010000,
260 0x00000004,0x10000004,0x00010004,0x10010004,
261 0x20000000,0x30000000,0x20010000,0x30010000,
262 0x20000004,0x30000004,0x20010004,0x30010004,
263 0x00100000,0x10100000,0x00110000,0x10110000,
264 0x00100004,0x10100004,0x00110004,0x10110004,
265 0x20100000,0x30100000,0x20110000,0x30110000,
266 0x20100004,0x30100004,0x20110004,0x30110004,
267 0x00001000,0x10001000,0x00011000,0x10011000,
268 0x00001004,0x10001004,0x00011004,0x10011004,
269 0x20001000,0x30001000,0x20011000,0x30011000,
270 0x20001004,0x30001004,0x20011004,0x30011004,
271 0x00101000,0x10101000,0x00111000,0x10111000,
272 0x00101004,0x10101004,0x00111004,0x10111004,
273 0x20101000,0x30101000,0x20111000,0x30111000,
274 0x20101004,0x30101004,0x20111004,0x30111004,
277 0x00000000,0x08000000,0x00000008,0x08000008,
278 0x00000400,0x08000400,0x00000408,0x08000408,
279 0x00020000,0x08020000,0x00020008,0x08020008,
280 0x00020400,0x08020400,0x00020408,0x08020408,
281 0x00000001,0x08000001,0x00000009,0x08000009,
282 0x00000401,0x08000401,0x00000409,0x08000409,
283 0x00020001,0x08020001,0x00020009,0x08020009,
284 0x00020401,0x08020401,0x00020409,0x08020409,
285 0x02000000,0x0A000000,0x02000008,0x0A000008,
286 0x02000400,0x0A000400,0x02000408,0x0A000408,
287 0x02020000,0x0A020000,0x02020008,0x0A020008,
288 0x02020400,0x0A020400,0x02020408,0x0A020408,
289 0x02000001,0x0A000001,0x02000009,0x0A000009,
290 0x02000401,0x0A000401,0x02000409,0x0A000409,
291 0x02020001,0x0A020001,0x02020009,0x0A020009,
292 0x02020401,0x0A020401,0x02020409,0x0A020409,
295 0x00000000,0x00000100,0x00080000,0x00080100,
296 0x01000000,0x01000100,0x01080000,0x01080100,
297 0x00000010,0x00000110,0x00080010,0x00080110,
298 0x01000010,0x01000110,0x01080010,0x01080110,
299 0x00200000,0x00200100,0x00280000,0x00280100,
300 0x01200000,0x01200100,0x01280000,0x01280100,
301 0x00200010,0x00200110,0x00280010,0x00280110,
302 0x01200010,0x01200110,0x01280010,0x01280110,
303 0x00000200,0x00000300,0x00080200,0x00080300,
304 0x01000200,0x01000300,0x01080200,0x01080300,
305 0x00000210,0x00000310,0x00080210,0x00080310,
306 0x01000210,0x01000310,0x01080210,0x01080310,
307 0x00200200,0x00200300,0x00280200,0x00280300,
308 0x01200200,0x01200300,0x01280200,0x01280300,
309 0x00200210,0x00200310,0x00280210,0x00280310,
310 0x01200210,0x01200310,0x01280210,0x01280310,
313 0x00000000,0x04000000,0x00040000,0x04040000,
314 0x00000002,0x04000002,0x00040002,0x04040002,
315 0x00002000,0x04002000,0x00042000,0x04042000,
316 0x00002002,0x04002002,0x00042002,0x04042002,
317 0x00000020,0x04000020,0x00040020,0x04040020,
318 0x00000022,0x04000022,0x00040022,0x04040022,
319 0x00002020,0x04002020,0x00042020,0x04042020,
320 0x00002022,0x04002022,0x00042022,0x04042022,
321 0x00000800,0x04000800,0x00040800,0x04040800,
322 0x00000802,0x04000802,0x00040802,0x04040802,
323 0x00002800,0x04002800,0x00042800,0x04042800,
324 0x00002802,0x04002802,0x00042802,0x04042802,
325 0x00000820,0x04000820,0x00040820,0x04040820,
326 0x00000822,0x04000822,0x00040822,0x04040822,
327 0x00002820,0x04002820,0x00042820,0x04042820,
328 0x00002822,0x04002822,0x00042822,0x04042822,
332 static const uint32_t des_SPtrans[8][64] =
335 0x00820200, 0x00020000, 0x80800000, 0x80820200,
336 0x00800000, 0x80020200, 0x80020000, 0x80800000,
337 0x80020200, 0x00820200, 0x00820000, 0x80000200,
338 0x80800200, 0x00800000, 0x00000000, 0x80020000,
339 0x00020000, 0x80000000, 0x00800200, 0x00020200,
340 0x80820200, 0x00820000, 0x80000200, 0x00800200,
341 0x80000000, 0x00000200, 0x00020200, 0x80820000,
342 0x00000200, 0x80800200, 0x80820000, 0x00000000,
343 0x00000000, 0x80820200, 0x00800200, 0x80020000,
344 0x00820200, 0x00020000, 0x80000200, 0x00800200,
345 0x80820000, 0x00000200, 0x00020200, 0x80800000,
346 0x80020200, 0x80000000, 0x80800000, 0x00820000,
347 0x80820200, 0x00020200, 0x00820000, 0x80800200,
348 0x00800000, 0x80000200, 0x80020000, 0x00000000,
349 0x00020000, 0x00800000, 0x80800200, 0x00820200,
350 0x80000000, 0x80820000, 0x00000200, 0x80020200,
353 0x10042004, 0x00000000, 0x00042000, 0x10040000,
354 0x10000004, 0x00002004, 0x10002000, 0x00042000,
355 0x00002000, 0x10040004, 0x00000004, 0x10002000,
356 0x00040004, 0x10042000, 0x10040000, 0x00000004,
357 0x00040000, 0x10002004, 0x10040004, 0x00002000,
358 0x00042004, 0x10000000, 0x00000000, 0x00040004,
359 0x10002004, 0x00042004, 0x10042000, 0x10000004,
360 0x10000000, 0x00040000, 0x00002004, 0x10042004,
361 0x00040004, 0x10042000, 0x10002000, 0x00042004,
362 0x10042004, 0x00040004, 0x10000004, 0x00000000,
363 0x10000000, 0x00002004, 0x00040000, 0x10040004,
364 0x00002000, 0x10000000, 0x00042004, 0x10002004,
365 0x10042000, 0x00002000, 0x00000000, 0x10000004,
366 0x00000004, 0x10042004, 0x00042000, 0x10040000,
367 0x10040004, 0x00040000, 0x00002004, 0x10002000,
368 0x10002004, 0x00000004, 0x10040000, 0x00042000,
371 0x41000000, 0x01010040, 0x00000040, 0x41000040,
372 0x40010000, 0x01000000, 0x41000040, 0x00010040,
373 0x01000040, 0x00010000, 0x01010000, 0x40000000,
374 0x41010040, 0x40000040, 0x40000000, 0x41010000,
375 0x00000000, 0x40010000, 0x01010040, 0x00000040,
376 0x40000040, 0x41010040, 0x00010000, 0x41000000,
377 0x41010000, 0x01000040, 0x40010040, 0x01010000,
378 0x00010040, 0x00000000, 0x01000000, 0x40010040,
379 0x01010040, 0x00000040, 0x40000000, 0x00010000,
380 0x40000040, 0x40010000, 0x01010000, 0x41000040,
381 0x00000000, 0x01010040, 0x00010040, 0x41010000,
382 0x40010000, 0x01000000, 0x41010040, 0x40000000,
383 0x40010040, 0x41000000, 0x01000000, 0x41010040,
384 0x00010000, 0x01000040, 0x41000040, 0x00010040,
385 0x01000040, 0x00000000, 0x41010000, 0x40000040,
386 0x41000000, 0x40010040, 0x00000040, 0x01010000,
389 0x00100402, 0x04000400, 0x00000002, 0x04100402,
390 0x00000000, 0x04100000, 0x04000402, 0x00100002,
391 0x04100400, 0x04000002, 0x04000000, 0x00000402,
392 0x04000002, 0x00100402, 0x00100000, 0x04000000,
393 0x04100002, 0x00100400, 0x00000400, 0x00000002,
394 0x00100400, 0x04000402, 0x04100000, 0x00000400,
395 0x00000402, 0x00000000, 0x00100002, 0x04100400,
396 0x04000400, 0x04100002, 0x04100402, 0x00100000,
397 0x04100002, 0x00000402, 0x00100000, 0x04000002,
398 0x00100400, 0x04000400, 0x00000002, 0x04100000,
399 0x04000402, 0x00000000, 0x00000400, 0x00100002,
400 0x00000000, 0x04100002, 0x04100400, 0x00000400,
401 0x04000000, 0x04100402, 0x00100402, 0x00100000,
402 0x04100402, 0x00000002, 0x04000400, 0x00100402,
403 0x00100002, 0x00100400, 0x04100000, 0x04000402,
404 0x00000402, 0x04000000, 0x04000002, 0x04100400,
407 0x02000000, 0x00004000, 0x00000100, 0x02004108,
408 0x02004008, 0x02000100, 0x00004108, 0x02004000,
409 0x00004000, 0x00000008, 0x02000008, 0x00004100,
410 0x02000108, 0x02004008, 0x02004100, 0x00000000,
411 0x00004100, 0x02000000, 0x00004008, 0x00000108,
412 0x02000100, 0x00004108, 0x00000000, 0x02000008,
413 0x00000008, 0x02000108, 0x02004108, 0x00004008,
414 0x02004000, 0x00000100, 0x00000108, 0x02004100,
415 0x02004100, 0x02000108, 0x00004008, 0x02004000,
416 0x00004000, 0x00000008, 0x02000008, 0x02000100,
417 0x02000000, 0x00004100, 0x02004108, 0x00000000,
418 0x00004108, 0x02000000, 0x00000100, 0x00004008,
419 0x02000108, 0x00000100, 0x00000000, 0x02004108,
420 0x02004008, 0x02004100, 0x00000108, 0x00004000,
421 0x00004100, 0x02004008, 0x02000100, 0x00000108,
422 0x00000008, 0x00004108, 0x02004000, 0x02000008,
425 0x20000010, 0x00080010, 0x00000000, 0x20080800,
426 0x00080010, 0x00000800, 0x20000810, 0x00080000,
427 0x00000810, 0x20080810, 0x00080800, 0x20000000,
428 0x20000800, 0x20000010, 0x20080000, 0x00080810,
429 0x00080000, 0x20000810, 0x20080010, 0x00000000,
430 0x00000800, 0x00000010, 0x20080800, 0x20080010,
431 0x20080810, 0x20080000, 0x20000000, 0x00000810,
432 0x00000010, 0x00080800, 0x00080810, 0x20000800,
433 0x00000810, 0x20000000, 0x20000800, 0x00080810,
434 0x20080800, 0x00080010, 0x00000000, 0x20000800,
435 0x20000000, 0x00000800, 0x20080010, 0x00080000,
436 0x00080010, 0x20080810, 0x00080800, 0x00000010,
437 0x20080810, 0x00080800, 0x00080000, 0x20000810,
438 0x20000010, 0x20080000, 0x00080810, 0x00000000,
439 0x00000800, 0x20000010, 0x20000810, 0x20080800,
440 0x20080000, 0x00000810, 0x00000010, 0x20080010,
443 0x00001000, 0x00000080, 0x00400080, 0x00400001,
444 0x00401081, 0x00001001, 0x00001080, 0x00000000,
445 0x00400000, 0x00400081, 0x00000081, 0x00401000,
446 0x00000001, 0x00401080, 0x00401000, 0x00000081,
447 0x00400081, 0x00001000, 0x00001001, 0x00401081,
448 0x00000000, 0x00400080, 0x00400001, 0x00001080,
449 0x00401001, 0x00001081, 0x00401080, 0x00000001,
450 0x00001081, 0x00401001, 0x00000080, 0x00400000,
451 0x00001081, 0x00401000, 0x00401001, 0x00000081,
452 0x00001000, 0x00000080, 0x00400000, 0x00401001,
453 0x00400081, 0x00001081, 0x00001080, 0x00000000,
454 0x00000080, 0x00400001, 0x00000001, 0x00400080,
455 0x00000000, 0x00400081, 0x00400080, 0x00001080,
456 0x00000081, 0x00001000, 0x00401081, 0x00400000,
457 0x00401080, 0x00000001, 0x00001001, 0x00401081,
458 0x00400001, 0x00401080, 0x00401000, 0x00001001,
461 0x08200020, 0x08208000, 0x00008020, 0x00000000,
462 0x08008000, 0x00200020, 0x08200000, 0x08208020,
463 0x00000020, 0x08000000, 0x00208000, 0x00008020,
464 0x00208020, 0x08008020, 0x08000020, 0x08200000,
465 0x00008000, 0x00208020, 0x00200020, 0x08008000,
466 0x08208020, 0x08000020, 0x00000000, 0x00208000,
467 0x08000000, 0x00200000, 0x08008020, 0x08200020,
468 0x00200000, 0x00008000, 0x08208000, 0x00000020,
469 0x00200000, 0x00008000, 0x08000020, 0x08208020,
470 0x00008020, 0x08000000, 0x00000000, 0x00208000,
471 0x08200020, 0x08008020, 0x08008000, 0x00200020,
472 0x08208000, 0x00000020, 0x00200020, 0x08008000,
473 0x08208020, 0x00200000, 0x08200000, 0x08000020,
474 0x00208000, 0x00008020, 0x08008020, 0x08200000,
475 0x00000020, 0x08208000, 0x00208020, 0x00000000,
476 0x08000000, 0x08200020, 0x00008000, 0x00208020,
480 static const int32_t DES_KEY_SZ=8;
482 void des_set_odd_parity(uint8_t* key)
484 int32_t i;
486 for (i=0; i < DES_KEY_SZ; i++)
487 key[i]=odd_parity[key[i]&0xff];
490 int8_t check_parity(const uint8_t* key)
492 int32_t i;
494 for (i=0; i < DES_KEY_SZ; i++)
496 if (key[i] != odd_parity[key[i]&0xff])
497 return 0;
499 return 1;
502 int8_t des_is_weak_key(const uint8_t* key)
504 int32_t i, j;
506 for (i=0; i < 16; i++)
508 for(j=0; j < DES_KEY_SZ; j++)
510 if (weak_keys[i][j] != key[j])
512 // not weak
513 continue;
516 // weak
517 return 1;
519 return 0;
522 static uint32_t Get32bits(const uint8_t* key, int32_t kindex)
524 return(((key[kindex+3]&0xff)<<24) + ((key[kindex+2]&0xff)<<16) + ((key[kindex+1]&0xff)<<8) + (key[kindex]&0xff));
527 int8_t des_set_key(const uint8_t* key, uint32_t* schedule)
529 uint32_t c,d,t,s;
530 int32_t inIndex;
531 int32_t kIndex;
532 int32_t i;
533 inIndex=0;
534 kIndex=0;
535 c =Get32bits(key, inIndex);
536 d =Get32bits(key, inIndex+4);
537 t=(((d>>4)^c)&0x0f0f0f0f);
538 c^=t;
539 d^=(t<<4);
540 t=(((c<<(16-(-2)))^c)&0xcccc0000);
541 c=c^t^(t>>(16-(-2)));
542 t=((d<<(16-(-2)))^d)&0xcccc0000;
543 d=d^t^(t>>(16-(-2)));
544 t=((d>>1)^c)&0x55555555;
545 c^=t;
546 d^=(t<<1);
547 t=((c>>8)^d)&0x00ff00ff;
548 d^=t;
549 c^=(t<<8);
550 t=((d>>1)^c)&0x55555555;
551 c^=t;
552 d^=(t<<1);
553 d= (((d&0x000000ff)<<16)| (d&0x0000ff00) |((d&0x00ff0000)>>16)|((c&0xf0000000)>>4));
554 c&=0x0fffffff;
555 for (i=0; i < 16; i++)
557 if (shifts2[i])
559 c=((c>>2)|(c<<26));
560 d=((d>>2)|(d<<26));
562 else
564 c=((c>>1)|(c<<27));
565 d=((d>>1)|(d<<27));
567 c&=0x0fffffff;
568 d&=0x0fffffff;
569 s= des_skb[0][ (c )&0x3f ]|
570 des_skb[1][((c>> 6)&0x03)|((c>> 7)&0x3c)]|
571 des_skb[2][((c>>13)&0x0f)|((c>>14)&0x30)]|
572 des_skb[3][((c>>20)&0x01)|((c>>21)&0x06) |
573 ((c>>22)&0x38)];
574 t= des_skb[4][ (d )&0x3f ]|
575 des_skb[5][((d>> 7)&0x03)|((d>> 8)&0x3c)]|
576 des_skb[6][ (d>>15)&0x3f ]|
577 des_skb[7][((d>>21)&0x0f)|((d>>22)&0x30)];
578 schedule[kIndex++]=((t<<16)|(s&0x0000ffff))&0xffffffff;
579 s=((s>>16)|(t&0xffff0000));
580 s=(s<<4)|(s>>28);
581 schedule[kIndex++]=s&0xffffffff;
583 return 1;
586 static uint32_t _lrotr(uint32_t i)
588 return((i>>4) | ((i&0xff)<<28));
591 static void des_encrypt_int(uint32_t* data, const uint32_t* ks, int8_t do_encrypt)
593 uint32_t l=0,r=0,t=0,u=0;
594 int32_t i;
596 u=data[0];
597 r=data[1];
600 uint32_t tt;
602 tt=((r>>4)^u)&0x0f0f0f0f;
603 u^=tt;
604 r^=(tt<<4);
605 tt=(((u>>16)^r)&0x0000ffff);
606 r^=tt;
607 u^=(tt<<16);
608 tt=(((r>>2)^u)&0x33333333);
609 u^=tt;
610 r^=(tt<<2);
611 tt=(((u>>8)^r)&0x00ff00ff);
612 r^=tt;
613 u^=(tt<<8);
614 tt=(((r>>1)^u)&0x55555555);
615 u^=tt;
616 r^=(tt<<1);
619 l=(r<<1)|(r>>31);
620 r=(u<<1)|(u>>31);
621 l&=0xffffffff;
622 r&=0xffffffff;
624 if (do_encrypt)
626 for (i=0; i < 32; i+=8)
629 u=(r^ks[i+0 ]);
630 t=r^ks[i+0+1];
631 t=(_lrotr(t));
632 l^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
635 u=(l^ks[i+2 ]);
636 t=l^ks[i+2+1];
637 t=(_lrotr(t));
638 r^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
641 u=(r^ks[i+4 ]);
642 t=r^ks[i+4+1];
643 t=(_lrotr(t));
644 l^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
647 u=(l^ks[i+6 ]);
648 t=l^ks[i+6+1];
649 t=(_lrotr(t));
650 r^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
654 else
656 for (i=30; i > 0; i-=8)
659 u=(r^ks[i-0 ]);
660 t=r^ks[i-0+1];
661 t=(_lrotr(t));
662 l^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
665 u=(l^ks[i-2 ]);
666 t=l^ks[i-2+1];
667 t=(_lrotr(t));
668 r^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
671 u=(r^ks[i-4 ]);
672 t=r^ks[i-4+1];
673 t=(_lrotr(t));
674 l^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
677 u=(l^ks[i-6 ]);
678 t=l^ks[i-6+1];
679 t=(_lrotr(t));
680 r^= des_SPtrans[1][(t )&0x3f]| des_SPtrans[3][(t>> 8)&0x3f]| des_SPtrans[5][(t>>16)&0x3f]| des_SPtrans[7][(t>>24)&0x3f]| des_SPtrans[0][(u )&0x3f]| des_SPtrans[2][(u>> 8)&0x3f]| des_SPtrans[4][(u>>16)&0x3f]| des_SPtrans[6][(u>>24)&0x3f];
685 l=(l>>1)|(l<<31);
686 r=(r>>1)|(r<<31);
687 l&=0xffffffff;
688 r&=0xffffffff;
691 uint32_t tt;
692 tt=(((r>>1)^l)&0x55555555);
693 l^=tt;
694 r^=(tt<<1);
695 tt=(((l>>8)^r)&0x00ff00ff);
696 r^=tt;
697 l^=(tt<<8);
698 tt=(((r>>2)^l)&0x33333333);
699 l^=tt;
700 r^=(tt<<2);
701 tt=(((l>>16)^r)&0x0000ffff);
702 r^=tt;
703 l^=(tt<<16);
704 tt=(((r>>4)^l)&0x0f0f0f0f);
705 l^=tt;
706 r^=(tt<<4);
709 data[0]=l;
710 data[1]=r;
713 void des(uint8_t* data, const uint32_t* schedule, int8_t do_encrypt)
715 uint32_t l, ll[2];
716 int32_t inIndex;
717 int32_t outIndex;
719 inIndex=0;
720 outIndex=0;
722 l = Get32bits(data, inIndex);
723 ll[0]=l;
725 l = Get32bits(data, inIndex+4);
726 ll[1]=l;
728 des_encrypt_int(ll, schedule, do_encrypt);
730 l=ll[0];
732 data[outIndex++] = (l&0xff);
733 data[outIndex++] = ((l>>8)&0xff);
734 data[outIndex++] = ((l>>16)&0xff);
735 data[outIndex++] = ((l>>24)&0xff);
736 l=ll[1];
737 data[outIndex++] = (l&0xff);
738 data[outIndex++] = ((l>>8) &0xff);
739 data[outIndex++] = ((l>>16) &0xff);
740 data[outIndex++] = ((l>>24) &0xff);
743 static inline void xxor(uint8_t *data, int32_t len, const uint8_t *v1, const uint8_t *v2)
745 uint32_t i;
746 switch(len)
748 case 16:
749 for(i = 0; i < 16; ++i)
751 data[i] = v1[i] ^ v2[i];
753 break;
754 case 8:
755 for(i = 0; i < 8; ++i)
757 data[i] = v1[i] ^ v2[i];
759 break;
760 case 4:
761 for(i = 0; i < 4; ++i)
763 data[i] = v1[i] ^ v2[i];
765 break;
766 default:
767 while(len--)
769 *data++ = *v1++ ^ *v2++;
771 break;
775 void des_ecb_encrypt(uint8_t* data, const uint8_t* key, int32_t len)
777 uint32_t schedule[32];
778 int32_t i;
780 des_set_key(key, schedule);
782 len&=~7;
784 for(i=0; i<len; i+=8)
786 des(&data[i], schedule, 1);
790 void des_ecb_decrypt(uint8_t* data, const uint8_t* key, int32_t len)
792 uint32_t schedule[32];
793 int32_t i;
795 des_set_key(key, schedule);
797 len&=~7;
799 for(i=0; i<len; i+=8)
801 des(&data[i], schedule, 0);
805 void des_cbc_encrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key, int32_t len)
807 const uint8_t *civ = iv;
808 uint32_t schedule[32];
809 int32_t i;
811 des_set_key(key, schedule);
813 len&=~7;
815 for(i=0; i<len; i+=8)
817 xxor(&data[i],8,&data[i],civ);
818 civ=&data[i];
819 des(&data[i], schedule, 1);
823 void des_cbc_decrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key, int32_t len)
825 uint8_t civ[2][8];
826 uint32_t schedule[32];
827 int32_t i, n=0;
829 des_set_key(key, schedule);
831 len&=~7;
833 memcpy(civ[n],iv,8);
834 for(i=0; i<len; i+=8,data+=8,n^=1)
836 memcpy(civ[1-n],data,8);
837 des(data, schedule,0);
838 xxor(data,8,data,civ[n]);
842 void des_ede2_cbc_encrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key1, const uint8_t* key2, int32_t len)
844 const uint8_t *civ = iv;
845 uint32_t schedule1[32], schedule2[32];
846 int32_t i;
848 des_set_key(key1, schedule1);
849 des_set_key(key2, schedule2);
851 len&=~7;
853 for(i=0; i<len; i+=8)
855 xxor(&data[i],8,&data[i],civ);
856 civ=&data[i];
858 des(&data[i], schedule1, 1);
859 des(&data[i], schedule2, 0);
860 des(&data[i], schedule1, 1);
864 void des_ede2_cbc_decrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key1, const uint8_t* key2, int32_t len)
866 uint8_t civ[2][8];
867 uint32_t schedule1[32], schedule2[32];
868 int32_t i, n=0;
870 des_set_key(key1, schedule1);
871 des_set_key(key2, schedule2);
873 len&=~7;
875 memcpy(civ[n],iv,8);
876 for(i=0; i<len; i+=8,data+=8,n^=1)
878 memcpy(civ[1-n],data,8);
879 des(data, schedule1, 0);
880 des(data, schedule2, 1);
881 des(data, schedule1, 0);
882 xxor(data,8,data,civ[n]);
886 void des_ecb3_decrypt(uint8_t* data, const uint8_t* key)
888 uint8_t desA[8];
889 uint8_t desB[8];
891 uint32_t schedule1[32];
892 uint32_t schedule2[32];
894 memcpy(desA, key, 8);
895 des_set_key(desA, schedule1);
896 memcpy(desB, key+8, 8);
897 des_set_key(desB, schedule2);
899 des(data, schedule1, 0);
900 des(data, schedule2, 1);
901 des(data, schedule1, 0);
904 void des_ecb3_encrypt(uint8_t* data, const uint8_t* key)
906 uint8_t desA[8];
907 uint8_t desB[8];
909 uint32_t schedule1[32];
910 uint32_t schedule2[32];
912 memcpy(desA, key, 8);
913 des_set_key(desA, schedule1);
914 memcpy(desB, key+8, 8);
915 des_set_key(desB, schedule2);
917 des(data, schedule1, 1);
918 des(data, schedule2, 0);
919 des(data, schedule1, 1);