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;
00059
00060
00061
00062
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;
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
00113
00114
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
00122
00123
00124
00125 cse = CSSvarients[varient] ^ CSStable2[varient];
00126
00127
00128
00129
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};