Changeset 8119
- Timestamp:
- 01/18/13 02:30:35 (11 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi-coolapi.c
r8087 r8119 400 400 } 401 401 402 //coolstream supports only a 12 bytes demux filter so we need to compare all 16 bytes403 int32_t emm_pattern_matching(uchar * buff, dmx_callback_data_t * data, int32_t pid)404 {405 uint32_t i,j,found;406 407 if (ll_count(ll_cool_filter) > 0) {408 LL_ITER itr = ll_iter_create(ll_cool_filter);409 S_COOL_FILTER *filter_item;410 while ((filter_item=ll_iter_next(&itr))) {411 if (filter_item->pid != pid || (int32_t) filter_item->channel != (int32_t) data->channel)412 continue;413 found = 1;414 for (i=0,j=0; i < 16 && i < data->len && found; i++,j++) {415 found = (filter_item->filter16[j] == (buff[i]&filter_item->mask16[j]));416 if (i==0) i+=2;417 }418 if (found)419 return 0;420 }421 }422 return -1;423 }424 425 402 int32_t coolapi_read(dmx_t * dmx, dmx_callback_data_t * data) 426 403 { … … 459 436 //cs_debug_mask(D_DVBAPI, "bytes read %d\n", done); 460 437 461 if (dmx->type == TYPE_ECM || dmx->pid == 0x001 || emm_pattern_matching(buff,data,dmx->pid) > -1) 462 return 0; 463 else 464 return -1; 438 return 0; 465 439 } 466 440 -
trunk/module-dvbapi.c
r8109 r8119 604 604 struct s_cardsystem *cs; 605 605 if (!rdr->caid) 606 cs = get_cardsystem_by_caid(rdr->csystem.caids[0]); 606 cs = get_cardsystem_by_caid(rdr->csystem.caids[0]); //Bulcrypt 607 607 else 608 608 cs = get_cardsystem_by_caid(rdr->caid); … … 643 643 //.. provid 0 is safe since oscam sets filter with e.g. rdr->sa & doesn't add filter twice (is_emmfilter_in_list) 644 644 if (!rdr->caid) { 645 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->csystem.caids[0], 0); 645 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->csystem.caids[0], 0); //Bulcrypt 646 646 if (l<0) 647 647 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->csystem.caids[1], 0); 648 648 } else { 649 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->caid, 0); 649 if (rdr->auprovid) { 650 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->caid, rdr->auprovid); 651 if (l<0) 652 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->caid, 0); 653 } else { 654 l = dvbapi_find_emmpid(demux_index, emmtype, rdr->caid, 0); 655 } 650 656 } 651 657 } … … 1044 1050 1045 1051 #ifdef READER_VIACCESS 1046 extern int32_t viaccess_reassemble_emm(uchar *buffer, uint32_t *len );1052 extern int32_t viaccess_reassemble_emm(uchar *buffer, uint32_t *len, int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid); 1047 1053 #endif 1048 1054 #ifdef READER_CRYPTOWORKS 1049 extern int32_t cryptoworks_reassemble_emm(uchar *buffer, uint32_t *len );1055 extern int32_t cryptoworks_reassemble_emm(uchar *buffer, uint32_t *len, int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid); 1050 1056 #endif 1051 1057 … … 1066 1072 case 0x05: 1067 1073 #ifdef READER_VIACCESS 1068 if (!viaccess_reassemble_emm(buffer, &len ))1074 if (!viaccess_reassemble_emm(buffer, &len, demux_index, filter->caid, filter->provid, filter->pid)) 1069 1075 #endif 1070 1076 return; … … 1072 1078 case 0x0d: 1073 1079 #ifdef READER_CRYPTOWORKS 1074 if (!cryptoworks_reassemble_emm(buffer, &len ))1080 if (!cryptoworks_reassemble_emm(buffer, &len, demux_index, filter->caid, filter->provid, filter->pid)) 1075 1081 #endif 1076 1082 return; -
trunk/reader-cryptoworks.c
r7999 r8119 704 704 void dvbapi_sort_nanos(unsigned char *dest, const unsigned char *src, int32_t len); 705 705 706 int32_t cryptoworks_reassemble_emm(uchar *buffer, uint32_t *len) { 707 static uchar emm_global[512]; // function only called from dvbapi thread, no need to be threadsafe 708 static int32_t emm_global_len = 0; 706 struct s_reassemble_cwemm_data { 707 int32_t demux_id; 708 uint16_t caid; 709 uint32_t provid; 710 uint16_t pid; 711 uchar emm_global[512]; 712 uint32_t emm_global_len; 713 } S_REASSEMBLE_CWEMM_DATA; 714 LLIST *ll_reassemble_cwemm_data = NULL; 715 716 struct s_reassemble_cwemm_data *get_reassemble_cwemm_data(int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid) 717 { 718 if (!ll_reassemble_cwemm_data) 719 ll_reassemble_cwemm_data = ll_create("ll_reassemble_cwemm_data"); 720 721 struct s_reassemble_cwemm_data *data; 722 LL_ITER itr; 723 if (ll_count(ll_reassemble_cwemm_data) > 0) { 724 itr = ll_iter_create(ll_reassemble_cwemm_data); 725 while ((data=ll_iter_next(&itr))) { 726 if (data->demux_id == demux_index && data->caid == caid && data->provid == provid && data->pid == pid) 727 return data; 728 } 729 } 730 return NULL; 731 } 732 733 int8_t add_reassemble_cwemm_data(int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid, uchar *buffer, uint32_t *len) 734 { 735 if (!ll_reassemble_cwemm_data) 736 ll_reassemble_cwemm_data = ll_create("ll_reassemble_cwemm_data"); 737 738 struct s_reassemble_cwemm_data *data; 739 if (!cs_malloc(&data,sizeof(struct s_reassemble_cwemm_data))) 740 return 0; 741 742 data->demux_id = demux_index; 743 data->caid = caid; 744 data->provid = provid; 745 data->pid = pid; 746 data->emm_global_len =*len; 747 memcpy(data->emm_global, buffer, *len); 748 ll_append(ll_reassemble_cwemm_data, data); 749 return 1; 750 } 751 752 int32_t cryptoworks_reassemble_emm(int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid, uchar *buffer, uint32_t *len) { 709 753 int32_t emm_len = 0; 710 754 … … 718 762 char dumpbuf[255]; 719 763 764 struct s_reassemble_cwemm_data *data = get_reassemble_cwemm_data(demux_index, caid, provid, pid); 765 720 766 switch (buffer[0]) { 721 767 case 0x82 : // emm-u … … 725 771 case 0x84: // emm-sh 726 772 cs_debug_mask(D_DVBAPI, "[cryptoworks] shared emm (EMM-SH): %s" , cs_hexdump(0, buffer, *len, dumpbuf, sizeof(dumpbuf))); 727 if (!memcmp(emm_global, buffer, *len)) return 0; 728 memcpy(emm_global, buffer, *len); 729 emm_global_len=*len; 773 774 if (!data || !data->emm_global) { 775 add_reassemble_cwemm_data(demux_index, caid, provid, pid, buffer, len); 776 return 0; 777 } 778 779 // emm-s part 1 780 if (!memcmp(data->emm_global, buffer, *len)) 781 return 0; 782 783 ll_remove(ll_reassemble_cwemm_data, data); 784 // copy first part of the emm-s 785 add_reassemble_cwemm_data(demux_index, caid, provid, pid, buffer, len); 786 //cs_ddump_mask(D_READER, buffer, len, "viaccess global emm:"); 730 787 return 0; 731 732 788 case 0x86: // emm-sb 733 789 cs_debug_mask(D_DVBAPI, "[cryptoworks] shared emm (EMM-SB): %s" , cs_hexdump(0, buffer, *len, dumpbuf, sizeof(dumpbuf))); 734 if (!emm_global_len) return 0; 790 if (!data || !data->emm_global_len || !data->emm_global) 791 return 0; 735 792 736 793 // we keep the first 12 bytes of the 0x84 emm (EMM-SH) … … 744 801 // 745 802 746 emm_len=*len-5 + emm_global_len-12;803 emm_len=*len-5 + data->emm_global_len-12; 747 804 unsigned char *tmp, *assembled; 748 805 if (!cs_malloc(&tmp, emm_len)) … … 756 813 return 0; 757 814 memcpy(tmp,&buffer[5], *len-5); 758 memcpy(tmp+*len-5,& emm_global[12],emm_global_len-12);759 memcpy(assembled_EMM, emm_global,12);815 memcpy(tmp+*len-5,&data->emm_global[12],data->emm_global_len-12); 816 memcpy(assembled_EMM,data->emm_global,12); 760 817 dvbapi_sort_nanos(assembled_EMM+12,tmp,emm_len); 761 818 … … 769 826 free(assembled_EMM); 770 827 771 emm_global_len=0;828 data->emm_global_len=0; 772 829 773 830 cs_debug_mask(D_DVBAPI, "[cryptoworks] shared emm (assembled): %s", cs_hexdump(0, buffer, emm_len+12, dumpbuf, sizeof(dumpbuf))); -
trunk/reader-viaccess.c
r7999 r8119 678 678 unsigned char ins18[] = { 0xca,0x18,0x01,0x01,0x00 }; // set subscription 679 679 unsigned char ins1c[] = { 0xca,0x1c,0x01,0x01,0x00 }; // set subscription, encrypted 680 static const unsigned char insc8[] = { 0xca,0xc8,0x00,0x00,0x02 }; // read extended status680 //static const unsigned char insc8[] = { 0xca,0xc8,0x00,0x00,0x02 }; // read extended status 681 681 // static const unsigned char insc8Data[] = { 0x00,0x00 }; // data for read extended status 682 682 … … 853 853 write_cmd(ins1c, insData); 854 854 855 if( (cta_res[cta_lr-2]==0x90 && cta_res[cta_lr-1]==0x00) ) { 855 if( (cta_res[cta_lr-2]==0x90 || cta_res[cta_lr-2]==0x91) && 856 (cta_res[cta_lr-1]==0x00 || cta_res[cta_lr-1]==0x08) ) { 856 857 rdr_log(reader, "update successfully written"); 857 858 rc=1; // written 858 859 } 860 rc=1; 861 /* don't return ERROR at this place 859 862 else { 860 863 if( cta_res[cta_lr-2]&0x1 ) … … 868 871 //} 869 872 return ERROR; 870 } 873 } */ 871 874 872 875 } … … 985 988 void dvbapi_sort_nanos(unsigned char *dest, const unsigned char *src, int32_t len); 986 989 987 int32_t viaccess_reassemble_emm(uchar *buffer, uint32_t *len) { 988 static uchar emm_global[512]; 989 static int32_t emm_global_len = 0; 990 991 int32_t pos=0, i; 992 uint32_t k; 990 struct s_reassemble_viaemm_data { 991 int32_t demux_id; 992 uint16_t caid; 993 uint32_t provid; 994 uint16_t pid; 995 uchar emm_global[512]; 996 uint32_t emm_global_len; 997 } S_REASSEMBLE_VIAEMM_DATA; 998 LLIST *ll_reassemble_viaemm_data = NULL; 999 1000 struct s_reassemble_viaemm_data *get_reassemble_viaemm_data(int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid) 1001 { 1002 if (!ll_reassemble_viaemm_data) 1003 ll_reassemble_viaemm_data = ll_create("ll_reassemble_viaemm_data"); 1004 1005 struct s_reassemble_viaemm_data *data; 1006 LL_ITER itr; 1007 if (ll_count(ll_reassemble_viaemm_data) > 0) { 1008 itr = ll_iter_create(ll_reassemble_viaemm_data); 1009 while ((data=ll_iter_next(&itr))) { 1010 if (data->demux_id == demux_index && data->caid == caid && data->provid == provid && data->pid == pid) 1011 return data; 1012 } 1013 } 1014 return NULL; 1015 } 1016 1017 int8_t add_reassemble_viaemm_data(int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid, uchar *buffer, uint32_t *len) 1018 { 1019 if (!ll_reassemble_viaemm_data) 1020 ll_reassemble_viaemm_data = ll_create("ll_reassemble_viaemm_data"); 1021 1022 struct s_reassemble_viaemm_data *data; 1023 if (!cs_malloc(&data,sizeof(struct s_reassemble_viaemm_data))) 1024 return 0; 1025 1026 data->demux_id = demux_index; 1027 data->caid = caid; 1028 data->provid = provid; 1029 data->pid = pid; 1030 data->emm_global_len =*len; 1031 memcpy(data->emm_global, buffer, *len); 1032 ll_append(ll_reassemble_viaemm_data, data); 1033 return 1; 1034 } 1035 1036 int32_t viaccess_reassemble_emm(uchar *buffer, uint32_t *len, int32_t demux_index, uint16_t caid, uint32_t provid, uint16_t pid) { 1037 int32_t pos=0; 1038 uint32_t i, k; 993 1039 994 1040 // Viaccess 995 1041 if (*len>500) return 0; 1042 1043 struct s_reassemble_viaemm_data *data = get_reassemble_viaemm_data(demux_index, caid, provid, pid); 996 1044 997 1045 switch(buffer[0]) { 998 1046 case 0x8c: 999 1047 case 0x8d: 1048 if (!data || !data->emm_global_len || !data->emm_global) { 1049 add_reassemble_viaemm_data(demux_index, caid, provid, pid, buffer, len); 1050 return 0; 1051 } 1000 1052 // emm-s part 1 1001 if (!memcmp( emm_global, buffer, *len))1053 if (!memcmp(data->emm_global, buffer, *len)) 1002 1054 return 0; 1003 1055 1056 ll_remove(ll_reassemble_viaemm_data, data); 1004 1057 // copy first part of the emm-s 1005 memcpy(emm_global, buffer, *len); 1006 emm_global_len=*len; 1058 add_reassemble_viaemm_data(demux_index, caid, provid, pid, buffer, len); 1007 1059 //cs_ddump_mask(D_READER, buffer, len, "viaccess global emm:"); 1008 1060 return 0; … … 1010 1062 case 0x8e: 1011 1063 // emm-s part 2 1012 if (!emm_global_len) return 0; 1064 if (!data || !data->emm_global_len || !data->emm_global) 1065 return 0; 1013 1066 1014 1067 //extract nanos from emm-gh and emm-s … … 1017 1070 cs_debug_mask(D_DVBAPI, "[viaccess] %s: start extracting nanos", __func__); 1018 1071 //extract from emm-gh 1019 for (i=3; i< emm_global_len; i+=emm_global[i+1]+2) {1072 for (i=3; i<data->emm_global_len; i+=data->emm_global[i+1]+2) { 1020 1073 //copy nano (length determined by i+1) 1021 memcpy(emmbuf+pos, emm_global+i,emm_global[i+1]+2);1022 pos+= emm_global[i+1]+2;1074 memcpy(emmbuf+pos, data->emm_global+i, data->emm_global[i+1]+2); 1075 pos+=data->emm_global[i+1]+2; 1023 1076 } 1024 1077 … … 1050 1103 buffer[2]=pos-3; 1051 1104 1052 cs_ddump_mask(D_DVBAPI, emm_global,emm_global_len, "[viaccess] %s: emm-gh", __func__);1105 cs_ddump_mask(D_DVBAPI, data->emm_global, data->emm_global_len, "[viaccess] %s: emm-gh", __func__); 1053 1106 cs_ddump_mask(D_DVBAPI, buffer, pos, "[viaccess] %s: assembled emm", __func__); 1054 1107
Note:
See TracChangeset
for help on using the changeset viewer.