Changeset 2323 for trunk/reader-viaccess.c
- Timestamp:
- 05/22/10 21:20:47 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/reader-viaccess.c
r2208 r2323 11 11 ushort year_e : 7; 12 12 }; 13 14 //TNTSAT 15 struct TEcm 16 { 17 int len; 18 int keynr; 19 unsigned char Data[255]; 20 int BadEcm; 21 }TEcm; 22 struct TMake 23 { 24 unsigned char ident[3]; 25 int Nbr; 26 struct TEcm Ecm[4] ; 27 int Pos; 28 }TMake; 29 static struct TMake Make; 30 //TNTSAT 13 31 14 32 static void parse_via_date(const uchar *buf, struct via_date *vd, int fend) … … 48 66 cls=(l-(j+1))*8+i; 49 67 if (p) 50 cs_log("%sclass: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", p, cls, 68 cs_log("%sclass: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", p, cls, 51 69 vd.year_s+1980, vd.month_s, vd.day_s, 52 70 vd.year_e+1980, vd.month_e, vd.day_e); 53 71 else 54 cs_ri_log(reader, "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls, 72 cs_ri_log(reader, "class: %02X, expiry date: %04d/%02d/%02d - %04d/%02d/%02d", cls, 55 73 vd.year_s+1980, vd.month_s, vd.day_s, 56 74 vd.year_e+1980, vd.month_e, vd.day_e); … … 59 77 60 78 static void show_subs(struct s_reader * reader, const uchar *emm) 61 { 79 { 62 80 // emm -> A9, A6, B6 63 81 … … 86 104 cls=(byts-(j+1))*8+i; 87 105 cs_log("%sclass %02X: expiry date: %02d/%02d/%04d - %02d/%02d/%04d", 88 fnano?"nano A9: ":"", cls, 89 vd.day_s, vd.month_s, vd.year_s+1980, 106 fnano?"nano A9: ":"", cls, 107 vd.day_s, vd.month_s, vd.year_s+1980, 90 108 vd.day_e, vd.month_e, vd.year_e+1980); 91 109 } … … 109 127 m=emm[emm[1]+1]; 110 128 parse_via_date(emm+2, &vd, 0); 111 cs_log("[viaccess-reader] nano B6: modexp %d%d%d%d%d%d: %02d/%02d/%04d", (m&0x20)?1:0, 129 cs_log("[viaccess-reader] nano B6: modexp %d%d%d%d%d%d: %02d/%02d/%04d", (m&0x20)?1:0, 112 130 (m&0x10)?1:0,(m&0x08)?1:0,(m&0x04)?1:0,(m&0x02)?1:0,(m&0x01)?1:0, 113 131 vd.day_s, vd.month_s, vd.year_s+1980); … … 155 173 // default: ver="unknown"; break; 156 174 // } 157 175 158 176 reader->caid[0]=0x500; 159 177 memset(reader->prid, 0xff, sizeof(reader->prid)); … … 217 235 } 218 236 237 int viaccess_do_ecm_tntsat(struct s_reader * reader, ECM_REQUEST *er) 238 { 239 //TNTSAT 240 def_resp; 241 static unsigned char insa4[] = { 0xca,0xa4,0x04,0x00,0x03 }; // set provider id 242 static unsigned char ins88[] = { 0xca,0x88,0x00,0x00,0x00 }; // set ecm 243 static unsigned char insf8[] = { 0xca,0xf8,0x00,0x00,0x00 }; // set geographic info 244 static unsigned char insc0[] = { 0xca,0xc0,0x00,0x00,0x12 }; // read dcw 245 246 const uchar *ecm2=er->ecm; 247 int i=0, z=0, x=0; 248 if ( ecm2[4]==0x80 && ecm2[6]==0xd2 && ecm2[7]==0x02)//long ecm 249 { 250 Make.Nbr=0; 251 memcpy (Make.ident, &ecm2[12], sizeof(Make.ident)); 252 253 for ( i=0; i<ecm2[2]; i++ ) 254 { 255 if (ecm2[i]==0x40 && ecm2[i+1]==0x07) 256 { 257 Make.Ecm[Make.Nbr].keynr=ecm2[i+5]; 258 259 Make.Ecm[Make.Nbr].len=ecm2[i-5]-13; 260 261 for ( x=0; x<ecm2[i-5]-13; x++ ) 262 Make.Ecm[Make.Nbr].Data[x]=ecm2[i+9+x]; 263 Make.Nbr++; 264 } 265 } 266 267 for ( Make.Pos=0; Make.Pos<Make.Nbr; Make.Pos++ ) 268 if(Make.Ecm[Make.Pos].BadEcm==0)break; 269 270 271 if((Make.Pos==Make.Nbr)&&(Make.Ecm[Make.Pos].BadEcm==1))//1=ko 272 for ( z=0; z<Make.Nbr; z++ ) 273 Make.Ecm[z].BadEcm=0;//0=ok 274 275 cs_debug("POS ecm %d \n",Make.Pos); 276 277 //80 00 4f 01 90 03 03 0b 08 e2 278 er->ecm[0]= 0x80; 279 er->ecm[1]= 0x70; 280 er->ecm[2]= Make.Ecm[Make.Pos].len+6; 281 er->ecm[3]= 0x01; 282 er->ecm[4]= 0x90; 283 er->ecm[5]= 0x03; 284 memcpy(&er->ecm[6],Make.ident,sizeof(Make.ident)); 285 er->ecm[8]= Make.Ecm[Make.Pos].keynr & 0xf; 286 memcpy(&er->ecm[9],Make.Ecm[Make.Pos].Data,Make.Ecm[Make.Pos].len); 287 288 289 } 290 //TNTSAT 291 292 293 const uchar *ecm88Data=er->ecm+4; //XXX what is the 4th byte for ?? 294 int ecm88Len=SCT_LEN(er->ecm)-4; 295 ulong provid; 296 int rc=0; 297 298 299 300 if ((ecm88Data[0]==0x90 || ecm88Data[0]==0x40) && (ecm88Data[1]==0x03 || ecm88Data[1]==0x07 ) ) 301 { 302 uchar ident[3], keynr; 303 //uchar buff[256]; // MAX_LEN 304 uchar *ecmf8Data=0; 305 int ecmf8Len=0; 306 307 memcpy (ident, &ecm88Data[2], sizeof(ident)); 308 provid = b2i(3, ident); 309 ident[2]&=0xF0; 310 keynr=ecm88Data[4]&0x0F; 311 if (!chk_prov(reader, ident, keynr)) 312 { 313 cs_debug("[viaccess-reader] ECM: provider or key not found on card"); 314 return ERROR; 315 } 316 ecm88Data+=5; 317 ecm88Len-=5; 318 319 320 if( reader->last_geo.provid != provid ) 321 { 322 reader->last_geo.provid = provid; 323 reader->last_geo.geo_len = 0; 324 reader->last_geo.geo[0] = 0; 325 write_cmd(insa4, ident); // set provider 326 } 327 328 while(ecm88Len>0 && ecm88Data[0]<0xA0) 329 { 330 int nanoLen=ecm88Data[1]+2; 331 if (!ecmf8Data) 332 ecmf8Data=(uchar *)ecm88Data; 333 ecmf8Len+=nanoLen; 334 ecm88Len-=nanoLen; 335 ecm88Data+=nanoLen; 336 } 337 if(ecmf8Len) 338 { 339 if( reader->last_geo.geo_len!=ecmf8Len || 340 memcmp(reader->last_geo.geo, ecmf8Data, reader->last_geo.geo_len)) 341 { 342 memcpy(reader->last_geo.geo, ecmf8Data, ecmf8Len); 343 reader->last_geo.geo_len= ecmf8Len; 344 insf8[3]=keynr; 345 insf8[4]=ecmf8Len; 346 write_cmd(insf8, ecmf8Data); 347 } 348 } 349 ins88[2]=ecmf8Len?1:0; 350 ins88[3]=keynr; 351 ins88[4]=ecm88Len; 352 353 write_cmd(ins88, (uchar *)ecm88Data); // request dcw 354 if( cta_res[cta_lr-2]!=0x90 || cta_res[cta_lr-1]!=0x00 ) 355 { 356 Make.Ecm[Make.Pos].BadEcm=1;//if error swap pos ecm 357 cs_log("send ecm error: %02X %02X", cta_res[cta_lr-2], cta_res[cta_lr-1]); 358 } 359 360 write_cmd(insc0, NULL); // read dcw 361 switch(cta_res[0]) 362 { 363 case 0xe8: // even 364 if(cta_res[1]==8) { memcpy(er->cw,cta_res+2,8); rc=1; } 365 break; 366 case 0xe9: // odd 367 if(cta_res[1]==8) { memcpy(er->cw+8,cta_res+2,8); rc=1; } 368 break; 369 case 0xea: // complete 370 if(cta_res[1]==16) { memcpy(er->cw,cta_res+2,16); rc=1; } 371 break; 372 } 373 } 374 aes_decrypt(er->cw, 16); 375 return(rc?OK:ERROR); 376 377 } 378 219 379 int viaccess_do_ecm(struct s_reader * reader, ECM_REQUEST *er) 220 380 { … … 222 382 static unsigned char insa4[] = { 0xca,0xa4,0x04,0x00,0x03 }; // set provider id 223 383 static unsigned char ins88[] = { 0xca,0x88,0x00,0x00,0x00 }; // set ecm 224 static unsigned char insf8[] = { 0xca,0xf8,0x00,0x00,0x00 }; // set geographic info 384 static unsigned char insf8[] = { 0xca,0xf8,0x00,0x00,0x00 }; // set geographic info 225 385 static unsigned char insc0[] = { 0xca,0xc0,0x00,0x00,0x12 }; // read dcw 386 226 387 227 388 const uchar *ecm88Data=er->ecm+4; //XXX what is the 4th byte for ?? … … 231 392 int hasD2 = 0; 232 393 uchar DE04[256]; 233 234 memset(DE04, 0, sizeof(DE04)); 394 memset(DE04, 0, sizeof(DE04)); //fix dorcel de04 bug 395 396 if (ecm88Data[0]==0x80 && ecm88Data[2]==0xd2 && ecm88Data[3]==0x02) //long ecm 397 { 398 return viaccess_do_ecm_tntsat(reader,er); 399 } 235 400 236 401 if(ecm88Data[0]==0xd2) … … 243 408 } 244 409 245 if ((ecm88Data[0]==0x90 || ecm88Data[0]==0x40) && ecm88Data[1]==0x03)410 if ((ecm88Data[0]==0x90 || ecm88Data[0]==0x40) && (ecm88Data[1]==0x03 || ecm88Data[1]==0x07 ) ) 246 411 { 247 412 uchar ident[3], keynr; … … 256 421 if (!chk_prov(reader, ident, keynr)) 257 422 { 258 cs_debug("[viaccess-reader] E MM: provider or key not found on card");423 cs_debug("[viaccess-reader] ECM: provider or key not found on card"); 259 424 return ERROR; 260 425 } … … 270 435 // 271 436 272 if( reader->last_geo.provid != provid ) 437 if( reader->last_geo.provid != provid ) 273 438 { 274 439 reader->last_geo.provid = provid; … … 289 454 if(ecmf8Len) 290 455 { 291 if( reader->last_geo.geo_len!=ecmf8Len || 456 if( reader->last_geo.geo_len!=ecmf8Len || 292 457 memcmp(reader->last_geo.geo, ecmf8Data, reader->last_geo.geo_len)) 293 458 { … … 314 479 } 315 480 // 316 481 317 482 write_cmd(insc0, NULL); // read dcw 318 483 switch(cta_res[0]) … … 451 616 } 452 617 453 // as we are maybe changing the used provider, clear the cache, so the next ecm will re-select the correct one 618 // as we are maybe changing the used provider, clear the cache, so the next ecm will re-select the correct one 454 619 memset(&reader->last_geo, 0, sizeof(reader->last_geo)); 455 620 456 621 // set provider 457 write_cmd(insa4, soid); 622 write_cmd(insa4, soid); 458 623 if( cta_res[cta_lr-2]!=0x90 || cta_res[cta_lr-1]!=0x00 ) { 459 624 cs_dump(insa4, 5, "set provider cmd:"); … … 496 661 /* other nanos */ 497 662 show_subs(reader, emmParsed); 498 663 499 664 memcpy(ins18Data+ins18Len, emmParsed, emmParsed[1] + 2); 500 665 ins18Len += emmParsed [1] + 2; … … 518 683 // set adf 519 684 insf0[3] = keynr; // key 520 write_cmd(insf0, nano9EData); 685 write_cmd(insf0, nano9EData); 521 686 if( cta_res[cta_lr-2]!=0x90 || cta_res[cta_lr-1]!=0x00 ) { 522 687 cs_dump(insf0, 5, "set adf cmd:"); … … 531 696 memcpy (insData, nano91Data, nano91Data[1] + 2); 532 697 memcpy (insData + nano91Data[1] + 2, nano9EData, nano9EData[1] + 2); 533 write_cmd(insf4, insData); 698 write_cmd(insf4, insData); 534 699 if(( cta_res[cta_lr-2]!=0x90 && cta_res[cta_lr-2]!=0x91) || cta_res[cta_lr-1]!=0x00 ) { 535 700 cs_dump(insf4, 5, "set adf encrypted cmd:"); … … 555 720 cs_log("[viaccess-reader] update error: %02X %02X", cta_res[cta_lr-2], cta_res[cta_lr-1]); 556 721 } 557 722 558 723 } else { 559 724 // send subscription encrypted … … 569 734 memcpy (insData + nano92Data[1] + 2, nano81Data, nano81Data[1] + 2); 570 735 memcpy (insData + nano92Data[1] + 2 + nano81Data[1] + 2, nanoF0Data, nanoF0Data[1] + 2); 571 write_cmd(ins1c, insData); 736 write_cmd(ins1c, insData); 572 737 if( cta_res[cta_lr-2]!=0x90 || cta_res[cta_lr-1]!=0x00 ) { 573 738 /* maybe a 2nd level status, so read it */ … … 576 741 ///cs_log("[viaccess-reader] update error: %02X %02X", cta_res[cta_lr-2], cta_res[cta_lr-1]); 577 742 578 write_cmd(insc8, insc8Data); 743 write_cmd(insc8, insc8Data); 579 744 if( cta_res[0] != 0x00 || cta_res[1] != 00 || cta_res[cta_lr-2]!=0x90 || cta_res[cta_lr-1]!=0x00 ) { 580 745 ///cs_dump(cta_res, cta_lr, "extended status error:"); … … 629 794 memset(&reader->last_geo, 0, sizeof(reader->last_geo)); 630 795 631 cs_log("[viaccess-reader] card detected"); 632 796 cs_log("[viaccess-reader] card detected"); 797 633 798 // set pin 634 799 write_cmd(ins24, pin); … … 685 850 fshow=(scls<show_cls); 686 851 insb8[4]=l; write_cmd(insb8, NULL); // read class subs 687 if( (cta_res[cta_lr-2]==0x90) && (fshow) && 852 if( (cta_res[cta_lr-2]==0x90) && (fshow) && 688 853 (cta_res[cta_lr-1]==0x00 || cta_res[cta_lr-1]==0x08) ) 689 854 { … … 695 860 696 861 insac[4]=0; 697 insa4[2]=0x02; 862 insa4[2]=0x02; 698 863 write_cmd(insa4, NULL); // select next provider 699 864 }
Note:
See TracChangeset
for help on using the changeset viewer.