3 static void CSSengine(int varient
,unsigned char const *input
,unsigned char *output
);
5 void CSSkey1(int varient
,unsigned char const *challenge
,unsigned char *key
)
7 static unsigned char perm_challenge
[] = {1,3,0,7,5, 2,9,6,4,8};
9 unsigned char scratch
[10];
12 for (i
= 9; i
>= 0; --i
)
13 scratch
[i
] = challenge
[perm_challenge
[i
]];
15 CSSengine(varient
, scratch
, key
);
18 void CSSkey2(int varient
,unsigned char const *challenge
,unsigned char *key
)
20 static unsigned char perm_challenge
[] = {6,1,9,3,8, 5,7,4,0,2};
22 static unsigned char perm_varient
[] = {
23 0x0a, 0x08, 0x0e, 0x0c, 0x0b, 0x09, 0x0f, 0x0d,
24 0x1a, 0x18, 0x1e, 0x1c, 0x1b, 0x19, 0x1f, 0x1d,
25 0x02, 0x00, 0x06, 0x04, 0x03, 0x01, 0x07, 0x05,
26 0x12, 0x10, 0x16, 0x14, 0x13, 0x11, 0x17, 0x15};
28 unsigned char scratch
[10];
31 for (i
= 9; i
>= 0; --i
)
32 scratch
[i
] = challenge
[perm_challenge
[i
]];
34 CSSengine(perm_varient
[varient
], scratch
, key
);
37 void CSSbuskey(int varient
,unsigned char const *challenge
,unsigned char *key
)
39 static unsigned char perm_challenge
[] = {4,0,3,5,7, 2,8,6,1,9};
40 static unsigned char perm_varient
[] = {
41 0x12, 0x1a, 0x16, 0x1e, 0x02, 0x0a, 0x06, 0x0e,
42 0x10, 0x18, 0x14, 0x1c, 0x00, 0x08, 0x04, 0x0c,
43 0x13, 0x1b, 0x17, 0x1f, 0x03, 0x0b, 0x07, 0x0f,
44 0x11, 0x19, 0x15, 0x1d, 0x01, 0x09, 0x05, 0x0d};
46 unsigned char scratch
[10];
49 for (i
= 9; i
>= 0; --i
)
50 scratch
[i
] = challenge
[perm_challenge
[i
]];
52 CSSengine(perm_varient
[varient
], scratch
, key
);
55 static void CSSgenbits(unsigned char *output
, int len
,unsigned char const *s
)
57 unsigned long lfsr0
, lfsr1
;
58 unsigned char b1_combined
; /* Save the old value of bit 1 for feedback */
60 /* In order to ensure that the LFSR works we need to ensure that the
61 * initial values are non-zero. Thus when we initialise them from
62 * the seed, we ensure that a bit is set.
64 lfsr0
= (s
[0] << 17) | (s
[1] << 9) | ((s
[2] & ~7) << 1) | 8 | (s
[2] & 7);
65 lfsr1
= (s
[3] << 9) | 0x100 | s
[4];
74 for (bit
= 0, val
= 0; bit
< 8; ++bit
) {
75 unsigned char o_lfsr0
, o_lfsr1
; /* Actually only 1 bit each */
76 unsigned char combined
;
78 o_lfsr0
= ((lfsr0
>> 24) ^ (lfsr0
>> 21) ^ (lfsr0
>> 20) ^ (lfsr0
>> 12)) & 1;
79 lfsr0
= (lfsr0
<< 1) | o_lfsr0
;
81 o_lfsr1
= ((lfsr1
>> 16) ^ (lfsr1
>> 2)) & 1;
82 lfsr1
= (lfsr1
<< 1) | o_lfsr1
;
84 #define BIT0(x) ((x) & 1)
85 #define BIT1(x) (((x) >> 1) & 1)
87 combined
= !o_lfsr1
+ b1_combined
+ !o_lfsr0
;
88 b1_combined
= BIT1(combined
);
89 val
|= BIT0(combined
) << bit
;
96 unsigned char CSSsecret
[];
97 unsigned char CSSvarients
[];
98 unsigned char CSStable0
[];
99 unsigned char CSStable1
[];
100 unsigned char CSStable2
[];
101 unsigned char CSStable3
[];
103 static void CSSengine(int varient
, unsigned char const *input
,unsigned char *output
)
105 unsigned char cse
, term
, index
;
106 unsigned char temp1
[5];
107 unsigned char temp2
[5];
108 unsigned char bits
[30];
112 /* Feed the CSSsecret into the input values such that
113 * we alter the seed to the LFSR's used above, then
114 * generate the bits to play with.
116 for (i
= 5; --i
>= 0; )
117 temp1
[i
] = input
[5 + i
] ^ CSSsecret
[i
] ^ CSStable2
[i
];
119 CSSgenbits(&bits
[29], sizeof bits
, temp1
);
121 /* This term is used throughout the following to
122 * select one of 32 different variations on the
125 cse
= CSSvarients
[varient
] ^ CSStable2
[varient
];
127 /* Now the actual blocks doing the encryption. Each
128 * of these works on 40 bits at a time and are quite
131 for (i
= 5, term
= 0; --i
>= 0; term
= input
[i
]) {
132 index
= bits
[25 + i
] ^ input
[i
];
133 index
= CSStable1
[index
] ^ ~CSStable2
[index
] ^ cse
;
135 temp1
[i
] = CSStable2
[index
] ^ CSStable3
[index
] ^ term
;
137 temp1
[4] ^= temp1
[0];
139 for (i
= 5, term
= 0; --i
>= 0; term
= temp1
[i
]) {
140 index
= bits
[20 + i
] ^ temp1
[i
];
141 index
= CSStable1
[index
] ^ ~CSStable2
[index
] ^ cse
;
143 temp2
[i
] = CSStable2
[index
] ^ CSStable3
[index
] ^ term
;
145 temp2
[4] ^= temp2
[0];
147 for (i
= 5, term
= 0; --i
>= 0; term
= temp2
[i
]) {
148 index
= bits
[15 + i
] ^ temp2
[i
];
149 index
= CSStable1
[index
] ^ ~CSStable2
[index
] ^ cse
;
150 index
= CSStable2
[index
] ^ CSStable3
[index
] ^ term
;
152 temp1
[i
] = CSStable0
[index
] ^ CSStable2
[index
];
154 temp1
[4] ^= temp1
[0];
156 for (i
= 5, term
= 0; --i
>= 0; term
= temp1
[i
]) {
157 index
= bits
[10 + i
] ^ temp1
[i
];
158 index
= CSStable1
[index
] ^ ~CSStable2
[index
] ^ cse
;
160 index
= CSStable2
[index
] ^ CSStable3
[index
] ^ term
;
162 temp2
[i
] = CSStable0
[index
] ^ CSStable2
[index
];
164 temp2
[4] ^= temp2
[0];
166 for (i
= 5, term
= 0; --i
>= 0; term
= temp2
[i
]) {
167 index
= bits
[5 + i
] ^ temp2
[i
];
168 index
= CSStable1
[index
] ^ ~CSStable2
[index
] ^ cse
;
170 temp1
[i
] = CSStable2
[index
] ^ CSStable3
[index
] ^ term
;
172 temp1
[4] ^= temp1
[0];
174 for (i
= 5, term
= 0; --i
>= 0; term
= temp1
[i
]) {
175 index
= bits
[i
] ^ temp1
[i
];
176 index
= CSStable1
[index
] ^ ~CSStable2
[index
] ^ cse
;
178 output
[i
] = CSStable2
[index
] ^ CSStable3
[index
] ^ term
;
182 static unsigned char CSSvarients
[] = {
183 0xB7, 0x74, 0x85, 0xD0, 0xCC, 0xDB, 0xCA, 0x73,
184 0x03, 0xFE, 0x31, 0x03, 0x52, 0xE0, 0xB7, 0x42,
185 0x63, 0x16, 0xF2, 0x2A, 0x79, 0x52, 0xFF, 0x1B,
186 0x7A, 0x11, 0xCA, 0x1A, 0x9B, 0x40, 0xAD, 0x01};
188 static unsigned char CSSsecret
[] = {0x55, 0xD6, 0xC4, 0xC5, 0x28};
190 static unsigned char CSStable0
[] = {
191 0xB7, 0xF4, 0x82, 0x57, 0xDA, 0x4D, 0xDB, 0xE2,
192 0x2F, 0x52, 0x1A, 0xA8, 0x68, 0x5A, 0x8A, 0xFF,
193 0xFB, 0x0E, 0x6D, 0x35, 0xF7, 0x5C, 0x76, 0x12,
194 0xCE, 0x25, 0x79, 0x29, 0x39, 0x62, 0x08, 0x24,
195 0xA5, 0x85, 0x7B, 0x56, 0x01, 0x23, 0x68, 0xCF,
196 0x0A, 0xE2, 0x5A, 0xED, 0x3D, 0x59, 0xB0, 0xA9,
197 0xB0, 0x2C, 0xF2, 0xB8, 0xEF, 0x32, 0xA9, 0x40,
198 0x80, 0x71, 0xAF, 0x1E, 0xDE, 0x8F, 0x58, 0x88,
199 0xB8, 0x3A, 0xD0, 0xFC, 0xC4, 0x1E, 0xB5, 0xA0,
200 0xBB, 0x3B, 0x0F, 0x01, 0x7E, 0x1F, 0x9F, 0xD9,
201 0xAA, 0xB8, 0x3D, 0x9D, 0x74, 0x1E, 0x25, 0xDB,
202 0x37, 0x56, 0x8F, 0x16, 0xBA, 0x49, 0x2B, 0xAC,
203 0xD0, 0xBD, 0x95, 0x20, 0xBE, 0x7A, 0x28, 0xD0,
204 0x51, 0x64, 0x63, 0x1C, 0x7F, 0x66, 0x10, 0xBB,
205 0xC4, 0x56, 0x1A, 0x04, 0x6E, 0x0A, 0xEC, 0x9C,
206 0xD6, 0xE8, 0x9A, 0x7A, 0xCF, 0x8C, 0xDB, 0xB1,
207 0xEF, 0x71, 0xDE, 0x31, 0xFF, 0x54, 0x3E, 0x5E,
208 0x07, 0x69, 0x96, 0xB0, 0xCF, 0xDD, 0x9E, 0x47,
209 0xC7, 0x96, 0x8F, 0xE4, 0x2B, 0x59, 0xC6, 0xEE,
210 0xB9, 0x86, 0x9A, 0x64, 0x84, 0x72, 0xE2, 0x5B,
211 0xA2, 0x96, 0x58, 0x99, 0x50, 0x03, 0xF5, 0x38,
212 0x4D, 0x02, 0x7D, 0xE7, 0x7D, 0x75, 0xA7, 0xB8,
213 0x67, 0x87, 0x84, 0x3F, 0x1D, 0x11, 0xE5, 0xFC,
214 0x1E, 0xD3, 0x83, 0x16, 0xA5, 0x29, 0xF6, 0xC7,
215 0x15, 0x61, 0x29, 0x1A, 0x43, 0x4F, 0x9B, 0xAF,
216 0xC5, 0x87, 0x34, 0x6C, 0x0F, 0x3B, 0xA8, 0x1D,
217 0x45, 0x58, 0x25, 0xDC, 0xA8, 0xA3, 0x3B, 0xD1,
218 0x79, 0x1B, 0x48, 0xF2, 0xE9, 0x93, 0x1F, 0xFC,
219 0xDB, 0x2A, 0x90, 0xA9, 0x8A, 0x3D, 0x39, 0x18,
220 0xA3, 0x8E, 0x58, 0x6C, 0xE0, 0x12, 0xBB, 0x25,
221 0xCD, 0x71, 0x22, 0xA2, 0x64, 0xC6, 0xE7, 0xFB,
222 0xAD, 0x94, 0x77, 0x04, 0x9A, 0x39, 0xCF, 0x7C};
224 static unsigned char CSStable1
[] = {
225 0x8C, 0x47, 0xB0, 0xE1, 0xEB, 0xFC, 0xEB, 0x56,
226 0x10, 0xE5, 0x2C, 0x1A, 0x5D, 0xEF, 0xBE, 0x4F,
227 0x08, 0x75, 0x97, 0x4B, 0x0E, 0x25, 0x8E, 0x6E,
228 0x39, 0x5A, 0x87, 0x53, 0xC4, 0x1F, 0xF4, 0x5C,
229 0x4E, 0xE6, 0x99, 0x30, 0xE0, 0x42, 0x88, 0xAB,
230 0xE5, 0x85, 0xBC, 0x8F, 0xD8, 0x3C, 0x54, 0xC9,
231 0x53, 0x47, 0x18, 0xD6, 0x06, 0x5B, 0x41, 0x2C,
232 0x67, 0x1E, 0x41, 0x74, 0x33, 0xE2, 0xB4, 0xE0,
233 0x23, 0x29, 0x42, 0xEA, 0x55, 0x0F, 0x25, 0xB4,
234 0x24, 0x2C, 0x99, 0x13, 0xEB, 0x0A, 0x0B, 0xC9,
235 0xF9, 0x63, 0x67, 0x43, 0x2D, 0xC7, 0x7D, 0x07,
236 0x60, 0x89, 0xD1, 0xCC, 0xE7, 0x94, 0x77, 0x74,
237 0x9B, 0x7E, 0xD7, 0xE6, 0xFF, 0xBB, 0x68, 0x14,
238 0x1E, 0xA3, 0x25, 0xDE, 0x3A, 0xA3, 0x54, 0x7B,
239 0x87, 0x9D, 0x50, 0xCA, 0x27, 0xC3, 0xA4, 0x50,
240 0x91, 0x27, 0xD4, 0xB0, 0x82, 0x41, 0x97, 0x79,
241 0x94, 0x82, 0xAC, 0xC7, 0x8E, 0xA5, 0x4E, 0xAA,
242 0x78, 0x9E, 0xE0, 0x42, 0xBA, 0x28, 0xEA, 0xB7,
243 0x74, 0xAD, 0x35, 0xDA, 0x92, 0x60, 0x7E, 0xD2,
244 0x0E, 0xB9, 0x24, 0x5E, 0x39, 0x4F, 0x5E, 0x63,
245 0x09, 0xB5, 0xFA, 0xBF, 0xF1, 0x22, 0x55, 0x1C,
246 0xE2, 0x25, 0xDB, 0xC5, 0xD8, 0x50, 0x03, 0x98,
247 0xC4, 0xAC, 0x2E, 0x11, 0xB4, 0x38, 0x4D, 0xD0,
248 0xB9, 0xFC, 0x2D, 0x3C, 0x08, 0x04, 0x5A, 0xEF,
249 0xCE, 0x32, 0xFB, 0x4C, 0x92, 0x1E, 0x4B, 0xFB,
250 0x1A, 0xD0, 0xE2, 0x3E, 0xDA, 0x6E, 0x7C, 0x4D,
251 0x56, 0xC3, 0x3F, 0x42, 0xB1, 0x3A, 0x23, 0x4D,
252 0x6E, 0x84, 0x56, 0x68, 0xF4, 0x0E, 0x03, 0x64,
253 0xD0, 0xA9, 0x92, 0x2F, 0x8B, 0xBC, 0x39, 0x9C,
254 0xAC, 0x09, 0x5E, 0xEE, 0xE5, 0x97, 0xBF, 0xA5,
255 0xCE, 0xFA, 0x28, 0x2C, 0x6D, 0x4F, 0xEF, 0x77,
256 0xAA, 0x1B, 0x79, 0x8E, 0x97, 0xB4, 0xC3, 0xF4};
258 static unsigned char CSStable2
[] = {
259 0xB7, 0x75, 0x81, 0xD5, 0xDC, 0xCA, 0xDE, 0x66,
260 0x23, 0xDF, 0x15, 0x26, 0x62, 0xD1, 0x83, 0x77,
261 0xE3, 0x97, 0x76, 0xAF, 0xE9, 0xC3, 0x6B, 0x8E,
262 0xDA, 0xB0, 0x6E, 0xBF, 0x2B, 0xF1, 0x19, 0xB4,
263 0x95, 0x34, 0x48, 0xE4, 0x37, 0x94, 0x5D, 0x7B,
264 0x36, 0x5F, 0x65, 0x53, 0x07, 0xE2, 0x89, 0x11,
265 0x98, 0x85, 0xD9, 0x12, 0xC1, 0x9D, 0x84, 0xEC,
266 0xA4, 0xD4, 0x88, 0xB8, 0xFC, 0x2C, 0x79, 0x28,
267 0xD8, 0xDB, 0xB3, 0x1E, 0xA2, 0xF9, 0xD0, 0x44,
268 0xD7, 0xD6, 0x60, 0xEF, 0x14, 0xF4, 0xF6, 0x31,
269 0xD2, 0x41, 0x46, 0x67, 0x0A, 0xE1, 0x58, 0x27,
270 0x43, 0xA3, 0xF8, 0xE0, 0xC8, 0xBA, 0x5A, 0x5C,
271 0x80, 0x6C, 0xC6, 0xF2, 0xE8, 0xAD, 0x7D, 0x04,
272 0x0D, 0xB9, 0x3C, 0xC2, 0x25, 0xBD, 0x49, 0x63,
273 0x8C, 0x9F, 0x51, 0xCE, 0x20, 0xC5, 0xA1, 0x50,
274 0x92, 0x2D, 0xDD, 0xBC, 0x8D, 0x4F, 0x9A, 0x71,
275 0x2F, 0x30, 0x1D, 0x73, 0x39, 0x13, 0xFB, 0x1A,
276 0xCB, 0x24, 0x59, 0xFE, 0x05, 0x96, 0x57, 0x0F,
277 0x1F, 0xCF, 0x54, 0xBE, 0xF5, 0x06, 0x1B, 0xB2,
278 0x6D, 0xD3, 0x4D, 0x32, 0x56, 0x21, 0x33, 0x0B,
279 0x52, 0xE7, 0xAB, 0xEB, 0xA6, 0x74, 0x00, 0x4C,
280 0xB1, 0x7F, 0x82, 0x99, 0x87, 0x0E, 0x5E, 0xC0,
281 0x8F, 0xEE, 0x6F, 0x55, 0xF3, 0x7E, 0x08, 0x90,
282 0xFA, 0xB6, 0x64, 0x70, 0x47, 0x4A, 0x17, 0xA7,
283 0xB5, 0x40, 0x8A, 0x38, 0xE5, 0x68, 0x3E, 0x8B,
284 0x69, 0xAA, 0x9B, 0x42, 0xA5, 0x10, 0x01, 0x35,
285 0xFD, 0x61, 0x9E, 0xE6, 0x16, 0x9C, 0x86, 0xED,
286 0xCD, 0x2E, 0xFF, 0xC4, 0x5B, 0xA0, 0xAE, 0xCC,
287 0x4B, 0x3B, 0x03, 0xBB, 0x1C, 0x2A, 0xAC, 0x0C,
288 0x3F, 0x93, 0xC7, 0x72, 0x7A, 0x09, 0x22, 0x3D,
289 0x45, 0x78, 0xA9, 0xA8, 0xEA, 0xC9, 0x6A, 0xF7,
290 0x29, 0x91, 0xF0, 0x02, 0x18, 0x3A, 0x4E, 0x7C};
292 static unsigned char CSStable3
[] = {
293 0x73, 0x51, 0x95, 0xE1, 0x12, 0xE4, 0xC0, 0x58,
294 0xEE, 0xF2, 0x08, 0x1B, 0xA9, 0xFA, 0x98, 0x4C,
295 0xA7, 0x33, 0xE2, 0x1B, 0xA7, 0x6D, 0xF5, 0x30,
296 0x97, 0x1D, 0xF3, 0x02, 0x60, 0x5A, 0x82, 0x0F,
297 0x91, 0xD0, 0x9C, 0x10, 0x39, 0x7A, 0x83, 0x85,
298 0x3B, 0xB2, 0xB8, 0xAE, 0x0C, 0x09, 0x52, 0xEA,
299 0x1C, 0xE1, 0x8D, 0x66, 0x4F, 0xF3, 0xDA, 0x92,
300 0x29, 0xB9, 0xD5, 0xC5, 0x77, 0x47, 0x22, 0x53,
301 0x14, 0xF7, 0xAF, 0x22, 0x64, 0xDF, 0xC6, 0x72,
302 0x12, 0xF3, 0x75, 0xDA, 0xD7, 0xD7, 0xE5, 0x02,
303 0x9E, 0xED, 0xDA, 0xDB, 0x4C, 0x47, 0xCE, 0x91,
304 0x06, 0x06, 0x6D, 0x55, 0x8B, 0x19, 0xC9, 0xEF,
305 0x8C, 0x80, 0x1A, 0x0E, 0xEE, 0x4B, 0xAB, 0xF2,
306 0x08, 0x5C, 0xE9, 0x37, 0x26, 0x5E, 0x9A, 0x90,
307 0x00, 0xF3, 0x0D, 0xB2, 0xA6, 0xA3, 0xF7, 0x26,
308 0x17, 0x48, 0x88, 0xC9, 0x0E, 0x2C, 0xC9, 0x02,
309 0xE7, 0x18, 0x05, 0x4B, 0xF3, 0x39, 0xE1, 0x20,
310 0x02, 0x0D, 0x40, 0xC7, 0xCA, 0xB9, 0x48, 0x30,
311 0x57, 0x67, 0xCC, 0x06, 0xBF, 0xAC, 0x81, 0x08,
312 0x24, 0x7A, 0xD4, 0x8B, 0x19, 0x8E, 0xAC, 0xB4,
313 0x5A, 0x0F, 0x73, 0x13, 0xAC, 0x9E, 0xDA, 0xB6,
314 0xB8, 0x96, 0x5B, 0x60, 0x88, 0xE1, 0x81, 0x3F,
315 0x07, 0x86, 0x37, 0x2D, 0x79, 0x14, 0x52, 0xEA,
316 0x73, 0xDF, 0x3D, 0x09, 0xC8, 0x25, 0x48, 0xD8,
317 0x75, 0x60, 0x9A, 0x08, 0x27, 0x4A, 0x2C, 0xB9,
318 0xA8, 0x8B, 0x8A, 0x73, 0x62, 0x37, 0x16, 0x02,
319 0xBD, 0xC1, 0x0E, 0x56, 0x54, 0x3E, 0x14, 0x5F,
320 0x8C, 0x8F, 0x6E, 0x75, 0x1C, 0x07, 0x39, 0x7B,
321 0x4B, 0xDB, 0xD3, 0x4B, 0x1E, 0xC8, 0x7E, 0xFE,
322 0x3E, 0x72, 0x16, 0x83, 0x7D, 0xEE, 0xF5, 0xCA,
323 0xC5, 0x18, 0xF9, 0xD8, 0x68, 0xAB, 0x38, 0x85,
324 0xA8, 0xF0, 0xA1, 0x73, 0x9F, 0x5D, 0x19, 0x0B,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
326 0x33, 0x72, 0x39, 0x25, 0x67, 0x26, 0x6D, 0x71,
327 0x36, 0x77, 0x3C, 0x20, 0x62, 0x23, 0x68, 0x74,
328 0xC3, 0x82, 0xC9, 0x15, 0x57, 0x16, 0x5D, 0x81};