source: trunk/cscrypt/des.c

Last change on this file was 11480, checked in by Gorgone Impertinence, 18 months ago

big update pack 5
another cleanup &
removed duplicate functions

  • Property svn:eol-style set to LF
File size: 31.1 KB
Line 
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:
10//
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.
17//
18// This set of classes is FREE FOR COMMERCIAL AND NON-COMMERCIAL USE
19// as long as the following conditions are adhered to:
20//
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.
27//
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.
63//
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.
69//
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.
75//
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.
82//
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.]
87
88/* original eay copyright notice follows:*/
89
90/* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
91 * All rights reserved.
92 *
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.
99 *
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.
105 *
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)
117 *
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.
129 *
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.]
134 */
135
136#include "../globals.h"
137#include "../oscam-string.h"
138#include "des.h"
139
140static const uint8_t weak_keys[16][8] =
141{
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}
160};
161
162static const uint8_t odd_parity[] =
163{
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
180};
181
182static const uint8_t shifts2[16] = {0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
183
184static const uint32_t des_skb[8][64] =
185{
186 {
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,
203 },{
204
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,
221 },{
222
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,
239 },{
240
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,
257 },{
258
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,
275 },{
276
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,
293 },{
294
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,
311 },{
312
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,
329 }
330};
331
332static const uint32_t des_SPtrans[8][64] =
333{
334 {
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,
351 },{
352
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,
369 },{
370
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,
387 },{
388
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,
405 },{
406
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,
423 },{
424
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,
441 },{
442
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,
459 },{
460
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,
477 }
478};
479
480static const int32_t DES_KEY_SZ=8;
481
482void des_set_odd_parity(uint8_t* key)
483{
484 int32_t i;
485
486 for (i=0; i < DES_KEY_SZ; i++)
487 key[i]=odd_parity[key[i]&0xff];
488}
489
490int8_t check_parity(const uint8_t* key)
491{
492 int32_t i;
493
494 for (i=0; i < DES_KEY_SZ; i++)
495 {
496 if (key[i] != odd_parity[key[i]&0xff])
497 return 0;
498 }
499 return 1;
500}
501
502int8_t des_is_weak_key(const uint8_t* key)
503{
504 int32_t i, j;
505
506 for (i=0; i < 16; i++)
507 {
508 for(j=0; j < DES_KEY_SZ; j++)
509 {
510 if (weak_keys[i][j] != key[j])
511 {
512 // not weak
513 continue;
514 }
515 }
516 // weak
517 return 1;
518 }
519 return 0;
520}
521
522static uint32_t Get32bits(const uint8_t* key, int32_t kindex)
523{
524 return(((key[kindex+3]&0xff)<<24) + ((key[kindex+2]&0xff)<<16) + ((key[kindex+1]&0xff)<<8) + (key[kindex]&0xff));
525}
526
527int8_t des_set_key(const uint8_t* key, uint32_t* schedule)
528{
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++)
556 {
557 if (shifts2[i])
558 {
559 c=((c>>2)|(c<<26));
560 d=((d>>2)|(d<<26));
561 }
562 else
563 {
564 c=((c>>1)|(c<<27));
565 d=((d>>1)|(d<<27));
566 }
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;
582 }
583 return 1;
584}
585
586static uint32_t _lrotr(uint32_t i)
587{
588 return((i>>4) | ((i&0xff)<<28));
589}
590
591static void des_encrypt_int(uint32_t* data, const uint32_t* ks, int8_t do_encrypt)
592{
593 uint32_t l,r,t,u;
594 int32_t i;
595
596 u=data[0];
597 r=data[1];
598
599 {
600 uint32_t tt;
601
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);
617 }
618
619 l=(r<<1)|(r>>31);
620 r=(u<<1)|(u>>31);
621 l&=0xffffffff;
622 r&=0xffffffff;
623
624 if (do_encrypt)
625 {
626 for (i=0; i < 32; i+=8)
627 {
628 {
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];
633 };
634 {
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];
639 };
640 {
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];
645 };
646 {
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];
651 };
652 }
653 }
654 else
655 {
656 for (i=30; i > 0; i-=8)
657 {
658 {
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];
663 };
664 {
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];
669 };
670 {
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];
675 };
676 {
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];
681 };
682 }
683 }
684
685 l=(l>>1)|(l<<31);
686 r=(r>>1)|(r<<31);
687 l&=0xffffffff;
688 r&=0xffffffff;
689
690 {
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);
707 }
708
709 data[0]=l;
710 data[1]=r;
711 l=r=t=u=0;
712}
713
714void des(uint8_t* data, const uint32_t* schedule, int8_t do_encrypt)
715{
716 uint32_t l, ll[2];
717 int32_t inIndex;
718 int32_t outIndex;
719
720 inIndex=0;
721 outIndex=0;
722
723 l = Get32bits(data, inIndex);
724 ll[0]=l;
725
726 l = Get32bits(data, inIndex+4);
727 ll[1]=l;
728
729 des_encrypt_int(ll, schedule, do_encrypt);
730
731 l=ll[0];
732
733 data[outIndex++] = (l&0xff);
734 data[outIndex++] = ((l>>8)&0xff);
735 data[outIndex++] = ((l>>16)&0xff);
736 data[outIndex++] = ((l>>24)&0xff);
737 l=ll[1];
738 data[outIndex++] = (l&0xff);
739 data[outIndex++] = ((l>>8) &0xff);
740 data[outIndex++] = ((l>>16) &0xff);
741 data[outIndex++] = ((l>>24) &0xff);
742}
743
744static inline void xxor(uint8_t *data, int32_t len, const uint8_t *v1, const uint8_t *v2)
745{
746 uint32_t i;
747 switch(len)
748 {
749 case 16:
750 for(i = 0; i < 16; ++i)
751 {
752 data[i] = v1[i] ^ v2[i];
753 }
754 break;
755 case 8:
756 for(i = 0; i < 8; ++i)
757 {
758 data[i] = v1[i] ^ v2[i];
759 }
760 break;
761 case 4:
762 for(i = 0; i < 4; ++i)
763 {
764 data[i] = v1[i] ^ v2[i];
765 }
766 break;
767 default:
768 while(len--)
769 {
770 *data++ = *v1++ ^ *v2++;
771 }
772 break;
773 }
774}
775
776void des_ecb_encrypt(uint8_t* data, const uint8_t* key, int32_t len)
777{
778 uint32_t schedule[32];
779 int32_t i;
780
781 des_set_key(key, schedule);
782
783 len&=~7;
784
785 for(i=0; i<len; i+=8)
786 {
787 des(&data[i], schedule, 1);
788 }
789}
790
791void des_ecb_decrypt(uint8_t* data, const uint8_t* key, int32_t len)
792{
793 uint32_t schedule[32];
794 int32_t i;
795
796 des_set_key(key, schedule);
797
798 len&=~7;
799
800 for(i=0; i<len; i+=8)
801 {
802 des(&data[i], schedule, 0);
803 }
804}
805
806void des_cbc_encrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key, int32_t len)
807{
808 const uint8_t *civ = iv;
809 uint32_t schedule[32];
810 int32_t i;
811
812 des_set_key(key, schedule);
813
814 len&=~7;
815
816 for(i=0; i<len; i+=8)
817 {
818 xxor(&data[i],8,&data[i],civ);
819 civ=&data[i];
820 des(&data[i], schedule, 1);
821 }
822}
823
824void des_cbc_decrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key, int32_t len)
825{
826 uint8_t civ[2][8];
827 uint32_t schedule[32];
828 int32_t i, n=0;
829
830 des_set_key(key, schedule);
831
832 len&=~7;
833
834 memcpy(civ[n],iv,8);
835 for(i=0; i<len; i+=8,data+=8,n^=1)
836 {
837 memcpy(civ[1-n],data,8);
838 des(data, schedule,0);
839 xxor(data,8,data,civ[n]);
840 }
841}
842
843void des_ede2_cbc_encrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key1, const uint8_t* key2, int32_t len)
844{
845 const uint8_t *civ = iv;
846 uint32_t schedule1[32], schedule2[32];
847 int32_t i;
848
849 des_set_key(key1, schedule1);
850 des_set_key(key2, schedule2);
851
852 len&=~7;
853
854 for(i=0; i<len; i+=8)
855 {
856 xxor(&data[i],8,&data[i],civ);
857 civ=&data[i];
858
859 des(&data[i], schedule1, 1);
860 des(&data[i], schedule2, 0);
861 des(&data[i], schedule1, 1);
862 }
863}
864
865void des_ede2_cbc_decrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key1, const uint8_t* key2, int32_t len)
866{
867 uint8_t civ[2][8];
868 uint32_t schedule1[32], schedule2[32];
869 int32_t i, n=0;
870
871 des_set_key(key1, schedule1);
872 des_set_key(key2, schedule2);
873
874 len&=~7;
875
876 memcpy(civ[n],iv,8);
877 for(i=0; i<len; i+=8,data+=8,n^=1)
878 {
879 memcpy(civ[1-n],data,8);
880 des(data, schedule1, 0);
881 des(data, schedule2, 1);
882 des(data, schedule1, 0);
883 xxor(data,8,data,civ[n]);
884 }
885}
886
887void des_ecb3_decrypt(uint8_t* data, const uint8_t* key)
888{
889 uint8_t desA[8];
890 uint8_t desB[8];
891
892 uint32_t schedule1[32];
893 uint32_t schedule2[32];
894
895 memcpy(desA, key, 8);
896 des_set_key(desA, schedule1);
897 memcpy(desB, key+8, 8);
898 des_set_key(desB, schedule2);
899
900 des(data, schedule1, 0);
901 des(data, schedule2, 1);
902 des(data, schedule1, 0);
903}
904
905void des_ecb3_encrypt(uint8_t* data, const uint8_t* key)
906{
907 uint8_t desA[8];
908 uint8_t desB[8];
909
910 uint32_t schedule1[32];
911 uint32_t schedule2[32];
912
913 memcpy(desA, key, 8);
914 des_set_key(desA, schedule1);
915 memcpy(desB, key+8, 8);
916 des_set_key(desB, schedule2);
917
918 des(data, schedule1, 1);
919 des(data, schedule2, 0);
920 des(data, schedule1, 1);
921}
Note: See TracBrowser for help on using the repository browser.