Changeset 4012
- Timestamp:
- 11/29/10 08:33:43 (13 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/cscrypt/Makefile
r3993 r4012 23 23 $(LIBFILE1)(i_skey.o) \ 24 24 $(LIBFILE1)(mem.o) \ 25 $(LIBFILE1)(rc6.o) 25 $(LIBFILE1)(rc6.o) \ 26 $(LIBFILE1)(i_ecb.o) 26 27 27 28 all: $(LIBFILE1) -
trunk/cscrypt/rc6.h
r3999 r4012 21 21 * w=32; and r=20. 22 22 */ 23 23 24 24 #define rc6keylen 43 25 25 … … 37 37 void rc6_block_encrypt(unsigned int *pt, unsigned int *ct, unsigned int *S); 38 38 void rc6_block_decrypt(unsigned int *ct, unsigned int *pt, unsigned int *S); 39 -
trunk/module-cccam.c
r4004 r4012 6 6 #include "reader-common.h" 7 7 #include <poll.h> 8 #include "cscrypt/rc6.h"9 8 10 9 extern int pthread_mutexattr_settype(pthread_mutexattr_t *__attr, int __kind); //Needs extern defined??? … … 13 12 const char *cmd05_mode_name[] = { "UNKNOWN", "PLAIN", "AES", "CC_CRYPT", "RC4", 14 13 "LEN=0" }; 14 15 //Mode names for CMD_0C command: 16 const char *cmd0c_mode_name[] = { "NONE", "RC6", "RC4", "CC_CRYPT", "AES", "IDEA" }; 15 17 16 18 static uint8 cc_node_id[8]; … … 103 105 tmp = ~tmp; 104 106 cws[i] = (cardid >> (2 * i)) ^ tmp; 107 } 108 } 109 110 void cc_cw_crypt_cmd0c(struct s_client *cl, uint8 *cws) { 111 struct cc_data *cc = cl->cc; 112 uint8 out[16]; 113 114 switch (cc->cmd0c_mode) { 115 case MODE_CMD_0x0C_NONE: { // none additional encryption 116 break; 117 } 118 case MODE_CMD_0x0C_RC6 : { //RC6 119 rc6_block_decrypt((unsigned int *) cws, 120 (unsigned int *) &out, cc->cmd0c_RC6_cryptkey); 121 memcpy(cws, &out, 16); 122 break; 123 } 124 case MODE_CMD_0x0C_RC4: { // RC4 125 cc_rc4_crypt(&cc->cmd0c_cryptkey, cws, 16, ENCRYPT); 126 break; 127 } 128 case MODE_CMD_0x0C_CC_CRYPT: { // cc_crypt 129 cc_crypt(&cc->cmd0c_cryptkey, cws, 16, DECRYPT); 130 cws[0] ^= 0xF0; 131 cws[15] ^= 0xF0; 132 break; 133 } 134 case MODE_CMD_0x0C_AES: { // AES 135 AES_decrypt((unsigned char *) cws, 136 (unsigned char *) &out, &cc->cmd0c_AES_key); 137 memcpy(cws, &out, 16); 138 break; 139 } 140 case MODE_CMD_0x0C_IDEA : { //IDEA 141 uint8 cws_in[8]; 142 int i; 143 144 memcpy(&cws_in, cws, 8); 145 idea_ecb_encrypt(cws_in, out, &cc->cmd0c_IDEA_dkey); 146 memcpy(&cws_in, cws + 8, 8); 147 idea_ecb_encrypt(cws_in, out + 8, &cc->cmd0c_IDEA_dkey); 148 149 //final cws[8-15]: 150 for (i = 8; i < 16; i++) 151 out[i] ^= cws[i-8]; 152 153 memcpy(cws, &out, 16); 154 break; 155 } 156 } 157 } 158 159 void set_cmd0c_cryptkey(struct s_client *cl, uint8 *key, uint8 len) { 160 struct cc_data *cc = cl->cc; 161 uint8 key_buf[32]; 162 163 memset(&key_buf, 0, sizeof(key_buf)); 164 165 if (len > 32) 166 len = 32; 167 168 memcpy(key_buf, key, len); 169 170 switch (cc->cmd0c_mode) { 171 172 case MODE_CMD_0x0C_NONE : { //NONE 173 break; 174 } 175 case MODE_CMD_0x0C_RC6 : { //RC6 176 rc6_key_setup(key_buf, 32, cc->cmd0c_RC6_cryptkey); 177 break; 178 } 179 180 case MODE_CMD_0x0C_RC4: //RC4 181 case MODE_CMD_0x0C_CC_CRYPT: { //CC_CRYPT 182 cc_init_crypt(&cc->cmd0c_cryptkey, key_buf, 32); 183 break; 184 } 185 186 case MODE_CMD_0x0C_AES: { //AES 187 memset(&cc->cmd0c_AES_key, 0, sizeof(cc->cmd0c_AES_key)); 188 AES_set_decrypt_key((unsigned char *) key_buf, 256, &cc->cmd0c_AES_key); 189 break; 190 } 191 192 case MODE_CMD_0x0C_IDEA : { //IDEA 193 IDEA_KEY_SCHEDULE ekey; 194 uint8 key_buf_IDEA[16]; 195 memcpy(&key_buf_IDEA, &key_buf, 16); 196 197 idea_set_encrypt_key(key_buf_IDEA, &ekey); 198 idea_set_decrypt_key(&ekey,&cc->cmd0c_IDEA_dkey); 199 break; 200 } 105 201 } 106 202 } … … 2036 2132 2037 2133 if (card) { 2038 if (!cc->extended_mode) 2039 cc_cw_crypt(cl, buf + 4, card->id); 2134 2135 if (!cc->extended_mode) { 2136 cc_cw_crypt(cl, buf + 4, card->id); 2137 cc_cw_crypt_cmd0c(cl, buf + 4); 2138 } 2139 2040 2140 memcpy(cc->dcw, buf + 4, 16); 2041 2141 //fix_dcw(cc->dcw); … … 2148 2248 } 2149 2249 2150 case MSG_CMD_0C: { //New CCCAM 2.2.0 Server fake check!2250 case MSG_CMD_0C: { //New CCCAM 2.2.0 Server/Client fake check! 2151 2251 int len = l-4; 2252 2152 2253 if (cl->typ == 'c') { //Only im comming from "client" 2153 2254 cs_debug_mask(D_TRACE, "%s MSG_CMD_0C received (payload=%d)!", getprefix(), len); … … 2177 2278 } 2178 2279 else //reader 2179 { 2180 cs_debug_mask(D_TRACE, "%s MSG_CMD_0C received (payload=%d)!", getprefix(), len); 2181 cs_ddump(buf, l, "%s content: len=%d", getprefix(), l); 2182 uint8 CMD_0x0C_CMD = data[0]; 2280 { 2281 // by Project:Keynation 2282 uint8 CMD_0x0C_Command = data[0]; 2283 2284 if (CMD_0x0C_Command > 4) { 2285 cc->cmd0c_mode = MODE_CMD_0x0C_NONE; 2286 break; 2287 } 2288 2289 switch (CMD_0x0C_Command) { 2290 2291 case 0 : { //RC6 2292 cc->cmd0c_mode = MODE_CMD_0x0C_RC6; 2293 break; 2294 } 2295 2296 case 1: { //RC4 2297 cc->cmd0c_mode = MODE_CMD_0x0C_RC4; 2298 break; 2299 } 2300 2301 case 2: { //CC_CRYPT 2302 cc->cmd0c_mode = MODE_CMD_0x0C_CC_CRYPT; 2303 break; 2304 } 2305 2306 case 3: { //AES 2307 cc->cmd0c_mode = MODE_CMD_0x0C_AES; 2308 break; 2309 } 2310 2311 case 4 : { //IDEA 2312 cc->cmd0c_mode = MODE_CMD_0x0C_IDEA; 2313 break; 2314 } 2315 } 2183 2316 2184 cs_log("%s received MSG_CMD_0C from server! CMD_0x0C_CMD=%d, cycle connection!", getprefix(), CMD_0x0C_CMD); 2185 2186 //Unkown commands...need workout algo 2187 if (CMD_0x0C_CMD < 5) 2188 cc_cli_close(cl, TRUE); 2189 2190 //TODO 2191 // * CMD_0x0C_01 2192 // 1. Set Mode to CMD_0x0C_01 2193 // 2. cc_init_crypt(BlockCMD_0x0C, data) with $20 received Bytes 2194 // 3. CW with cc_cw_crypt and cc_rc4_crypt(BlockCMD_0x0C, ENCRYPT) 2195 // 2196 // * CMD_0x0C_02 2197 // 1. Set Mode to CMD_0x0C_02 2198 // 2. cc_init_crypt(BlockCMD_0x0C, data) with $20 received Bytes 2199 // 3. CW with cc_cw_crypt and cc_crypt(BlockCMD_0x0C, DECRYPT) 2200 // 2201 2202 2317 cs_log("%s received MSG_CMD_0C from server! CMD_0x0C_CMD=%d, MODE=%s! Message data: %s", 2318 getprefix(), CMD_0x0C_Command, cmd0c_mode_name[cc->cmd0c_mode], cs_hexdump(0, data, len)); 2319 2320 set_cmd0c_cryptkey(cl, data, len); 2203 2321 } 2204 2322 break; 2205 2323 } 2324 2325 case MSG_CMD_0D: { //key update for the active cmd0x0c algo 2326 int len = l-4; 2327 if (cc->cmd0c_mode == MODE_CMD_0x0C_NONE) 2328 break; 2329 2330 set_cmd0c_cryptkey(cl, data, len); 2331 2332 cs_log("%s received MSG_CMD_0D from server! MODE=%s! Message data: %s", 2333 getprefix(), cmd0c_mode_name[cc->cmd0c_mode], cs_hexdump(0, data, len)); 2334 break; 2335 } 2206 2336 2207 case MSG_CMD_0D:2208 2337 case MSG_CMD_0E: { 2209 2338 cs_log("cccam 2.2.0 commands not implemented"); -
trunk/module-cccam.h
r4004 r4012 9 9 10 10 #include "module-datastruct-llist.h" 11 12 #include "cscrypt/rc6.h" 13 #include "cscrypt/idea.h" 11 14 12 15 #define CC_MAXMSGSIZE 512 … … 102 105 } cc_cmd05_mode; 103 106 107 typedef enum { 108 MODE_CMD_0x0C_NONE = 0, 109 MODE_CMD_0x0C_RC6 = 1, 110 MODE_CMD_0x0C_RC4 = 2, 111 MODE_CMD_0x0C_CC_CRYPT = 3, 112 MODE_CMD_0x0C_AES = 4, 113 MODE_CMD_0x0C_IDEA = 5, 114 } cc_cmd0c_mode; 115 116 104 117 struct cc_extended_ecm_idx { 105 118 uint8 send_idx; … … 129 142 cc_cmd05_mode cmd05_mode; 130 143 int cmd05_offset; 144 145 cc_cmd0c_mode cmd0c_mode; 146 struct cc_crypt_block cmd0c_cryptkey; 147 RC6KEY cmd0c_RC6_cryptkey; 148 AES_KEY cmd0c_AES_key; 149 IDEA_KEY_SCHEDULE cmd0c_IDEA_dkey; 150 131 151 uint8 receive_buffer[CC_MAXMSGSIZE]; 132 152
Note:
See TracChangeset
for help on using the changeset viewer.