Changeset 1975 for branches/modular/reader-videoguard2.c
- Timestamp:
- 04/06/10 17:45:45 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/modular/reader-videoguard2.c
r1905 r1975 11 11 #define MAX_HIST 15 // max. number of historical characters 12 12 13 #define write_cmd_vg(cmd, data) (card_write(reader, cmd, data, cta_res, &cta_lr) == 0) 14 13 15 ////// ==================================================================================== 14 16 … … 43 45 return ERROR; 44 46 } 45 46 47 47 48 unsigned short NdTabB001[0x15][0x20]= { … … 89 90 0x6AAB,0x33C1,0xE1F4,0x6165,0x7894,0x83B9,0x0A0C,0x38AF,0x5803,0x18C0,0xFA36,0x592C,0x4548,0xABB8,0x1527,0xAEE9 } 90 91 91 }; 92 }; 92 93 93 94 unsigned short Hash3[] = {0x0123,0x4567,0x89AB,0xCDEF,0xF861,0xCB52}; … … 399 400 unsigned char CW1[8], CW2[8]; 400 401 401 extern uchar cta_res[];402 extern ushort cta_lr;403 404 402 extern int io_serial_need_dummy_char; 405 403 … … 447 445 } 448 446 449 #define write_cmd(cmd, data) (card_write(cmd, data) == 0) 450 #define read_cmd(cmd, data) (card_write(cmd, NULL) == 0) 451 452 static int read_cmd_len(const unsigned char *cmd) 447 static int read_cmd_len(struct s_reader * reader, const unsigned char *cmd) 453 448 { 449 def_resp; 454 450 unsigned char cmd2[5]; 455 451 memcpy(cmd2,cmd,5); 456 452 cmd2[3]=0x80; 457 453 cmd2[4]=1; 458 if(! read_cmd(cmd2,NULL) || cta_res[1] != 0x90 || cta_res[2] != 0x00) {454 if(!write_cmd_vg(cmd2,NULL) || cta_res[1] != 0x90 || cta_res[2] != 0x00) { 459 455 cs_debug("[videoguard2-reader] failed to read %02x%02x cmd length (%02x %02x)",cmd[1],cmd[2],cta_res[1],cta_res[2]); 460 456 return -1; … … 463 459 } 464 460 465 static int do_cmd(const unsigned char *ins, const unsigned char *txbuff, unsigned char *rxbuff) 466 { 461 static int do_cmd(struct s_reader * reader, const unsigned char *ins, const unsigned char *txbuff, unsigned char *rxbuff, unsigned char * cta_res) 462 { 463 ushort cta_lr; 467 464 unsigned char ins2[5]; 468 465 memcpy(ins2,ins,5); … … 470 467 if(cmd_table_get_info(ins2,&len,&mode)) { 471 468 if(len==0xFF && mode==2) { 472 if(ins2[4]==0) ins2[4]=len=read_cmd_len( ins2);469 if(ins2[4]==0) ins2[4]=len=read_cmd_len(reader, ins2); 473 470 } 474 471 else if(mode!=0) ins2[4]=len; … … 480 477 if(!rxbuff) rxbuff=tmp; 481 478 if(mode>1) { 482 if(! read_cmd(ins2,NULL) || !status_ok(cta_res+len)) return -1;479 if(!write_cmd_vg(ins2,NULL) || !status_ok(cta_res+len)) return -1; 483 480 memcpy(rxbuff,ins2,5); 484 481 memcpy(rxbuff+5,cta_res,len); … … 486 483 } 487 484 else { 488 if(!write_cmd (ins2,(uchar *)txbuff) || !status_ok(cta_res)) return -2;485 if(!write_cmd_vg(ins2,(uchar *)txbuff) || !status_ok(cta_res)) return -2; 489 486 memcpy(rxbuff,ins2,5); 490 487 memcpy(rxbuff+5,txbuff,len); … … 545 542 }; 546 543 547 static char *get_tier_name( unsigned short tier_id){544 static char *get_tier_name(struct s_reader * reader, unsigned short tier_id){ 548 545 static char *empty = ""; 549 546 unsigned int i; 550 547 551 switch (reader [ridx].caid[0])548 switch (reader->caid[0]) 552 549 { 553 550 case 0x919: … … 561 558 } 562 559 563 static void read_tiers(void) 564 { 560 static void read_tiers(struct s_reader * reader) 561 { 562 def_resp; 565 563 static const unsigned char ins2a[5] = { 0xd0,0x2a,0x00,0x00,0x00 }; 566 564 int l; 567 l=do_cmd( ins2a,NULL,NULL);565 l=do_cmd(reader, ins2a,NULL,NULL,cta_res); 568 566 if(l<0 || !status_ok(cta_res+l)) return; 569 567 static unsigned char ins76[5] = { 0xd0,0x76,0x00,0x00,0x00 }; 570 568 ins76[3]=0x7f; ins76[4]=2; 571 if(! read_cmd(ins76,NULL) || !status_ok(cta_res+2)) return;569 if(!write_cmd_vg(ins76,NULL) || !status_ok(cta_res+2)) return; 572 570 ins76[3]=0; ins76[4]=0; 573 571 int num=cta_res[1]; 574 572 int i; 575 reader [ridx].init_history_pos = 0; //reset for re-read576 memset(reader [ridx].init_history, 0, sizeof(reader[ridx].init_history));573 reader->init_history_pos = 0; //reset for re-read 574 memset(reader->init_history, 0, sizeof(reader->init_history)); 577 575 for(i=0; i<num; i++) { 578 576 ins76[2]=i; 579 l=do_cmd( ins76,NULL,NULL);577 l=do_cmd(reader, ins76,NULL,NULL,cta_res); 580 578 if(l<0 || !status_ok(cta_res+l)) return; 581 579 if(cta_res[2]==0 && cta_res[3]==0) break; … … 583 581 rev_date_calc(&cta_res[4],&y,&m,&d,&H,&M,&S); 584 582 unsigned short tier_id = (cta_res[2] << 8) | cta_res[3]; 585 char *tier_name = get_tier_name( tier_id);586 cs_ri_log( "[videoguard2-reader] tier: %04x, expiry date: %04d/%02d/%02d-%02d:%02d:%02d %s",tier_id,y,m,d,H,M,S,tier_name);587 } 588 } 589 590 int videoguard_card_init( ATR newatr)583 char *tier_name = get_tier_name(reader, tier_id); 584 cs_ri_log(reader, "[videoguard2-reader] tier: %04x, expiry date: %04d/%02d/%02d-%02d:%02d:%02d %s",tier_id,y,m,d,H,M,S,tier_name); 585 } 586 } 587 588 int videoguard_card_init(struct s_reader * reader, ATR newatr) 591 589 { 592 590 get_hist; … … 594 592 return ERROR; 595 593 get_atr; 594 def_resp; 596 595 /* known atrs */ 597 596 unsigned char atr_bskyb[] = { 0x3F, 0x7F, 0x13, 0x25, 0x03, 0x33, 0xB0, 0x06, 0x69, 0xFF, 0x4A, 0x50, 0xD0, 0x00, 0x00, 0x53, 0x59, 0x00, 0x00, 0x00 }; … … 610 609 if ((atr_size == sizeof (atr_bskyb)) && (memcmp (atr, atr_bskyb, atr_size) == 0)) 611 610 { 612 cs_ri_log( "[videoguard2-reader] type: VideoGuard BSkyB");611 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard BSkyB"); 613 612 /* BSkyB seems to need one additionnal byte in the serial communication... */ 614 613 io_serial_need_dummy_char = 1; … … 617 616 else if ((atr_size == sizeof (atr_bskyb_new)) && (memcmp (atr, atr_bskyb_new, atr_size) == 0)) 618 617 { 619 cs_ri_log( "[videoguard2-reader] type: VideoGuard BSkyB - New");618 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard BSkyB - New"); 620 619 } 621 620 else if ((atr_size == sizeof (atr_skyitalia)) && (memcmp (atr, atr_skyitalia, atr_size) == 0)) 622 621 { 623 cs_ri_log( "[videoguard2-reader] type: VideoGuard Sky Italia");622 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Sky Italia"); 624 623 } 625 624 else if ((atr_size == sizeof (atr_directv)) && (memcmp (atr, atr_directv, atr_size) == 0)) 626 625 { 627 cs_ri_log( "[videoguard2-reader] type: VideoGuard DirecTV");626 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard DirecTV"); 628 627 } 629 628 else if ((atr_size == sizeof (atr_yes)) && (memcmp (atr, atr_yes, atr_size) == 0)) 630 629 { 631 cs_ri_log( "[videoguard2-reader] type: VideoGuard YES DBS Israel");630 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard YES DBS Israel"); 632 631 } 633 632 else if ((atr_size == sizeof (atr_viasat_new)) && (memcmp (atr, atr_viasat_new, atr_size) == 0)) 634 633 { 635 cs_ri_log( "[videoguard2-reader] type: VideoGuard Viasat new (093E)");634 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Viasat new (093E)"); 636 635 BASEYEAR = 2000; 637 636 } 638 637 else if ((atr_size == sizeof (atr_viasat_scandinavia)) && (memcmp (atr, atr_viasat_scandinavia, atr_size) == 0)) 639 638 { 640 cs_ri_log( "[videoguard2-reader] type: VideoGuard Viasat Scandinavia");639 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Viasat Scandinavia"); 641 640 BASEYEAR = 2000; 642 641 } 643 642 else if ((atr_size == sizeof (atr_skyitalia93b)) && (memcmp (atr, atr_skyitalia93b, atr_size) == 0)) 644 643 { 645 cs_ri_log( "[videoguard2-reader] type: VideoGuard Sky Italia new (093B)");644 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Sky Italia new (093B)"); 646 645 } 647 646 else if ((atr_size == sizeof (atr_premiere)) && (memcmp (atr, atr_premiere, atr_size) == 0)) 648 647 { 649 cs_ri_log( "[videoguard2-reader] type: VideoGuard Sky Germany");648 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Sky Germany"); 650 649 } 651 650 else if ((atr_size == sizeof (atr_kbw)) && (memcmp (atr, atr_kbw, atr_size) == 0)) 652 651 { 653 cs_ri_log( "[videoguard2-reader] type: VideoGuard Kabel BW");652 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Kabel BW"); 654 653 } 655 654 else if ((atr_size == sizeof (atr_get)) && (memcmp (atr, atr_get, atr_size) == 0)) 656 655 { 657 cs_ri_log( "[videoguard2-reader] type: VideoGuard Get Kabel Norway");656 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Get Kabel Norway"); 658 657 BASEYEAR = 2004; 659 658 } 660 659 else if ((atr_size == sizeof (atr_foxtel_90b)) && (memcmp (atr, atr_foxtel_90b, atr_size) == 0)) 661 660 { 662 cs_ri_log( "[videoguard2-reader] type: VideoGuard Foxtel Australia (090b)");661 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard Foxtel Australia (090b)"); 663 662 BASEYEAR = 2000; 664 663 } … … 673 672 unsigned char ins7401[5] = { 0xD0,0x74,0x01,0x00,0x00 }; 674 673 int l; 675 if((l=read_cmd_len( ins7401))<0) return ERROR; //not a videoguard2/NDS card or communication error674 if((l=read_cmd_len(reader, ins7401))<0) return ERROR; //not a videoguard2/NDS card or communication error 676 675 ins7401[4]=l; 677 if(! read_cmd(ins7401,NULL) || !status_ok(cta_res+l)) {676 if(!write_cmd_vg(ins7401,NULL) || !status_ok(cta_res+l)) { 678 677 cs_log ("[videoguard2-reader] failed to read cmd list"); 679 678 return ERROR; … … 684 683 685 684 unsigned char ins7416[5] = { 0xD0,0x74,0x16,0x00,0x00 }; 686 if(do_cmd( ins7416, NULL, NULL)<0) {685 if(do_cmd(reader, ins7416, NULL, NULL,cta_res)<0) { 687 686 cs_log ("[videoguard2-reader] cmd 7416 failed"); 688 687 return ERROR; … … 692 691 unsigned char boxID [4]; 693 692 694 if (reader [ridx].boxid > 0) {693 if (reader->boxid > 0) { 695 694 /* the boxid is specified in the config */ 696 695 int i; 697 696 for (i=0; i < 4; i++) { 698 boxID[i] = (reader [ridx].boxid >> (8 * (3 - i))) % 0x100;697 boxID[i] = (reader->boxid >> (8 * (3 - i))) % 0x100; 699 698 } 700 699 } else { 701 700 /* we can try to get the boxid from the card */ 702 701 int boxidOK=0; 703 l=do_cmd( ins36, NULL, buff);702 l=do_cmd(reader, ins36, NULL, buff,cta_res); 704 703 if(l>=0) { 705 704 int i; … … 722 721 unsigned char payload4C[9] = { 0,0,0,0, 3,0,0,0,4 }; 723 722 memcpy(payload4C,boxID,4); 724 if(!write_cmd (ins4C,payload4C) || !status_ok(cta_res+l)) {723 if(!write_cmd_vg(ins4C,payload4C) || !status_ok(cta_res+l)) { 725 724 cs_log("[videoguard2-reader] sending boxid failed"); 726 725 return ERROR; … … 729 728 //short int SWIRDstatus = cta_res[1]; 730 729 unsigned char ins58[5] = { 0xD0,0x58,0x00,0x00,0x00 }; 731 l=do_cmd( ins58, NULL, buff);730 l=do_cmd(reader, ins58, NULL, buff,cta_res); 732 731 if(l<0) { 733 732 cs_log("[videoguard2-reader] cmd ins58 failed"); 734 733 return ERROR; 735 734 } 736 memset(reader [ridx].hexserial, 0, 8);737 memcpy(reader [ridx].hexserial+2, cta_res+3, 4);738 reader [ridx].caid[0] = cta_res[24]*0x100+cta_res[25];735 memset(reader->hexserial, 0, 8); 736 memcpy(reader->hexserial+2, cta_res+3, 4); 737 reader->caid[0] = cta_res[24]*0x100+cta_res[25]; 739 738 740 739 /* we have one provider, 0x0000 */ 741 reader [ridx].nprov = 1;742 memset(reader [ridx].prid, 0x00, sizeof(reader[ridx].prid));740 reader->nprov = 1; 741 memset(reader->prid, 0x00, sizeof(reader->prid)); 743 742 744 743 /* … … 766 765 unsigned char tbuff[64]; 767 766 cCamCryptVG2_GetCamKey(tbuff); 768 l=do_cmd( insB4, tbuff, NULL);767 l=do_cmd(reader, insB4, tbuff, NULL,cta_res); 769 768 if(l<0 || !status_ok(cta_res)) { 770 769 cs_log ("[videoguard2-reader] cmd D0B4 failed (%02X%02X)", cta_res[0], cta_res[1]); … … 773 772 774 773 unsigned char insBC[5] = { 0xD0,0xBC,0x00,0x00,0x00 }; 775 l=do_cmd( insBC, NULL, NULL);774 l=do_cmd(reader, insBC, NULL, NULL,cta_res); 776 775 if(l<0) { 777 776 cs_log("[videoguard2-reader] cmd D0BC failed"); … … 780 779 781 780 unsigned char insBE[5] = { 0xD3,0xBE,0x00,0x00,0x00 }; 782 l=do_cmd( insBE, NULL, NULL);781 l=do_cmd(reader, insBE, NULL, NULL,cta_res); 783 782 if(l<0) { 784 783 cs_log("[videoguard2-reader] cmd D3BE failed"); … … 787 786 788 787 unsigned char ins58a[5] = { 0xD1,0x58,0x00,0x00,0x00 }; 789 l=do_cmd( ins58a, NULL, NULL);788 l=do_cmd(reader, ins58a, NULL, NULL,cta_res); 790 789 if(l<0) { 791 790 cs_log("[videoguard2-reader] cmd D158 failed"); … … 794 793 795 794 unsigned char ins4Ca[5] = { 0xD1,0x4C,0x00,0x00,0x00 }; 796 l=do_cmd( ins4Ca,payload4C, NULL);795 l=do_cmd(reader, ins4Ca,payload4C, NULL,cta_res); 797 796 if(l<0 || !status_ok(cta_res)) { 798 797 cs_log("[videoguard2-reader] cmd D14Ca failed"); … … 800 799 } 801 800 802 cs_ri_log( "[videoguard2-reader] type: VideoGuard, caid: %04X, serial: %02X%02X%02X%02X, BoxID: %02X%02X%02X%02X",803 reader [ridx].caid[0],804 reader [ridx].hexserial[2],reader[ridx].hexserial[3],reader[ridx].hexserial[4],reader[ridx].hexserial[5],801 cs_ri_log(reader, "[videoguard2-reader] type: VideoGuard, caid: %04X, serial: %02X%02X%02X%02X, BoxID: %02X%02X%02X%02X", 802 reader->caid[0], 803 reader->hexserial[2],reader->hexserial[3],reader->hexserial[4],reader->hexserial[5], 805 804 boxID[0],boxID[1],boxID[2],boxID[3]); 806 805 … … 811 810 return OK; 812 811 } 813 814 815 816 817 818 812 819 813 static void do_post_dw_hash(unsigned char *cw, unsigned char *ecm_header_data) { … … 826 820 return; 827 821 828 829 830 831 832 833 834 835 836 822 ecm_header_count=ecm_header_data[0]; 823 824 for(i=0, ecmi = 1; i<ecm_header_count; i++) { 825 if(ecm_header_data[ecmi+1] != 0xb0) { 826 ecmi += ecm_header_data[ecmi]+1; 827 } else { 828 switch(ecm_header_data[ecmi+2]) { //b0 01 829 case 1: 830 { 837 831 unsigned short hk[8],i,j,m=0; 838 832 for (i = 0; i < 6; i++) hk[2+i]=Hash3[i]; … … 866 860 cw[7] = (cw[4] + cw[5] + cw[6]) & 0xFF; 867 861 cs_ddump (cw, 8, "Postprocessed2 DW:"); 868 869 870 871 862 break; 863 } 864 case 3: 865 { 872 866 memset(buffer,0,sizeof(buffer)); 873 867 memcpy(buffer,cw,8); … … 876 870 memcpy(cw,md5_digest,8); 877 871 cs_ddump (cw, 8, "Postprocessed2 DW:"); 878 879 880 881 882 872 break; 873 } 874 875 case 2: 876 { /* Method 2 left out */ 883 877 //memcpy(DW_OUTPUT, DW_INPUT, 8); 884 885 886 887 888 889 } 890 891 int videoguard_do_ecm( ECM_REQUEST *er)878 break; 879 } 880 } 881 } 882 } 883 } 884 885 int videoguard_do_ecm(struct s_reader * reader, ECM_REQUEST *er) 892 886 { 893 887 //unsigned char cw[16]; 888 unsigned char cta_res[CTA_RES_LEN]; 894 889 static unsigned char ins40[5] = { 0xD1,0x40,0x00,0x80,0xFF }; 895 890 static const unsigned char ins54[5] = { 0xD3,0x54,0x00,0x00,0x00}; … … 901 896 ins40[4]=lenECMpart2; 902 897 int l; 903 l = do_cmd( ins40,tbuff,NULL);898 l = do_cmd(reader, ins40,tbuff,NULL,cta_res); 904 899 if(l>0 && status_ok(cta_res)) { 905 l = do_cmd( ins54,NULL,NULL);900 l = do_cmd(reader, ins54,NULL,NULL,cta_res); 906 901 if(l>0 && status_ok(cta_res+l)) { 907 902 if (!cw_is_valid(CW1)) //sky cards report 90 00 = ok but send cw = 00 when channel not subscribed … … 1022 1017 } 1023 1018 1024 int videoguard_do_emm(EMM_PACKET *ep) 1025 { 1019 int videoguard_do_emm(struct s_reader * reader, EMM_PACKET *ep) 1020 { 1021 unsigned char cta_res[CTA_RES_LEN]; 1026 1022 unsigned char ins42[5] = { 0xD1,0x42,0x00,0x00,0xFF }; 1027 1023 int rc=ERROR; 1028 1024 1029 const unsigned char *payload = payload_addr(ep->emm, reader [ridx].hexserial);1025 const unsigned char *payload = payload_addr(ep->emm, reader->hexserial); 1030 1026 while (payload) { 1031 1027 ins42[4]=*payload; 1032 int l = do_cmd( ins42,payload+1,NULL);1028 int l = do_cmd(reader, ins42,payload+1,NULL,cta_res); 1033 1029 if(l>0 && status_ok(cta_res)) { 1034 1030 rc=OK; … … 1038 1034 //cs_dump(ep->emm, 64, "EMM:"); 1039 1035 if (status_ok (cta_res) && (cta_res[1] & 0x01)) { 1040 read_tiers( );1036 read_tiers(reader); 1041 1037 } 1042 1038 … … 1056 1052 } 1057 1053 1058 int videoguard_card_info( void)1054 int videoguard_card_info(struct s_reader * reader) 1059 1055 { 1060 1056 /* info is displayed in init, or when processing info */ 1061 1057 cs_log("[videoguard2-reader] card detected"); 1062 1058 cs_log("[videoguard2-reader] type: VideoGuard" ); 1063 read_tiers ( );1059 read_tiers (reader); 1064 1060 return OK; 1065 1061 }
Note:
See TracChangeset
for help on using the changeset viewer.