37 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL 
   44 #if (DES_SUPPORT == ENABLED || DES3_SUPPORT == ENABLED) 
   47 #define ROL28(a, n) ((((a) << (n)) | ((a) >> (28 - (n)))) & 0x0FFFFFFF) 
   50 #define SWAPMOVE(a, b, n, m) \ 
   52    t = ((a >> n) ^ b) & m; \ 
   60    SWAPMOVE(l, r, 4, 0x0F0F0F0F); \ 
   61    SWAPMOVE(l, r, 16, 0x0000FFFF); \ 
   62    SWAPMOVE(r, l, 2, 0x33333333); \ 
   63    SWAPMOVE(r, l, 8, 0x00FF00FF); \ 
   64    SWAPMOVE(l, r, 1, 0x55555555); \ 
   70 #define IP_INV(l, r) \ 
   74    SWAPMOVE(l, r, 1, 0x55555555); \ 
   75    SWAPMOVE(r, l, 8, 0x00FF00FF); \ 
   76    SWAPMOVE(r, l, 2, 0x33333333); \ 
   77    SWAPMOVE(l, r, 16, 0x0000FFFF); \ 
   78    SWAPMOVE(l, r, 4, 0x0F0F0F0F); \ 
   84    SWAPMOVE(c, d, 4, 0x0F0F0F0F); \ 
   85    SWAPMOVE(c, d, 16, 0x0000FFFF); \ 
   86    SWAPMOVE(d, c, 2, 0x33333333); \ 
   87    SWAPMOVE(d, c, 8, 0x00FF00FF); \ 
   88    SWAPMOVE(c, d, 1, 0x55555555); \ 
   89    SWAPMOVE(d, c, 8, 0x00FF00FF); \ 
   90    SWAPMOVE(c, d, 16, 0x0000FFFF); \ 
   91    t = (c << 4) & 0x0FFFFFF0; \ 
   92    t |= (d >> 24) & 0x0000000F; \ 
   93    c = (d << 20) & 0x0FF00000; \ 
   94    c |= (d << 4) & 0x000FF000; \ 
   95    c |= (d >> 12) & 0x00000FF0; \ 
   96    c |= (d >> 28) & 0x0000000F; \ 
  101 #define PC2_L(c, d) \ 
  102    (((c << 4) & 0x24000000) | \ 
  103    ((c << 28) & 0x10000000) | \ 
  104    ((c << 14) & 0x08000000) | \ 
  105    ((c << 18) & 0x02080000) | \ 
  106    ((c << 6) & 0x01000000) | \ 
  107    ((c << 9) & 0x00200000) | \ 
  108    ((c >> 1) & 0x00100000) | \ 
  109    ((c << 10) & 0x00040000) | \ 
  110    ((c << 2) & 0x00020000) | \ 
  111    ((c >> 10) & 0x00010000) | \ 
  112    ((d >> 13) & 0x00002000) | \ 
  113    ((d >> 4) & 0x00001000) | \ 
  114    ((d << 6) & 0x00000800) | \ 
  115    ((d >> 1) & 0x00000400) | \ 
  116    ((d >> 14) & 0x00000200) | \ 
  117    ((d >> 0) & 0x00000100) | \ 
  118    ((d >> 5) & 0x00000020) | \ 
  119    ((d >> 10) & 0x00000010) | \ 
  120    ((d >> 3) & 0x00000008) | \ 
  121    ((d >> 18) & 0x00000004) | \ 
  122    ((d >> 26) & 0x00000002) | \ 
  123    ((d >> 24) & 0x00000001)) 
  126 #define PC2_R(c, d) \ 
  127    (((c << 15) & 0x20000000) | \ 
  128    ((c << 17) & 0x10000000) | \ 
  129    ((c << 10) & 0x08000000) | \ 
  130    ((c << 22) & 0x04000000) | \ 
  131    ((c >> 2) & 0x02000000) | \ 
  132    ((c << 1) & 0x01000000) | \ 
  133    ((c << 16) & 0x00200000) | \ 
  134    ((c << 11) & 0x00100000) | \ 
  135    ((c << 3) & 0x00080000) | \ 
  136    ((c >> 6) & 0x00040000) | \ 
  137    ((c << 15) & 0x00020000) | \ 
  138    ((c >> 4) & 0x00010000) | \ 
  139    ((d >> 2) & 0x00002000) | \ 
  140    ((d << 8) & 0x00001000) | \ 
  141    ((d >> 14) & 0x00000808) | \ 
  142    ((d >> 9) & 0x00000400) | \ 
  143    ((d >> 0) & 0x00000200) | \ 
  144    ((d << 7) & 0x00000100) | \ 
  145    ((d >> 7) & 0x00000020) | \ 
  146    ((d >> 3) & 0x00000011) | \ 
  147    ((d << 2) & 0x00000004) | \ 
  148    ((d >> 21) & 0x00000002)) 
  151 #define ROUND(l, r, k1, k2) \ 
  154    l ^= sp2[(t >> 24) & 0x3F]; \ 
  155    l ^= sp4[(t >> 16) & 0x3F]; \ 
  156    l ^= sp6[(t >> 8) & 0x3F]; \ 
  157    l ^= sp8[t & 0x3F]; \ 
  158    t = ROR32(r, 4) ^ k2; \ 
  159    l ^= sp1[(t >> 24) & 0x3F]; \ 
  160    l ^= sp3[(t >> 16) & 0x3F]; \ 
  161    l ^= sp5[(t >> 8) & 0x3F]; \ 
  162    l ^= sp7[t & 0x3F]; \ 
  166 static const uint32_t sp1[64] =
 
  168    0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000,
 
  169    0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
 
  170    0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
 
  171    0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000,
 
  172    0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400,
 
  173    0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
 
  174    0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400,
 
  175    0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004
 
  179 static const uint32_t sp2[64] =
 
  181    0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020,
 
  182    0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
 
  183    0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
 
  184    0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020,
 
  185    0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000,
 
  186    0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
 
  187    0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020,
 
  188    0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000
 
  192 static const uint32_t sp3[64] =
 
  194    0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200,
 
  195    0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
 
  196    0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
 
  197    0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000,
 
  198    0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000,
 
  199    0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
 
  200    0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008,
 
  201    0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200
 
  205 static const uint32_t sp4[64] =
 
  207    0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001,
 
  208    0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
 
  209    0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
 
  210    0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081,
 
  211    0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000,
 
  212    0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
 
  213    0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081,
 
  214    0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080
 
  218 static const uint32_t sp5[64] =
 
  220    0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000,
 
  221    0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
 
  222    0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
 
  223    0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100,
 
  224    0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100,
 
  225    0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
 
  226    0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000,
 
  227    0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100
 
  231 static const uint32_t sp6[64] =
 
  233    0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000,
 
  234    0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
 
  235    0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
 
  236    0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000,
 
  237    0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010,
 
  238    0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
 
  239    0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010,
 
  240    0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010
 
  244 static const uint32_t sp7[64] =
 
  246    0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800,
 
  247    0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
 
  248    0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
 
  249    0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800,
 
  250    0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002,
 
  251    0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
 
  252    0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802,
 
  253    0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002
 
  257 static const uint32_t sp8[64] =
 
  259    0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000,
 
  260    0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
 
  261    0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
 
  262    0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000,
 
  263    0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040,
 
  264    0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
 
  265    0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000,
 
  266    0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000
 
  305    if(context == NULL || key == NULL)
 
  320    for(i = 0; i < 16; i++)
 
  323       if(i == 0 || i == 1 || i == 8 || i == 15)
 
  336       context->
