Changeset 1926 for trunk/reader-irdeto.c
- Timestamp:
- 04/02/10 16:21:14 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-irdeto.c
r1830 r1926 139 139 } 140 140 141 static int irdeto_do_cmd( uchar *buf, ushort good)141 static int irdeto_do_cmd(struct s_reader * reader, uchar *buf, ushort good) 142 142 { 143 143 int rc; 144 if( (rc=reader_cmd2icc( buf, buf[4]+5)) )144 if( (rc=reader_cmd2icc(reader, buf, buf[4]+5)) ) 145 145 return(rc); // result may be 0 (success) or negative 146 146 if (cta_lr<2) … … 151 151 #define reader_chk_cmd(cmd, l) \ 152 152 { \ 153 if (reader_cmd2icc( cmd, sizeof(cmd))) return ERROR; \153 if (reader_cmd2icc(reader, cmd, sizeof(cmd))) return ERROR; \ 154 154 if (l && (cta_lr!=l)) return ERROR; } 155 155 156 static int irdeto_card_init_provider( void)156 static int irdeto_card_init_provider(struct s_reader * reader) 157 157 { 158 158 int i, p; … … 162 162 * Provider 163 163 */ 164 memset(reader [ridx].prid, 0xff, sizeof(reader[ridx].prid));165 for (buf[0]=i=p=0; i<reader [ridx].nprov; i++)164 memset(reader->prid, 0xff, sizeof(reader->prid)); 165 for (buf[0]=i=p=0; i<reader->nprov; i++) 166 166 { 167 167 sc_GetProvider[3]=i; … … 170 170 if ((cta_lr==26) && ((!(i&1)) || (cta_res[0]!=0xf))) 171 171 { 172 reader [ridx].prid[i][4]=p++;172 reader->prid[i][4]=p++; 173 173 174 174 // maps the provider id for Betacrypt from FFFFFF to 000000, 175 175 // fixes problems with cascading CCcam and OSCam 176 if ((reader [ridx].caid[0] >= 0x1700) && (reader[ridx].caid[0] <= 0x1799))177 memset(&reader [ridx].prid[i][0], 0, 4);176 if ((reader->caid[0] >= 0x1700) && (reader->caid[0] <= 0x1799)) 177 memset(&reader->prid[i][0], 0, 4); 178 178 else 179 memcpy(&reader [ridx].prid[i][0], cta_res, 4);180 181 sprintf((char *) buf+strlen((char *)buf), ",%06lx", b2i(3, &reader [ridx].prid[i][1]));179 memcpy(&reader->prid[i][0], cta_res, 4); 180 181 sprintf((char *) buf+strlen((char *)buf), ",%06lx", b2i(3, &reader->prid[i][1])); 182 182 } 183 183 else 184 reader [ridx].prid[i][0]=0xf;184 reader->prid[i][0]=0xf; 185 185 } 186 186 if (p) 187 cs_ri_log( "providers: %d (%s)", p, buf+1);187 cs_ri_log(reader, "providers: %d (%s)", p, buf+1); 188 188 189 189 return OK; 190 190 } 191 191 192 int irdeto_card_init( ATR newatr)192 int irdeto_card_init(struct s_reader * reader, ATR newatr) 193 193 { 194 194 get_atr; … … 198 198 if (memcmp(atr+4, "IRDETO", 6)) 199 199 return ERROR; 200 cs_ri_log( "detect Irdeto card");200 cs_ri_log(reader, "detect Irdeto card"); 201 201 202 if(reader [ridx].has_rsa) // we use rsa from config as camkey202 if(reader->has_rsa) // we use rsa from config as camkey 203 203 { 204 204 cs_debug("[irdeto-reader] using camkey data from config"); 205 memcpy(&sc_GetCamKey383C[5], reader [ridx].rsa_mod, 0x40);206 memcpy(sc_CamKey, reader [ridx].nagra_boxkey, 8);205 memcpy(&sc_GetCamKey383C[5], reader->rsa_mod, 0x40); 206 memcpy(sc_CamKey, reader->nagra_boxkey, 8); 207 207 cs_debug("[irdeto-reader] camkey: %s", cs_hexdump (0, sc_CamKey, 8)); 208 208 cs_debug("[irdeto-reader] camkey-data: %s", cs_hexdump (0, &sc_GetCamKey383C[5], 32)); … … 214 214 */ 215 215 reader_chk_cmd(sc_GetCountryCode, 18); 216 reader [ridx].acs=(cta_res[0]<<8)|cta_res[1];217 reader [ridx].caid[0]=(cta_res[5]<<8)|cta_res[6];218 cs_ri_log( "caid: %04X, acs: %x.%02x%s",219 reader [ridx].caid[0], cta_res[0], cta_res[1], buf);216 reader->acs=(cta_res[0]<<8)|cta_res[1]; 217 reader->caid[0]=(cta_res[5]<<8)|cta_res[6]; 218 cs_ri_log(reader, "caid: %04X, acs: %x.%02x%s", 219 reader->caid[0], cta_res[0], cta_res[1], buf); 220 220 221 221 /* … … 226 226 buf[10]=0; 227 227 reader_chk_cmd(sc_GetHEXSerial, 18); 228 memcpy(reader [ridx].hexserial, cta_res+12, 8);229 reader [ridx].nprov=cta_res[10];230 cs_ri_log( "ascii serial: %s, hex serial: %02X%02X%02X, hex base: %02X",228 memcpy(reader->hexserial, cta_res+12, 8); 229 reader->nprov=cta_res[10]; 230 cs_ri_log(reader, "ascii serial: %s, hex serial: %02X%02X%02X, hex base: %02X", 231 231 buf, cta_res[12], cta_res[13], cta_res[14], cta_res[15]); 232 232 … … 242 242 if ((atr[14]==0x03) && (atr[15]==0x84) && (atr[16]==0x55)) 243 243 { 244 switch (reader [ridx].caid[0])244 switch (reader->caid[0]) 245 245 { 246 246 case 0x1702: camkey=1; break; … … 268 268 break; 269 269 } 270 if (reader [ridx].cardmhz != 600)270 if (reader->cardmhz != 600) 271 271 cs_log("WARNING: For Irdeto cards you will have to set 'cardmhz = 600' in oscam.server"); 272 272 273 return irdeto_card_init_provider( );274 } 275 276 int irdeto_do_ecm( ECM_REQUEST *er)273 return irdeto_card_init_provider(reader); 274 } 275 276 int irdeto_do_ecm(struct s_reader * reader, ECM_REQUEST *er) 277 277 { 278 278 static const uchar sc_EcmCmd[] = { 0x05, 0x00, 0x00, 0x02, 0x00 }; … … 282 282 cta_cmd[4]=(er->ecm[2])-3; 283 283 memcpy(cta_cmd+sizeof(sc_EcmCmd), &er->ecm[6], cta_cmd[4]); 284 if (irdeto_do_cmd( cta_cmd, 0x9D00)) return ERROR;284 if (irdeto_do_cmd(reader, cta_cmd, 0x9D00)) return ERROR; 285 285 if (cta_lr<24) return ERROR; 286 286 ReverseSessionKeyCrypt(sc_CamKey, cta_res+6); … … 331 331 } 332 332 333 int irdeto_do_emm( EMM_PACKET *ep)333 int irdeto_do_emm(struct s_reader * reader, EMM_PACKET *ep) 334 334 { 335 335 static const uchar sc_EmmCmd[] = { 0x01,0x00,0x00,0x00,0x00 }; … … 342 342 if (mode&0x10) // Hex addressed 343 343 { 344 ok=(mode==reader [ridx].hexserial[3] &&345 (!l || !memcmp(&emm[4], reader [ridx].hexserial, l)));344 ok=(mode==reader->hexserial[3] && 345 (!l || !memcmp(&emm[4], reader->hexserial, l))); 346 346 } 347 347 else // Provider addressed 348 348 { 349 for(i=0; i<reader [ridx].nprov; i++)350 { 351 ok=(mode==reader [ridx].prid[i][0] &&352 (!l || !memcmp(&emm[4], &reader [ridx].prid[i][1], l)));349 for(i=0; i<reader->nprov; i++) 350 { 351 ok=(mode==reader->prid[i][0] && 352 (!l || !memcmp(&emm[4], &reader->prid[i][1], l))); 353 353 if (ok) break; 354 354 } … … 369 369 ptr+=ADDRLEN; emm+=l; 370 370 memcpy(ptr, &emm[2], dataLen); // copy emm bytes 371 return(irdeto_do_cmd( cta_cmd, 0) ? 0 : 1);371 return(irdeto_do_cmd(reader, cta_cmd, 0) ? 0 : 1); 372 372 } 373 373 else … … 377 377 } 378 378 379 int irdeto_card_info( void)379 int irdeto_card_info(struct s_reader * reader) 380 380 { 381 381 int i, p; … … 393 393 * Provider 2 394 394 */ 395 for (i=p=0; i<reader [ridx].nprov; i++)395 for (i=p=0; i<reader->nprov; i++) 396 396 { 397 397 int j, k, chid, first=1; 398 398 char t[32]; 399 if (reader [ridx].prid[i][4]!=0xff)399 if (reader->prid[i][4]!=0xff) 400 400 { 401 401 p++; … … 416 416 if (first) 417 417 { 418 cs_ri_log( "provider: %d, id: %06X", p, b2i(3, &reader[ridx].prid[i][1]));418 cs_ri_log(reader, "provider: %d, id: %06X", p, b2i(3, &reader->prid[i][1])); 419 419 first=0; 420 420 } 421 cs_ri_log( "chid: %04X, date: %s - %s", chid, t, t+16);421 cs_ri_log(reader, "chid: %04X, date: %s - %s", chid, t, t+16); 422 422 } 423 423 } … … 426 426 } 427 427 } 428 cs_ri_log( "[irdeto-reader] ready for requests");428 cs_ri_log(reader, "[irdeto-reader] ready for requests"); 429 429 return OK; 430 430 }
Note:
See TracChangeset
for help on using the changeset viewer.