diff --git a/hecl/driver/driver.pro b/hecl/driver/driver.pro index c694d9771..5d407144d 100644 --- a/hecl/driver/driver.pro +++ b/hecl/driver/driver.pro @@ -7,8 +7,11 @@ unix:!macx:LIBS += -std=c++11 -stdlib=libc++ -lc++abi INCLUDEPATH += ../include -LIBPATH += $$OUT_PWD/../lib $$OUT_PWD/../extern/sqlite3 -LIBS += -lhecl -lsqlite3 +LIBPATH += $$OUT_PWD/../lib \ + $$OUT_PWD/../extern/sqlite3 \ + $$OUT_PWD/../extern/blowfish + +LIBS += -lhecl -lsqlite3 -lblowfish SOURCES += \ $$PWD/main.cpp diff --git a/hecl/extern/blowfish/BLOWFISH.C b/hecl/extern/blowfish/BLOWFISH.C deleted file mode 100644 index b1f7a286d..000000000 --- a/hecl/extern/blowfish/BLOWFISH.C +++ /dev/null @@ -1,228 +0,0 @@ -#ifdef little_endian /* Eg: Intel */ - #include - #include - #include -#endif - -#include -#include -#include -#include - -#ifdef little_endian /* Eg: Intel */ - #include -#endif - -#include - -#ifdef little_endian /* Eg: Intel */ - #include - #include -#endif - -#ifdef big_endian - #include -#endif - -#include "Blowfish.h" - -#define N 16 -#define noErr 0 -#define DATAERROR -1 -#define KEYBYTES 8 -#define subkeyfilename "Blowfish.dat" - -unsigned long P[N + 2]; -unsigned long S[4][256]; -FILE* SubkeyFile; - -short opensubkeyfile(void) /* read only */ -{ - short error; - - error = noErr; - - if((SubkeyFile = fopen(subkeyfilename,"rb")) == NULL) { - error = DATAERROR; - } - - return error; -} - -unsigned long F(unsigned long x) -{ - unsigned short a; - unsigned short b; - unsigned short c; - unsigned short d; - unsigned long y; - - d = x & 0x00FF; - x >>= 8; - c = x & 0x00FF; - x >>= 8; - b = x & 0x00FF; - x >>= 8; - a = x & 0x00FF; - //y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d]; - y = S[0][a] + S[1][b]; - y = y ^ S[2][c]; - y = y + S[3][d]; - - return y; -} - -void Blowfish_encipher(unsigned long *xl, unsigned long *xr) -{ - unsigned long Xl; - unsigned long Xr; - unsigned long temp; - short i; - - Xl = *xl; - Xr = *xr; - - for (i = 0; i < N; ++i) { - Xl = Xl ^ P[i]; - Xr = F(Xl) ^ Xr; - - temp = Xl; - Xl = Xr; - Xr = temp; - } - - temp = Xl; - Xl = Xr; - Xr = temp; - - Xr = Xr ^ P[N]; - Xl = Xl ^ P[N + 1]; - - *xl = Xl; - *xr = Xr; -} - -void Blowfish_decipher(unsigned long *xl, unsigned long *xr) -{ - unsigned long Xl; - unsigned long Xr; - unsigned long temp; - short i; - - Xl = *xl; - Xr = *xr; - - for (i = N + 1; i > 1; --i) { - Xl = Xl ^ P[i]; - Xr = F(Xl) ^ Xr; - - /* Exchange Xl and Xr */ - temp = Xl; - Xl = Xr; - Xr = temp; - } - - /* Exchange Xl and Xr */ - temp = Xl; - Xl = Xr; - Xr = temp; - - Xr = Xr ^ P[1]; - Xl = Xl ^ P[0]; - - *xl = Xl; - *xr = Xr; -} - -short InitializeBlowfish(char key[], short keybytes) -{ - short i; - short j; - short k; - short error; - short numread; - unsigned long data; - unsigned long datal; - unsigned long datar; - - /* First, open the file containing the array initialization data */ - error = opensubkeyfile(); - if (error == noErr) { - for (i = 0; i < N + 2; ++i) { - numread = fread(&data, 4, 1, SubkeyFile); - #ifdef little_endian /* Eg: Intel We want to process things in byte */ - /* order, not as rearranged in a longword */ - data = ((data & 0xFF000000) >> 24) | - ((data & 0x00FF0000) >> 8) | - ((data & 0x0000FF00) << 8) | - ((data & 0x000000FF) << 24); - #endif - - if (numread != 1) { - return DATAERROR; - } else { - P[i] = data; - } - } - - for (i = 0; i < 4; ++i) { - for (j = 0; j < 256; ++j) { - numread = fread(&data, 4, 1, SubkeyFile); - - #ifdef little_endian /* Eg: Intel We want to process things in byte */ - /* order, not as rearranged in a longword */ - data = ((data & 0xFF000000) >> 24) | - ((data & 0x00FF0000) >> 8) | - ((data & 0x0000FF00) << 8) | - ((data & 0x000000FF) << 24); - #endif - - if (numread != 1) { - return DATAERROR; - } else { - S[i][j] = data; - } - } - } - - fclose(SubkeyFile); - - j = 0; - for (i = 0; i < N + 2; ++i) { - data = 0x00000000; - for (k = 0; k < 4; ++k) { - data = (data << 8) | key[j]; - j = j + 1; - if (j >= keybytes) { - j = 0; - } - } - P[i] = P[i] ^ data; - } - - datal = 0x00000000; - datar = 0x00000000; - - for (i = 0; i < N + 2; i += 2) { - Blowfish_encipher(&datal, &datar); - - P[i] = datal; - P[i + 1] = datar; - } - - for (i = 0; i < 4; ++i) { - for (j = 0; j < 256; j += 2) { - - Blowfish_encipher(&datal, &datar); - - S[i][j] = datal; - S[i][j + 1] = datar; - } - } - } else { - printf("Unable to open subkey initialization file : %d\n", error); - } - - return error; -} - diff --git a/hecl/extern/blowfish/BLOWFISH.DAT.c b/hecl/extern/blowfish/BLOWFISH.DAT.c deleted file mode 100644 index 00a3904e6..000000000 --- a/hecl/extern/blowfish/BLOWFISH.DAT.c +++ /dev/null @@ -1,505 +0,0 @@ -#include -size_t BLOWFISH_DAT_SZ = 5006; -char BLOWFISH_DAT[] = { - 0x24,0x3F,0x6A,0x88,0x85,0xA3,0x08,0xD3,0x13,0x19, - 0x8A,0x2E,0x03,0x70,0x73,0x44,0xA4,0x09,0x38,0x22, - 0x29,0x9F,0x31,0xD0,0x08,0x2E,0xFA,0x98,0xEC,0x4E, - 0x6C,0x89,0x45,0x28,0x21,0xE6,0x38,0xD0,0x13,0x77, - 0xBE,0x54,0x66,0xCF,0x34,0xE9,0x0C,0x6C,0xC0,0xAC, - 0x29,0xB7,0xC9,0x7C,0x50,0xDD,0x3F,0x84,0xD5,0xB5, - 0xB5,0x47,0x09,0x17,0x92,0x16,0xD5,0xD9,0x89,0x79, - 0xFB,0x1B,0xD1,0x31,0x0B,0xA6,0x98,0xDF,0xB5,0xAC, - 0x2F,0xFD,0x72,0xDB,0xD0,0x1A,0xDF,0xB7,0xB8,0xE1, - 0xAF,0xED,0x6A,0x26,0x7E,0x96,0xBA,0x7C,0x90,0x45, - 0xF1,0x2C,0x7F,0x99,0x24,0xA1,0x99,0x47,0xB3,0x91, - 0x6C,0xF7,0x08,0x01,0xF2,0xE2,0x85,0x8E,0xFC,0x16, - 0x63,0x69,0x20,0xD8,0x71,0x57,0x4E,0x69,0xA4,0x58, - 0xFE,0xA3,0xF4,0x93,0x3D,0x7E,0x0D,0x95,0x74,0x8F, - 0x72,0x8E,0xB6,0x58,0x71,0x8B,0xCD,0x58,0x82,0x15, - 0x4A,0xEE,0x7B,0x54,0xA4,0x1D,0xC2,0x5A,0x59,0xB5, - 0x9C,0x30,0xD5,0x39,0x2A,0xF2,0x60,0x13,0xC5,0xD1, - 0xB0,0x23,0x28,0x60,0x85,0xF0,0xCA,0x41,0x79,0x18, - 0xB8,0xDB,0x38,0xEF,0x8E,0x79,0xDC,0xB0,0x60,0x3A, - 0x18,0x0E,0x6C,0x9E,0x0E,0x8B,0xB0,0x1E,0x8A,0x3E, - 0xD7,0x15,0x77,0xC1,0xBD,0x31,0x4B,0x27,0x78,0xAF, - 0x2F,0xDA,0x55,0x60,0x5C,0x60,0xE6,0x55,0x25,0xF3, - 0xAA,0x55,0xAB,0x94,0x57,0x48,0x98,0x62,0x63,0xE8, - 0x14,0x40,0x55,0xCA,0x39,0x6A,0x2A,0xAB,0x10,0xB6, - 0xB4,0xCC,0x5C,0x34,0x11,0x41,0xE8,0xCE,0xA1,0x54, - 0x86,0xAF,0x7C,0x72,0xE9,0x93,0xB3,0xEE,0x14,0x11, - 0x63,0x6F,0xBC,0x2A,0x2B,0xA9,0xC5,0x5D,0x74,0x18, - 0x31,0xF6,0xCE,0x5C,0x3E,0x16,0x9B,0x87,0x93,0x1E, - 0xAF,0xD6,0xBA,0x33,0x6C,0x24,0xCF,0x5C,0x7A,0x32, - 0x53,0x81,0x28,0x95,0x86,0x77,0x3B,0x8F,0x48,0x98, - 0x6B,0x4B,0xB9,0xAF,0xC4,0xBF,0xE8,0x1B,0x66,0x28, - 0x21,0x93,0x61,0xD8,0x09,0xCC,0xFB,0x21,0xA9,0x91, - 0x48,0x7C,0xAC,0x60,0x5D,0xEC,0x80,0x32,0xEF,0x84, - 0x5D,0x5D,0xE9,0x85,0x75,0xB1,0xDC,0x26,0x23,0x02, - 0xEB,0x65,0x1B,0x88,0x23,0x89,0x3E,0x81,0xD3,0x96, - 0xAC,0xC5,0x0F,0x6D,0x6F,0xF3,0x83,0xF4,0x42,0x39, - 0x2E,0x0B,0x44,0x82,0xA4,0x84,0x20,0x04,0x69,0xC8, - 0xF0,0x4A,0x9E,0x1F,0x9B,0x5E,0x21,0xC6,0x68,0x42, - 0xF6,0xE9,0x6C,0x9A,0x67,0x0C,0x9C,0x61,0xAB,0xD3, - 0x88,0xF0,0x6A,0x51,0xA0,0xD2,0xD8,0x54,0x2F,0x68, - 0x96,0x0F,0xA7,0x28,0xAB,0x51,0x33,0xA3,0x6E,0xEF, - 0x0B,0x6C,0x13,0x7A,0x3B,0xE4,0xBA,0x3B,0xF0,0x50, - 0x7E,0xFB,0x2A,0x98,0xA1,0xF1,0x65,0x1D,0x39,0xAF, - 0x01,0x76,0x66,0xCA,0x59,0x3E,0x82,0x43,0x0E,0x88, - 0x8C,0xEE,0x86,0x19,0x45,0x6F,0x9F,0xB4,0x7D,0x84, - 0xA5,0xC3,0x3B,0x8B,0x5E,0xBE,0xE0,0x6F,0x75,0xD8, - 0x85,0xC1,0x20,0x73,0x40,0x1A,0x44,0x9F,0x56,0xC1, - 0x6A,0xA6,0x4E,0xD3,0xAA,0x62,0x36,0x3F,0x77,0x06, - 0x1B,0xFE,0xDF,0x72,0x42,0x9B,0x02,0x3D,0x37,0xD0, - 0xD7,0x24,0xD0,0x0A,0x12,0x48,0xDB,0x0F,0xEA,0xD3, - 0x49,0xF1,0xC0,0x9B,0x07,0x53,0x72,0xC9,0x80,0x99, - 0x1B,0x7B,0x25,0xD4,0x79,0xD8,0xF6,0xE8,0xDE,0xF7, - 0xE3,0xFE,0x50,0x1A,0xB6,0x79,0x4C,0x3B,0x97,0x6C, - 0xE0,0xBD,0x04,0xC0,0x06,0xBA,0xC1,0xA9,0x4F,0xB6, - 0x40,0x9F,0x60,0xC4,0x5E,0x5C,0x9E,0xC2,0x19,0x6A, - 0x24,0x63,0x68,0xFB,0x6F,0xAF,0x3E,0x6C,0x53,0xB5, - 0x13,0x39,0xB2,0xEB,0x3B,0x52,0xEC,0x6F,0x6D,0xFC, - 0x51,0x1F,0x9B,0x30,0x95,0x2C,0xCC,0x81,0x45,0x44, - 0xAF,0x5E,0xBD,0x09,0xBE,0xE3,0xD0,0x04,0xDE,0x33, - 0x4A,0xFD,0x66,0x0F,0x28,0x07,0x19,0x2E,0x4B,0xB3, - 0xC0,0xCB,0xA8,0x57,0x45,0xC8,0x74,0x0F,0xD2,0x0B, - 0x5F,0x39,0xB9,0xD3,0xFB,0xDB,0x55,0x79,0xC0,0xBD, - 0x1A,0x60,0x32,0x0A,0xD6,0xA1,0x00,0xC6,0x40,0x2C, - 0x72,0x79,0x67,0x9F,0x25,0xFE,0xFB,0x1F,0xA3,0xCC, - 0x8E,0xA5,0xE9,0xF8,0xDB,0x32,0x22,0xF8,0x3C,0x75, - 0x16,0xDF,0xFD,0x61,0x6B,0x15,0x2F,0x50,0x1E,0xC8, - 0xAD,0x05,0x52,0xAB,0x32,0x3D,0xB5,0xFA,0xFD,0x23, - 0x87,0x60,0x53,0x31,0x7B,0x48,0x3E,0x00,0xDF,0x82, - 0x9E,0x5C,0x57,0xBB,0xCA,0x6F,0x8C,0xA0,0x1A,0x87, - 0x56,0x2E,0xDF,0x17,0x69,0xDB,0xD5,0x42,0xA8,0xF6, - 0x28,0x7E,0xFF,0xC3,0xAC,0x67,0x32,0xC6,0x8C,0x4F, - 0x55,0x73,0x69,0x5B,0x27,0xB0,0xBB,0xCA,0x58,0xC8, - 0xE1,0xFF,0xA3,0x5D,0xB8,0xF0,0x11,0xA0,0x10,0xFA, - 0x3D,0x98,0xFD,0x21,0x83,0xB8,0x4A,0xFC,0xB5,0x6C, - 0x2D,0xD1,0xD3,0x5B,0x9A,0x53,0xE4,0x79,0xB6,0xF8, - 0x45,0x65,0xD2,0x8E,0x49,0xBC,0x4B,0xFB,0x97,0x90, - 0xE1,0xDD,0xF2,0xDA,0xA4,0xCB,0x7E,0x33,0x62,0xFB, - 0x13,0x41,0xCE,0xE4,0xC6,0xE8,0xEF,0x20,0xCA,0xDA, - 0x36,0x77,0x4C,0x01,0xD0,0x7E,0x9E,0xFE,0x2B,0xF1, - 0x1F,0xB4,0x95,0xDB,0xDA,0x4D,0xAE,0x90,0x91,0x98, - 0xEA,0xAD,0x8E,0x71,0x6B,0x93,0xD5,0xA0,0xD0,0x8E, - 0xD1,0xD0,0xAF,0xC7,0x25,0xE0,0x8E,0x3C,0x5B,0x2F, - 0x8E,0x75,0x94,0xB7,0x8F,0xF6,0xE2,0xFB,0xF2,0x12, - 0x2B,0x64,0x88,0x88,0xB8,0x12,0x90,0x0D,0xF0,0x1C, - 0x4F,0xAD,0x5E,0xA0,0x68,0x8F,0xC3,0x1C,0xD1,0xCF, - 0xF1,0x91,0xB3,0xA8,0xC1,0xAD,0x2F,0x2F,0x22,0x18, - 0xBE,0x0E,0x17,0x77,0xEA,0x75,0x2D,0xFE,0x8B,0x02, - 0x1F,0xA1,0xE5,0xA0,0xCC,0x0F,0xB5,0x6F,0x74,0xE8, - 0x18,0xAC,0xF3,0xD6,0xCE,0x89,0xE2,0x99,0xB4,0xA8, - 0x4F,0xE0,0xFD,0x13,0xE0,0xB7,0x7C,0xC4,0x3B,0x81, - 0xD2,0xAD,0xA8,0xD9,0x16,0x5F,0xA2,0x66,0x80,0x95, - 0x77,0x05,0x93,0xCC,0x73,0x14,0x21,0x1A,0x14,0x77, - 0xE6,0xAD,0x20,0x65,0x77,0xB5,0xFA,0x86,0xC7,0x54, - 0x42,0xF5,0xFB,0x9D,0x35,0xCF,0xEB,0xCD,0xAF,0x0C, - 0x7B,0x3E,0x89,0xA0,0xD6,0x41,0x1B,0xD3,0xAE,0x1E, - 0x7E,0x49,0x00,0x25,0x0E,0x2D,0x20,0x71,0xB3,0x5E, - 0x22,0x68,0x00,0xBB,0x57,0xB8,0xE0,0xAF,0x24,0x64, - 0x36,0x9B,0xF0,0x09,0xB9,0x1E,0x55,0x63,0x91,0x1D, - 0x59,0xDF,0xA6,0xAA,0x78,0xC1,0x43,0x89,0xD9,0x5A, - 0x53,0x7F,0x20,0x7D,0x5B,0xA2,0x02,0xE5,0xB9,0xC5, - 0x83,0x26,0x03,0x76,0x62,0x95,0xCF,0xA9,0x11,0xC8, - 0x19,0x68,0x4E,0x73,0x4A,0x41,0xB3,0x47,0x2D,0xCA, - 0x7B,0x14,0xA9,0x4A,0x1B,0x51,0x00,0x52,0x9A,0x53, - 0x29,0x15,0xD6,0x0F,0x57,0x3F,0xBC,0x9B,0xC6,0xE4, - 0x2B,0x60,0xA4,0x76,0x81,0xE6,0x74,0x00,0x08,0xBA, - 0x6F,0xB5,0x57,0x1B,0xE9,0x1F,0xF2,0x96,0xEC,0x6B, - 0x2A,0x0D,0xD9,0x15,0xB6,0x63,0x65,0x21,0xE7,0xB9, - 0xF9,0xB6,0xFF,0x34,0x05,0x2E,0xC5,0x85,0x56,0x64, - 0x53,0xB0,0x2D,0x5D,0xA9,0x9F,0x8F,0xA1,0x08,0xBA, - 0x47,0x99,0x6E,0x85,0x07,0x6A,0x4B,0x7A,0x70,0xE9, - 0xB5,0xB3,0x29,0x44,0xDB,0x75,0x09,0x2E,0xC4,0x19, - 0x26,0x23,0xAD,0x6E,0xA6,0xB0,0x49,0xA7,0xDF,0x7D, - 0x9C,0xEE,0x60,0xB8,0x8F,0xED,0xB2,0x66,0xEC,0xAA, - 0x8C,0x71,0x69,0x9A,0x17,0xFF,0x56,0x64,0x52,0x6C, - 0xC2,0xB1,0x9E,0xE1,0x19,0x36,0x02,0xA5,0x75,0x09, - 0x4C,0x29,0xA0,0x59,0x13,0x40,0xE4,0x18,0x3A,0x3E, - 0x3F,0x54,0x98,0x9A,0x5B,0x42,0x9D,0x65,0x6B,0x8F, - 0xE4,0xD6,0x99,0xF7,0x3F,0xD6,0xA1,0xD2,0x9C,0x07, - 0xEF,0xE8,0x30,0xF5,0x4D,0x2D,0x38,0xE6,0xF0,0x25, - 0x5D,0xC1,0x4C,0xDD,0x20,0x86,0x84,0x70,0xEB,0x26, - 0x63,0x82,0xE9,0xC6,0x02,0x1E,0xCC,0x5E,0x09,0x68, - 0x6B,0x3F,0x3E,0xBA,0xEF,0xC9,0x3C,0x97,0x18,0x14, - 0x6B,0x6A,0x70,0xA1,0x68,0x7F,0x35,0x84,0x52,0xA0, - 0xE2,0x86,0xB7,0x9C,0x53,0x05,0xAA,0x50,0x07,0x37, - 0x3E,0x07,0x84,0x1C,0x7F,0xDE,0xAE,0x5C,0x8E,0x7D, - 0x44,0xEC,0x57,0x16,0xF2,0xB8,0xB0,0x3A,0xDA,0x37, - 0xF0,0x50,0x0C,0x0D,0xF0,0x1C,0x1F,0x04,0x02,0x00, - 0xB3,0xFF,0xAE,0x0C,0xF5,0x1A,0x3C,0xB5,0x74,0xB2, - 0x25,0x83,0x7A,0x58,0xDC,0x09,0x21,0xBD,0xD1,0x91, - 0x13,0xF9,0x7C,0xA9,0x2F,0xF6,0x94,0x32,0x47,0x73, - 0x22,0xF5,0x47,0x01,0x3A,0xE5,0xE5,0x81,0x37,0xC2, - 0xDA,0xDC,0xC8,0xB5,0x76,0x34,0x9A,0xF3,0xDD,0xA7, - 0xA9,0x44,0x61,0x46,0x0F,0xD0,0x03,0x0E,0xEC,0xC8, - 0xC7,0x3E,0xA4,0x75,0x1E,0x41,0xE2,0x38,0xCD,0x99, - 0x3B,0xEA,0x0E,0x2F,0x32,0x80,0xBB,0xA1,0x18,0x3E, - 0xB3,0x31,0x4E,0x54,0x8B,0x38,0x4F,0x6D,0xB9,0x08, - 0x6F,0x42,0x0D,0x03,0xF6,0x0A,0x04,0xBF,0x2C,0xB8, - 0x12,0x90,0x24,0x97,0x7C,0x79,0x56,0x79,0xB0,0x72, - 0xBC,0xAF,0x89,0xAF,0xDE,0x9A,0x77,0x1F,0xD9,0x93, - 0x08,0x10,0xB3,0x8B,0xAE,0x12,0xDC,0xCF,0x3F,0x2E, - 0x55,0x12,0x72,0x1F,0x2E,0x6B,0x71,0x24,0x50,0x1A, - 0xDD,0xE6,0x9F,0x84,0xCD,0x87,0x7A,0x58,0x47,0x18, - 0x74,0x08,0xDA,0x17,0xBC,0x9F,0x9A,0xBC,0xE9,0x4B, - 0x7D,0x8C,0xEC,0x7A,0xEC,0x3A,0xDB,0x85,0x1D,0xFA, - 0x63,0x09,0x43,0x66,0xC4,0x64,0xC3,0xD2,0xEF,0x1C, - 0x18,0x47,0x32,0x15,0xD9,0x08,0xDD,0x43,0x3B,0x37, - 0x24,0xC2,0xBA,0x16,0x12,0xA1,0x4D,0x43,0x2A,0x65, - 0xC4,0x51,0x50,0x94,0x00,0x02,0x13,0x3A,0xE4,0xDD, - 0x71,0xDF,0xF8,0x9E,0x10,0x31,0x4E,0x55,0x81,0xAC, - 0x77,0xD6,0x5F,0x11,0x19,0x9B,0x04,0x35,0x56,0xF1, - 0xD7,0xA3,0xC7,0x6B,0x3C,0x11,0x18,0x3B,0x59,0x24, - 0xA5,0x09,0xF2,0x8F,0xE6,0xED,0x97,0xF1,0xFB,0xFA, - 0x9E,0xBA,0xBF,0x2C,0x1E,0x15,0x3C,0x6E,0x86,0xE3, - 0x45,0x70,0xEA,0xE9,0x6F,0xB1,0x86,0x0E,0x5E,0x0A, - 0x5A,0x3E,0x2A,0xB3,0x77,0x1F,0xE7,0x1C,0x4E,0x3D, - 0x06,0xFA,0x29,0x65,0xDC,0xB9,0x99,0xE7,0x1D,0x0F, - 0x80,0x3E,0x89,0xD6,0x52,0x66,0xC8,0x25,0x2E,0x4C, - 0xC9,0x78,0x9C,0x10,0xB3,0x6A,0xC6,0x15,0x0E,0xBA, - 0x94,0xE2,0xEA,0x78,0xA5,0xFC,0x3C,0x53,0x1E,0x0A, - 0x2D,0xF4,0xF2,0xF7,0x4E,0xA7,0x36,0x1D,0x2B,0x3D, - 0x19,0x39,0x26,0x0F,0x19,0xC2,0x79,0x60,0x52,0x23, - 0xA7,0x08,0xF7,0x13,0x12,0xB6,0xEB,0xAD,0xFE,0x6E, - 0xEA,0xC3,0x1F,0x66,0xE3,0xBC,0x45,0x95,0xA6,0x7B, - 0xC8,0x83,0xB1,0x7F,0x37,0xD1,0x01,0x8C,0xFF,0x28, - 0xC3,0x32,0xDD,0xEF,0xBE,0x6C,0x5A,0xA5,0x65,0x58, - 0x21,0x85,0x68,0xAB,0x98,0x02,0xEE,0xCE,0xA5,0x0F, - 0xDB,0x2F,0x95,0x3B,0x2A,0xEF,0x7D,0xAD,0x5B,0x6E, - 0x2F,0x84,0x15,0x21,0xB6,0x28,0x29,0x07,0x61,0x70, - 0xEC,0xDD,0x47,0x75,0x61,0x9F,0x15,0x10,0x13,0xCC, - 0xA8,0x30,0xEB,0x61,0xBD,0x96,0x03,0x34,0xFE,0x1E, - 0xAA,0x03,0x63,0xCF,0xB5,0x73,0x5C,0x90,0x4C,0x70, - 0xA2,0x39,0xD5,0x9E,0x9E,0x0B,0xCB,0xAA,0xDE,0x14, - 0xEE,0xCC,0x86,0xBC,0x60,0x62,0x2C,0xA7,0x9C,0xAB, - 0x5C,0xAB,0xB2,0xF3,0x84,0x6E,0x64,0x8B,0x1E,0xAF, - 0x19,0xBD,0xF0,0xCA,0xA0,0x23,0x69,0xB9,0x65,0x5A, - 0xBB,0x50,0x40,0x68,0x5A,0x32,0x3C,0x2A,0xB4,0xB3, - 0x31,0x9E,0xE9,0xD5,0xC0,0x21,0xB8,0xF7,0x9B,0x54, - 0x0B,0x19,0x87,0x5F,0xA0,0x99,0x95,0xF7,0x99,0x7E, - 0x62,0x3D,0x7D,0xA8,0xF8,0x37,0x88,0x9A,0x97,0xE3, - 0x2D,0x77,0x11,0xED,0x93,0x5F,0x16,0x68,0x12,0x81, - 0x0E,0x35,0x88,0x29,0xC7,0xE6,0x1F,0xD6,0x96,0xDE, - 0xDF,0xA1,0x78,0x58,0xBA,0x99,0x57,0xF5,0x84,0xA5, - 0x1B,0x22,0x72,0x63,0x9B,0x83,0xC3,0xFF,0x1A,0xC2, - 0x46,0x96,0xCD,0xB3,0x0A,0xEB,0x53,0x2E,0x30,0x54, - 0x8F,0xD9,0x48,0xE4,0x6D,0xBC,0x31,0x28,0x58,0xEB, - 0xF2,0xEF,0x34,0xC6,0xFF,0xEA,0xFE,0x28,0xED,0x61, - 0xEE,0x7C,0x3C,0x73,0x5D,0x4A,0x14,0xD9,0xE8,0x64, - 0xB7,0xE3,0x42,0x10,0x5D,0x14,0x20,0x3E,0x13,0xE0, - 0x45,0xEE,0xE2,0xB6,0xA3,0xAA,0xAB,0xEA,0xDB,0x6C, - 0x4F,0x15,0xFA,0xCB,0x4F,0xD0,0xC7,0x42,0xF4,0x42, - 0xEF,0x6A,0xBB,0xB5,0x65,0x4F,0x3B,0x1D,0x41,0xCD, - 0x21,0x05,0xD8,0x1E,0x79,0x9E,0x86,0x85,0x4D,0xC7, - 0xE4,0x4B,0x47,0x6A,0x3D,0x81,0x62,0x50,0xCF,0x62, - 0xA1,0xF2,0x5B,0x8D,0x26,0x46,0xFC,0x88,0x83,0xA0, - 0xC1,0xC7,0xB6,0xA3,0x7F,0x15,0x24,0xC3,0x69,0xCB, - 0x74,0x92,0x47,0x84,0x8A,0x0B,0x56,0x92,0xB2,0x85, - 0x09,0x5B,0xBF,0x00,0xAD,0x19,0x48,0x9D,0x14,0x62, - 0xB1,0x74,0x23,0x82,0x0E,0x00,0x58,0x42,0x8D,0x2A, - 0x0C,0x55,0xF5,0xEA,0x1D,0xAD,0xF4,0x3E,0x23,0x3F, - 0x70,0x61,0x33,0x72,0xF0,0x92,0x8D,0x93,0x7E,0x41, - 0xD6,0x5F,0xEC,0xF1,0x6C,0x22,0x3B,0xDB,0x7C,0xDE, - 0x37,0x59,0xCB,0xEE,0x74,0x60,0x40,0x85,0xF2,0xA7, - 0xCE,0x77,0x32,0x6E,0xA6,0x07,0x80,0x84,0x19,0xF8, - 0x50,0x9E,0xE8,0xEF,0xD8,0x55,0x61,0xD9,0x97,0x35, - 0xA9,0x69,0xA7,0xAA,0xC5,0x0C,0x06,0xC2,0x5A,0x04, - 0xAB,0xFC,0x80,0x0B,0xCA,0xDC,0x9E,0x44,0x7A,0x2E, - 0xC3,0x45,0x34,0x84,0xFD,0xD5,0x67,0x05,0x0E,0x1E, - 0x9E,0xC9,0xDB,0x73,0xDB,0xD3,0x10,0x55,0x88,0xCD, - 0x67,0x5F,0xDA,0x79,0xE3,0x67,0x43,0x40,0xC5,0xC4, - 0x34,0x65,0x71,0x3E,0x38,0xD8,0x3D,0x28,0xF8,0x9E, - 0xF1,0x6D,0xFF,0x20,0x15,0x3E,0x21,0xE7,0x8F,0xB0, - 0x3D,0x4A,0xE6,0xE3,0x9F,0x2B,0xDB,0x83,0xAD,0xF7, - 0xE9,0x3D,0x5A,0x68,0x94,0x81,0x40,0xF7,0xF6,0x4C, - 0x26,0x1C,0x94,0x69,0x29,0x34,0x41,0x15,0x20,0xF7, - 0x76,0x02,0xD4,0xF7,0xBC,0xF4,0x6B,0x2E,0xD4,0xA2, - 0x00,0x68,0xD4,0x08,0x24,0x71,0x33,0x20,0xF4,0x6A, - 0x43,0xB7,0xD4,0xB7,0x50,0x00,0x61,0xAF,0x1E,0x39, - 0xF6,0x2E,0x97,0x24,0x45,0x46,0x14,0x21,0x4F,0x74, - 0xBF,0x8B,0x88,0x40,0x4D,0x95,0xFC,0x1D,0x96,0xB5, - 0x91,0xAF,0x70,0xF4,0xDD,0xD3,0x66,0xA0,0x2F,0x45, - 0xBF,0xBC,0x09,0xEC,0x03,0xBD,0x97,0x85,0x7F,0xAC, - 0x6D,0xD0,0x31,0xCB,0x85,0x04,0x96,0xEB,0x27,0xB3, - 0x55,0xFD,0x39,0x41,0xDA,0x25,0x47,0xE6,0xAB,0xCA, - 0x0A,0x9A,0x28,0x50,0x78,0x25,0x53,0x04,0x29,0xF4, - 0x0A,0x2C,0x86,0xDA,0xE9,0xB6,0x6D,0xFB,0x68,0xDC, - 0x14,0x62,0xD7,0x48,0x69,0x00,0x68,0x0E,0xC0,0xA4, - 0x27,0xA1,0x8D,0xEE,0x4F,0x3F,0xFE,0xA2,0xE8,0x87, - 0xAD,0x8C,0xB5,0x8C,0xE0,0x06,0x7A,0xF4,0xD6,0xB6, - 0xAA,0xCE,0x1E,0x7C,0xD3,0x37,0x5F,0xEC,0xCE,0x78, - 0xA3,0x99,0x40,0x6B,0x2A,0x42,0x20,0xFE,0x9E,0x35, - 0xD9,0xF3,0x85,0xB9,0xEE,0x39,0xD7,0xAB,0x3B,0x12, - 0x4E,0x8B,0x1D,0xC9,0xFA,0xF7,0x4B,0x6D,0x18,0x56, - 0x26,0xA3,0x66,0x31,0xEA,0xE3,0x97,0xB2,0x3A,0x6E, - 0xFA,0x74,0xDD,0x5B,0x43,0x32,0x68,0x41,0xE7,0xF7, - 0xCA,0x78,0x20,0xFB,0xFB,0x0A,0xF5,0x4E,0xD8,0xFE, - 0xB3,0x97,0x45,0x40,0x56,0xAC,0xBA,0x48,0x95,0x27, - 0x55,0x53,0x3A,0x3A,0x20,0x83,0x8D,0x87,0xFE,0x6B, - 0xA9,0xB7,0xD0,0x96,0x95,0x4B,0x55,0xA8,0x67,0xBC, - 0xA1,0x15,0x9A,0x58,0xCC,0xA9,0x29,0x63,0x99,0xE1, - 0xDB,0x33,0xA6,0x2A,0x4A,0x56,0x3F,0x31,0x25,0xF9, - 0x5E,0xF4,0x7E,0x1C,0x90,0x29,0x31,0x7C,0xFD,0xF8, - 0xE8,0x02,0x04,0x27,0x2F,0x70,0x80,0xBB,0x15,0x5C, - 0x05,0x28,0x2C,0xE3,0x95,0xC1,0x15,0x48,0xE4,0xC6, - 0x6D,0x22,0x48,0xC1,0x13,0x3F,0xC7,0x0F,0x86,0xDC, - 0x07,0xF9,0xC9,0xEE,0x41,0x04,0x1F,0x0F,0x40,0x47, - 0x79,0xA4,0x5D,0x88,0x6E,0x17,0x32,0x5F,0x51,0xEB, - 0xD5,0x9B,0xC0,0xD1,0xF2,0xBC,0xC1,0x8F,0x41,0x11, - 0x35,0x64,0x25,0x7B,0x78,0x34,0x60,0x2A,0x9C,0x60, - 0xDF,0xF8,0xE8,0xA3,0x1F,0x63,0x6C,0x1B,0x0E,0x12, - 0xB4,0xC2,0x02,0xE1,0x32,0x9E,0xAF,0x66,0x4F,0xD1, - 0xCA,0xD1,0x81,0x15,0x6B,0x23,0x95,0xE0,0x33,0x3E, - 0x92,0xE1,0x3B,0x24,0x0B,0x62,0xEE,0xBE,0xB9,0x22, - 0x85,0xB2,0xA2,0x0E,0xE6,0xBA,0x0D,0x99,0xDE,0x72, - 0x0C,0x8C,0x2D,0xA2,0xF7,0x28,0xD0,0x12,0x78,0x45, - 0x95,0xB7,0x94,0xFD,0x64,0x7D,0x08,0x62,0xE7,0xCC, - 0xF5,0xF0,0x54,0x49,0xA3,0x6F,0x87,0x7D,0x48,0xFA, - 0xC3,0x9D,0xFD,0x27,0xF3,0x3E,0x8D,0x1E,0x0A,0x47, - 0x63,0x41,0x99,0x2E,0xFF,0x74,0x3A,0x6F,0x6E,0xAB, - 0xF4,0xF8,0xFD,0x37,0xA8,0x12,0xDC,0x60,0xA1,0xEB, - 0xDD,0xF8,0x99,0x1B,0xE1,0x4C,0xDB,0x6E,0x6B,0x0D, - 0xC6,0x7B,0x55,0x10,0x6D,0x67,0x2C,0x37,0x27,0x65, - 0xD4,0x3B,0xDC,0xD0,0xE8,0x04,0xF1,0x29,0x0D,0xC7, - 0xCC,0x00,0xFF,0xA3,0xB5,0x39,0x0F,0x92,0x69,0x0F, - 0xED,0x0B,0x66,0x7B,0x9F,0xFB,0xCE,0xDB,0x7D,0x9C, - 0xA0,0x91,0xCF,0x0B,0xD9,0x15,0x5E,0xA3,0xBB,0x13, - 0x2F,0x88,0x51,0x5B,0xAD,0x24,0x7B,0x94,0x79,0xBF, - 0x76,0x3B,0xD6,0xEB,0x37,0x39,0x2E,0xB3,0xCC,0x11, - 0x59,0x79,0x80,0x26,0xE2,0x97,0xF4,0x2E,0x31,0x2D, - 0x68,0x42,0xAD,0xA7,0xC6,0x6A,0x2B,0x3B,0x12,0x75, - 0x4C,0xCC,0x78,0x2E,0xF1,0x1C,0x6A,0x12,0x42,0x37, - 0xB7,0x92,0x51,0xE7,0x06,0xA1,0xBB,0xE6,0x4B,0xFB, - 0x63,0x50,0x1A,0x6B,0x10,0x18,0x11,0xCA,0xED,0xFA, - 0x3D,0x25,0xBD,0xD8,0xE2,0xE1,0xC3,0xC9,0x44,0x42, - 0x16,0x59,0x0A,0x12,0x13,0x86,0xD9,0x0C,0xEC,0x6E, - 0xD5,0xAB,0xEA,0x2A,0x64,0xAF,0x67,0x4E,0xDA,0x86, - 0xA8,0x5F,0xBE,0xBF,0xE9,0x88,0x64,0xE4,0xC3,0xFE, - 0x9D,0xBC,0x80,0x57,0xF0,0xF7,0xC0,0x86,0x60,0x78, - 0x7B,0xF8,0x60,0x03,0x60,0x4D,0xD1,0xFD,0x83,0x46, - 0xF6,0x38,0x1F,0xB0,0x77,0x45,0xAE,0x04,0xD7,0x36, - 0xFC,0xCC,0x83,0x42,0x6B,0x33,0xF0,0x1E,0xAB,0x71, - 0xB0,0x80,0x41,0x87,0x3C,0x00,0x5E,0x5F,0x77,0xA0, - 0x57,0xBE,0xBD,0xE8,0xAE,0x24,0x55,0x46,0x42,0x99, - 0xBF,0x58,0x2E,0x61,0x4E,0x58,0xF4,0x8F,0xF2,0xDD, - 0xFD,0xA2,0xF4,0x74,0xEF,0x38,0x87,0x89,0xBD,0xC2, - 0x53,0x66,0xF9,0xC3,0xC8,0xB3,0x8E,0x74,0xB4,0x75, - 0xF2,0x55,0x46,0xFC,0xD9,0xB9,0x7A,0xEB,0x26,0x61, - 0x8B,0x1D,0xDF,0x84,0x84,0x6A,0x0E,0x79,0x91,0x5F, - 0x95,0xE2,0x46,0x6E,0x59,0x8E,0x20,0xB4,0x57,0x70, - 0x8C,0xD5,0x55,0x91,0xC9,0x02,0xDE,0x4C,0xB9,0x0B, - 0xAC,0xE1,0xBB,0x82,0x05,0xD0,0x11,0xA8,0x62,0x48, - 0x75,0x74,0xA9,0x9E,0xB7,0x7F,0x19,0xB6,0xE0,0xA9, - 0xDC,0x09,0x66,0x2D,0x09,0xA1,0xC4,0x32,0x46,0x33, - 0xE8,0x5A,0x1F,0x02,0x09,0xF0,0xBE,0x8C,0x4A,0x99, - 0xA0,0x25,0x1D,0x6E,0xFE,0x10,0x1A,0xB9,0x3D,0x1D, - 0x0B,0xA5,0xA4,0xDF,0xA1,0x86,0xF2,0x0F,0x28,0x68, - 0xF1,0x69,0xDC,0xB7,0xDA,0x83,0x57,0x39,0x06,0xFE, - 0xA1,0xE2,0xCE,0x9B,0x4F,0xCD,0x7F,0x52,0x50,0x11, - 0x5E,0x01,0xA7,0x06,0x83,0xFA,0xA0,0x02,0xB5,0xC4, - 0x0D,0xE6,0xD0,0x27,0x9A,0xF8,0x8C,0x27,0x77,0x3F, - 0x86,0x41,0xC3,0x60,0x4C,0x06,0x61,0xA8,0x06,0xB5, - 0xF0,0x17,0x7A,0x28,0xC0,0xF5,0x86,0xE0,0x00,0x60, - 0x58,0xAA,0x30,0xDC,0x7D,0x62,0x11,0xE6,0x9E,0xD7, - 0x23,0x38,0xEA,0x63,0x53,0xC2,0xDD,0x94,0xC2,0xC2, - 0x16,0x34,0xBB,0xCB,0xEE,0x56,0x90,0xBC,0xB6,0xDE, - 0xEB,0xFC,0x7D,0xA1,0xCE,0x59,0x1D,0x76,0x6F,0x05, - 0xE4,0x09,0x4B,0x7C,0x01,0x88,0x39,0x72,0x0A,0x3D, - 0x7C,0x92,0x7C,0x24,0x86,0xE3,0x72,0x5F,0x72,0x4D, - 0x9D,0xB9,0x1A,0xC1,0x5B,0xB4,0xD3,0x9E,0xB8,0xFC, - 0xED,0x54,0x55,0x78,0x08,0xFC,0xA5,0xB5,0xD8,0x3D, - 0x7C,0xD3,0x4D,0xAD,0x0F,0xC4,0x1E,0x50,0xEF,0x5E, - 0xB1,0x61,0xE6,0xF8,0xA2,0x85,0x14,0xD9,0x6C,0x51, - 0x13,0x3C,0x6F,0xD5,0xC7,0xE7,0x56,0xE1,0x4E,0xC4, - 0x36,0x2A,0xBF,0xCE,0xDD,0xC6,0xC8,0x37,0xD7,0x9A, - 0x32,0x34,0x92,0x63,0x82,0x12,0x67,0x0E,0xFA,0x8E, - 0x40,0x60,0x00,0xE0,0x3A,0x39,0xCE,0x37,0xD3,0xFA, - 0xF5,0xCF,0xAB,0xC2,0x77,0x37,0x5A,0xC5,0x2D,0x1B, - 0x5C,0xB0,0x67,0x9E,0x4F,0xA3,0x37,0x42,0xD3,0x82, - 0x27,0x40,0x99,0xBC,0x9B,0xBE,0xD5,0x11,0x8E,0x9D, - 0xBF,0x0F,0x73,0x15,0xD6,0x2D,0x1C,0x7E,0xC7,0x00, - 0xC4,0x7B,0xB7,0x8C,0x1B,0x6B,0x21,0xA1,0x90,0x45, - 0xB2,0x6E,0xB1,0xBE,0x6A,0x36,0x6E,0xB4,0x57,0x48, - 0xAB,0x2F,0xBC,0x94,0x6E,0x79,0xC6,0xA3,0x76,0xD2, - 0x65,0x49,0xC2,0xC8,0x53,0x0F,0xF8,0xEE,0x46,0x8D, - 0xDE,0x7D,0xD5,0x73,0x0A,0x1D,0x4C,0xD0,0x4D,0xC6, - 0x29,0x39,0xBB,0xDB,0xA9,0xBA,0x46,0x50,0xAC,0x95, - 0x26,0xE8,0xBE,0x5E,0xE3,0x04,0xA1,0xFA,0xD5,0xF0, - 0x6A,0x2D,0x51,0x9A,0x63,0xEF,0x8C,0xE2,0x9A,0x86, - 0xEE,0x22,0xC0,0x89,0xC2,0xB8,0x43,0x24,0x2E,0xF6, - 0xA5,0x1E,0x03,0xAA,0x9C,0xF2,0xD0,0xA4,0x83,0xC0, - 0x61,0xBA,0x9B,0xE9,0x6A,0x4D,0x8F,0xE5,0x15,0x50, - 0xBA,0x64,0x5B,0xD6,0x28,0x26,0xA2,0xF9,0xA7,0x3A, - 0x3A,0xE1,0x4B,0xA9,0x95,0x86,0xEF,0x55,0x62,0xE9, - 0xC7,0x2F,0xEF,0xD3,0xF7,0x52,0xF7,0xDA,0x3F,0x04, - 0x6F,0x69,0x77,0xFA,0x0A,0x59,0x80,0xE4,0xA9,0x15, - 0x87,0xB0,0x86,0x01,0x9B,0x09,0xE6,0xAD,0x3B,0x3E, - 0xE5,0x93,0xE9,0x90,0xFD,0x5A,0x9E,0x34,0xD7,0x97, - 0x2C,0xF0,0xB7,0xD9,0x02,0x2B,0x8B,0x51,0x96,0xD5, - 0xAC,0x3A,0x01,0x7D,0xA6,0x7D,0xD1,0xCF,0x3E,0xD6, - 0x7C,0x7D,0x2D,0x28,0x1F,0x9F,0x25,0xCF,0xAD,0xF2, - 0xB8,0x9B,0x5A,0xD6,0xB4,0x72,0x5A,0x88,0xF5,0x4C, - 0xE0,0x29,0xAC,0x71,0xE0,0x19,0xA5,0xE6,0x47,0xB0, - 0xAC,0xFD,0xED,0x93,0xFA,0x9B,0xE8,0xD3,0xC4,0x8D, - 0x28,0x3B,0x57,0xCC,0xF8,0xD5,0x66,0x29,0x79,0x13, - 0x2E,0x28,0x78,0x5F,0x01,0x91,0xED,0x75,0x60,0x55, - 0xF7,0x96,0x0E,0x44,0xE3,0xD3,0x5E,0x8C,0x15,0x05, - 0x6D,0xD4,0x88,0xF4,0x6D,0xBA,0x03,0xA1,0x61,0x25, - 0x05,0x64,0xF0,0xBD,0xC3,0xEB,0x9E,0x15,0x3C,0x90, - 0x57,0xA2,0x97,0x27,0x1A,0xEC,0xA9,0x3A,0x07,0x2A, - 0x1B,0x3F,0x6D,0x9B,0x1E,0x63,0x21,0xF5,0xF5,0x9C, - 0x66,0xFB,0x26,0xDC,0xF3,0x19,0x75,0x33,0xD9,0x28, - 0xB1,0x55,0xFD,0xF5,0x03,0x56,0x34,0x82,0x8A,0xBA, - 0x3C,0xBB,0x28,0x51,0x77,0x11,0xC2,0x0A,0xD9,0xF8, - 0xAB,0xCC,0x51,0x67,0xCC,0xAD,0x92,0x5F,0x4D,0xE8, - 0x17,0x51,0x38,0x30,0xDC,0x8E,0x37,0x9D,0x58,0x62, - 0x93,0x20,0xF9,0x91,0xEA,0x7A,0x90,0xC2,0xFB,0x3E, - 0x7B,0xCE,0x51,0x21,0xCE,0x64,0x77,0x4F,0xBE,0x32, - 0xA8,0xB6,0xE3,0x7E,0xC3,0x29,0x3D,0x46,0x48,0xDE, - 0x53,0x69,0x64,0x13,0xE6,0x80,0xA2,0xAE,0x08,0x10, - 0xDD,0x6D,0xB2,0x24,0x69,0x85,0x2D,0xFD,0x09,0x07, - 0x21,0x66,0xB3,0x9A,0x46,0x0A,0x64,0x45,0xC0,0xDD, - 0x58,0x6C,0xDE,0xCF,0x1C,0x20,0xC8,0xAE,0x5B,0xBE, - 0xF7,0xDD,0x1B,0x58,0x8D,0x40,0xCC,0xD2,0x01,0x7F, - 0x6B,0xB4,0xE3,0xBB,0xDD,0xA2,0x6A,0x7E,0x3A,0x59, - 0xFF,0x45,0x3E,0x35,0x0A,0x44,0xBC,0xB4,0xCD,0xD5, - 0x72,0xEA,0xCE,0xA8,0xFA,0x64,0x84,0xBB,0x8D,0x66, - 0x12,0xAE,0xBF,0x3C,0x6F,0x47,0xD2,0x9B,0xE4,0x63, - 0x54,0x2F,0x5D,0x9E,0xAE,0xC2,0x77,0x1B,0xF6,0x4E, - 0x63,0x70,0x74,0x0E,0x0D,0x8D,0xE7,0x5B,0x13,0x57, - 0xF8,0x72,0x16,0x71,0xAF,0x53,0x7D,0x5D,0x40,0x40, - 0xCB,0x08,0x4E,0xB4,0xE2,0xCC,0x34,0xD2,0x46,0x6A, - 0x01,0x15,0xAF,0x84,0xE1,0xB0,0x04,0x28,0x95,0x98, - 0x3A,0x1D,0x06,0xB8,0x9F,0xB4,0xCE,0x6E,0xA0,0x48, - 0x6F,0x3F,0x3B,0x82,0x35,0x20,0xAB,0x82,0x01,0x1A, - 0x1D,0x4B,0x27,0x72,0x27,0xF8,0x61,0x15,0x60,0xB1, - 0xE7,0x93,0x3F,0xDC,0xBB,0x3A,0x79,0x2B,0x34,0x45, - 0x25,0xBD,0xA0,0x88,0x39,0xE1,0x51,0xCE,0x79,0x4B, - 0x2F,0x32,0xC9,0xB7,0xA0,0x1F,0xBA,0xC9,0xE0,0x1C, - 0xC8,0x7E,0xBC,0xC7,0xD1,0xF6,0xCF,0x01,0x11,0xC3, - 0xA1,0xE8,0xAA,0xC7,0x1A,0x90,0x87,0x49,0xD4,0x4F, - 0xBD,0x9A,0xD0,0xDA,0xDE,0xCB,0xD5,0x0A,0xDA,0x38, - 0x03,0x39,0xC3,0x2A,0xC6,0x91,0x36,0x67,0x8D,0xF9, - 0x31,0x7C,0xE0,0xB1,0x2B,0x4F,0xF7,0x9E,0x59,0xB7, - 0x43,0xF5,0xBB,0x3A,0xF2,0xD5,0x19,0xFF,0x27,0xD9, - 0x45,0x9C,0xBF,0x97,0x22,0x2C,0x15,0xE6,0xFC,0x2A, - 0x0F,0x91,0xFC,0x71,0x9B,0x94,0x15,0x25,0xFA,0xE5, - 0x93,0x61,0xCE,0xB6,0x9C,0xEB,0xC2,0xA8,0x64,0x59, - 0x12,0xBA,0xA8,0xD1,0xB6,0xC1,0x07,0x5E,0xE3,0x05, - 0x6A,0x0C,0x10,0xD2,0x50,0x65,0xCB,0x03,0xA4,0x42, - 0xE0,0xEC,0x6E,0x0E,0x16,0x98,0xDB,0x3B,0x4C,0x98, - 0xA0,0xBE,0x32,0x78,0xE9,0x64,0x9F,0x1F,0x95,0x32, - 0xE0,0xD3,0x92,0xDF,0xD3,0xA0,0x34,0x2B,0x89,0x71, - 0xF2,0x1E,0x1B,0x0A,0x74,0x41,0x4B,0xA3,0x34,0x8C, - 0xC5,0xBE,0x71,0x20,0xC3,0x76,0x32,0xD8,0xDF,0x35, - 0x9F,0x8D,0x9B,0x99,0x2F,0x2E,0xE6,0x0B,0x6F,0x47, - 0x0F,0xE3,0xF1,0x1D,0xE5,0x4C,0xDA,0x54,0x1E,0xDA, - 0xD8,0x91,0xCE,0x62,0x79,0xCF,0xCD,0x3E,0x7E,0x6F, - 0x16,0x18,0xB1,0x66,0xFD,0x2C,0x1D,0x05,0x84,0x8F, - 0xD2,0xC5,0xF6,0xFB,0x22,0x99,0xF5,0x23,0xF3,0x57, - 0xA6,0x32,0x76,0x23,0x93,0xA8,0x35,0x31,0x56,0xCC, - 0xCD,0x02,0xAC,0xF0,0x81,0x62,0x5A,0x75,0xEB,0xB5, - 0x6E,0x16,0x36,0x97,0x88,0xD2,0x73,0xCC,0xDE,0x96, - 0x62,0x92,0x81,0xB9,0x49,0xD0,0x4C,0x50,0x90,0x1B, - 0x71,0xC6,0x56,0x14,0xE6,0xC6,0xC7,0xBD,0x32,0x7A, - 0x14,0x0A,0x45,0xE1,0xD0,0x06,0xC3,0xF2,0x7B,0x9A, - 0xC9,0xAA,0x53,0xFD,0x62,0xA8,0x0F,0x00,0xBB,0x25, - 0xBF,0xE2,0x35,0xBD,0xD2,0xF6,0x71,0x12,0x69,0x05, - 0xB2,0x04,0x02,0x22,0xB6,0xCB,0xCF,0x7C,0xCD,0x76, - 0x9C,0x2B,0x53,0x11,0x3E,0xC0,0x16,0x40,0xE3,0xD3, - 0x38,0xAB,0xBD,0x60,0x25,0x47,0xAD,0xF0,0xBA,0x38, - 0x20,0x9C,0xF7,0x46,0xCE,0x76,0x77,0xAF,0xA1,0xC5, - 0x20,0x75,0x60,0x60,0x85,0xCB,0xFE,0x4E,0x8A,0xE8, - 0x8D,0xD8,0x7A,0xAA,0xF9,0xB0,0x4C,0xF9,0xAA,0x7E, - 0x19,0x48,0xC2,0x5C,0x02,0xFB,0x8A,0x8C,0x01,0xC3, - 0x6A,0xE4,0xD6,0xEB,0xE1,0xF9,0x90,0xD4,0xF8,0x69, - 0xA6,0x5C,0xDE,0xA0,0x3F,0x09,0x25,0x2D,0xC2,0x08, - 0xE6,0x9F,0xB7,0x4E,0x61,0x32,0xCE,0x77,0xE2,0x5B, - 0x57,0x8F,0xDF,0xE3,0x3A,0xC3,0x72,0xE6,0xB8,0x3A, - 0xCB,0x02,0x20,0x02,0x39,0x7A,0x6E,0xC6,0xFB,0x5B, - 0xFF,0xCF,0xD4,0xDD,0x4C,0xBF,0x5E,0xD1,0xF4,0x3F, - 0xE5,0x82,0x3E,0xF4,0xE8,0x23,0x2D,0x15,0x2A,0xF0, - 0xE7,0x18,0xC9,0x70,0x59,0xBD,0x98,0x20,0x1F,0x4A, - 0x9D,0x62,0xE7,0xA5,0x29,0xBA,0x89,0xE1,0x24,0x8D, - 0x3B,0xF8,0x86,0x56,0xC5,0x11,0x4D,0x0E,0xBC,0x4C, - 0xEE,0x16,0x03,0x4D,0x8A,0x39,0x20,0xE4,0x78,0x82, - 0xE9,0xAE,0x8F,0xBD,0xE3,0xAB,0xDC,0x1F,0x6D,0xA5, - 0x1E,0x52,0x5D,0xB2,0xBA,0xE1,0x01,0xF8,0x6E,0x7A, - 0x6D,0x9C,0x68,0xA9,0x27,0x08,0xFC,0xD9,0x29,0x3C, - 0xBC,0x0C,0xB0,0x3C,0x86,0xF8,0xA8,0xAD,0x2C,0x2F, - 0x00,0x42,0x4E,0xEB,0xCA,0xCB,0x45,0x2D,0x89,0xCC, - 0x71,0xFC,0xD5,0x9C,0x7F,0x91,0x7F,0x06,0x22,0xBC, - 0x6D,0x8A,0x08,0xB1,0x83,0x4D,0x21,0x32,0x68,0x84, - 0xCA,0x82,0xE3,0xAA,0xCB,0xF3,0x77,0x86,0xF2,0xFA, - 0x2C,0xAB,0x6E,0x3D,0xCE,0x53,0x5A,0xD1,0xF2,0x0A, - 0xC6,0x07,0xC6,0xB8,0xE1,0x4F,0x5E,0xB4,0x38,0x8E, - 0x77,0x50,0x14,0xA6,0x65,0x66,0x65,0xF7,0xB6,0x4A, - 0x43,0xE4,0xBA,0x38,0x3D,0x01,0xB2,0xE4,0x10,0x79, - 0x8E,0xB2,0x98,0x6F,0x90,0x9E,0x0C,0xA4,0x1F,0x7B, - 0x37,0x77,0x2C,0x12,0x60,0x30,0x85,0x08,0x87,0x18, - 0xC4,0xE7,0xD1,0xBD,0x40,0x65,0xFF,0xCE,0x83,0x92, - 0xFD,0x8A,0xAA,0x36,0xD1,0x2B,0xB4,0xC8,0xC9,0xD0, - 0x99,0x4F,0xB0,0xB7,0x14,0xF9,0x68,0x18,0xF9,0xA5, - 0x39,0x98,0xA0,0xA1,0x78,0xC6,0x26,0x84,0xA8,0x1E, - 0x8A,0xE9,0x72,0xF6,0xB8,0x42,0x5E,0xB6,0x7A,0x29, - 0xD4,0x86,0x55,0x1B,0xD7,0x19,0xAF,0x32,0xC1,0x89, - 0xD5,0x14,0x55,0x05,0xDC,0x81,0xD5,0x3E,0x48,0x42, - 0x4E,0xDA,0xB7,0x96,0xEF,0x46,0xA0,0x49,0x8F,0x03, - 0x66,0x7D,0xEE,0xDE,0x03,0xAC,0x0A,0xB3,0xC4,0x97, - 0x73,0x3D,0x53,0x16,0xA8,0x91,0x30,0xA8,0x8F,0xCC, - 0x96,0x04,0x44,0x0A,0xCE,0xEB,0x89,0x3A,0x77,0x25, - 0xB8,0x2B,0x0E,0x1E,0xF6,0x9D,0x30,0x2A,0x5C,0x8E, - 0xE7,0xB8,0x4D,0xEF,0x5A,0x31,0xB0,0x96,0xC9,0xEB, - 0xF8,0x8D,0x51,0x2D,0x78,0x8E,0x7E,0x40,0x02,0xEE, - 0x87,0xE0,0x2A,0xF6,0xC3,0x58,0xA1,0xBB,0x02,0xE8, - 0xD7,0xAF,0xDF,0x9F,0xB0,0xE7,0x79,0x0E,0x94,0x2A, - 0x3B,0x3C,0x1A,0xBA,0xC6,0xFF,0xA7,0xAF,0x9D,0xF7, - 0x96,0xF9,0x32,0x1B,0xB9,0x94,0x01,0x74,0xA8,0xA8, - 0xED,0x22,0x16,0x2C,0xCF,0xF1,0xBB,0x99,0xDA,0xA8, - 0xD5,0x51,0xA4,0xD5,0xE4,0x4B,0xEC,0xDD,0xE3,0xEC, - 0xA8,0x0D,0xC5,0x09,0x03,0x93,0xEE,0xF2,0x72,0x52, - 0x3D,0x31,0xD4,0x8E,0x3A,0x1C,0x22,0x4E,0xB6,0x5E, - 0x60,0x52,0xC3,0xA4,0x21,0x09,0xC3,0x2F,0x05,0x2E, - 0xE3,0x88,0xED,0x9F,0x7E,0xA9,0x91,0xC6,0x2F,0x97, - 0x77,0xB5,0x5B,0xA0,0x15,0x0C,0xBC,0xA3,0x3A,0xEC, - 0x65,0x25,0xDF,0x31,0x83,0x83,0x43,0xA9,0xCE,0x26, - 0x93,0x62,0xAD,0x8B,0x01,0x34,0x14,0x0B,0x8D,0xF5, - 0xCF,0x81,0x1E,0x9F,0xF5,0x59,0x16,0x7F,0x05,0x64, - 0x38,0x12,0xF4,0xE0,0x58,0x8A,0x52,0xB0,0xCB,0xB8, - 0xE9,0x44,0xEF,0x5B,0x16,0xA3,0x73,0xC4,0xED,0xA1, - 0x7D,0xFC,0xFE,0xEA,0xF5,0x4B,0xCB,0xBE,0x87,0x73, - 0xE3,0xD2,0xC5,0x31,0xDC,0xD0,0x55,0xC4,0x67,0x29, - 0x52,0x77,0x4F,0x3A,0x57,0xCA,0x6B,0xC0,0x46,0x7D, - 0x3A,0x3B,0x24,0x77,0x84,0x25,0xB7,0x99,0x1E,0x9A, - 0xDD,0x82,0x5C,0x26,0xE4,0x52,0xC8,0xEE,0xFC,0xAC, - 0xDE,0x1E,0x84,0x83,0x3A,0xF3,0x61,0x21,0x1D,0x03, - 0x17,0x32,0xC1,0x31,0xCC,0xAD,0xB2,0x47,0xE6,0x06, - 0xBE,0x8C,0x71,0x2B,0x39,0xF1,0x88,0xB4,0xEF,0x39, - 0x3A,0x9F,0xCD,0xC5,0xC5,0x75,0x51,0x69,0x1F,0xF6, - 0x99,0x4F,0x39,0x82,0x9C,0xB0,0x11,0x01,0x65,0x73, - 0x33,0x43,0xCB,0xEB,0x61,0xD3,0xD0,0xB4,0x44,0xF3, - 0x0A,0xEF,0xA8,0xAE,0x73,0x75,0x2A,0x3A,0x1C,0x9D, - 0xB4,0xB7,0x09,0x14,0xD6,0xAB,0x25,0x0C,0x85,0x3B, - 0x73,0x28,0x49,0x5F,0x94,0x8F,0xD2,0xA4,0xED,0x8E, - 0x6C,0xF7,0x51,0xE4,0xC3,0x20,0xBB,0x75,0xD9,0xCA, - 0xA0,0xB3,0x8B,0xA5,0x62,0x62,0x4E,0x84,0xB0,0x3F, - 0xEE,0xA8,0x07,0x6E,0x74,0xA0,0x7F,0xE5,0x80,0x39, - 0xE0,0x0C,0x36,0xFF,0xDA,0xF8,0x03,0x73,0x13,0x58, - 0xB9,0xE6,0x71,0xB9,0xDA,0xC4,0xCE,0x1C,0xB2,0x5B, - 0x10,0xED,0x4D,0xD3,0xD5,0xB1,0xFC,0xF2,0xB4,0x80, - 0x46,0x34,0xF5,0x79,0x25,0xEA,0xC4,0x00,0xA9,0xAC, - 0x55,0xEA,0x72,0x89,0x32,0xDF,0x06,0x04,0x1D,0x05, - 0x5D,0x31,0xF5,0x02,0xC5,0x39,0xC2,0xE3,0x2B,0x89, - 0xD9,0xDB,0x5B,0xCC,0x0A,0x98,0xC0,0x5B,0xFD,0x6F, - 0x1B,0x25,0x06,0x22,0x2E,0x21,0xBE,0x0E,0x60,0x97, - 0x3B,0x04,0xEC,0xD5,0x4A,0x67,0xB5,0x4F,0xE6,0x38, - 0xA6,0xED,0x66,0x15,0x98,0x1A,0x91,0x0A,0x5D,0x92, - 0x92,0x8D,0xAC,0x6F,0xC6,0x97,0xE7,0x3C,0x63,0xAD, - 0x45,0x6E,0xDF,0x5F,0x45,0x7A,0x81,0x45,0x51,0x87, - 0x5A,0x64,0xCD,0x30,0x99,0xF1,0x69,0xB5,0xF1,0x8A, - 0x8C,0x73,0xEE,0x0B,0x5E,0x57,0x36,0x8F,0x6C,0x79, - 0xF4,0xBB,0x7A,0x59,0x59,0x26,0xAA,0xB4,0x9E,0xC6, - 0x8A,0xC8,0xFC,0xFB,0x80,0x00, -0x0}; diff --git a/hecl/extern/blowfish/BLOWFISH.H b/hecl/extern/blowfish/BLOWFISH.H deleted file mode 100644 index f89d251b1..000000000 --- a/hecl/extern/blowfish/BLOWFISH.H +++ /dev/null @@ -1,8 +0,0 @@ -#define MAXKEYBYTES 56 /* 448 bits */ -// #define little_endian 1 /* Eg: Intel */ -#define big_endian 1 /* Eg: Motorola */ - -short opensubkeyfile(void); -unsigned long F(unsigned long x); -void Blowfish_encipher(unsigned long *xl, unsigned long *xr); -void Blowfish_decipher(unsigned long *xl, unsigned long *xr); diff --git a/hecl/extern/blowfish/blowfish.c b/hecl/extern/blowfish/blowfish.c new file mode 100644 index 000000000..bf5bb0030 --- /dev/null +++ b/hecl/extern/blowfish/blowfish.c @@ -0,0 +1,128 @@ +#include +#include +#include "blowfish.h" + +#define N 16 + +extern const unsigned long BLOWFISH_DAT_P[N + 2]; +extern const unsigned long BLOWFISH_DAT_S[4][256]; + +#define P BLOWFISH_DAT_P +#define S BLOWFISH_DAT_S + +static unsigned long F(unsigned long x) +{ + unsigned short a; + unsigned short b; + unsigned short c; + unsigned short d; + unsigned long y; + + d = x & 0x00FF; + x >>= 8; + c = x & 0x00FF; + x >>= 8; + b = x & 0x00FF; + x >>= 8; + a = x & 0x00FF; + y = S[0][a] + S[1][b]; + y = y ^ S[2][c]; + y = y + S[3][d]; + + return y; +} + +void Blowfish_encipher(unsigned long *xl, unsigned long *xr) +{ + unsigned long Xl; + unsigned long Xr; + unsigned long temp; + short i; + + Xl = *xl; + Xr = *xr; + + for (i = 0; i < N; ++i) { + Xl = Xl ^ P[i]; + Xr = F(Xl) ^ Xr; + + temp = Xl; + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ P[N]; + Xl = Xl ^ P[N + 1]; + + *xl = Xl; + *xr = Xr; +} + +void Blowfish_decipher(unsigned long *xl, unsigned long *xr) +{ + unsigned long Xl; + unsigned long Xr; + unsigned long temp; + short i; + + Xl = *xl; + Xr = *xr; + + for (i = N + 1; i > 1; --i) { + Xl = Xl ^ P[i]; + Xr = F(Xl) ^ Xr; + + /* Exchange Xl and Xr */ + temp = Xl; + Xl = Xr; + Xr = temp; + } + + /* Exchange Xl and Xr */ + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ P[1]; + Xl = Xl ^ P[0]; + + *xl = Xl; + *xr = Xr; +} + +uint64_t Blowfish_hash(void* buf, size_t len) +{ + unsigned i,j; + union + { + unsigned long h32[2]; + uint64_t h64; + } hash = {}; + + for (i=0 ; i +#include + +void Blowfish_encipher(unsigned long *xl, unsigned long *xr); +void Blowfish_decipher(unsigned long *xl, unsigned long *xr); +uint64_t Blowfish_hash(void* buf, size_t len); + +#ifdef __cplusplus +} +#endif diff --git a/hecl/extern/blowfish/blowfish.pro b/hecl/extern/blowfish/blowfish.pro new file mode 100644 index 000000000..85b647aa5 --- /dev/null +++ b/hecl/extern/blowfish/blowfish.pro @@ -0,0 +1,9 @@ +TEMPLATE = lib +CONFIG += staticlib +TARGET = blowfish +CONFIG -= Qt +QT = + +HEADERS += blowfish.h +SOURCES += blowfish.c blowfish.dat.c + diff --git a/hecl/extern/blowfish/cme.py b/hecl/extern/blowfish/cme.py index 09557f26b..edf45f6cc 100644 --- a/hecl/extern/blowfish/cme.py +++ b/hecl/extern/blowfish/cme.py @@ -1,16 +1,104 @@ import struct -with open('BLOWFISH.DAT', 'rb') as fin: - with open('BLOWFISH.DAT.c', 'w') as fout: - fout.write('#include \n') - fin.seek(0, 2) - sz = fin.tell() - fout.write('size_t BLOWFISH_DAT_SZ = %u;\n' % sz) - fout.write('char BLOWFISH_DAT[] = {') - fin.seek(0) - rb = fin.read(1) - for i in range(sz): - if not i%10: + +P = [] +S = [] + +def F(x): + d = x & 0x00FF + x >>= 8 + c = x & 0x00FF + x >>= 8 + b = x & 0x00FF + x >>= 8 + a = x & 0x00FF + #y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d]; + y = S[0][a] + S[1][b] + y = y ^ S[2][c] + y = y + S[3][d] + + return y + +def bfencipher(xl, xr): + Xl = xl + Xr = xr + + for i in range(16): + Xl = Xl ^ P[i] + Xr = F(Xl) ^ Xr + + temp = Xl + Xl = Xr + Xr = temp + + temp = Xl + Xl = Xr + Xr = temp + + Xr = Xr ^ P[16] + Xl = Xl ^ P[16+1] + + return Xl&0xffffffff, Xr&0xffffffff + +key = bytearray() +with open('hecl_key', 'r') as keyin: + b = keyin.read(2) + while len(b): + if len(b) != 2: + break + key += struct.pack('B', int(b, 16)) + b = keyin.read(2) + +if len(key) < 8: + raise RuntimeError('key must be at least 8 bytes in length') + +with open('blowfish.dat', 'rb') as fin: + word = fin.read(4) + for i in range(18): + P.append(struct.unpack(">I", word)[0]) + word = fin.read(4) + for i in range(4): + sub = [] + for j in range(256): + sub.append(struct.unpack(">I", word)[0]) + word = fin.read(4) + S.append(sub) + +j = 0 +for i in range(18): + data = 0x00000000 + for k in range(4): + data = (data << 8) | key[j] + j = j + 1 + if j >= len(key): + j = 0 + P[i] = P[i] ^ data + +datal = 0x00000000 +datar = 0x00000000 + +for i in range(9): + datal, datar = bfencipher(datal, datar) + P[i*2] = datal + P[i*2+1] = datar + +for i in range(4): + for j in range(128): + datal, datar = bfencipher(datal, datar) + S[i][j*2] = datal + S[i][j*2+1] = datar + +with open('blowfish.dat.c', 'w') as fout: + fout.write('const unsigned long BLOWFISH_P[] = {') + for i in range(18): + if not i%4: + fout.write('\n ') + fout.write('0x%08X,' % P[i]) + fout.write('\n};\n') + fout.write('const unsigned long BLOWFISH_S[] = {') + for i in range(4): + for j in range(256): + if not (i*256+j)%4: fout.write('\n ') - fout.write('0x%02X,' % struct.unpack("B", rb)[0]) - rb = fin.read(1) - fout.write('\n0x0};\n') + fout.write('0x%08X,' % S[i][j]) + fout.write('\n};\n') + diff --git a/hecl/extern/blowfish/hecl_key b/hecl/extern/blowfish/hecl_key new file mode 100644 index 000000000..9badf9dc1 --- /dev/null +++ b/hecl/extern/blowfish/hecl_key @@ -0,0 +1 @@ +CA75FA1170DABBAD00BADD00D5B00B51 diff --git a/hecl/hecl.pro b/hecl/hecl.pro index ea769fa68..30a414d2b 100644 --- a/hecl/hecl.pro +++ b/hecl/hecl.pro @@ -17,8 +17,10 @@ HEADERS += \ SUBDIRS += \ extern/sqlite3 \ + extern/blowfish \ lib \ driver -lib.depends = extern/sqlite3 +driver.depends = extern/sqlite3 +driver.depends = extern/blowfish driver.depends = lib