ks[2 * i + 1] = 
PC2_R(
c, d);
 
  367    for(i = 0; i < 32; i += 4)
 
  372       ROUND(
r, 
l, context->
ks[i + 2], context->
ks[i + 3]);
 
  407    for(i = 32; i > 0; i -= 4)
 
  410       ROUND(
r, 
l, context->
ks[i - 2], context->
ks[i - 1]);
 
  412       ROUND(
l, 
r, context->
ks[i - 4], context->
ks[i - 3]);
 
  445    output[0] = input[0];
 
  446    output[1] = (input[0] << 7) | (input[1] >> 1);
 
  447    output[2] = (input[1] << 6) | (input[2] >> 2);
 
  448    output[3] = (input[2] << 5) | (input[3] >> 3);
 
  449    output[4] = (input[3] << 4) | (input[4] >> 4);
 
  450    output[5] = (input[4] << 3) | (input[5] >> 5);
 
  451    output[6] = (input[5] << 2) | (input[6] >> 6);
 
  452    output[7] = input[6] << 1;
 
  470    for(i = 0; i < 8; i++)
 
  474       parity ^= parity >> 1;
 
  475       parity ^= parity >> 2;
 
  476       parity ^= parity >> 4;
 
  480       key[i] ^= (parity ^ 0x01);
 
  498    for(valid = 1, i = 0; i < 8; i++)
 
  502       parity ^= parity >> 1;
 
  503       parity ^= parity >> 2;
 
  504       parity ^= parity >> 4;