source: svn/trunk/newcon3bcm2_21bu/dta/src/bootloader/des/des.c @ 2

Last change on this file since 2 was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 12.7 KB
Line 
1#include "des.h"
2#include <stdio.h>
3//#include <memory.h>
4#include <string.h>
5#include "../secure_boot.h"
6/* openssl-0.9.7d spr.h */
7
8const DES_LONG DES_SPtrans[8][64]={
9{
10/* nibble 0 */
110x02080800L, 0x00080000L, 0x02000002L, 0x02080802L,
120x02000000L, 0x00080802L, 0x00080002L, 0x02000002L,
130x00080802L, 0x02080800L, 0x02080000L, 0x00000802L,
140x02000802L, 0x02000000L, 0x00000000L, 0x00080002L,
150x00080000L, 0x00000002L, 0x02000800L, 0x00080800L,
160x02080802L, 0x02080000L, 0x00000802L, 0x02000800L,
170x00000002L, 0x00000800L, 0x00080800L, 0x02080002L,
180x00000800L, 0x02000802L, 0x02080002L, 0x00000000L,
190x00000000L, 0x02080802L, 0x02000800L, 0x00080002L,
200x02080800L, 0x00080000L, 0x00000802L, 0x02000800L,
210x02080002L, 0x00000800L, 0x00080800L, 0x02000002L,
220x00080802L, 0x00000002L, 0x02000002L, 0x02080000L,
230x02080802L, 0x00080800L, 0x02080000L, 0x02000802L,
240x02000000L, 0x00000802L, 0x00080002L, 0x00000000L,
250x00080000L, 0x02000000L, 0x02000802L, 0x02080800L,
260x00000002L, 0x02080002L, 0x00000800L, 0x00080802L,
27},{
28/* nibble 1 */
290x40108010L, 0x00000000L, 0x00108000L, 0x40100000L,
300x40000010L, 0x00008010L, 0x40008000L, 0x00108000L,
310x00008000L, 0x40100010L, 0x00000010L, 0x40008000L,
320x00100010L, 0x40108000L, 0x40100000L, 0x00000010L,
330x00100000L, 0x40008010L, 0x40100010L, 0x00008000L,
340x00108010L, 0x40000000L, 0x00000000L, 0x00100010L,
350x40008010L, 0x00108010L, 0x40108000L, 0x40000010L,
360x40000000L, 0x00100000L, 0x00008010L, 0x40108010L,
370x00100010L, 0x40108000L, 0x40008000L, 0x00108010L,
380x40108010L, 0x00100010L, 0x40000010L, 0x00000000L,
390x40000000L, 0x00008010L, 0x00100000L, 0x40100010L,
400x00008000L, 0x40000000L, 0x00108010L, 0x40008010L,
410x40108000L, 0x00008000L, 0x00000000L, 0x40000010L,
420x00000010L, 0x40108010L, 0x00108000L, 0x40100000L,
430x40100010L, 0x00100000L, 0x00008010L, 0x40008000L,
440x40008010L, 0x00000010L, 0x40100000L, 0x00108000L,
45},{
46/* nibble 2 */
470x04000001L, 0x04040100L, 0x00000100L, 0x04000101L,
480x00040001L, 0x04000000L, 0x04000101L, 0x00040100L,
490x04000100L, 0x00040000L, 0x04040000L, 0x00000001L,
500x04040101L, 0x00000101L, 0x00000001L, 0x04040001L,
510x00000000L, 0x00040001L, 0x04040100L, 0x00000100L,
520x00000101L, 0x04040101L, 0x00040000L, 0x04000001L,
530x04040001L, 0x04000100L, 0x00040101L, 0x04040000L,
540x00040100L, 0x00000000L, 0x04000000L, 0x00040101L,
550x04040100L, 0x00000100L, 0x00000001L, 0x00040000L,
560x00000101L, 0x00040001L, 0x04040000L, 0x04000101L,
570x00000000L, 0x04040100L, 0x00040100L, 0x04040001L,
580x00040001L, 0x04000000L, 0x04040101L, 0x00000001L,
590x00040101L, 0x04000001L, 0x04000000L, 0x04040101L,
600x00040000L, 0x04000100L, 0x04000101L, 0x00040100L,
610x04000100L, 0x00000000L, 0x04040001L, 0x00000101L,
620x04000001L, 0x00040101L, 0x00000100L, 0x04040000L,
63},{
64/* nibble 3 */
650x00401008L, 0x10001000L, 0x00000008L, 0x10401008L,
660x00000000L, 0x10400000L, 0x10001008L, 0x00400008L,
670x10401000L, 0x10000008L, 0x10000000L, 0x00001008L,
680x10000008L, 0x00401008L, 0x00400000L, 0x10000000L,
690x10400008L, 0x00401000L, 0x00001000L, 0x00000008L,
700x00401000L, 0x10001008L, 0x10400000L, 0x00001000L,
710x00001008L, 0x00000000L, 0x00400008L, 0x10401000L,
720x10001000L, 0x10400008L, 0x10401008L, 0x00400000L,
730x10400008L, 0x00001008L, 0x00400000L, 0x10000008L,
740x00401000L, 0x10001000L, 0x00000008L, 0x10400000L,
750x10001008L, 0x00000000L, 0x00001000L, 0x00400008L,
760x00000000L, 0x10400008L, 0x10401000L, 0x00001000L,
770x10000000L, 0x10401008L, 0x00401008L, 0x00400000L,
780x10401008L, 0x00000008L, 0x10001000L, 0x00401008L,
790x00400008L, 0x00401000L, 0x10400000L, 0x10001008L,
800x00001008L, 0x10000000L, 0x10000008L, 0x10401000L,
81},{
82/* nibble 4 */
830x08000000L, 0x00010000L, 0x00000400L, 0x08010420L,
840x08010020L, 0x08000400L, 0x00010420L, 0x08010000L,
850x00010000L, 0x00000020L, 0x08000020L, 0x00010400L,
860x08000420L, 0x08010020L, 0x08010400L, 0x00000000L,
870x00010400L, 0x08000000L, 0x00010020L, 0x00000420L,
880x08000400L, 0x00010420L, 0x00000000L, 0x08000020L,
890x00000020L, 0x08000420L, 0x08010420L, 0x00010020L,
900x08010000L, 0x00000400L, 0x00000420L, 0x08010400L,
910x08010400L, 0x08000420L, 0x00010020L, 0x08010000L,
920x00010000L, 0x00000020L, 0x08000020L, 0x08000400L,
930x08000000L, 0x00010400L, 0x08010420L, 0x00000000L,
940x00010420L, 0x08000000L, 0x00000400L, 0x00010020L,
950x08000420L, 0x00000400L, 0x00000000L, 0x08010420L,
960x08010020L, 0x08010400L, 0x00000420L, 0x00010000L,
970x00010400L, 0x08010020L, 0x08000400L, 0x00000420L,
980x00000020L, 0x00010420L, 0x08010000L, 0x08000020L,
99},{
100/* nibble 5 */
1010x80000040L, 0x00200040L, 0x00000000L, 0x80202000L,
1020x00200040L, 0x00002000L, 0x80002040L, 0x00200000L,
1030x00002040L, 0x80202040L, 0x00202000L, 0x80000000L,
1040x80002000L, 0x80000040L, 0x80200000L, 0x00202040L,
1050x00200000L, 0x80002040L, 0x80200040L, 0x00000000L,
1060x00002000L, 0x00000040L, 0x80202000L, 0x80200040L,
1070x80202040L, 0x80200000L, 0x80000000L, 0x00002040L,
1080x00000040L, 0x00202000L, 0x00202040L, 0x80002000L,
1090x00002040L, 0x80000000L, 0x80002000L, 0x00202040L,
1100x80202000L, 0x00200040L, 0x00000000L, 0x80002000L,
1110x80000000L, 0x00002000L, 0x80200040L, 0x00200000L,
1120x00200040L, 0x80202040L, 0x00202000L, 0x00000040L,
1130x80202040L, 0x00202000L, 0x00200000L, 0x80002040L,
1140x80000040L, 0x80200000L, 0x00202040L, 0x00000000L,
1150x00002000L, 0x80000040L, 0x80002040L, 0x80202000L,
1160x80200000L, 0x00002040L, 0x00000040L, 0x80200040L,
117},{
118/* nibble 6 */
1190x00004000L, 0x00000200L, 0x01000200L, 0x01000004L,
1200x01004204L, 0x00004004L, 0x00004200L, 0x00000000L,
1210x01000000L, 0x01000204L, 0x00000204L, 0x01004000L,
1220x00000004L, 0x01004200L, 0x01004000L, 0x00000204L,
1230x01000204L, 0x00004000L, 0x00004004L, 0x01004204L,
1240x00000000L, 0x01000200L, 0x01000004L, 0x00004200L,
1250x01004004L, 0x00004204L, 0x01004200L, 0x00000004L,
1260x00004204L, 0x01004004L, 0x00000200L, 0x01000000L,
1270x00004204L, 0x01004000L, 0x01004004L, 0x00000204L,
1280x00004000L, 0x00000200L, 0x01000000L, 0x01004004L,
1290x01000204L, 0x00004204L, 0x00004200L, 0x00000000L,
1300x00000200L, 0x01000004L, 0x00000004L, 0x01000200L,
1310x00000000L, 0x01000204L, 0x01000200L, 0x00004200L,
1320x00000204L, 0x00004000L, 0x01004204L, 0x01000000L,
1330x01004200L, 0x00000004L, 0x00004004L, 0x01004204L,
1340x01000004L, 0x01004200L, 0x01004000L, 0x00004004L,
135},{
136/* nibble 7 */
1370x20800080L, 0x20820000L, 0x00020080L, 0x00000000L,
1380x20020000L, 0x00800080L, 0x20800000L, 0x20820080L,
1390x00000080L, 0x20000000L, 0x00820000L, 0x00020080L,
1400x00820080L, 0x20020080L, 0x20000080L, 0x20800000L,
1410x00020000L, 0x00820080L, 0x00800080L, 0x20020000L,
1420x20820080L, 0x20000080L, 0x00000000L, 0x00820000L,
1430x20000000L, 0x00800000L, 0x20020080L, 0x20800080L,
1440x00800000L, 0x00020000L, 0x20820000L, 0x00000080L,
1450x00800000L, 0x00020000L, 0x20000080L, 0x20820080L,
1460x00020080L, 0x20000000L, 0x00000000L, 0x00820000L,
1470x20800080L, 0x20020080L, 0x20020000L, 0x00800080L,
1480x20820000L, 0x00000080L, 0x00800080L, 0x20020000L,
1490x20820080L, 0x00800000L, 0x20800000L, 0x20000080L,
1500x00820000L, 0x00020080L, 0x20020080L, 0x20800000L,
1510x00000080L, 0x20820000L, 0x00820080L, 0x00000000L,
1520x20000000L, 0x20800080L, 0x00020000L, 0x00820080L,
153}};
154
155
156void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc);
157
158void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
159                  DES_key_schedule *ks2, DES_key_schedule *ks3);
160void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
161                  DES_key_schedule *ks2, DES_key_schedule *ks3);
162int DES_check_key_parity(const DES_cblock *key);                 
163int DES_is_weak_key(const DES_cblock *key);
164
165
166void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc)
167{
168  register DES_LONG l,r,t,u;
169#ifdef DES_PTR
170  register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans;
171#endif
172#ifndef DES_UNROLL
173  register int i;
174#endif
175  register DES_LONG *s;
176
177  r=data[0];
178  l=data[1];
179
180  /* Things have been modified so that the initial rotate is
181  * done outside the loop.  This required the
182  * DES_SPtrans values in sp.h to be rotated 1 bit to the right.
183  * One perl script later and things have a 5% speed up on a sparc2.
184  * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
185  * for pointing this out. */
186  /* clear the top bits on machines with 8byte longs */
187  r=ROTATE(r,29)&0xffffffffL;
188  l=ROTATE(l,29)&0xffffffffL;
189
190  s=ks->ks->deslong;
191  /* I don't know if it is worth the effort of loop unrolling the
192  * inner loop */
193  if (enc)
194  {
195#ifdef DES_UNROLL
196    D_ENCRYPT(l,r, 0); /*  1 */
197    D_ENCRYPT(r,l, 2); /*  2 */
198    D_ENCRYPT(l,r, 4); /*  3 */
199    D_ENCRYPT(r,l, 6); /*  4 */
200    D_ENCRYPT(l,r, 8); /*  5 */
201    D_ENCRYPT(r,l,10); /*  6 */
202    D_ENCRYPT(l,r,12); /*  7 */
203    D_ENCRYPT(r,l,14); /*  8 */
204    D_ENCRYPT(l,r,16); /*  9 */
205    D_ENCRYPT(r,l,18); /*  10 */
206    D_ENCRYPT(l,r,20); /*  11 */
207    D_ENCRYPT(r,l,22); /*  12 */
208    D_ENCRYPT(l,r,24); /*  13 */
209    D_ENCRYPT(r,l,26); /*  14 */
210    D_ENCRYPT(l,r,28); /*  15 */
211    D_ENCRYPT(r,l,30); /*  16 */
212#else
213    for (i=0; i<32; i+=8)
214    {
215      D_ENCRYPT(l,r,i+0); /*  1 */
216      D_ENCRYPT(r,l,i+2); /*  2 */
217      D_ENCRYPT(l,r,i+4); /*  3 */
218      D_ENCRYPT(r,l,i+6); /*  4 */
219    }
220#endif
221  }
222  else
223  {
224#ifdef DES_UNROLL
225    D_ENCRYPT(l,r,30); /* 16 */
226    D_ENCRYPT(r,l,28); /* 15 */
227    D_ENCRYPT(l,r,26); /* 14 */
228    D_ENCRYPT(r,l,24); /* 13 */
229    D_ENCRYPT(l,r,22); /* 12 */
230    D_ENCRYPT(r,l,20); /* 11 */
231    D_ENCRYPT(l,r,18); /* 10 */
232    D_ENCRYPT(r,l,16); /*  9 */
233    D_ENCRYPT(l,r,14); /*  8 */
234    D_ENCRYPT(r,l,12); /*  7 */
235    D_ENCRYPT(l,r,10); /*  6 */
236    D_ENCRYPT(r,l, 8); /*  5 */
237    D_ENCRYPT(l,r, 6); /*  4 */
238    D_ENCRYPT(r,l, 4); /*  3 */
239    D_ENCRYPT(l,r, 2); /*  2 */
240    D_ENCRYPT(r,l, 0); /*  1 */
241#else
242    for (i=30; i>0; i-=8)
243    {
244      D_ENCRYPT(l,r,i-0); /* 16 */
245      D_ENCRYPT(r,l,i-2); /* 15 */
246      D_ENCRYPT(l,r,i-4); /* 14 */
247      D_ENCRYPT(r,l,i-6); /* 13 */
248    }
249#endif
250  }
251  /* rotate and clear the top bits on machines with 8byte longs */
252  data[0]=ROTATE(l,3)&0xffffffffL;
253  data[1]=ROTATE(r,3)&0xffffffffL;
254  l=r=t=u=0;
255}
256
257void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
258                  DES_key_schedule *ks2, DES_key_schedule *ks3)
259{
260  register DES_LONG l,r;
261
262  l=data[0];
263  r=data[1];
264  IP(l,r);
265  data[0]=l;
266  data[1]=r;
267  DES_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT);
268  DES_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT);
269  DES_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT);
270  l=data[0];
271  r=data[1];
272  FP(r,l);
273  data[0]=l;
274  data[1]=r;
275}
276
277void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
278                  DES_key_schedule *ks2, DES_key_schedule *ks3)
279{
280  register DES_LONG l,r;
281
282  l=data[0];
283  r=data[1];
284  IP(l,r);
285  data[0]=l;
286  data[1]=r;
287  DES_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT);
288  DES_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT);
289  DES_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT);
290  l=data[0];
291  r=data[1];
292  FP(r,l);
293  data[0]=l;
294  data[1]=r;
295}
296
297/* openssl-0.9.7d ecb3_enc.c */
298void DES_ecb3_encrypt(const DES_cblock *input, DES_cblock *output,
299                      DES_key_schedule *ks1, DES_key_schedule *ks2,
300                      DES_key_schedule *ks3,
301                      int enc)
302{
303  register DES_LONG l0,l1;
304  DES_LONG ll[2];
305  const unsigned char *in = &(*input)[0];
306  unsigned char *out = &(*output)[0];
307
308  c2l(in,l0);
309  c2l(in,l1);
310  ll[0]=l0;
311  ll[1]=l1;
312  if (enc)
313    DES_encrypt3(ll,ks1,ks2,ks3);
314  else
315    DES_decrypt3(ll,ks1,ks2,ks3);
316  l0=ll[0];
317  l1=ll[1];
318  l2c(l0,out);
319  l2c(l1,out);
320}
321
322void DES_set_key_unchecked(const DES_cblock *key, DES_key_schedule *schedule)
323{
324        static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
325        register DES_LONG c,d,t,s,t2;
326        register const unsigned char *in;
327        register DES_LONG *k;
328        register int i;
329
330        k = &schedule->ks->deslong[0];
331        in = &(*key)[0];
332
333        c2l(in,c);
334        c2l(in,d);
335
336        /* do PC1 in 47 simple operations :-)
337        * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
338        * for the inspiration. :-) */
339        PERM_OP (d,c,t,4,0x0f0f0f0fL);
340        HPERM_OP(c,t,-2,0xcccc0000L);
341        HPERM_OP(d,t,-2,0xcccc0000L);
342        PERM_OP (d,c,t,1,0x55555555L);
343        PERM_OP (c,d,t,8,0x00ff00ffL);
344        PERM_OP (d,c,t,1,0x55555555L);
345        d=      (((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |
346                ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
347        c&=0x0fffffffL;
348
349        for (i=0; i<ITERATIONS; i++)
350        {
351                if (shifts2[i])
352                { c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
353                else
354                { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
355                c&=0x0fffffffL;
356                d&=0x0fffffffL;
357                /* could be a few less shifts but I am to lazy at this
358                * point in time to investigate */
359                s=      des_skb[0][ (c    )&0x3f                ]|
360                        des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
361                        des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
362                        des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
363                        ((c>>22L)&0x38)];
364                t=      des_skb[4][ (d    )&0x3f                ]|
365                        des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
366                        des_skb[6][ (d>>15L)&0x3f                ]|
367                        des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
368
369                /* table contained 0213 4657 */
370                t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
371                *(k++)=ROTATE(t2,30)&0xffffffffL;
372
373                t2=((s>>16L)|(t&0xffff0000L));
374                *(k++)=ROTATE(t2,26)&0xffffffffL;
375        }
376}
377
378
379       
Note: See TracBrowser for help on using the repository browser.