CSSauth.cpp

00001 #include "stdafx.h"
00002 
00003 static void CSSengine(int varient,unsigned char const *input,unsigned char *output);
00004 
00005 void CSSkey1(int varient,unsigned char const *challenge,unsigned char *key)
00006 {
00007         static unsigned char perm_challenge[] = {1,3,0,7,5, 2,9,6,4,8};
00008 
00009         unsigned char scratch[10];
00010         int i;
00011 
00012         for (i = 9; i >= 0; --i)
00013                 scratch[i] = challenge[perm_challenge[i]];
00014 
00015         CSSengine(varient, scratch, key);
00016 }
00017 
00018 void CSSkey2(int varient,unsigned char const *challenge,unsigned char *key)
00019 {
00020         static unsigned char perm_challenge[] = {6,1,9,3,8, 5,7,4,0,2};
00021 
00022         static unsigned char perm_varient[] = {
00023                 0x0a, 0x08, 0x0e, 0x0c, 0x0b, 0x09, 0x0f, 0x0d,
00024                 0x1a, 0x18, 0x1e, 0x1c, 0x1b, 0x19, 0x1f, 0x1d,
00025                 0x02, 0x00, 0x06, 0x04, 0x03, 0x01, 0x07, 0x05,
00026                 0x12, 0x10, 0x16, 0x14, 0x13, 0x11, 0x17, 0x15};
00027 
00028         unsigned char scratch[10];
00029         int i;
00030 
00031         for (i = 9; i >= 0; --i)
00032                 scratch[i] = challenge[perm_challenge[i]];
00033 
00034         CSSengine(perm_varient[varient], scratch, key);
00035 }
00036 
00037 void CSSbuskey(int varient,unsigned char const *challenge,unsigned char *key)
00038 {
00039         static unsigned char perm_challenge[] = {4,0,3,5,7, 2,8,6,1,9};
00040         static unsigned char perm_varient[] = {
00041                 0x12, 0x1a, 0x16, 0x1e, 0x02, 0x0a, 0x06, 0x0e,
00042                 0x10, 0x18, 0x14, 0x1c, 0x00, 0x08, 0x04, 0x0c,
00043                 0x13, 0x1b, 0x17, 0x1f, 0x03, 0x0b, 0x07, 0x0f,
00044                 0x11, 0x19, 0x15, 0x1d, 0x01, 0x09, 0x05, 0x0d};
00045 
00046         unsigned char scratch[10];
00047         int i;
00048 
00049         for (i = 9; i >= 0; --i)
00050                 scratch[i] = challenge[perm_challenge[i]];
00051 
00052         CSSengine(perm_varient[varient], scratch, key);
00053 }
00054 
00055 static void CSSgenbits(unsigned char *output, int len,unsigned char const *s)
00056 {
00057         unsigned long lfsr0, lfsr1;
00058         unsigned char b1_combined; /* Save the old value of bit 1 for feedback */
00059 
00060         /* In order to ensure that the LFSR works we need to ensure that the
00061          * initial values are non-zero.  Thus when we initialise them from
00062          * the seed,  we ensure that a bit is set.
00063          */
00064         lfsr0 = (s[0] << 17) | (s[1] << 9) | ((s[2] & ~7) << 1) | 8 | (s[2] & 7);
00065         lfsr1 = (s[3] << 9) | 0x100 | s[4];
00066 
00067         ++output;
00068 
00069         b1_combined = 0;
00070         do {
00071                 int bit;
00072                 unsigned char val;
00073 
00074                 for (bit = 0, val = 0; bit < 8; ++bit) {
00075                         unsigned char o_lfsr0, o_lfsr1; /* Actually only 1 bit each */
00076                         unsigned char combined;
00077 
00078                         o_lfsr0 = ((lfsr0 >> 24) ^ (lfsr0 >> 21) ^ (lfsr0 >> 20) ^ (lfsr0 >> 12)) & 1;
00079                           lfsr0 = (lfsr0 << 1) | o_lfsr0;
00080 
00081                         o_lfsr1 = ((lfsr1 >> 16) ^ (lfsr1 >> 2)) & 1;
00082                           lfsr1 = (lfsr1 << 1) | o_lfsr1;
00083 
00084 #define  BIT0(x) ((x) & 1)
00085 #define  BIT1(x) (((x) >> 1) & 1)
00086 
00087                         combined = !o_lfsr1 + b1_combined + !o_lfsr0;
00088                         b1_combined = BIT1(combined);
00089                         val |= BIT0(combined) << bit;
00090                 }
00091         
00092                 *--output = val;
00093         } while (--len > 0);
00094 }
00095 
00096 unsigned char CSSsecret[];
00097 unsigned char CSSvarients[];
00098 unsigned char CSStable0[];
00099 unsigned char CSStable1[];
00100 unsigned char CSStable2[];
00101 unsigned char CSStable3[];
00102 
00103 static void CSSengine(int varient, unsigned char const *input,unsigned char *output)
00104 {
00105         unsigned char cse, term, index;
00106         unsigned char temp1[5];
00107         unsigned char temp2[5];
00108         unsigned char bits[30];
00109 
00110         int i;
00111 
00112         /* Feed the CSSsecret into the input values such that
00113          * we alter the seed to the LFSR's used above,  then
00114          * generate the bits to play with.
00115          */
00116         for (i = 5; --i >= 0; )
00117                 temp1[i] = input[5 + i] ^ CSSsecret[i] ^ CSStable2[i];
00118 
00119         CSSgenbits(&bits[29], sizeof bits, temp1);
00120 
00121         /* This term is used throughout the following to
00122          * select one of 32 different variations on the
00123          * algorithm.
00124          */
00125         cse = CSSvarients[varient] ^ CSStable2[varient];
00126 
00127         /* Now the actual blocks doing the encryption.  Each
00128          * of these works on 40 bits at a time and are quite
00129          * similar.
00130          */
00131         for (i = 5, term = 0; --i >= 0; term = input[i]) {
00132                 index = bits[25 + i] ^ input[i];
00133                 index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
00134 
00135                 temp1[i] = CSStable2[index] ^ CSStable3[index] ^ term;
00136         }
00137         temp1[4] ^= temp1[0];
00138 
00139         for (i = 5, term = 0; --i >= 0; term = temp1[i]) {
00140                 index = bits[20 + i] ^ temp1[i];
00141                 index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
00142 
00143                 temp2[i] = CSStable2[index] ^ CSStable3[index] ^ term;
00144         }
00145         temp2[4] ^= temp2[0];
00146 
00147         for (i = 5, term = 0; --i >= 0; term = temp2[i]) {
00148                 index = bits[15 + i] ^ temp2[i];
00149                 index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
00150                 index = CSStable2[index] ^ CSStable3[index] ^ term;
00151 
00152                 temp1[i] = CSStable0[index] ^ CSStable2[index];
00153         }
00154         temp1[4] ^= temp1[0];
00155 
00156         for (i = 5, term = 0; --i >= 0; term = temp1[i]) {
00157                 index = bits[10 + i] ^ temp1[i];
00158                 index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
00159 
00160                 index = CSStable2[index] ^ CSStable3[index] ^ term;
00161 
00162                 temp2[i] = CSStable0[index] ^ CSStable2[index];
00163         }
00164         temp2[4] ^= temp2[0];
00165 
00166         for (i = 5, term = 0; --i >= 0; term = temp2[i]) {
00167                 index = bits[5 + i] ^ temp2[i];
00168                 index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
00169 
00170                 temp1[i] = CSStable2[index] ^ CSStable3[index] ^ term;
00171         }
00172         temp1[4] ^= temp1[0];
00173 
00174         for (i = 5, term = 0; --i >= 0; term = temp1[i]) {
00175                 index = bits[i] ^ temp1[i];
00176                 index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
00177 
00178                 output[i] = CSStable2[index] ^ CSStable3[index] ^ term;
00179         }
00180 }
00181 
00182 static unsigned char CSSvarients[] = {
00183         0xB7, 0x74, 0x85, 0xD0, 0xCC, 0xDB, 0xCA, 0x73,
00184         0x03, 0xFE, 0x31, 0x03, 0x52, 0xE0, 0xB7, 0x42,
00185         0x63, 0x16, 0xF2, 0x2A, 0x79, 0x52, 0xFF, 0x1B,
00186         0x7A, 0x11, 0xCA, 0x1A, 0x9B, 0x40, 0xAD, 0x01};
00187 
00188 static unsigned char CSSsecret[] = {0x55, 0xD6, 0xC4, 0xC5, 0x28};
00189 
00190 static unsigned char CSStable0[] = {
00191         0xB7, 0xF4, 0x82, 0x57, 0xDA, 0x4D, 0xDB, 0xE2,
00192         0x2F, 0x52, 0x1A, 0xA8, 0x68, 0x5A, 0x8A, 0xFF,
00193         0xFB, 0x0E, 0x6D, 0x35, 0xF7, 0x5C, 0x76, 0x12,
00194         0xCE, 0x25, 0x79, 0x29, 0x39, 0x62, 0x08, 0x24,
00195         0xA5, 0x85, 0x7B, 0x56, 0x01, 0x23, 0x68, 0xCF,
00196         0x0A, 0xE2, 0x5A, 0xED, 0x3D, 0x59, 0xB0, 0xA9,
00197         0xB0, 0x2C, 0xF2, 0xB8, 0xEF, 0x32, 0xA9, 0x40,
00198         0x80, 0x71, 0xAF, 0x1E, 0xDE, 0x8F, 0x58, 0x88,
00199         0xB8, 0x3A, 0xD0, 0xFC, 0xC4, 0x1E, 0xB5, 0xA0,
00200         0xBB, 0x3B, 0x0F, 0x01, 0x7E, 0x1F, 0x9F, 0xD9,
00201         0xAA, 0xB8, 0x3D, 0x9D, 0x74, 0x1E, 0x25, 0xDB,
00202         0x37, 0x56, 0x8F, 0x16, 0xBA, 0x49, 0x2B, 0xAC,
00203         0xD0, 0xBD, 0x95, 0x20, 0xBE, 0x7A, 0x28, 0xD0,
00204         0x51, 0x64, 0x63, 0x1C, 0x7F, 0x66, 0x10, 0xBB,
00205         0xC4, 0x56, 0x1A, 0x04, 0x6E, 0x0A, 0xEC, 0x9C,
00206         0xD6, 0xE8, 0x9A, 0x7A, 0xCF, 0x8C, 0xDB, 0xB1,
00207         0xEF, 0x71, 0xDE, 0x31, 0xFF, 0x54, 0x3E, 0x5E,
00208         0x07, 0x69, 0x96, 0xB0, 0xCF, 0xDD, 0x9E, 0x47,
00209         0xC7, 0x96, 0x8F, 0xE4, 0x2B, 0x59, 0xC6, 0xEE,
00210         0xB9, 0x86, 0x9A, 0x64, 0x84, 0x72, 0xE2, 0x5B,
00211         0xA2, 0x96, 0x58, 0x99, 0x50, 0x03, 0xF5, 0x38,
00212         0x4D, 0x02, 0x7D, 0xE7, 0x7D, 0x75, 0xA7, 0xB8,
00213         0x67, 0x87, 0x84, 0x3F, 0x1D, 0x11, 0xE5, 0xFC,
00214         0x1E, 0xD3, 0x83, 0x16, 0xA5, 0x29, 0xF6, 0xC7,
00215         0x15, 0x61, 0x29, 0x1A, 0x43, 0x4F, 0x9B, 0xAF,
00216         0xC5, 0x87, 0x34, 0x6C, 0x0F, 0x3B, 0xA8, 0x1D,
00217         0x45, 0x58, 0x25, 0xDC, 0xA8, 0xA3, 0x3B, 0xD1,
00218         0x79, 0x1B, 0x48, 0xF2, 0xE9, 0x93, 0x1F, 0xFC,
00219         0xDB, 0x2A, 0x90, 0xA9, 0x8A, 0x3D, 0x39, 0x18,
00220         0xA3, 0x8E, 0x58, 0x6C, 0xE0, 0x12, 0xBB, 0x25,
00221         0xCD, 0x71, 0x22, 0xA2, 0x64, 0xC6, 0xE7, 0xFB,
00222         0xAD, 0x94, 0x77, 0x04, 0x9A, 0x39, 0xCF, 0x7C};
00223 
00224 static unsigned char CSStable1[] = {
00225         0x8C, 0x47, 0xB0, 0xE1, 0xEB, 0xFC, 0xEB, 0x56,
00226         0x10, 0xE5, 0x2C, 0x1A, 0x5D, 0xEF, 0xBE, 0x4F,
00227         0x08, 0x75, 0x97, 0x4B, 0x0E, 0x25, 0x8E, 0x6E,
00228         0x39, 0x5A, 0x87, 0x53, 0xC4, 0x1F, 0xF4, 0x5C,
00229         0x4E, 0xE6, 0x99, 0x30, 0xE0, 0x42, 0x88, 0xAB,
00230         0xE5, 0x85, 0xBC, 0x8F, 0xD8, 0x3C, 0x54, 0xC9,
00231         0x53, 0x47, 0x18, 0xD6, 0x06, 0x5B, 0x41, 0x2C,
00232         0x67, 0x1E, 0x41, 0x74, 0x33, 0xE2, 0xB4, 0xE0,
00233         0x23, 0x29, 0x42, 0xEA, 0x55, 0x0F, 0x25, 0xB4,
00234         0x24, 0x2C, 0x99, 0x13, 0xEB, 0x0A, 0x0B, 0xC9,
00235         0xF9, 0x63, 0x67, 0x43, 0x2D, 0xC7, 0x7D, 0x07,
00236         0x60, 0x89, 0xD1, 0xCC, 0xE7, 0x94, 0x77, 0x74,
00237         0x9B, 0x7E, 0xD7, 0xE6, 0xFF, 0xBB, 0x68, 0x14,
00238         0x1E, 0xA3, 0x25, 0xDE, 0x3A, 0xA3, 0x54, 0x7B,
00239         0x87, 0x9D, 0x50, 0xCA, 0x27, 0xC3, 0xA4, 0x50,
00240         0x91, 0x27, 0xD4, 0xB0, 0x82, 0x41, 0x97, 0x79,
00241         0x94, 0x82, 0xAC, 0xC7, 0x8E, 0xA5, 0x4E, 0xAA,
00242         0x78, 0x9E, 0xE0, 0x42, 0xBA, 0x28, 0xEA, 0xB7,
00243         0x74, 0xAD, 0x35, 0xDA, 0x92, 0x60, 0x7E, 0xD2,
00244         0x0E, 0xB9, 0x24, 0x5E, 0x39, 0x4F, 0x5E, 0x63,
00245         0x09, 0xB5, 0xFA, 0xBF, 0xF1, 0x22, 0x55, 0x1C,
00246         0xE2, 0x25, 0xDB, 0xC5, 0xD8, 0x50, 0x03, 0x98,
00247         0xC4, 0xAC, 0x2E, 0x11, 0xB4, 0x38, 0x4D, 0xD0,
00248         0xB9, 0xFC, 0x2D, 0x3C, 0x08, 0x04, 0x5A, 0xEF,
00249         0xCE, 0x32, 0xFB, 0x4C, 0x92, 0x1E, 0x4B, 0xFB,
00250         0x1A, 0xD0, 0xE2, 0x3E, 0xDA, 0x6E, 0x7C, 0x4D,
00251         0x56, 0xC3, 0x3F, 0x42, 0xB1, 0x3A, 0x23, 0x4D,
00252         0x6E, 0x84, 0x56, 0x68, 0xF4, 0x0E, 0x03, 0x64,
00253         0xD0, 0xA9, 0x92, 0x2F, 0x8B, 0xBC, 0x39, 0x9C,
00254         0xAC, 0x09, 0x5E, 0xEE, 0xE5, 0x97, 0xBF, 0xA5,
00255         0xCE, 0xFA, 0x28, 0x2C, 0x6D, 0x4F, 0xEF, 0x77,
00256         0xAA, 0x1B, 0x79, 0x8E, 0x97, 0xB4, 0xC3, 0xF4};
00257 
00258 static unsigned char CSStable2[] = {
00259         0xB7, 0x75, 0x81, 0xD5, 0xDC, 0xCA, 0xDE, 0x66,
00260         0x23, 0xDF, 0x15, 0x26, 0x62, 0xD1, 0x83, 0x77,
00261         0xE3, 0x97, 0x76, 0xAF, 0xE9, 0xC3, 0x6B, 0x8E,
00262         0xDA, 0xB0, 0x6E, 0xBF, 0x2B, 0xF1, 0x19, 0xB4,
00263         0x95, 0x34, 0x48, 0xE4, 0x37, 0x94, 0x5D, 0x7B,
00264         0x36, 0x5F, 0x65, 0x53, 0x07, 0xE2, 0x89, 0x11,
00265         0x98, 0x85, 0xD9, 0x12, 0xC1, 0x9D, 0x84, 0xEC,
00266         0xA4, 0xD4, 0x88, 0xB8, 0xFC, 0x2C, 0x79, 0x28,
00267         0xD8, 0xDB, 0xB3, 0x1E, 0xA2, 0xF9, 0xD0, 0x44,
00268         0xD7, 0xD6, 0x60, 0xEF, 0x14, 0xF4, 0xF6, 0x31,
00269         0xD2, 0x41, 0x46, 0x67, 0x0A, 0xE1, 0x58, 0x27,
00270         0x43, 0xA3, 0xF8, 0xE0, 0xC8, 0xBA, 0x5A, 0x5C,
00271         0x80, 0x6C, 0xC6, 0xF2, 0xE8, 0xAD, 0x7D, 0x04,
00272         0x0D, 0xB9, 0x3C, 0xC2, 0x25, 0xBD, 0x49, 0x63,
00273         0x8C, 0x9F, 0x51, 0xCE, 0x20, 0xC5, 0xA1, 0x50,
00274         0x92, 0x2D, 0xDD, 0xBC, 0x8D, 0x4F, 0x9A, 0x71,
00275         0x2F, 0x30, 0x1D, 0x73, 0x39, 0x13, 0xFB, 0x1A,
00276         0xCB, 0x24, 0x59, 0xFE, 0x05, 0x96, 0x57, 0x0F,
00277         0x1F, 0xCF, 0x54, 0xBE, 0xF5, 0x06, 0x1B, 0xB2,
00278         0x6D, 0xD3, 0x4D, 0x32, 0x56, 0x21, 0x33, 0x0B,
00279         0x52, 0xE7, 0xAB, 0xEB, 0xA6, 0x74, 0x00, 0x4C,
00280         0xB1, 0x7F, 0x82, 0x99, 0x87, 0x0E, 0x5E, 0xC0,
00281         0x8F, 0xEE, 0x6F, 0x55, 0xF3, 0x7E, 0x08, 0x90,
00282         0xFA, 0xB6, 0x64, 0x70, 0x47, 0x4A, 0x17, 0xA7,
00283         0xB5, 0x40, 0x8A, 0x38, 0xE5, 0x68, 0x3E, 0x8B,
00284         0x69, 0xAA, 0x9B, 0x42, 0xA5, 0x10, 0x01, 0x35,
00285         0xFD, 0x61, 0x9E, 0xE6, 0x16, 0x9C, 0x86, 0xED,
00286         0xCD, 0x2E, 0xFF, 0xC4, 0x5B, 0xA0, 0xAE, 0xCC,
00287         0x4B, 0x3B, 0x03, 0xBB, 0x1C, 0x2A, 0xAC, 0x0C,
00288         0x3F, 0x93, 0xC7, 0x72, 0x7A, 0x09, 0x22, 0x3D,
00289         0x45, 0x78, 0xA9, 0xA8, 0xEA, 0xC9, 0x6A, 0xF7,
00290         0x29, 0x91, 0xF0, 0x02, 0x18, 0x3A, 0x4E, 0x7C};
00291 
00292 static unsigned char CSStable3[] = {
00293         0x73, 0x51, 0x95, 0xE1, 0x12, 0xE4, 0xC0, 0x58,
00294         0xEE, 0xF2, 0x08, 0x1B, 0xA9, 0xFA, 0x98, 0x4C,
00295         0xA7, 0x33, 0xE2, 0x1B, 0xA7, 0x6D, 0xF5, 0x30,
00296         0x97, 0x1D, 0xF3, 0x02, 0x60, 0x5A, 0x82, 0x0F,
00297         0x91, 0xD0, 0x9C, 0x10, 0x39, 0x7A, 0x83, 0x85,
00298         0x3B, 0xB2, 0xB8, 0xAE, 0x0C, 0x09, 0x52, 0xEA,
00299         0x1C, 0xE1, 0x8D, 0x66, 0x4F, 0xF3, 0xDA, 0x92,
00300         0x29, 0xB9, 0xD5, 0xC5, 0x77, 0x47, 0x22, 0x53,
00301         0x14, 0xF7, 0xAF, 0x22, 0x64, 0xDF, 0xC6, 0x72,
00302         0x12, 0xF3, 0x75, 0xDA, 0xD7, 0xD7, 0xE5, 0x02,
00303         0x9E, 0xED, 0xDA, 0xDB, 0x4C, 0x47, 0xCE, 0x91,
00304         0x06, 0x06, 0x6D, 0x55, 0x8B, 0x19, 0xC9, 0xEF,
00305         0x8C, 0x80, 0x1A, 0x0E, 0xEE, 0x4B, 0xAB, 0xF2,
00306         0x08, 0x5C, 0xE9, 0x37, 0x26, 0x5E, 0x9A, 0x90,
00307         0x00, 0xF3, 0x0D, 0xB2, 0xA6, 0xA3, 0xF7, 0x26,
00308         0x17, 0x48, 0x88, 0xC9, 0x0E, 0x2C, 0xC9, 0x02,
00309         0xE7, 0x18, 0x05, 0x4B, 0xF3, 0x39, 0xE1, 0x20,
00310         0x02, 0x0D, 0x40, 0xC7, 0xCA, 0xB9, 0x48, 0x30,
00311         0x57, 0x67, 0xCC, 0x06, 0xBF, 0xAC, 0x81, 0x08,
00312         0x24, 0x7A, 0xD4, 0x8B, 0x19, 0x8E, 0xAC, 0xB4,
00313         0x5A, 0x0F, 0x73, 0x13, 0xAC, 0x9E, 0xDA, 0xB6,
00314         0xB8, 0x96, 0x5B, 0x60, 0x88, 0xE1, 0x81, 0x3F,
00315         0x07, 0x86, 0x37, 0x2D, 0x79, 0x14, 0x52, 0xEA,
00316         0x73, 0xDF, 0x3D, 0x09, 0xC8, 0x25, 0x48, 0xD8,
00317         0x75, 0x60, 0x9A, 0x08, 0x27, 0x4A, 0x2C, 0xB9,
00318         0xA8, 0x8B, 0x8A, 0x73, 0x62, 0x37, 0x16, 0x02,
00319         0xBD, 0xC1, 0x0E, 0x56, 0x54, 0x3E, 0x14, 0x5F,
00320         0x8C, 0x8F, 0x6E, 0x75, 0x1C, 0x07, 0x39, 0x7B,
00321         0x4B, 0xDB, 0xD3, 0x4B, 0x1E, 0xC8, 0x7E, 0xFE,
00322         0x3E, 0x72, 0x16, 0x83, 0x7D, 0xEE, 0xF5, 0xCA,
00323         0xC5, 0x18, 0xF9, 0xD8, 0x68, 0xAB, 0x38, 0x85,
00324         0xA8, 0xF0, 0xA1, 0x73, 0x9F, 0x5D, 0x19, 0x0B,
00325         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00326         0x33, 0x72, 0x39, 0x25, 0x67, 0x26, 0x6D, 0x71,
00327         0x36, 0x77, 0x3C, 0x20, 0x62, 0x23, 0x68, 0x74,
00328         0xC3, 0x82, 0xC9, 0x15, 0x57, 0x16, 0x5D, 0x81};

Generated on Tue Dec 13 14:47:06 2005 for guliverkli by  doxygen 1.4.5