src/3rdparty/des/des.cpp
changeset 0 1918ee327afb
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /*
       
     2  * Implementation of DES encryption for NTLM
       
     3  *
       
     4  * Copyright 1997-2005 Simon Tatham.
       
     5  *
       
     6  * This software is released under the MIT license.
       
     7  */
       
     8 
       
     9 /*
       
    10  * Description of DES
       
    11  * ------------------
       
    12  *
       
    13  * Unlike the description in FIPS 46, I'm going to use _sensible_ indices:
       
    14  * bits in an n-bit word are numbered from 0 at the LSB to n-1 at the MSB.
       
    15  * And S-boxes are indexed by six consecutive bits, not by the outer two
       
    16  * followed by the middle four.
       
    17  *
       
    18  * The DES encryption routine requires a 64-bit input, and a key schedule K
       
    19  * containing 16 48-bit elements.
       
    20  *
       
    21  *   First the input is permuted by the initial permutation IP.
       
    22  *   Then the input is split into 32-bit words L and R. (L is the MSW.)
       
    23  *   Next, 16 rounds. In each round:
       
    24  *     (L, R) <- (R, L xor f(R, K[i]))
       
    25  *   Then the pre-output words L and R are swapped.
       
    26  *   Then L and R are glued back together into a 64-bit word. (L is the MSW,
       
    27  *     again, but since we just swapped them, the MSW is the R that came out
       
    28  *     of the last round.)
       
    29  *   The 64-bit output block is permuted by the inverse of IP and returned.
       
    30  *
       
    31  * Decryption is identical except that the elements of K are used in the
       
    32  * opposite order. (This wouldn't work if that word swap didn't happen.)
       
    33  *
       
    34  * The function f, used in each round, accepts a 32-bit word R and a
       
    35  * 48-bit key block K. It produces a 32-bit output.
       
    36  *
       
    37  *   First R is expanded to 48 bits using the bit-selection function E.
       
    38  *   The resulting 48-bit block is XORed with the key block K to produce
       
    39  *     a 48-bit block X.
       
    40  *   This block X is split into eight groups of 6 bits. Each group of 6
       
    41  *     bits is then looked up in one of the eight S-boxes to convert
       
    42  *     it to 4 bits. These eight groups of 4 bits are glued back
       
    43  *     together to produce a 32-bit preoutput block.
       
    44  *   The preoutput block is permuted using the permutation P and returned.
       
    45  *
       
    46  * Key setup maps a 64-bit key word into a 16x48-bit key schedule. Although
       
    47  * the approved input format for the key is a 64-bit word, eight of the
       
    48  * bits are discarded, so the actual quantity of key used is 56 bits.
       
    49  *
       
    50  *   First the input key is converted to two 28-bit words C and D using
       
    51  *     the bit-selection function PC1.
       
    52  *   Then 16 rounds of key setup occur. In each round, C and D are each
       
    53  *     rotated left by either 1 or 2 bits (depending on which round), and
       
    54  *     then converted into a key schedule element using the bit-selection
       
    55  *     function PC2.
       
    56  *
       
    57  * That's the actual algorithm. Now for the tedious details: all those
       
    58  * painful permutations and lookup tables.
       
    59  *
       
    60  * IP is a 64-to-64 bit permutation. Its output contains the following
       
    61  * bits of its input (listed in order MSB to LSB of output).
       
    62  *
       
    63  *    6 14 22 30 38 46 54 62  4 12 20 28 36 44 52 60
       
    64  *    2 10 18 26 34 42 50 58  0  8 16 24 32 40 48 56
       
    65  *    7 15 23 31 39 47 55 63  5 13 21 29 37 45 53 61
       
    66  *    3 11 19 27 35 43 51 59  1  9 17 25 33 41 49 57
       
    67  *
       
    68  * E is a 32-to-48 bit selection function. Its output contains the following
       
    69  * bits of its input (listed in order MSB to LSB of output).
       
    70  *
       
    71  *    0 31 30 29 28 27 28 27 26 25 24 23 24 23 22 21 20 19 20 19 18 17 16 15
       
    72  *   16 15 14 13 12 11 12 11 10  9  8  7  8  7  6  5  4  3  4  3  2  1  0 31
       
    73  *
       
    74  * The S-boxes are arbitrary table-lookups each mapping a 6-bit input to a
       
    75  * 4-bit output. In other words, each S-box is an array[64] of 4-bit numbers.
       
    76  * The S-boxes are listed below. The first S-box listed is applied to the
       
    77  * most significant six bits of the block X; the last one is applied to the
       
    78  * least significant.
       
    79  *
       
    80  *   14  0  4 15 13  7  1  4  2 14 15  2 11 13  8  1
       
    81  *    3 10 10  6  6 12 12 11  5  9  9  5  0  3  7  8
       
    82  *    4 15  1 12 14  8  8  2 13  4  6  9  2  1 11  7
       
    83  *   15  5 12 11  9  3  7 14  3 10 10  0  5  6  0 13
       
    84  *
       
    85  *   15  3  1 13  8  4 14  7  6 15 11  2  3  8  4 14
       
    86  *    9 12  7  0  2  1 13 10 12  6  0  9  5 11 10  5
       
    87  *    0 13 14  8  7 10 11  1 10  3  4 15 13  4  1  2
       
    88  *    5 11  8  6 12  7  6 12  9  0  3  5  2 14 15  9
       
    89  *
       
    90  *   10 13  0  7  9  0 14  9  6  3  3  4 15  6  5 10
       
    91  *    1  2 13  8 12  5  7 14 11 12  4 11  2 15  8  1
       
    92  *   13  1  6 10  4 13  9  0  8  6 15  9  3  8  0  7
       
    93  *   11  4  1 15  2 14 12  3  5 11 10  5 14  2  7 12
       
    94  *
       
    95  *    7 13 13  8 14 11  3  5  0  6  6 15  9  0 10  3
       
    96  *    1  4  2  7  8  2  5 12 11  1 12 10  4 14 15  9
       
    97  *   10  3  6 15  9  0  0  6 12 10 11  1  7 13 13  8
       
    98  *   15  9  1  4  3  5 14 11  5 12  2  7  8  2  4 14
       
    99  *
       
   100  *    2 14 12 11  4  2  1 12  7  4 10  7 11 13  6  1
       
   101  *    8  5  5  0  3 15 15 10 13  3  0  9 14  8  9  6
       
   102  *    4 11  2  8  1 12 11  7 10  1 13 14  7  2  8 13
       
   103  *   15  6  9 15 12  0  5  9  6 10  3  4  0  5 14  3
       
   104  *
       
   105  *   12 10  1 15 10  4 15  2  9  7  2 12  6  9  8  5
       
   106  *    0  6 13  1  3 13  4 14 14  0  7 11  5  3 11  8
       
   107  *    9  4 14  3 15  2  5 12  2  9  8  5 12 15  3 10
       
   108  *    7 11  0 14  4  1 10  7  1  6 13  0 11  8  6 13
       
   109  *
       
   110  *    4 13 11  0  2 11 14  7 15  4  0  9  8  1 13 10
       
   111  *    3 14 12  3  9  5  7 12  5  2 10 15  6  8  1  6
       
   112  *    1  6  4 11 11 13 13  8 12  1  3  4  7 10 14  7
       
   113  *   10  9 15  5  6  0  8 15  0 14  5  2  9  3  2 12
       
   114  *
       
   115  *   13  1  2 15  8 13  4  8  6 10 15  3 11  7  1  4
       
   116  *   10 12  9  5  3  6 14 11  5  0  0 14 12  9  7  2
       
   117  *    7  2 11  1  4 14  1  7  9  4 12 10 14  8  2 13
       
   118  *    0 15  6 12 10  9 13  0 15  3  3  5  5  6  8 11
       
   119  *
       
   120  * P is a 32-to-32 bit permutation. Its output contains the following
       
   121  * bits of its input (listed in order MSB to LSB of output).
       
   122  *
       
   123  *   16 25 12 11  3 20  4 15 31 17  9  6 27 14  1 22
       
   124  *   30 24  8 18  0  5 29 23 13 19  2 26 10 21 28  7
       
   125  *
       
   126  * PC1 is a 64-to-56 bit selection function. Its output is in two words,
       
   127  * C and D. The word C contains the following bits of its input (listed
       
   128  * in order MSB to LSB of output).
       
   129  *
       
   130  *    7 15 23 31 39 47 55 63  6 14 22 30 38 46
       
   131  *   54 62  5 13 21 29 37 45 53 61  4 12 20 28
       
   132  *
       
   133  * And the word D contains these bits.
       
   134  *
       
   135  *    1  9 17 25 33 41 49 57  2 10 18 26 34 42
       
   136  *   50 58  3 11 19 27 35 43 51 59 36 44 52 60
       
   137  *
       
   138  * PC2 is a 56-to-48 bit selection function. Its input is in two words,
       
   139  * C and D. These are treated as one 56-bit word (with C more significant,
       
   140  * so that bits 55 to 28 of the word are bits 27 to 0 of C, and bits 27 to
       
   141  * 0 of the word are bits 27 to 0 of D). The output contains the following
       
   142  * bits of this 56-bit input word (listed in order MSB to LSB of output).
       
   143  *
       
   144  *   42 39 45 32 55 51 53 28 41 50 35 46 33 37 44 52 30 48 40 49 29 36 43 54
       
   145  *   15  4 25 19  9  1 26 16  5 11 23  8 12  7 17  0 22  3 10 14  6 20 27 24
       
   146  */
       
   147 
       
   148 /*
       
   149  * Implementation details
       
   150  * ----------------------
       
   151  * 
       
   152  * If you look at the code in this module, you'll find it looks
       
   153  * nothing _like_ the above algorithm. Here I explain the
       
   154  * differences...
       
   155  *
       
   156  * Key setup has not been heavily optimised here. We are not
       
   157  * concerned with key agility: we aren't codebreakers. We don't
       
   158  * mind a little delay (and it really is a little one; it may be a
       
   159  * factor of five or so slower than it could be but it's still not
       
   160  * an appreciable length of time) while setting up. The only tweaks
       
   161  * in the key setup are ones which change the format of the key
       
   162  * schedule to speed up the actual encryption. I'll describe those
       
   163  * below.
       
   164  *
       
   165  * The first and most obvious optimisation is the S-boxes. Since
       
   166  * each S-box always targets the same four bits in the final 32-bit
       
   167  * word, so the output from (for example) S-box 0 must always be
       
   168  * shifted left 28 bits, we can store the already-shifted outputs
       
   169  * in the lookup tables. This reduces lookup-and-shift to lookup,
       
   170  * so the S-box step is now just a question of ORing together eight
       
   171  * table lookups.
       
   172  *
       
   173  * The permutation P is just a bit order change; it's invariant
       
   174  * with respect to OR, in that P(x)|P(y) = P(x|y). Therefore, we
       
   175  * can apply P to every entry of the S-box tables and then we don't
       
   176  * have to do it in the code of f(). This yields a set of tables
       
   177  * which might be called SP-boxes.
       
   178  *
       
   179  * The bit-selection function E is our next target. Note that E is
       
   180  * immediately followed by the operation of splitting into 6-bit
       
   181  * chunks. Examining the 6-bit chunks coming out of E we notice
       
   182  * they're all contiguous within the word (speaking cyclically -
       
   183  * the end two wrap round); so we can extract those bit strings
       
   184  * individually rather than explicitly running E. This would yield
       
   185  * code such as
       
   186  *
       
   187  *     y |= SPboxes[0][ (rotl(R, 5) ^  top6bitsofK) & 0x3F ];
       
   188  *     t |= SPboxes[1][ (rotl(R,11) ^ next6bitsofK) & 0x3F ];
       
   189  *
       
   190  * and so on; and the key schedule preparation would have to
       
   191  * provide each 6-bit chunk separately.
       
   192  *
       
   193  * Really we'd like to XOR in the key schedule element before
       
   194  * looking up bit strings in R. This we can't do, naively, because
       
   195  * the 6-bit strings we want overlap. But look at the strings:
       
   196  *
       
   197  *       3322222222221111111111
       
   198  * bit   10987654321098765432109876543210
       
   199  * 
       
   200  * box0  XXXXX                          X
       
   201  * box1     XXXXXX
       
   202  * box2         XXXXXX
       
   203  * box3             XXXXXX
       
   204  * box4                 XXXXXX
       
   205  * box5                     XXXXXX
       
   206  * box6                         XXXXXX
       
   207  * box7  X                          XXXXX
       
   208  *
       
   209  * The bit strings we need to XOR in for boxes 0, 2, 4 and 6 don't
       
   210  * overlap with each other. Neither do the ones for boxes 1, 3, 5
       
   211  * and 7. So we could provide the key schedule in the form of two
       
   212  * words that we can separately XOR into R, and then every S-box
       
   213  * index is available as a (cyclically) contiguous 6-bit substring
       
   214  * of one or the other of the results.
       
   215  *
       
   216  * The comments in Eric Young's libdes implementation point out
       
   217  * that two of these bit strings require a rotation (rather than a
       
   218  * simple shift) to extract. It's unavoidable that at least _one_
       
   219  * must do; but we can actually run the whole inner algorithm (all
       
   220  * 16 rounds) rotated one bit to the left, so that what the `real'
       
   221  * DES description sees as L=0x80000001 we see as L=0x00000003.
       
   222  * This requires rotating all our SP-box entries one bit to the
       
   223  * left, and rotating each word of the key schedule elements one to
       
   224  * the left, and rotating L and R one bit left just after IP and
       
   225  * one bit right again just before FP. And in each round we convert
       
   226  * a rotate into a shift, so we've saved a few per cent.
       
   227  *
       
   228  * That's about it for the inner loop; the SP-box tables as listed
       
   229  * below are what I've described here (the original S value,
       
   230  * shifted to its final place in the input to P, run through P, and
       
   231  * then rotated one bit left). All that remains is to optimise the
       
   232  * initial permutation IP.
       
   233  *
       
   234  * IP is not an arbitrary permutation. It has the nice property
       
   235  * that if you take any bit number, write it in binary (6 bits),
       
   236  * permute those 6 bits and invert some of them, you get the final
       
   237  * position of that bit. Specifically, the bit whose initial
       
   238  * position is given (in binary) as fedcba ends up in position
       
   239  * AcbFED (where a capital letter denotes the inverse of a bit).
       
   240  *
       
   241  * We have the 64-bit data in two 32-bit words L and R, where bits
       
   242  * in L are those with f=1 and bits in R are those with f=0. We
       
   243  * note that we can do a simple transformation: suppose we exchange
       
   244  * the bits with f=1,c=0 and the bits with f=0,c=1. This will cause
       
   245  * the bit fedcba to be in position cedfba - we've `swapped' bits c
       
   246  * and f in the position of each bit!
       
   247  * 
       
   248  * Better still, this transformation is easy. In the example above,
       
   249  * bits in L with c=0 are bits 0x0F0F0F0F, and those in R with c=1
       
   250  * are 0xF0F0F0F0. So we can do
       
   251  *
       
   252  *     difference = ((R >> 4) ^ L) & 0x0F0F0F0F
       
   253  *     R ^= (difference << 4)
       
   254  *     L ^= difference
       
   255  *
       
   256  * to perform the swap. Let's denote this by bitswap(4,0x0F0F0F0F).
       
   257  * Also, we can invert the bit at the top just by exchanging L and
       
   258  * R. So in a few swaps and a few of these bit operations we can
       
   259  * do:
       
   260  * 
       
   261  * Initially the position of bit fedcba is     fedcba
       
   262  * Swap L with R to make it                    Fedcba
       
   263  * Perform bitswap( 4,0x0F0F0F0F) to make it   cedFba
       
   264  * Perform bitswap(16,0x0000FFFF) to make it   ecdFba
       
   265  * Swap L with R to make it                    EcdFba
       
   266  * Perform bitswap( 2,0x33333333) to make it   bcdFEa
       
   267  * Perform bitswap( 8,0x00FF00FF) to make it   dcbFEa
       
   268  * Swap L with R to make it                    DcbFEa
       
   269  * Perform bitswap( 1,0x55555555) to make it   acbFED
       
   270  * Swap L with R to make it                    AcbFED
       
   271  *
       
   272  * (In the actual code the four swaps are implicit: R and L are
       
   273  * simply used the other way round in the first, second and last
       
   274  * bitswap operations.)
       
   275  *
       
   276  * The final permutation is just the inverse of IP, so it can be
       
   277  * performed by a similar set of operations.
       
   278  */
       
   279 
       
   280 struct des_context {
       
   281 	quint32 k0246[16], k1357[16];
       
   282 };
       
   283 
       
   284 #define rotl(x, c) ( (x << c) | (x >> (32-c)) )
       
   285 #define rotl28(x, c) ( ( (x << c) | (x >> (28-c)) ) & 0x0FFFFFFF)
       
   286 
       
   287 static quint32 bitsel(quint32 * input, const int *bitnums, int size)
       
   288 {
       
   289 	quint32 ret = 0;
       
   290 	while (size--) {
       
   291 		int bitpos = *bitnums++;
       
   292 		ret <<= 1;
       
   293 		if (bitpos >= 0)
       
   294 			ret |= 1 & (input[bitpos / 32] >> (bitpos % 32));
       
   295 	}
       
   296 	return ret;
       
   297 }
       
   298 
       
   299 static inline void des_key_setup(quint32 key_msw, quint32 key_lsw,
       
   300 				 struct des_context *sched)
       
   301 {
       
   302 	/* Tables are modified to work with 56-bit key */
       
   303 	static const int PC1_Cbits[] = {
       
   304 		6, 13, 20, 27, 34, 41, 48, 55, 5, 12, 19, 26, 33, 40,
       
   305 		47, 54, 4, 11, 18, 25, 32, 39, 46, 53, 3, 10, 17, 24
       
   306 	};
       
   307 	static const int PC1_Dbits[] = {
       
   308 		0, 7, 14, 21, 28, 35, 42, 49, 1, 8, 15, 22, 29, 36,
       
   309 		43, 50, 2, 9, 16, 23, 30, 37, 44, 51, 31, 38, 45, 52
       
   310 	};
       
   311 	/*
       
   312 	 * The bit numbers in the two lists below don't correspond to
       
   313 	 * the ones in the above description of PC2, because in the
       
   314 	 * above description C and D are concatenated so `bit 28' means
       
   315 	 * bit 0 of C. In this implementation we're using the standard
       
   316 	 * `bitsel' function above and C is in the second word, so bit
       
   317 	 * 0 of C is addressed by writing `32' here.
       
   318 	 */
       
   319 	static const int PC2_0246[] = {
       
   320 		49, 36, 59, 55, -1, -1, 37, 41, 48, 56, 34, 52, -1, -1, 15, 4,
       
   321 		25, 19, 9, 1, -1, -1, 12, 7, 17, 0, 22, 3, -1, -1, 46, 43
       
   322 	};
       
   323 	static const int PC2_1357[] = {
       
   324 		-1, -1, 57, 32, 45, 54, 39, 50, -1, -1, 44, 53, 33, 40, 47, 58,
       
   325 		-1, -1, 26, 16, 5, 11, 23, 8, -1, -1, 10, 14, 6, 20, 27, 24
       
   326 	};
       
   327 	static const int leftshifts[] =	{
       
   328 		1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
       
   329 	};
       
   330 
       
   331 	quint32 C, D;
       
   332 	quint32 buf[2];
       
   333 	int i;
       
   334 
       
   335 	buf[0] = key_lsw;
       
   336 	buf[1] = key_msw;
       
   337 
       
   338 	C = bitsel(buf, PC1_Cbits, 28);
       
   339 	D = bitsel(buf, PC1_Dbits, 28);
       
   340 
       
   341 	for (i = 0; i < 16; i++) {
       
   342 		C = rotl28(C, leftshifts[i]);
       
   343 		D = rotl28(D, leftshifts[i]);
       
   344 		buf[0] = D;
       
   345 		buf[1] = C;
       
   346 		sched->k0246[i] = bitsel(buf, PC2_0246, 32);
       
   347 		sched->k1357[i] = bitsel(buf, PC2_1357, 32);
       
   348 	}
       
   349 }
       
   350 
       
   351 static const quint32 SPboxes[8][64] = {
       
   352 	{0x01010400, 0x00000000, 0x00010000, 0x01010404,
       
   353 	 0x01010004, 0x00010404, 0x00000004, 0x00010000,
       
   354 	 0x00000400, 0x01010400, 0x01010404, 0x00000400,
       
   355 	 0x01000404, 0x01010004, 0x01000000, 0x00000004,
       
   356 	 0x00000404, 0x01000400, 0x01000400, 0x00010400,
       
   357 	 0x00010400, 0x01010000, 0x01010000, 0x01000404,
       
   358 	 0x00010004, 0x01000004, 0x01000004, 0x00010004,
       
   359 	 0x00000000, 0x00000404, 0x00010404, 0x01000000,
       
   360 	 0x00010000, 0x01010404, 0x00000004, 0x01010000,
       
   361 	 0x01010400, 0x01000000, 0x01000000, 0x00000400,
       
   362 	 0x01010004, 0x00010000, 0x00010400, 0x01000004,
       
   363 	 0x00000400, 0x00000004, 0x01000404, 0x00010404,
       
   364 	 0x01010404, 0x00010004, 0x01010000, 0x01000404,
       
   365 	 0x01000004, 0x00000404, 0x00010404, 0x01010400,
       
   366 	 0x00000404, 0x01000400, 0x01000400, 0x00000000,
       
   367 	 0x00010004, 0x00010400, 0x00000000, 0x01010004},
       
   368 
       
   369 	{0x80108020, 0x80008000, 0x00008000, 0x00108020,
       
   370 	 0x00100000, 0x00000020, 0x80100020, 0x80008020,
       
   371 	 0x80000020, 0x80108020, 0x80108000, 0x80000000,
       
   372 	 0x80008000, 0x00100000, 0x00000020, 0x80100020,
       
   373 	 0x00108000, 0x00100020, 0x80008020, 0x00000000,
       
   374 	 0x80000000, 0x00008000, 0x00108020, 0x80100000,
       
   375 	 0x00100020, 0x80000020, 0x00000000, 0x00108000,
       
   376 	 0x00008020, 0x80108000, 0x80100000, 0x00008020,
       
   377 	 0x00000000, 0x00108020, 0x80100020, 0x00100000,
       
   378 	 0x80008020, 0x80100000, 0x80108000, 0x00008000,
       
   379 	 0x80100000, 0x80008000, 0x00000020, 0x80108020,
       
   380 	 0x00108020, 0x00000020, 0x00008000, 0x80000000,
       
   381 	 0x00008020, 0x80108000, 0x00100000, 0x80000020,
       
   382 	 0x00100020, 0x80008020, 0x80000020, 0x00100020,
       
   383 	 0x00108000, 0x00000000, 0x80008000, 0x00008020,
       
   384 	 0x80000000, 0x80100020, 0x80108020, 0x00108000},
       
   385 
       
   386 	{0x00000208, 0x08020200, 0x00000000, 0x08020008,
       
   387 	 0x08000200, 0x00000000, 0x00020208, 0x08000200,
       
   388 	 0x00020008, 0x08000008, 0x08000008, 0x00020000,
       
   389 	 0x08020208, 0x00020008, 0x08020000, 0x00000208,
       
   390 	 0x08000000, 0x00000008, 0x08020200, 0x00000200,
       
   391 	 0x00020200, 0x08020000, 0x08020008, 0x00020208,
       
   392 	 0x08000208, 0x00020200, 0x00020000, 0x08000208,
       
   393 	 0x00000008, 0x08020208, 0x00000200, 0x08000000,
       
   394 	 0x08020200, 0x08000000, 0x00020008, 0x00000208,
       
   395 	 0x00020000, 0x08020200, 0x08000200, 0x00000000,
       
   396 	 0x00000200, 0x00020008, 0x08020208, 0x08000200,
       
   397 	 0x08000008, 0x00000200, 0x00000000, 0x08020008,
       
   398 	 0x08000208, 0x00020000, 0x08000000, 0x08020208,
       
   399 	 0x00000008, 0x00020208, 0x00020200, 0x08000008,
       
   400 	 0x08020000, 0x08000208, 0x00000208, 0x08020000,
       
   401 	 0x00020208, 0x00000008, 0x08020008, 0x00020200},
       
   402 
       
   403 	{0x00802001, 0x00002081, 0x00002081, 0x00000080,
       
   404 	 0x00802080, 0x00800081, 0x00800001, 0x00002001,
       
   405 	 0x00000000, 0x00802000, 0x00802000, 0x00802081,
       
   406 	 0x00000081, 0x00000000, 0x00800080, 0x00800001,
       
   407 	 0x00000001, 0x00002000, 0x00800000, 0x00802001,
       
   408 	 0x00000080, 0x00800000, 0x00002001, 0x00002080,
       
   409 	 0x00800081, 0x00000001, 0x00002080, 0x00800080,
       
   410 	 0x00002000, 0x00802080, 0x00802081, 0x00000081,
       
   411 	 0x00800080, 0x00800001, 0x00802000, 0x00802081,
       
   412 	 0x00000081, 0x00000000, 0x00000000, 0x00802000,
       
   413 	 0x00002080, 0x00800080, 0x00800081, 0x00000001,
       
   414 	 0x00802001, 0x00002081, 0x00002081, 0x00000080,
       
   415 	 0x00802081, 0x00000081, 0x00000001, 0x00002000,
       
   416 	 0x00800001, 0x00002001, 0x00802080, 0x00800081,
       
   417 	 0x00002001, 0x00002080, 0x00800000, 0x00802001,
       
   418 	 0x00000080, 0x00800000, 0x00002000, 0x00802080},
       
   419 
       
   420 	{0x00000100, 0x02080100, 0x02080000, 0x42000100,
       
   421 	 0x00080000, 0x00000100, 0x40000000, 0x02080000,
       
   422 	 0x40080100, 0x00080000, 0x02000100, 0x40080100,
       
   423 	 0x42000100, 0x42080000, 0x00080100, 0x40000000,
       
   424 	 0x02000000, 0x40080000, 0x40080000, 0x00000000,
       
   425 	 0x40000100, 0x42080100, 0x42080100, 0x02000100,
       
   426 	 0x42080000, 0x40000100, 0x00000000, 0x42000000,
       
   427 	 0x02080100, 0x02000000, 0x42000000, 0x00080100,
       
   428 	 0x00080000, 0x42000100, 0x00000100, 0x02000000,
       
   429 	 0x40000000, 0x02080000, 0x42000100, 0x40080100,
       
   430 	 0x02000100, 0x40000000, 0x42080000, 0x02080100,
       
   431 	 0x40080100, 0x00000100, 0x02000000, 0x42080000,
       
   432 	 0x42080100, 0x00080100, 0x42000000, 0x42080100,
       
   433 	 0x02080000, 0x00000000, 0x40080000, 0x42000000,
       
   434 	 0x00080100, 0x02000100, 0x40000100, 0x00080000,
       
   435 	 0x00000000, 0x40080000, 0x02080100, 0x40000100},
       
   436 
       
   437 	{0x20000010, 0x20400000, 0x00004000, 0x20404010,
       
   438 	 0x20400000, 0x00000010, 0x20404010, 0x00400000,
       
   439 	 0x20004000, 0x00404010, 0x00400000, 0x20000010,
       
   440 	 0x00400010, 0x20004000, 0x20000000, 0x00004010,
       
   441 	 0x00000000, 0x00400010, 0x20004010, 0x00004000,
       
   442 	 0x00404000, 0x20004010, 0x00000010, 0x20400010,
       
   443 	 0x20400010, 0x00000000, 0x00404010, 0x20404000,
       
   444 	 0x00004010, 0x00404000, 0x20404000, 0x20000000,
       
   445 	 0x20004000, 0x00000010, 0x20400010, 0x00404000,
       
   446 	 0x20404010, 0x00400000, 0x00004010, 0x20000010,
       
   447 	 0x00400000, 0x20004000, 0x20000000, 0x00004010,
       
   448 	 0x20000010, 0x20404010, 0x00404000, 0x20400000,
       
   449 	 0x00404010, 0x20404000, 0x00000000, 0x20400010,
       
   450 	 0x00000010, 0x00004000, 0x20400000, 0x00404010,
       
   451 	 0x00004000, 0x00400010, 0x20004010, 0x00000000,
       
   452 	 0x20404000, 0x20000000, 0x00400010, 0x20004010},
       
   453 
       
   454 	{0x00200000, 0x04200002, 0x04000802, 0x00000000,
       
   455 	 0x00000800, 0x04000802, 0x00200802, 0x04200800,
       
   456 	 0x04200802, 0x00200000, 0x00000000, 0x04000002,
       
   457 	 0x00000002, 0x04000000, 0x04200002, 0x00000802,
       
   458 	 0x04000800, 0x00200802, 0x00200002, 0x04000800,
       
   459 	 0x04000002, 0x04200000, 0x04200800, 0x00200002,
       
   460 	 0x04200000, 0x00000800, 0x00000802, 0x04200802,
       
   461 	 0x00200800, 0x00000002, 0x04000000, 0x00200800,
       
   462 	 0x04000000, 0x00200800, 0x00200000, 0x04000802,
       
   463 	 0x04000802, 0x04200002, 0x04200002, 0x00000002,
       
   464 	 0x00200002, 0x04000000, 0x04000800, 0x00200000,
       
   465 	 0x04200800, 0x00000802, 0x00200802, 0x04200800,
       
   466 	 0x00000802, 0x04000002, 0x04200802, 0x04200000,
       
   467 	 0x00200800, 0x00000000, 0x00000002, 0x04200802,
       
   468 	 0x00000000, 0x00200802, 0x04200000, 0x00000800,
       
   469 	 0x04000002, 0x04000800, 0x00000800, 0x00200002},
       
   470 
       
   471 	{0x10001040, 0x00001000, 0x00040000, 0x10041040,
       
   472 	 0x10000000, 0x10001040, 0x00000040, 0x10000000,
       
   473 	 0x00040040, 0x10040000, 0x10041040, 0x00041000,
       
   474 	 0x10041000, 0x00041040, 0x00001000, 0x00000040,
       
   475 	 0x10040000, 0x10000040, 0x10001000, 0x00001040,
       
   476 	 0x00041000, 0x00040040, 0x10040040, 0x10041000,
       
   477 	 0x00001040, 0x00000000, 0x00000000, 0x10040040,
       
   478 	 0x10000040, 0x10001000, 0x00041040, 0x00040000,
       
   479 	 0x00041040, 0x00040000, 0x10041000, 0x00001000,
       
   480 	 0x00000040, 0x10040040, 0x00001000, 0x00041040,
       
   481 	 0x10001000, 0x00000040, 0x10000040, 0x10040000,
       
   482 	 0x10040040, 0x10000000, 0x00040000, 0x10001040,
       
   483 	 0x00000000, 0x10041040, 0x00040040, 0x10000040,
       
   484 	 0x10040000, 0x10001000, 0x10001040, 0x00000000,
       
   485 	 0x10041040, 0x00041000, 0x00041000, 0x00001040,
       
   486 	 0x00001040, 0x00040040, 0x10000000, 0x10041000}
       
   487 };
       
   488 
       
   489 #define f(R, K0246, K1357) (\
       
   490 	s0246 = R ^ K0246, \
       
   491 	s1357 = R ^ K1357, \
       
   492 	s0246 = rotl(s0246, 28), \
       
   493 	SPboxes[0] [(s0246 >> 24) & 0x3F] | \
       
   494 	SPboxes[1] [(s1357 >> 24) & 0x3F] | \
       
   495 	SPboxes[2] [(s0246 >> 16) & 0x3F] | \
       
   496 	SPboxes[3] [(s1357 >> 16) & 0x3F] | \
       
   497 	SPboxes[4] [(s0246 >>  8) & 0x3F] | \
       
   498 	SPboxes[5] [(s1357 >>  8) & 0x3F] | \
       
   499 	SPboxes[6] [(s0246      ) & 0x3F] | \
       
   500 	SPboxes[7] [(s1357      ) & 0x3F])
       
   501 
       
   502 #define bitswap(L, R, n, mask) (\
       
   503 	swap = mask & ( (R >> n) ^ L ), \
       
   504 	R ^= swap << n, \
       
   505 	L ^= swap)
       
   506 
       
   507 /* Initial permutation */
       
   508 #define IP(L, R) (\
       
   509 	bitswap(R, L,  4, 0x0F0F0F0F), \
       
   510 	bitswap(R, L, 16, 0x0000FFFF), \
       
   511 	bitswap(L, R,  2, 0x33333333), \
       
   512 	bitswap(L, R,  8, 0x00FF00FF), \
       
   513 	bitswap(R, L,  1, 0x55555555))
       
   514 
       
   515 /* Final permutation */
       
   516 #define FP(L, R) (\
       
   517 	bitswap(R, L,  1, 0x55555555), \
       
   518 	bitswap(L, R,  8, 0x00FF00FF), \
       
   519 	bitswap(L, R,  2, 0x33333333), \
       
   520 	bitswap(R, L, 16, 0x0000FFFF), \
       
   521 	bitswap(R, L,  4, 0x0F0F0F0F))
       
   522 
       
   523 static void
       
   524 des_encipher(quint32 *output, quint32 L, quint32 R,
       
   525 	     struct des_context *sched)
       
   526 {
       
   527 	quint32 swap, s0246, s1357;
       
   528 
       
   529 	IP(L, R);
       
   530 
       
   531 	L = rotl(L, 1);
       
   532 	R = rotl(R, 1);
       
   533 
       
   534 	L ^= f(R, sched->k0246[0], sched->k1357[0]);
       
   535 	R ^= f(L, sched->k0246[1], sched->k1357[1]);
       
   536 	L ^= f(R, sched->k0246[2], sched->k1357[2]);
       
   537 	R ^= f(L, sched->k0246[3], sched->k1357[3]);
       
   538 	L ^= f(R, sched->k0246[4], sched->k1357[4]);
       
   539 	R ^= f(L, sched->k0246[5], sched->k1357[5]);
       
   540 	L ^= f(R, sched->k0246[6], sched->k1357[6]);
       
   541 	R ^= f(L, sched->k0246[7], sched->k1357[7]);
       
   542 	L ^= f(R, sched->k0246[8], sched->k1357[8]);
       
   543 	R ^= f(L, sched->k0246[9], sched->k1357[9]);
       
   544 	L ^= f(R, sched->k0246[10], sched->k1357[10]);
       
   545 	R ^= f(L, sched->k0246[11], sched->k1357[11]);
       
   546 	L ^= f(R, sched->k0246[12], sched->k1357[12]);
       
   547 	R ^= f(L, sched->k0246[13], sched->k1357[13]);
       
   548 	L ^= f(R, sched->k0246[14], sched->k1357[14]);
       
   549 	R ^= f(L, sched->k0246[15], sched->k1357[15]);
       
   550 
       
   551 	L = rotl(L, 31);
       
   552 	R = rotl(R, 31);
       
   553 
       
   554 	swap = L;
       
   555 	L = R;
       
   556 	R = swap;
       
   557 
       
   558 	FP(L, R);
       
   559 
       
   560 	output[0] = L;
       
   561 	output[1] = R;
       
   562 }
       
   563 
       
   564 #define GET_32BIT_MSB_FIRST(cp) \
       
   565 	(((unsigned long)(unsigned char)(cp)[3]) | \
       
   566 	((unsigned long)(unsigned char)(cp)[2] << 8) | \
       
   567 	((unsigned long)(unsigned char)(cp)[1] << 16) | \
       
   568 	((unsigned long)(unsigned char)(cp)[0] << 24))
       
   569 
       
   570 #define PUT_32BIT_MSB_FIRST(cp, value) do { \
       
   571 	(cp)[3] = (value); \
       
   572 	(cp)[2] = (value) >> 8; \
       
   573 	(cp)[1] = (value) >> 16; \
       
   574 	(cp)[0] = (value) >> 24; } while (0)
       
   575 
       
   576 static inline void
       
   577 des_cbc_encrypt(unsigned char *dest, const unsigned char *src,
       
   578 		struct des_context *sched)
       
   579 {
       
   580 	quint32 out[2], L, R;
       
   581 
       
   582 	L = GET_32BIT_MSB_FIRST(src);
       
   583 	R = GET_32BIT_MSB_FIRST(src + 4);
       
   584 	des_encipher(out, L, R, sched);
       
   585 	PUT_32BIT_MSB_FIRST(dest, out[0]);
       
   586 	PUT_32BIT_MSB_FIRST(dest + 4, out[1]);
       
   587 }
       
   588 
       
   589 
       
   590 static unsigned char *
       
   591 deshash(unsigned char *dst, const unsigned char *key,
       
   592 	const unsigned char *src)
       
   593 {
       
   594 	struct des_context ctx;
       
   595 
       
   596 	des_key_setup(GET_32BIT_MSB_FIRST(key) >> 8,
       
   597 		      GET_32BIT_MSB_FIRST(key + 3), &ctx);
       
   598 
       
   599 	des_cbc_encrypt(dst, src, &ctx);
       
   600 
       
   601 	return dst;
       
   602 }