stoneage8.5/石器时代8.5客户端最新源代码/石器源码/wgs/descrypt.cpp
2020-06-23 15:53:23 +08:00

1598 lines
31 KiB
C++

/*
* ecb_crypt, cbc_crypt, des_setparity - DES encryption/decryption routine
*
* Written by Koichiro Mori (kmori@lsi-j.co.jp)
*/
#include <string.h>
#include "../systeminc/version.h"
#include "descrypt.h"
#define YES 1
#define NO 0
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
void des_setparity(char *key)
{
int n;
for (n = 8; n > 0; n--) {
char c;
c = *key &= 0x7f;
c ^= c << 4;
c ^= c << 2;
c ^= c << 1;
*key++ ^= ~c & 0x80;
}
}
ulong Keys[16][2];
void des_setkey(char *key)
{
static char nshifts[]
= { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
#define C 28
#define D 0
static uchar pc1[] = {
C + 20, C + 12, C + 4, D + 0, D + 4, D + 12, D + 20,
C + 21, C + 13, C + 5, D + 1, D + 5, D + 13, D + 21,
C + 22, C + 14, C + 6, D + 2, D + 6, D + 14, D + 22,
C + 23, C + 15, C + 7, D + 3, D + 7, D + 15, D + 23,
C + 24, C + 16, C + 8, C + 0, D + 8, D + 16, D + 24,
C + 25, C + 17, C + 9, C + 1, D + 9, D + 17, D + 25,
C + 26, C + 18, C +10, C + 2, D +10, D + 18, D + 26,
C + 27, C + 19, C +11, C + 3, D +11, D + 19, D + 27
};
static uchar pc2_c[] = {
14, 11, 17, 4, 27, 23,
25, 0, 13, 22, 7, 18,
5, 9, 16, 24, 2, 20,
12, 21, 1, 8, 15, 26
};
static uchar pc2_d[] = {
15, 4, 25, 19, 9, 1,
26, 16, 5, 11, 23, 8,
12, 7, 17, 0, 22, 3,
10, 14, 6, 20, 27, 24,
};
ulong c, d;
uchar b, *p;
int i, j;
/* PC-1 (Permuted Choice 1) */
c = d = 0;
p = pc1;
for (i = 0; i < 8; i++) {
b = *key++;
for (j = 0; j < 7; j++) {
if (b & 0x80) {
if (*p >= C)
c |= 1L << (*p - C);
else
d |= 1L << *p;
}
p++;
b <<= 1;
}
}
for (i = 0; i < 16; i++) {
uchar *k, mask, w[8];
uint n = nshifts[i];
c = (c << n | c >> (28 - n)) & 0x0fffffff;
d = (d << n | d >> (28 - n)) & 0x0fffffff;
/* PC-2 (Permuted Choice 2) */
k = w;
p = pc2_c;
for (j = 0; j < 4; j++) {
*k = 0;
for (mask = 0x20; mask > 0; mask >>= 1) {
if ((c >> *p++) & 1)
*k |= mask;
}
k++;
}
p = pc2_d;
for (j = 0; j < 4; j++) {
*k = 0;
for (mask = 0x20; mask > 0; mask >>= 1) {
if ((d >> *p++) & 1)
*k |= mask;
}
k++;
}
Keys[i][0] = ((ulong)w[0] << 24) | ((ulong)w[2] << 16)
| ((ulong)w[4] << 8) | (ulong)w[6];
Keys[i][1] = ((ulong)w[1] << 24) | ((ulong)w[3] << 16)
| ((ulong)w[5] << 8) | (ulong)w[7];
}
}
#if MSC
#define ror4(x) _lrotr(x, 4)
#define rol1(x) _lrotl(x, 1)
#else
#define ror4(x) ((x) >> 4 | (x) << 28)
#define rol1(x) ((x) << 1 | (x) >> 31)
#endif
#if SMALL
uchar Sboxes[8][64] = {
{
14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13,
},
{
15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9,
},
{
10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12,
},
{
7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14,
},
{
2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3,
},
{
12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13,
},
{
4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12,
},
{
13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11,
},
};
ulong Ptbl[8][16] = {
{
0x00000000, 0x00000002, 0x00000200, 0x00000202,
0x00008000, 0x00008002, 0x00008200, 0x00008202,
0x00800000, 0x00800002, 0x00800200, 0x00800202,
0x00808000, 0x00808002, 0x00808200, 0x00808202,
},
{
0x00000000, 0x00004000, 0x40000000, 0x40004000,
0x00000010, 0x00004010, 0x40000010, 0x40004010,
0x00080000, 0x00084000, 0x40080000, 0x40084000,
0x00080010, 0x00084010, 0x40080010, 0x40084010,
},
{
0x00000000, 0x04000000, 0x00000004, 0x04000004,
0x00010000, 0x04010000, 0x00010004, 0x04010004,
0x00000100, 0x04000100, 0x00000104, 0x04000104,
0x00010100, 0x04010100, 0x00010104, 0x04010104,
},
{
0x00000000, 0x80000000, 0x00400000, 0x80400000,
0x00001000, 0x80001000, 0x00401000, 0x80401000,
0x00000040, 0x80000040, 0x00400040, 0x80400040,
0x00001040, 0x80001040, 0x00401040, 0x80401040,
},
{
0x00000000, 0x20000000, 0x00000080, 0x20000080,
0x00040000, 0x20040000, 0x00040080, 0x20040080,
0x01000000, 0x21000000, 0x01000080, 0x21000080,
0x01040000, 0x21040000, 0x01040080, 0x21040080,
},
{
0x00000000, 0x00002000, 0x00200000, 0x00202000,
0x00000008, 0x00002008, 0x00200008, 0x00202008,
0x10000000, 0x10002000, 0x10200000, 0x10202000,
0x10000008, 0x10002008, 0x10200008, 0x10202008,
},
{
0x00000000, 0x02000000, 0x00000400, 0x02000400,
0x00100000, 0x02100000, 0x00100400, 0x02100400,
0x00000001, 0x02000001, 0x00000401, 0x02000401,
0x00100001, 0x02100001, 0x00100401, 0x02100401,
},
{
0x00000000, 0x00000800, 0x00020000, 0x00020800,
0x00000020, 0x00000820, 0x00020020, 0x00020820,
0x08000000, 0x08000800, 0x08020000, 0x08020800,
0x08000020, 0x08000820, 0x08020020, 0x08020820,
},
};
#define ps(i, j) Ptbl[i][Sboxes[i][j]]
#else /* MIDDLE */
ulong Psboxes[8][64] = {
{
0x00808200, 0x00000000, 0x00008000, 0x00808202,
0x00808002, 0x00008202, 0x00000002, 0x00008000,
0x00000200, 0x00808200, 0x00808202, 0x00000200,
0x00800202, 0x00808002, 0x00800000, 0x00000002,
0x00000202, 0x00800200, 0x00800200, 0x00008200,
0x00008200, 0x00808000, 0x00808000, 0x00800202,
0x00008002, 0x00800002, 0x00800002, 0x00008002,
0x00000000, 0x00000202, 0x00008202, 0x00800000,
0x00008000, 0x00808202, 0x00000002, 0x00808000,
0x00808200, 0x00800000, 0x00800000, 0x00000200,
0x00808002, 0x00008000, 0x00008200, 0x00800002,
0x00000200, 0x00000002, 0x00800202, 0x00008202,
0x00808202, 0x00008002, 0x00808000, 0x00800202,
0x00800002, 0x00000202, 0x00008202, 0x00808200,
0x00000202, 0x00800200, 0x00800200, 0x00000000,
0x00008002, 0x00008200, 0x00000000, 0x00808002,
},
{
0x40084010, 0x40004000, 0x00004000, 0x00084010,
0x00080000, 0x00000010, 0x40080010, 0x40004010,
0x40000010, 0x40084010, 0x40084000, 0x40000000,
0x40004000, 0x00080000, 0x00000010, 0x40080010,
0x00084000, 0x00080010, 0x40004010, 0x00000000,
0x40000000, 0x00004000, 0x00084010, 0x40080000,
0x00080010, 0x40000010, 0x00000000, 0x00084000,
0x00004010, 0x40084000, 0x40080000, 0x00004010,
0x00000000, 0x00084010, 0x40080010, 0x00080000,
0x40004010, 0x40080000, 0x40084000, 0x00004000,
0x40080000, 0x40004000, 0x00000010, 0x40084010,
0x00084010, 0x00000010, 0x00004000, 0x40000000,
0x00004010, 0x40084000, 0x00080000, 0x40000010,
0x00080010, 0x40004010, 0x40000010, 0x00080010,
0x00084000, 0x00000000, 0x40004000, 0x00004010,
0x40000000, 0x40080010, 0x40084010, 0x00084000,
},
{
0x00000104, 0x04010100, 0x00000000, 0x04010004,
0x04000100, 0x00000000, 0x00010104, 0x04000100,
0x00010004, 0x04000004, 0x04000004, 0x00010000,
0x04010104, 0x00010004, 0x04010000, 0x00000104,
0x04000000, 0x00000004, 0x04010100, 0x00000100,
0x00010100, 0x04010000, 0x04010004, 0x00010104,
0x04000104, 0x00010100, 0x00010000, 0x04000104,
0x00000004, 0x04010104, 0x00000100, 0x04000000,
0x04010100, 0x04000000, 0x00010004, 0x00000104,
0x00010000, 0x04010100, 0x04000100, 0x00000000,
0x00000100, 0x00010004, 0x04010104, 0x04000100,
0x04000004, 0x00000100, 0x00000000, 0x04010004,
0x04000104, 0x00010000, 0x04000000, 0x04010104,
0x00000004, 0x00010104, 0x00010100, 0x04000004,
0x04010000, 0x04000104, 0x00000104, 0x04010000,
0x00010104, 0x00000004, 0x04010004, 0x00010100,
},
{
0x80401000, 0x80001040, 0x80001040, 0x00000040,
0x00401040, 0x80400040, 0x80400000, 0x80001000,
0x00000000, 0x00401000, 0x00401000, 0x80401040,
0x80000040, 0x00000000, 0x00400040, 0x80400000,
0x80000000, 0x00001000, 0x00400000, 0x80401000,
0x00000040, 0x00400000, 0x80001000, 0x00001040,
0x80400040, 0x80000000, 0x00001040, 0x00400040,
0x00001000, 0x00401040, 0x80401040, 0x80000040,
0x00400040, 0x80400000, 0x00401000, 0x80401040,
0x80000040, 0x00000000, 0x00000000, 0x00401000,
0x00001040, 0x00400040, 0x80400040, 0x80000000,
0x80401000, 0x80001040, 0x80001040, 0x00000040,
0x80401040, 0x80000040, 0x80000000, 0x00001000,
0x80400000, 0x80001000, 0x00401040, 0x80400040,
0x80001000, 0x00001040, 0x00400000, 0x80401000,
0x00000040, 0x00400000, 0x00001000, 0x00401040,
},
{
0x00000080, 0x01040080, 0x01040000, 0x21000080,
0x00040000, 0x00000080, 0x20000000, 0x01040000,
0x20040080, 0x00040000, 0x01000080, 0x20040080,
0x21000080, 0x21040000, 0x00040080, 0x20000000,
0x01000000, 0x20040000, 0x20040000, 0x00000000,
0x20000080, 0x21040080, 0x21040080, 0x01000080,
0x21040000, 0x20000080, 0x00000000, 0x21000000,
0x01040080, 0x01000000, 0x21000000, 0x00040080,
0x00040000, 0x21000080, 0x00000080, 0x01000000,
0x20000000, 0x01040000, 0x21000080, 0x20040080,
0x01000080, 0x20000000, 0x21040000, 0x01040080,
0x20040080, 0x00000080, 0x01000000, 0x21040000,
0x21040080, 0x00040080, 0x21000000, 0x21040080,
0x01040000, 0x00000000, 0x20040000, 0x21000000,
0x00040080, 0x01000080, 0x20000080, 0x00040000,
0x00000000, 0x20040000, 0x01040080, 0x20000080,
},
{
0x10000008, 0x10200000, 0x00002000, 0x10202008,
0x10200000, 0x00000008, 0x10202008, 0x00200000,
0x10002000, 0x00202008, 0x00200000, 0x10000008,
0x00200008, 0x10002000, 0x10000000, 0x00002008,
0x00000000, 0x00200008, 0x10002008, 0x00002000,
0x00202000, 0x10002008, 0x00000008, 0x10200008,
0x10200008, 0x00000000, 0x00202008, 0x10202000,
0x00002008, 0x00202000, 0x10202000, 0x10000000,
0x10002000, 0x00000008, 0x10200008, 0x00202000,
0x10202008, 0x00200000, 0x00002008, 0x10000008,
0x00200000, 0x10002000, 0x10000000, 0x00002008,
0x10000008, 0x10202008, 0x00202000, 0x10200000,
0x00202008, 0x10202000, 0x00000000, 0x10200008,
0x00000008, 0x00002000, 0x10200000, 0x00202008,
0x00002000, 0x00200008, 0x10002008, 0x00000000,
0x10202000, 0x10000000, 0x00200008, 0x10002008,
},
{
0x00100000, 0x02100001, 0x02000401, 0x00000000,
0x00000400, 0x02000401, 0x00100401, 0x02100400,
0x02100401, 0x00100000, 0x00000000, 0x02000001,
0x00000001, 0x02000000, 0x02100001, 0x00000401,
0x02000400, 0x00100401, 0x00100001, 0x02000400,
0x02000001, 0x02100000, 0x02100400, 0x00100001,
0x02100000, 0x00000400, 0x00000401, 0x02100401,
0x00100400, 0x00000001, 0x02000000, 0x00100400,
0x02000000, 0x00100400, 0x00100000, 0x02000401,
0x02000401, 0x02100001, 0x02100001, 0x00000001,
0x00100001, 0x02000000, 0x02000400, 0x00100000,
0x02100400, 0x00000401, 0x00100401, 0x02100400,
0x00000401, 0x02000001, 0x02100401, 0x02100000,
0x00100400, 0x00000000, 0x00000001, 0x02100401,
0x00000000, 0x00100401, 0x02100000, 0x00000400,
0x02000001, 0x02000400, 0x00000400, 0x00100001,
},
{
0x08000820, 0x00000800, 0x00020000, 0x08020820,
0x08000000, 0x08000820, 0x00000020, 0x08000000,
0x00020020, 0x08020000, 0x08020820, 0x00020800,
0x08020800, 0x00020820, 0x00000800, 0x00000020,
0x08020000, 0x08000020, 0x08000800, 0x00000820,
0x00020800, 0x00020020, 0x08020020, 0x08020800,
0x00000820, 0x00000000, 0x00000000, 0x08020020,
0x08000020, 0x08000800, 0x00020820, 0x00020000,
0x00020820, 0x00020000, 0x08020800, 0x00000800,
0x00000020, 0x08020020, 0x00000800, 0x00020820,
0x08000800, 0x00000020, 0x08000020, 0x08020000,
0x08020020, 0x08000000, 0x00020000, 0x08000820,
0x00000000, 0x08020820, 0x00020020, 0x08000020,
0x08020000, 0x08000800, 0x08000820, 0x00000000,
0x08020820, 0x00020800, 0x00020800, 0x00000820,
0x00000820, 0x00020020, 0x08000000, 0x08020800,
},
};
#define ps(i, j) Psboxes[i][j]
#endif /* SMALL */
#if ASSEMBLY
extern void des_crypt();
#else
unsigned long Ip_l[] = {
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00000000,
0x00000080,
0x00000000,
0x00000080,
0x00008000,
0x00008080,
0x00008000,
0x00008080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x00800000,
0x00800080,
0x00800000,
0x00800080,
0x00808000,
0x00808080,
0x00808000,
0x00808080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80000000,
0x80000080,
0x80000000,
0x80000080,
0x80008000,
0x80008080,
0x80008000,
0x80008080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
0x80800000,
0x80800080,
0x80800000,
0x80800080,
0x80808000,
0x80808080,
0x80808000,
0x80808080,
};
unsigned long Ip_r[] = {
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00000000,
0x00000000,
0x00000080,
0x00000080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00008000,
0x00008000,
0x00008080,
0x00008080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00800000,
0x00800000,
0x00800080,
0x00800080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x00808000,
0x00808000,
0x00808080,
0x00808080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80000000,
0x80000000,
0x80000080,
0x80000080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80008000,
0x80008000,
0x80008080,
0x80008080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80800000,
0x80800000,
0x80800080,
0x80800080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
0x80808000,
0x80808000,
0x80808080,
0x80808080,
};
unsigned long Ip_inv_l[] = {
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
0x00000000,
0x80000000,
0x00800000,
0x80800000,
0x00008000,
0x80008000,
0x00808000,
0x80808000,
0x00000080,
0x80000080,
0x00800080,
0x80800080,
0x00008080,
0x80008080,
0x00808080,
0x80808080,
};
unsigned long Ip_inv_r[] = {
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x80000000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x00800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x80800000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x00008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x80008000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x00808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x80808000,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x00000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x80000080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x00800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x80800080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x00008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x80008080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x00808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
0x80808080,
};
void des_crypt(char *block, int dflag)
{
ulong l, r, l2, r2;
uchar *s;
int i;
/* Initial Transpose */
s = (uchar *)block;
l = (((((((Ip_l[s[0]] >> 1
| Ip_l[s[1]]) >> 1
| Ip_l[s[2]]) >> 1
| Ip_l[s[3]]) >> 1
| Ip_l[s[4]]) >> 1
| Ip_l[s[5]]) >> 1
| Ip_l[s[6]]) >> 1
| Ip_l[s[7]]);
r = (((((((Ip_r[s[0]] >> 1
| Ip_r[s[1]]) >> 1
| Ip_r[s[2]]) >> 1
| Ip_r[s[3]]) >> 1
| Ip_r[s[4]]) >> 1
| Ip_r[s[5]]) >> 1
| Ip_r[s[6]]) >> 1
| Ip_r[s[7]]);
if (dflag == 0) {
for (i = 0; i < 16; i++) {
ulong v, x1, x2;
/* E-transpose, Xor, S-box and P-transpose */
x1 = rol1(r);
x2 = ror4(x1) ^ Keys[i][0];
x1 ^= Keys[i][1];
v = l ^ ps(7, x1 & 0x3f)
^ ps(5, (x1 >> 8) & 0x3f)
^ ps(3, (x1 >> 16) & 0x3f)
^ ps(1, (x1 >> 24) & 0x3f)
^ ps(6, x2 & 0x3f)
^ ps(4, (x2 >> 8) & 0x3f)
^ ps(2, (x2 >> 16) & 0x3f)
^ ps(0, (x2 >> 24) & 0x3f);
l = r;
r = v;
}
} else {
for (i = 16; --i >= 0; ) {
ulong v, x1, x2;
/* E-transpose, Xor, S-box and P-transpose */
x1 = rol1(r);
x2 = ror4(x1) ^ Keys[i][0];
x1 ^= Keys[i][1];
v = l ^ ps(7, x1 & 0x3f)
^ ps(5, (x1 >> 8) & 0x3f)
^ ps(3, (x1 >> 16) & 0x3f)
^ ps(1, (x1 >> 24) & 0x3f)
^ ps(6, x2 & 0x3f)
^ ps(4, (x2 >> 8) & 0x3f)
^ ps(2, (x2 >> 16) & 0x3f)
^ ps(0, (x2 >> 24) & 0x3f);
l = r;
r = v;
}
}
/* Final transpose */
l2 = (((((((Ip_inv_l[r & 0xff] >> 1
| Ip_inv_l[l & 0xff]) >> 1
| Ip_inv_l[r>>8 & 0xff]) >> 1
| Ip_inv_l[l>>8 & 0xff]) >> 1
| Ip_inv_l[r>>16 & 0xff]) >> 1
| Ip_inv_l[l>>16 & 0xff]) >> 1
| Ip_inv_l[r>>24 & 0xff]) >> 1
| Ip_inv_l[l>>24 & 0xff]);
r2 = (((((((Ip_inv_r[r & 0xff] >> 1
| Ip_inv_r[l & 0xff]) >> 1
| Ip_inv_r[r>>8 & 0xff]) >> 1
| Ip_inv_r[l>>8 & 0xff]) >> 1
| Ip_inv_r[r>>16 & 0xff]) >> 1
| Ip_inv_r[l>>16 & 0xff]) >> 1
| Ip_inv_r[r>>24 & 0xff]) >> 1
| Ip_inv_r[l>>24 & 0xff]);
*block++ = (char)(l2 >> 24);
*block++ = (char)(l2 >> 16);
*block++ = (char)(l2 >> 8);
*block++ = (char)l2;
*block++ = (char)(r2 >> 24);
*block++ = (char)(r2 >> 16);
*block++ = (char)(r2 >> 8);
*block++ = (char)r2;
}
#endif /* ASSEMBLY */
int ecb_crypt(char *key, char *buf, unsigned len, unsigned mode)
{
des_setkey(key);
for (len = (len + 7) & ~7; len != 0; buf += 8, len -= 8)
des_crypt(buf, mode & DES_DIRMASK);
return ((mode & DES_DEVMASK) == DES_SW ? DESERR_NONE
: DESERR_NOHWDEVICE);
}
int cbc_crypt(char *key, char *buf, unsigned len, unsigned mode, char *ivec)
{
char nvec[8];
des_setkey(key);
switch (mode & DES_DIRMASK) {
case DES_ENCRYPT:
for (len = (len + 7) & ~7; len != 0; len -= 8) {
buf[0] ^= ivec[0];
buf[1] ^= ivec[1];
buf[2] ^= ivec[2];
buf[3] ^= ivec[3];
buf[4] ^= ivec[4];
buf[5] ^= ivec[5];
buf[6] ^= ivec[6];
buf[7] ^= ivec[7];
des_crypt(buf, DES_ENCRYPT);
ivec[0] = *buf++;
ivec[1] = *buf++;
ivec[2] = *buf++;
ivec[3] = *buf++;
ivec[4] = *buf++;
ivec[5] = *buf++;
ivec[6] = *buf++;
ivec[7] = *buf++;
}
break;
case DES_DECRYPT:
for (len = (len + 7) & ~7; len != 0; len -= 8) {
nvec[0] = buf[0];
nvec[1] = buf[1];
nvec[2] = buf[2];
nvec[3] = buf[3];
nvec[4] = buf[4];
nvec[5] = buf[5];
nvec[6] = buf[6];
nvec[7] = buf[7];
des_crypt(buf, DES_DECRYPT);
*buf++ ^= ivec[0];
*buf++ ^= ivec[1];
*buf++ ^= ivec[2];
*buf++ ^= ivec[3];
*buf++ ^= ivec[4];
*buf++ ^= ivec[5];
*buf++ ^= ivec[6];
*buf++ ^= ivec[7];
ivec[0] = nvec[0];
ivec[1] = nvec[1];
ivec[2] = nvec[2];
ivec[3] = nvec[3];
ivec[4] = nvec[4];
ivec[5] = nvec[5];
ivec[6] = nvec[6];
ivec[7] = nvec[7];
}
break;
}
return ((mode & DES_DEVMASK) == DES_SW ? DESERR_NONE
: DESERR_NOHWDEVICE);
}