Annotation of truecrypt/crypto/des.c, revision 1.1.1.4

1.1.1.3   root        1: /* Deprecated/legacy */
1.1.1.4 ! root        2: // des.cpp - modified by Wei Dai from Phil Karn's des.c
        !             3: // The original code and all modifications are in the public domain.
1.1.1.3   root        4: 
1.1.1.4 ! root        5: /*
        !             6:  * This is a major rewrite of my old public domain DES code written
        !             7:  * circa 1987, which in turn borrowed heavily from Jim Gillogly's 1977
        !             8:  * public domain code. I pretty much kept my key scheduling code, but
        !             9:  * the actual encrypt/decrypt routines are taken from from Richard
        !            10:  * Outerbridge's DES code as printed in Schneier's "Applied Cryptography."
        !            11:  *
        !            12:  * This code is in the public domain. I would appreciate bug reports and
        !            13:  * enhancements.
        !            14:  *
        !            15:  * Phil Karn KA9Q, [email protected], August 1994.
        !            16:  */
        !            17: 
        !            18: /* Adapted for TrueCrypt by the TrueCrypt Foundation */
        !            19: 
        !            20: #include <memory.h>
        !            21: #include "Common/Tcdefs.h"
        !            22: #include "Common/Endian.h"
1.1.1.2   root       23: #include "Des.h"
1.1       root       24: 
1.1.1.4 ! root       25: #define word32 unsigned __int32
        !            26: #define byte unsigned __int8
        !            27: 
        !            28: static word32 rotlFixed (word32 x, unsigned int y)
        !            29: {
        !            30:        return (word32)((x<<y) | (x>>(sizeof(word32)*8-y)));
        !            31: }
        !            32: 
        !            33: static word32 rotrFixed (word32 x, unsigned int y)
        !            34: {
        !            35:        return (word32)((x>>y) | (x<<(sizeof(word32)*8-y)));
        !            36: }
        !            37: 
        !            38: 
        !            39: /* Tables defined in the Data Encryption Standard documents
        !            40:  * Three of these tables, the initial permutation, the final
        !            41:  * permutation and the expansion operator, are regular enough that
        !            42:  * for speed, we hard-code them. They're here for reference only.
        !            43:  * Also, the S and P boxes are used by a separate program, gensp.c,
        !            44:  * to build the combined SP box, Spbox[]. They're also here just
        !            45:  * for reference.
        !            46:  */
        !            47: #ifdef notdef
        !            48: /* initial permutation IP */
        !            49: static byte ip[] = {
        !            50:           58, 50, 42, 34, 26, 18, 10,  2,
        !            51:           60, 52, 44, 36, 28, 20, 12,  4,
        !            52:           62, 54, 46, 38, 30, 22, 14,  6,
        !            53:           64, 56, 48, 40, 32, 24, 16,  8,
        !            54:           57, 49, 41, 33, 25, 17,  9,  1,
        !            55:           59, 51, 43, 35, 27, 19, 11,  3,
        !            56:           61, 53, 45, 37, 29, 21, 13,  5,
        !            57:           63, 55, 47, 39, 31, 23, 15,  7
        !            58: };
        !            59: 
        !            60: /* final permutation IP^-1 */
        !            61: static byte fp[] = {
        !            62:           40,  8, 48, 16, 56, 24, 64, 32,
        !            63:           39,  7, 47, 15, 55, 23, 63, 31,
        !            64:           38,  6, 46, 14, 54, 22, 62, 30,
        !            65:           37,  5, 45, 13, 53, 21, 61, 29,
        !            66:           36,  4, 44, 12, 52, 20, 60, 28,
        !            67:           35,  3, 43, 11, 51, 19, 59, 27,
        !            68:           34,  2, 42, 10, 50, 18, 58, 26,
        !            69:           33,  1, 41,  9, 49, 17, 57, 25
        !            70: };
        !            71: /* expansion operation matrix */
        !            72: static byte ei[] = {
        !            73:           32,  1,  2,  3,  4,  5,
        !            74:                4,  5,  6,  7,  8,  9,
        !            75:                8,  9, 10, 11, 12, 13,
        !            76:           12, 13, 14, 15, 16, 17,
        !            77:           16, 17, 18, 19, 20, 21,
        !            78:           20, 21, 22, 23, 24, 25,
        !            79:           24, 25, 26, 27, 28, 29,
        !            80:           28, 29, 30, 31, 32,  1
        !            81: };
        !            82: /* The (in)famous S-boxes */
        !            83: static byte sbox[8][64] = {
        !            84:           /* S1 */
        !            85:           14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
        !            86:                0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
        !            87:                4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
        !            88:           15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,
        !            89: 
        !            90:           /* S2 */
        !            91:           15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
        !            92:                3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
        !            93:                0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
        !            94:           13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,
        !            95: 
        !            96:           /* S3 */
        !            97:           10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
        !            98:           13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
        !            99:           13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
        !           100:                1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,
        !           101: 
        !           102:           /* S4 */
        !           103:                7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
        !           104:           13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
        !           105:           10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
        !           106:                3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,
        !           107: 
        !           108:           /* S5 */
        !           109:                2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
        !           110:           14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
        !           111:                4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
        !           112:           11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,
        !           113: 
        !           114:           /* S6 */
        !           115:           12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
        !           116:           10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
        !           117:                9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
        !           118:                4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,
        !           119: 
        !           120:           /* S7 */
        !           121:                4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
        !           122:           13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
        !           123:                1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
        !           124:                6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,
        !           125: 
        !           126:           /* S8 */
        !           127:           13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
        !           128:                1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
        !           129:                7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
        !           130:                2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
        !           131: };
        !           132: 
        !           133: /* 32-bit permutation function P used on the output of the S-boxes */
        !           134: static byte p32i[] = {
        !           135:           16,  7, 20, 21,
        !           136:           29, 12, 28, 17,
        !           137:                1, 15, 23, 26,
        !           138:                5, 18, 31, 10,
        !           139:                2,  8, 24, 14,
        !           140:           32, 27,  3,  9,
        !           141:           19, 13, 30,  6,
        !           142:           22, 11,  4, 25
        !           143: };
        !           144: #endif
        !           145: 
        !           146: /* permuted choice table (key) */
        !           147: static const byte pc1[] = {
        !           148:           57, 49, 41, 33, 25, 17,  9,
        !           149:                1, 58, 50, 42, 34, 26, 18,
        !           150:           10,  2, 59, 51, 43, 35, 27,
        !           151:           19, 11,  3, 60, 52, 44, 36,
        !           152: 
        !           153:           63, 55, 47, 39, 31, 23, 15,
        !           154:                7, 62, 54, 46, 38, 30, 22,
        !           155:           14,  6, 61, 53, 45, 37, 29,
        !           156:           21, 13,  5, 28, 20, 12,  4
        !           157: };
        !           158: 
        !           159: /* number left rotations of pc1 */
        !           160: static const byte totrot[] = {
        !           161:           1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28
        !           162: };
        !           163: 
        !           164: /* permuted choice key (table) */
        !           165: static const byte pc2[] = {
        !           166:           14, 17, 11, 24,  1,  5,
        !           167:                3, 28, 15,  6, 21, 10,
        !           168:           23, 19, 12,  4, 26,  8,
        !           169:           16,  7, 27, 20, 13,  2,
        !           170:           41, 52, 31, 37, 47, 55,
        !           171:           30, 40, 51, 45, 33, 48,
        !           172:           44, 49, 39, 56, 34, 53,
        !           173:           46, 42, 50, 36, 29, 32
        !           174: };
        !           175: 
        !           176: /* End of DES-defined tables */
        !           177: 
        !           178: /* bit 0 is left-most in byte */
        !           179: static const int bytebit[] = {
        !           180:           0200,0100,040,020,010,04,02,01
        !           181: };
        !           182: 
        !           183: static const word32 Spbox[8][64] = {
        !           184: {
        !           185: 0x01010400,0x00000000,0x00010000,0x01010404, 0x01010004,0x00010404,0x00000004,0x00010000,
        !           186: 0x00000400,0x01010400,0x01010404,0x00000400, 0x01000404,0x01010004,0x01000000,0x00000004,
        !           187: 0x00000404,0x01000400,0x01000400,0x00010400, 0x00010400,0x01010000,0x01010000,0x01000404,
        !           188: 0x00010004,0x01000004,0x01000004,0x00010004, 0x00000000,0x00000404,0x00010404,0x01000000,
        !           189: 0x00010000,0x01010404,0x00000004,0x01010000, 0x01010400,0x01000000,0x01000000,0x00000400,
        !           190: 0x01010004,0x00010000,0x00010400,0x01000004, 0x00000400,0x00000004,0x01000404,0x00010404,
        !           191: 0x01010404,0x00010004,0x01010000,0x01000404, 0x01000004,0x00000404,0x00010404,0x01010400,
        !           192: 0x00000404,0x01000400,0x01000400,0x00000000, 0x00010004,0x00010400,0x00000000,0x01010004},
        !           193: {
        !           194: 0x80108020,0x80008000,0x00008000,0x00108020, 0x00100000,0x00000020,0x80100020,0x80008020,
        !           195: 0x80000020,0x80108020,0x80108000,0x80000000, 0x80008000,0x00100000,0x00000020,0x80100020,
        !           196: 0x00108000,0x00100020,0x80008020,0x00000000, 0x80000000,0x00008000,0x00108020,0x80100000,
        !           197: 0x00100020,0x80000020,0x00000000,0x00108000, 0x00008020,0x80108000,0x80100000,0x00008020,
        !           198: 0x00000000,0x00108020,0x80100020,0x00100000, 0x80008020,0x80100000,0x80108000,0x00008000,
        !           199: 0x80100000,0x80008000,0x00000020,0x80108020, 0x00108020,0x00000020,0x00008000,0x80000000,
        !           200: 0x00008020,0x80108000,0x00100000,0x80000020, 0x00100020,0x80008020,0x80000020,0x00100020,
        !           201: 0x00108000,0x00000000,0x80008000,0x00008020, 0x80000000,0x80100020,0x80108020,0x00108000},
        !           202: {
        !           203: 0x00000208,0x08020200,0x00000000,0x08020008, 0x08000200,0x00000000,0x00020208,0x08000200,
        !           204: 0x00020008,0x08000008,0x08000008,0x00020000, 0x08020208,0x00020008,0x08020000,0x00000208,
        !           205: 0x08000000,0x00000008,0x08020200,0x00000200, 0x00020200,0x08020000,0x08020008,0x00020208,
        !           206: 0x08000208,0x00020200,0x00020000,0x08000208, 0x00000008,0x08020208,0x00000200,0x08000000,
        !           207: 0x08020200,0x08000000,0x00020008,0x00000208, 0x00020000,0x08020200,0x08000200,0x00000000,
        !           208: 0x00000200,0x00020008,0x08020208,0x08000200, 0x08000008,0x00000200,0x00000000,0x08020008,
        !           209: 0x08000208,0x00020000,0x08000000,0x08020208, 0x00000008,0x00020208,0x00020200,0x08000008,
        !           210: 0x08020000,0x08000208,0x00000208,0x08020000, 0x00020208,0x00000008,0x08020008,0x00020200},
        !           211: {
        !           212: 0x00802001,0x00002081,0x00002081,0x00000080, 0x00802080,0x00800081,0x00800001,0x00002001,
        !           213: 0x00000000,0x00802000,0x00802000,0x00802081, 0x00000081,0x00000000,0x00800080,0x00800001,
        !           214: 0x00000001,0x00002000,0x00800000,0x00802001, 0x00000080,0x00800000,0x00002001,0x00002080,
        !           215: 0x00800081,0x00000001,0x00002080,0x00800080, 0x00002000,0x00802080,0x00802081,0x00000081,
        !           216: 0x00800080,0x00800001,0x00802000,0x00802081, 0x00000081,0x00000000,0x00000000,0x00802000,
        !           217: 0x00002080,0x00800080,0x00800081,0x00000001, 0x00802001,0x00002081,0x00002081,0x00000080,
        !           218: 0x00802081,0x00000081,0x00000001,0x00002000, 0x00800001,0x00002001,0x00802080,0x00800081,
        !           219: 0x00002001,0x00002080,0x00800000,0x00802001, 0x00000080,0x00800000,0x00002000,0x00802080},
        !           220: {
        !           221: 0x00000100,0x02080100,0x02080000,0x42000100, 0x00080000,0x00000100,0x40000000,0x02080000,
        !           222: 0x40080100,0x00080000,0x02000100,0x40080100, 0x42000100,0x42080000,0x00080100,0x40000000,
        !           223: 0x02000000,0x40080000,0x40080000,0x00000000, 0x40000100,0x42080100,0x42080100,0x02000100,
        !           224: 0x42080000,0x40000100,0x00000000,0x42000000, 0x02080100,0x02000000,0x42000000,0x00080100,
        !           225: 0x00080000,0x42000100,0x00000100,0x02000000, 0x40000000,0x02080000,0x42000100,0x40080100,
        !           226: 0x02000100,0x40000000,0x42080000,0x02080100, 0x40080100,0x00000100,0x02000000,0x42080000,
        !           227: 0x42080100,0x00080100,0x42000000,0x42080100, 0x02080000,0x00000000,0x40080000,0x42000000,
        !           228: 0x00080100,0x02000100,0x40000100,0x00080000, 0x00000000,0x40080000,0x02080100,0x40000100},
        !           229: {
        !           230: 0x20000010,0x20400000,0x00004000,0x20404010, 0x20400000,0x00000010,0x20404010,0x00400000,
        !           231: 0x20004000,0x00404010,0x00400000,0x20000010, 0x00400010,0x20004000,0x20000000,0x00004010,
        !           232: 0x00000000,0x00400010,0x20004010,0x00004000, 0x00404000,0x20004010,0x00000010,0x20400010,
        !           233: 0x20400010,0x00000000,0x00404010,0x20404000, 0x00004010,0x00404000,0x20404000,0x20000000,
        !           234: 0x20004000,0x00000010,0x20400010,0x00404000, 0x20404010,0x00400000,0x00004010,0x20000010,
        !           235: 0x00400000,0x20004000,0x20000000,0x00004010, 0x20000010,0x20404010,0x00404000,0x20400000,
        !           236: 0x00404010,0x20404000,0x00000000,0x20400010, 0x00000010,0x00004000,0x20400000,0x00404010,
        !           237: 0x00004000,0x00400010,0x20004010,0x00000000, 0x20404000,0x20000000,0x00400010,0x20004010},
        !           238: {
        !           239: 0x00200000,0x04200002,0x04000802,0x00000000, 0x00000800,0x04000802,0x00200802,0x04200800,
        !           240: 0x04200802,0x00200000,0x00000000,0x04000002, 0x00000002,0x04000000,0x04200002,0x00000802,
        !           241: 0x04000800,0x00200802,0x00200002,0x04000800, 0x04000002,0x04200000,0x04200800,0x00200002,
        !           242: 0x04200000,0x00000800,0x00000802,0x04200802, 0x00200800,0x00000002,0x04000000,0x00200800,
        !           243: 0x04000000,0x00200800,0x00200000,0x04000802, 0x04000802,0x04200002,0x04200002,0x00000002,
        !           244: 0x00200002,0x04000000,0x04000800,0x00200000, 0x04200800,0x00000802,0x00200802,0x04200800,
        !           245: 0x00000802,0x04000002,0x04200802,0x04200000, 0x00200800,0x00000000,0x00000002,0x04200802,
        !           246: 0x00000000,0x00200802,0x04200000,0x00000800, 0x04000002,0x04000800,0x00000800,0x00200002},
        !           247: {
        !           248: 0x10001040,0x00001000,0x00040000,0x10041040, 0x10000000,0x10001040,0x00000040,0x10000000,
        !           249: 0x00040040,0x10040000,0x10041040,0x00041000, 0x10041000,0x00041040,0x00001000,0x00000040,
        !           250: 0x10040000,0x10000040,0x10001000,0x00001040, 0x00041000,0x00040040,0x10040040,0x10041000,
        !           251: 0x00001040,0x00000000,0x00000000,0x10040040, 0x10000040,0x10001000,0x00041040,0x00040000,
        !           252: 0x00041040,0x00040000,0x10041000,0x00001000, 0x00000040,0x10040040,0x00001000,0x00041040,
        !           253: 0x10001000,0x00000040,0x10000040,0x10040000, 0x10040040,0x10000000,0x00040000,0x10001040,
        !           254: 0x00000000,0x10041040,0x00040040,0x10000040, 0x10040000,0x10001000,0x10001040,0x00000000,
        !           255: 0x10041040,0x00041000,0x00041000,0x00001040, 0x00001040,0x00040040,0x10000000,0x10041000}
        !           256: };
        !           257: 
        !           258: /* Set key (initialize key schedule array) */
        !           259: static void RawSetKey (int encryption, const byte *key, word32 *scheduledKey)
        !           260: {
        !           261:        byte buffer[56+56+8];
        !           262:        byte *const pc1m=buffer;                 /* place to modify pc1 into */
        !           263:        byte *const pcr=pc1m+56;                 /* place to rotate pc1 into */
        !           264:        byte *const ks=pcr+56;
        !           265:        register int i,j,l;
        !           266:        int m;
        !           267:        
        !           268:        for (j=0; j<56; j++) {          /* convert pc1 to bits of key */
        !           269:                l=pc1[j]-1;             /* integer bit location  */
        !           270:                m = l & 07;             /* find bit              */
        !           271:                pc1m[j]=(key[l>>3] &    /* find which key byte l is in */
        !           272:                        bytebit[m])     /* and which bit of that byte */
        !           273:                        ? 1 : 0;        /* and store 1-bit result */
        !           274:        }
        !           275:        for (i=0; i<16; i++) {          /* key chunk for each iteration */
        !           276:                memset(ks,0,8);         /* Clear key schedule */
        !           277:                for (j=0; j<56; j++)    /* rotate pc1 the right amount */
        !           278:                        pcr[j] = pc1m[(l=j+totrot[i])<(j<28? 28 : 56) ? l: l-28];
        !           279:                /* rotate left and right halves independently */
        !           280:                for (j=0; j<48; j++){   /* select bits individually */
        !           281:                        /* check bit that goes to ks[j] */
        !           282:                        if (pcr[pc2[j]-1]){
        !           283:                                /* mask it in if it's there */
        !           284:                                l= j % 6;
        !           285:                                ks[j/6] |= bytebit[l] >> 2;
        !           286:                        }
        !           287:                }
        !           288:                /* Now convert to odd/even interleaved form for use in F */
        !           289:                scheduledKey[2*i] = ((word32)ks[0] << 24)
        !           290:                        | ((word32)ks[2] << 16)
        !           291:                        | ((word32)ks[4] << 8)
        !           292:                        | ((word32)ks[6]);
        !           293:                scheduledKey[2*i+1] = ((word32)ks[1] << 24)
        !           294:                        | ((word32)ks[3] << 16)
        !           295:                        | ((word32)ks[5] << 8)
        !           296:                        | ((word32)ks[7]);
        !           297:        }
        !           298:        
        !           299:        if (!encryption)     // reverse key schedule order
        !           300:                for (i=0; i<16; i+=2)
        !           301:                {
        !           302:                        word32 b = scheduledKey[i];
        !           303:                        scheduledKey[i] = scheduledKey[32-2-i];
        !           304:                        scheduledKey[32-2-i] = b;
        !           305: 
        !           306:                        b = scheduledKey[i+1];
        !           307:                        scheduledKey[i+1] = scheduledKey[32-1-i];
        !           308:                        scheduledKey[32-1-i] = b;
        !           309:                }
        !           310: 
        !           311:        burn (buffer, sizeof (buffer));
        !           312: }
        !           313: 
        !           314: static void RawProcessBlock(word32 *l_, word32 *r_, const word32 *k)
        !           315: {
        !           316:        word32 l = *l_, r = *r_;
        !           317:        const word32 *kptr=k;
        !           318:        unsigned i;
        !           319: 
        !           320:        for (i=0; i<8; i++)
        !           321:        {
        !           322:                word32 work = rotrFixed(r, 4U) ^ kptr[4*i+0];
        !           323:                l ^= Spbox[6][(work) & 0x3f]
        !           324:                  ^  Spbox[4][(work >> 8) & 0x3f]
        !           325:                  ^  Spbox[2][(work >> 16) & 0x3f]
        !           326:                  ^  Spbox[0][(work >> 24) & 0x3f];
        !           327:                work = r ^ kptr[4*i+1];
        !           328:                l ^= Spbox[7][(work) & 0x3f]
        !           329:                  ^  Spbox[5][(work >> 8) & 0x3f]
        !           330:                  ^  Spbox[3][(work >> 16) & 0x3f]
        !           331:                  ^  Spbox[1][(work >> 24) & 0x3f];
        !           332: 
        !           333:                work = rotrFixed(l, 4U) ^ kptr[4*i+2];
        !           334:                r ^= Spbox[6][(work) & 0x3f]
        !           335:                  ^  Spbox[4][(work >> 8) & 0x3f]
        !           336:                  ^  Spbox[2][(work >> 16) & 0x3f]
        !           337:                  ^  Spbox[0][(work >> 24) & 0x3f];
        !           338:                work = l ^ kptr[4*i+3];
        !           339:                r ^= Spbox[7][(work) & 0x3f]
        !           340:                  ^  Spbox[5][(work >> 8) & 0x3f]
        !           341:                  ^  Spbox[3][(work >> 16) & 0x3f]
        !           342:                  ^  Spbox[1][(work >> 24) & 0x3f];
        !           343:        }
        !           344: 
        !           345:        *l_ = l; *r_ = r;
        !           346: }
        !           347: 
        !           348: void TripleDesSetKey (const byte *userKey, unsigned int length, TDES_KEY *ks)
        !           349: {
        !           350:        RawSetKey (1, userKey + 0, ks->k1);
        !           351:        RawSetKey (1, userKey + 8, ks->k2);
        !           352:        RawSetKey (1, userKey + 16, ks->k3);
        !           353:        RawSetKey (0, userKey + 16, ks->k1d);
        !           354:        RawSetKey (0, userKey + 8, ks->k2d);
        !           355:        RawSetKey (0, userKey + 0, ks->k3d);
        !           356: }
        !           357: 
        !           358: void TripleDesEncrypt (byte *inBlock, byte *outBlock, TDES_KEY *key, int encrypt)
        !           359: {
        !           360:        word32 left = BE32 (((word32 *)inBlock)[0]);
        !           361:        word32 right = BE32 (((word32 *)inBlock)[1]);
        !           362:        word32 work;
        !           363: 
        !           364:        right = rotlFixed(right, 4U);
        !           365:        work = (left ^ right) & 0xf0f0f0f0;
        !           366:        left ^= work;
        !           367:        right = rotrFixed(right^work, 20U);
        !           368:        work = (left ^ right) & 0xffff0000;
        !           369:        left ^= work;
        !           370:        right = rotrFixed(right^work, 18U);
        !           371:        work = (left ^ right) & 0x33333333;
        !           372:        left ^= work;
        !           373:        right = rotrFixed(right^work, 6U);
        !           374:        work = (left ^ right) & 0x00ff00ff;
        !           375:        left ^= work;
        !           376:        right = rotlFixed(right^work, 9U);
        !           377:        work = (left ^ right) & 0xaaaaaaaa;
        !           378:        left = rotlFixed(left^work, 1U);
        !           379:        right ^= work;
        !           380: 
        !           381:        RawProcessBlock (&left, &right, encrypt ? key->k1 : key->k1d);
        !           382:        RawProcessBlock (&right, &left, !encrypt ? key->k2 : key->k2d);
        !           383:        RawProcessBlock (&left, &right, encrypt ? key->k3 : key->k3d);
        !           384:        
        !           385:        right = rotrFixed(right, 1U);
        !           386:        work = (left ^ right) & 0xaaaaaaaa;
        !           387:        right ^= work;
        !           388:        left = rotrFixed(left^work, 9U);
        !           389:        work = (left ^ right) & 0x00ff00ff;
        !           390:        right ^= work;
        !           391:        left = rotlFixed(left^work, 6U);
        !           392:        work = (left ^ right) & 0x33333333;
        !           393:        right ^= work;
        !           394:        left = rotlFixed(left^work, 18U);
        !           395:        work = (left ^ right) & 0xffff0000;
        !           396:        right ^= work;
        !           397:        left = rotlFixed(left^work, 20U);
        !           398:        work = (left ^ right) & 0xf0f0f0f0;
        !           399:        right ^= work;
        !           400:        left = rotrFixed(left^work, 4U);
        !           401: 
        !           402:        ((word32 *)outBlock)[0] = BE32 (right);
        !           403:        ((word32 *)outBlock)[1] = BE32 (left);
        !           404: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.