Changeset 1951 for trunk/reader-dre.c
- Timestamp:
- 04/05/10 09:13:48 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-dre.c
r1948 r1951 1 1 #include "globals.h" 2 2 #include "reader-common.h" 3 4 extern uchar cta_res[];5 extern ushort cta_lr;6 static uchar provider;7 static short int mode;8 3 9 4 #define OK_RESPONSE 0x61 … … 19 14 } 20 15 21 static int dre_command (struct s_reader * reader, uchar * cmd, int cmdlen ) //attention: inputcommand will be changed!!!! answer will be in cta_res, length cta_lr ; returning 1 = no error, return ERROR = err16 static int dre_command (struct s_reader * reader, uchar * cmd, int cmdlen, unsigned char * cta_res, unsigned short * p_cta_lr) //attention: inputcommand will be changed!!!! answer will be in cta_res, length cta_lr ; returning 1 = no error, return ERROR = err 22 17 { 23 18 static uchar startcmd[] = { 0x80, 0xFF, 0x10, 0x01, 0x05 }; //any command starts with this, … … 40 35 command[cmdlen++] = checksum; 41 36 42 reader_cmd2icc (reader, command, cmdlen );43 44 if (( cta_lr != 2) || (cta_res[0] != OK_RESPONSE)) {45 cs_log ("[dre-reader] unexpected answer from card: %s", cs_hexdump (0, cta_res, cta_lr));37 reader_cmd2icc (reader, command, cmdlen, cta_res, p_cta_lr); 38 39 if ((*p_cta_lr != 2) || (cta_res[0] != OK_RESPONSE)) { 40 cs_log ("[dre-reader] unexpected answer from card: %s", cs_hexdump (0, cta_res, *p_cta_lr)); 46 41 return ERROR; //error 47 42 } 48 43 49 44 reqans[4] = cta_res[1]; //adapt length byte 50 reader_cmd2icc (reader, reqans, 5 );45 reader_cmd2icc (reader, reqans, 5, cta_res, p_cta_lr); 51 46 52 47 if (cta_res[0] != CMD_BYTE) { … … 57 52 switch (cta_res[3]) { 58 53 case 0xe1: 59 cs_log ("[dre-reader] checksum error: %s.", cs_hexdump (0, cta_res, cta_lr));54 cs_log ("[dre-reader] checksum error: %s.", cs_hexdump (0, cta_res, *p_cta_lr)); 60 55 break; 61 56 case 0xe2: 62 cs_log ("[dre-reader] wrong provider: %s.", cs_hexdump (0, cta_res, cta_lr));57 cs_log ("[dre-reader] wrong provider: %s.", cs_hexdump (0, cta_res, *p_cta_lr)); 63 58 break; 64 59 case 0xe3: 65 cs_log ("[dre-reader] illegal command: %s.", cs_hexdump (0, cta_res, cta_lr));60 cs_log ("[dre-reader] illegal command: %s.", cs_hexdump (0, cta_res, *p_cta_lr)); 66 61 break; 67 62 case 0xec: 68 cs_log ("[dre-reader] wrong signature: %s.", cs_hexdump (0, cta_res, cta_lr));63 cs_log ("[dre-reader] wrong signature: %s.", cs_hexdump (0, cta_res, *p_cta_lr)); 69 64 break; 70 65 default: 71 cs_debug ("[dre-reader] unknown error: %s.", cs_hexdump (0, cta_res, cta_lr));66 cs_debug ("[dre-reader] unknown error: %s.", cs_hexdump (0, cta_res, *p_cta_lr)); 72 67 break; 73 68 } 74 69 return ERROR; //error 75 70 } 76 int length_excl_leader = cta_lr;77 if ((cta_res[ cta_lr - 2] == 0x90) && (cta_res[cta_lr - 1] == 0x00))71 int length_excl_leader = *p_cta_lr; 72 if ((cta_res[*p_cta_lr - 2] == 0x90) && (cta_res[*p_cta_lr - 1] == 0x00)) 78 73 length_excl_leader -= 2; 79 74 … … 82 77 if (cta_res[length_excl_leader - 1] != checksum) { 83 78 cs_log ("[dre-reader] checksum does not match, expected %02x received %02x:%s", checksum, 84 cta_res[length_excl_leader - 1], cs_hexdump (0, cta_res, cta_lr));79 cta_res[length_excl_leader - 1], cs_hexdump (0, cta_res, *p_cta_lr)); 85 80 return ERROR; //error 86 81 } … … 90 85 #define dre_cmd(cmd) \ 91 86 { \ 92 dre_command(reader, cmd, sizeof(cmd) ); \87 dre_command(reader, cmd, sizeof(cmd),cta_res,&cta_lr); \ 93 88 } 94 89 95 90 static int dre_set_provider_info (struct s_reader * reader) 96 91 { 92 def_resp; 97 93 int i; 98 94 static uchar cmd59[] = { 0x59, 0x14 }; // subscriptions 99 95 static uchar cmd5b[] = { 0x5b, 0x00, 0x14 }; //validity dates 100 96 101 cmd59[1] = provider;97 cmd59[1] = reader->provider; 102 98 if ((dre_cmd (cmd59))) { //ask subscription packages, returns error on 0x11 card 103 99 uchar pbm[32]; … … 111 107 if (pbm[i] != 0xff) { 112 108 cmd5b[1] = i; 113 cmd5b[2] = provider;109 cmd5b[2] = reader->provider; 114 110 dre_cmd (cmd5b); //ask for validity dates 115 111 … … 139 135 { 140 136 get_atr; 137 def_resp; 141 138 static uchar ua[] = { 0x43, 0x15 }; // get serial number (UA) 142 139 static uchar providers[] = { 0x49, 0x15 }; // get providers … … 147 144 return ERROR; 148 145 149 provider = atr[6];146 reader->provider = atr[6]; 150 147 uchar checksum = xor (atr + 1, 6); 151 148 … … 157 154 card = "Tricolor Centr"; 158 155 reader->caid[0] = 0x4ae0; 159 mode = 41;160 156 break; //59 type card = MSP (74 type = ATMEL) 161 157 case 0x12: 162 158 card = "Cable TV"; 163 159 reader->caid[0] = 0x4ae0; //TODO not sure about this one 164 mode = 41; //TODO not sure165 160 break; 166 161 case 0x14: 167 162 card = "Tricolor Syberia / Platforma HD new"; 168 163 reader->caid[0] = 0x4ae1; 169 mode = 51;170 164 break; //59 type card 171 165 case 0x15: 172 166 card = "Platforma HD / DW old"; 173 167 reader->caid[0] = 0x4ae1; 174 mode = 51;175 168 break; //59 type card 176 169 default: 177 170 card = "Unknown"; 178 171 reader->caid[0] = 0x4ae1; 179 mode = 51;180 172 break; 181 173 } … … 194 186 195 187 static uchar cmd54[] = { 0x54, 0x14 }; // geocode 196 cmd54[1] = provider;188 cmd54[1] = reader->provider; 197 189 uchar geocode = 0; 198 190 if ((dre_cmd (cmd54))) //error would not be fatal, like on 0x11 cards 199 191 geocode = cta_res[3]; 200 192 201 providers[1] = provider;193 providers[1] = reader->provider; 202 194 if (!(dre_cmd (providers))) 203 195 return ERROR; //fatal error … … 213 205 int minor_version = cta_res[4]; 214 206 215 ua[1] = provider;207 ua[1] = reader->provider; 216 208 dre_cmd (ua); //error would not be fatal 217 209 … … 225 217 int dre_chksum = 0; 226 218 uchar buf[32]; 227 sprintf ((char *)buf, "%i%i%08i", provider - 16, major_version + 1, low_dre_id);219 sprintf ((char *)buf, "%i%i%08i", reader->provider - 16, major_version + 1, low_dre_id); 228 220 for (i = 0; i < 32; i++) { 229 221 if (buf[i] == 0x00) … … 234 226 //cs_ri_log("[dre-reader] type: DRE Crypt, caid: %04X, serial: %llu, card: v%x", 235 227 cs_ri_log (reader, "[dre-reader] type: DRE Crypt, caid: %04X, serial: %s, dre id: %i%i%i%08i, geocode %i, card: %s v%i.%i", 236 reader->caid[0], cs_hexdump (0, reader->hexserial + 2, 4), dre_chksum, provider - 16,228 reader->caid[0], cs_hexdump (0, reader->hexserial + 2, 4), dre_chksum, reader->provider - 16, 237 229 major_version + 1, low_dre_id, geocode, card, major_version, minor_version); 238 230 cs_ri_log (reader, "[dre-reader] Provider name:%s.", provname); … … 256 248 int dre_do_ecm (struct s_reader * reader, ECM_REQUEST * er) 257 249 { 258 if (mode == 41) { 250 def_resp; 251 if (reader->caid[0] == 0x4ae0) { 259 252 static uchar ecmcmd41[] = { 0x41, 260 253 0x58, 0x1f, 0x00, //fixed part, dont change … … 263 256 0x3b, 0x59, 0x11 //0x3b = keynumber, can be a value 56 ;; 0x59 number of package = 58+1 - Pay Package ;; 0x11 = provider 264 257 }; 265 ecmcmd41[22] = provider;258 ecmcmd41[22] = reader->provider; 266 259 memcpy (ecmcmd41 + 4, er->ecm + 8, 16); 267 260 ecmcmd41[20] = er->ecm[6]; //keynumber … … 290 283 cs_debug ("[dre-reader] unused ECM info front:%s", cs_hexdump (0, er->ecm, 5)); 291 284 cs_debug ("[dre-reader] unused ECM info back:%s", cs_hexdump (0, er->ecm + 37, 4)); 292 ecmcmd51[33] = provider; //no part of sig285 ecmcmd51[33] = reader->provider; //no part of sig 293 286 if ((dre_cmd (ecmcmd51))) { //ecm request 294 287 if ((cta_res[cta_lr - 2] != 0x90) || (cta_res[cta_lr - 1] != 0x00)) … … 321 314 int dre_do_emm (struct s_reader * reader, EMM_PACKET * ep) 322 315 { 323 316 def_resp; 324 317 int emm_length = ((ep->emm[1] & 0x0f) << 8) + ep->emm[2]; 325 318 … … 327 320 ep->type = ep->emm[0]; 328 321 329 if ( mode == 51) {322 if (reader->caid[0] == 0x4ae1) { 330 323 static uchar emmcmd52[0x3a]; 331 324 emmcmd52[0] = 0x52; … … 336 329 if(ep->emm[3]!=reader->sa[0][0]) 337 330 return OK; // ignore, wrong address 338 emmcmd52[0x39] = provider;331 emmcmd52[0x39] = reader->provider; 339 332 if ((dre_cmd (emmcmd52))) 340 333 if ((cta_res[cta_lr - 2] != 0x90) || (cta_res[cta_lr - 1] != 0x00)) … … 357 350 emmcmd42[49] = ep->emm[i*49 + 41]; //keynr 358 351 emmcmd42[50] = 0x58 + ep->emm[40]; //package nr 359 emmcmd42[51] = provider;352 emmcmd42[51] = reader->provider; 360 353 if ((dre_cmd (emmcmd42))) { 361 354 if ((cta_res[cta_lr - 2] != 0x90) || (cta_res[cta_lr - 1] != 0x00)) … … 367 360 default: 368 361 memcpy (emmcmd42 + 1, ep->emm + 6, 48); 369 emmcmd42[51] = provider;362 emmcmd42[51] = reader->provider; 370 363 //emmcmd42[50] = ecmcmd42[2]; //TODO package nr could also be fixed 0x58 371 364 emmcmd42[50] = 0x58; … … 381 374 /*memcpy (emmcmd42 + 1, ep->emm + 55, 7); //FIXME either I cant count or my EMM log contains errors 382 375 memcpy (emmcmd42 + 8, ep->emm + 67, 41); */ 383 emmcmd42[51] = provider;376 emmcmd42[51] = reader->provider; 384 377 //emmcmd42[50] = ecmcmd42[2]; //TODO package nr could also be fixed 0x58 385 378 emmcmd42[50] = 0x58;
Note:
See TracChangeset
for help on using the changeset viewer.