1  // Copyright (C) 19951996 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 NONCOMMERCIAL 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) 19951996 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 NONCOMMERCIAL 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 "../oscamstring.h"


138  #include "des.h"


139 


140  static 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  // semiweak 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 


162  static 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 


182  static const uint8_t shifts2[16] = {0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};


183 


184  static 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 


332  static 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 


480  static const int32_t DES_KEY_SZ=8;


481 


482  void 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 


490  int8_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 


502  int8_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 


522  static 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 


527  int8_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 


586  static uint32_t _lrotr(uint32_t i)


587  {


588  return((i>>4)  ((i&0xff)<<28));


589  }


590 


591  static void des_encrypt_int(uint32_t* data, const uint32_t* ks, int8_t do_encrypt)


592  {


593  uint32_t l=0,r=0,t=0,u=0;


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[i0 ]);


660  t=r^ks[i0+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[i2 ]);


666  t=l^ks[i2+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[i4 ]);


672  t=r^ks[i4+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[i6 ]);


678  t=l^ks[i6+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  }


712 


713  void des(uint8_t* data, const uint32_t* schedule, int8_t do_encrypt)


714  {


715  uint32_t l, ll[2];


716  int32_t inIndex;


717  int32_t outIndex;


718 


719  inIndex=0;


720  outIndex=0;


721 


722  l = Get32bits(data, inIndex);


723  ll[0]=l;


724 


725  l = Get32bits(data, inIndex+4);


726  ll[1]=l;


727 


728  des_encrypt_int(ll, schedule, do_encrypt);


729 


730  l=ll[0];


731 


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);


741  }


742 


743  static inline void xxor(uint8_t *data, int32_t len, const uint8_t *v1, const uint8_t *v2)


744  {


745  uint32_t i;


746  switch(len)


747  {


748  case 16:


749  for(i = 0; i < 16; ++i)


750  {


751  data[i] = v1[i] ^ v2[i];


752  }


753  break;


754  case 8:


755  for(i = 0; i < 8; ++i)


756  {


757  data[i] = v1[i] ^ v2[i];


758  }


759  break;


760  case 4:


761  for(i = 0; i < 4; ++i)


762  {


763  data[i] = v1[i] ^ v2[i];


764  }


765  break;


766  default:


767  while(len)


768  {


769  *data++ = *v1++ ^ *v2++;


770  }


771  break;


772  }


773  }


774 


775  void des_ecb_encrypt(uint8_t* data, const uint8_t* key, int32_t len)


776  {


777  uint32_t schedule[32];


778  int32_t i;


779 


780  des_set_key(key, schedule);


781 


782  len&=~7;


783 


784  for(i=0; i<len; i+=8)


785  {


786  des(&data[i], schedule, 1);


787  }


788  }


789 


790  void des_ecb_decrypt(uint8_t* data, const uint8_t* key, int32_t len)


791  {


792  uint32_t schedule[32];


793  int32_t i;


794 


795  des_set_key(key, schedule);


796 


797  len&=~7;


798 


799  for(i=0; i<len; i+=8)


800  {


801  des(&data[i], schedule, 0);


802  }


803  }


804 


805  void des_cbc_encrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key, int32_t len)


806  {


807  const uint8_t *civ = iv;


808  uint32_t schedule[32];


809  int32_t i;


810 


811  des_set_key(key, schedule);


812 


813  len&=~7;


814 


815  for(i=0; i<len; i+=8)


816  {


817  xxor(&data[i],8,&data[i],civ);


818  civ=&data[i];


819  des(&data[i], schedule, 1);


820  }


821  }


822 


823  void des_cbc_decrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key, int32_t len)


824  {


825  uint8_t civ[2][8];


826  uint32_t schedule[32];


827  int32_t i, n=0;


828 


829  des_set_key(key, schedule);


830 


831  len&=~7;


832 


833  memcpy(civ[n],iv,8);


834  for(i=0; i<len; i+=8,data+=8,n^=1)


835  {


836  memcpy(civ[1n],data,8);


837  des(data, schedule,0);


838  xxor(data,8,data,civ[n]);


839  }


840  }


841 


842  void des_ede2_cbc_encrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key1, const uint8_t* key2, int32_t len)


843  {


844  const uint8_t *civ = iv;


845  uint32_t schedule1[32], schedule2[32];


846  int32_t i;


847 


848  des_set_key(key1, schedule1);


849  des_set_key(key2, schedule2);


850 


851  len&=~7;


852 


853  for(i=0; i<len; i+=8)


854  {


855  xxor(&data[i],8,&data[i],civ);


856  civ=&data[i];


857 


858  des(&data[i], schedule1, 1);


859  des(&data[i], schedule2, 0);


860  des(&data[i], schedule1, 1);


861  }


862  }


863 


864  void des_ede2_cbc_decrypt(uint8_t* data, const uint8_t* iv, const uint8_t* key1, const uint8_t* key2, int32_t len)


865  {


866  uint8_t civ[2][8];


867  uint32_t schedule1[32], schedule2[32];


868  int32_t i, n=0;


869 


870  des_set_key(key1, schedule1);


871  des_set_key(key2, schedule2);


872 


873  len&=~7;


874 


875  memcpy(civ[n],iv,8);


876  for(i=0; i<len; i+=8,data+=8,n^=1)


877  {


878  memcpy(civ[1n],data,8);


879  des(data, schedule1, 0);


880  des(data, schedule2, 1);


881  des(data, schedule1, 0);


882  xxor(data,8,data,civ[n]);


883  }


884  }


885 


886  void des_ecb3_decrypt(uint8_t* data, const uint8_t* key)


887  {


888  uint8_t desA[8];


889  uint8_t desB[8];


890 


891  uint32_t schedule1[32];


892  uint32_t schedule2[32];


893 


894  memcpy(desA, key, 8);


895  des_set_key(desA, schedule1);


896  memcpy(desB, key+8, 8);


897  des_set_key(desB, schedule2);


898 


899  des(data, schedule1, 0);


900  des(data, schedule2, 1);


901  des(data, schedule1, 0);


902  }


903 


904  void des_ecb3_encrypt(uint8_t* data, const uint8_t* key)


905  {


906  uint8_t desA[8];


907  uint8_t desB[8];


908 


909  uint32_t schedule1[32];


910  uint32_t schedule2[32];


911 


912  memcpy(desA, key, 8);


913  des_set_key(desA, schedule1);


914  memcpy(desB, key+8, 8);


915  des_set_key(desB, schedule2);


916 


917  des(data, schedule1, 1);


918  des(data, schedule2, 0);


919  des(data, schedule1, 1);


920  }

