Changeset 8241
- Timestamp:
- 01/30/13 13:47:17 (11 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Makefile
r8115 r8241 340 340 SRC-y += oscam-config-reader.c 341 341 SRC-y += oscam-config.c 342 SRC-y += oscam-emm.c 342 343 SRC-y += oscam-failban.c 343 344 SRC-y += oscam-files.c -
trunk/global-functions.h
r8200 r8241 31 31 extern void convert_to_nagra(struct s_client *cl, ECM_REQUEST *er, uint16_t caidto); 32 32 extern void get_cw(struct s_client *, ECM_REQUEST *); 33 extern void do_emm(struct s_client *, EMM_PACKET *);34 33 extern ECM_REQUEST *get_ecmtask(void); 35 34 extern int32_t send_dcw(struct s_client *, ECM_REQUEST *); … … 77 76 78 77 extern void reader_do_idle(struct s_reader * reader); 79 extern int32_t reader_do_emm(struct s_reader * reader, EMM_PACKET *ep);80 extern void reader_log_emm(struct s_reader * reader, EMM_PACKET *ep, int32_t i, int32_t rc, struct timeb *tps);81 78 extern void reader_get_ecm(struct s_reader * reader, ECM_REQUEST *er); 82 79 extern void casc_check_dcw(struct s_reader * reader, int32_t idx, int32_t rc, uchar *cw); … … 103 100 * =========================== */ 104 101 extern struct s_cardsystem *get_cardsystem_by_caid(uint16_t caid); 105 extern int8_t cs_emmlen_is_blocked(struct s_reader *rdr, int16_t len);106 102 107 103 #endif -
trunk/module-camd33.c
r8220 r8241 3 3 #include "oscam-aes.h" 4 4 #include "oscam-client.h" 5 #include "oscam-emm.h" 5 6 #include "oscam-net.h" 6 7 #include "oscam-string.h" -
trunk/module-camd35.c
r8173 r8241 6 6 #include "oscam-chk.h" 7 7 #include "oscam-client.h" 8 #include "oscam-emm.h" 8 9 #include "oscam-net.h" 9 10 #include "oscam-string.h" -
trunk/module-cccam.c
r8224 r8241 9 9 #include "oscam-chk.h" 10 10 #include "oscam-client.h" 11 #include "oscam-emm.h" 11 12 #include "oscam-failban.h" 12 13 #include "oscam-garbage.h" -
trunk/module-dvbapi.c
r8207 r8241 11 11 #include "oscam-chk.h" 12 12 #include "oscam-client.h" 13 #include "oscam-emm.h" 13 14 #include "oscam-files.h" 14 15 #include "oscam-net.h" -
trunk/module-newcamd.c
r8226 r8241 3 3 #include "oscam-chk.h" 4 4 #include "oscam-client.h" 5 #include "oscam-emm.h" 5 6 #include "oscam-net.h" 6 7 #include "oscam-reader.h" -
trunk/oscam-chk.c
r8232 r8241 915 915 } 916 916 917 918 int32_t emm_reader_match(struct s_reader *reader, uint16_t caid, uint32_t provid) {919 int32_t i;920 921 // if physical reader a card needs to be inserted922 if (!is_network_reader(reader) && reader->card_status != CARD_INSERTED) {923 return(0);924 }925 926 if (reader->audisabled)927 return 0;928 929 if (reader->caid != caid) {930 int caid_found = 0;931 for (i = 0; i < 2; i++) {932 if (reader->csystem.caids[i] == caid) {933 caid_found = 1;934 break;935 }936 }937 if (!caid_found) {938 cs_debug_mask(D_EMM, "emm reader %s reader_caid %04x != caid %04x", reader->label, reader->caid, caid);939 return 0;940 }941 }942 943 //if (!hexserialset(reader)) { There are cards without serial, they should get emm of type global and shared!944 // cs_debug_mask(D_EMM, "emm reader %s has no serial set", reader->label);945 // return 0;946 //}947 948 if (!provid) {949 cs_debug_mask(D_EMM, "emm for reader %s (%04X) has no provider", reader->label, caid);950 return 1;951 }952 953 if (reader->auprovid && reader->auprovid == provid) {954 cs_debug_mask(D_EMM, "emm provider match reader %s auprovid %06X", reader->label, reader->auprovid);955 return 1;956 }957 958 if (!reader->nprov) {959 cs_debug_mask(D_EMM, "emm reader %s has no provider set", reader->label);960 return 1;961 }962 963 for (i=0; i<reader->nprov; i++) {964 uint32_t prid = b2i(4, reader->prid[i]);965 if (prid == provid || ( (reader->typ == R_CAMD35 || reader->typ == R_CS378X) && (prid & 0xFFFF) == (provid & 0xFFFF) )) {966 cs_debug_mask(D_EMM, "emm reader %s provider match %04X:%06X", reader->label, caid, provid);967 return 1;968 }969 }970 cs_debug_mask(D_EMM, "emm reader %s skip provider %04X:%06X", reader->label, caid, provid);971 return 0;972 }973 974 917 int32_t chk_caid(uint16_t caid, CAIDTAB *ctab) 975 918 { -
trunk/oscam-chk.h
r7826 r8241 4 4 int32_t ecm_ratelimit_check(struct s_reader * reader, ECM_REQUEST *er, int32_t reader_mode); 5 5 int32_t matching_reader(ECM_REQUEST *er, struct s_reader *rdr, int32_t slot); 6 int32_t emm_reader_match(struct s_reader *reader, uint16_t caid, uint32_t provid);7 6 8 7 int32_t chk_srvid_match(ECM_REQUEST *er, SIDTAB *sidtab); -
trunk/oscam-reader.c
r8214 r8241 409 409 } 410 410 411 static int32_t reader_store_emm(uchar type, uchar *emmd5)412 {413 int32_t rc;414 struct s_client *cl = cur_client();415 memcpy(cl->emmcache[cl->rotate].emmd5, emmd5, CS_EMMSTORESIZE);416 cl->emmcache[cl->rotate].type=type;417 cl->emmcache[cl->rotate].count=1;418 // cs_debug_mask(D_READER, "EMM stored (index %d)", rotate);419 rc=cl->rotate;420 cl->rotate=(++cl->rotate < CS_EMMCACHESIZE)?cl->rotate:0;421 return(rc);422 }423 424 411 void reader_get_ecm(struct s_reader * reader, ECM_REQUEST *er) 425 412 { … … 464 451 465 452 cardreader_process_ecm(reader, cl, er); 466 }467 468 void reader_log_emm(struct s_reader * reader, EMM_PACKET *ep, int32_t i, int32_t rc, struct timeb *tps) {469 char *rtxt[] = { "error",470 is_cascading_reader(reader) ? "sent" : "written", "skipped",471 "blocked" };472 char *typedesc[] = { "unknown", "unique", "shared", "global" };473 struct s_client *cl = reader->client;474 struct timeb tpe;475 476 if (reader->logemm & (1 << rc)) {477 cs_ftime(&tpe);478 if (!tps)479 tps = &tpe;480 481 rdr_log(reader, "%s emmtype=%s, len=%d, idx=%d, cnt=%d: %s (%ld ms)",482 username(ep->client), typedesc[cl->emmcache[i].type], ep->emm[2],483 i, cl->emmcache[i].count, rtxt[rc],484 1000 * (tpe.time - tps->time) + tpe.millitm - tps->millitm);485 }486 487 if (rc) {488 cl->lastemm = time((time_t*) 0);489 led_status_emm_ok();490 }491 492 #if defined(WEBIF) || defined(LCDSUPPORT)493 //counting results494 switch (rc) {495 case 0:496 reader->emmerror[ep->type]++;497 break;498 case 1:499 reader->emmwritten[ep->type]++;500 break;501 case 2:502 reader->emmskipped[ep->type]++;503 break;504 case 3:505 reader->emmblocked[ep->type]++;506 break;507 }508 #endif509 }510 511 int32_t reader_do_emm(struct s_reader * reader, EMM_PACKET *ep)512 {513 int32_t i, rc, ecs;514 unsigned char md5tmp[MD5_DIGEST_LENGTH];515 struct timeb tps;516 struct s_client *cl = reader->client;517 518 if(!cl) return 0;519 520 cs_ftime(&tps);521 522 MD5(ep->emm, ep->emm[2], md5tmp);523 524 for (i=ecs=0; (i<CS_EMMCACHESIZE) ; i++) {525 if (!memcmp(cl->emmcache[i].emmd5, md5tmp, CS_EMMSTORESIZE)) {526 cl->emmcache[i].count++;527 if (reader->cachemm){528 if (cl->emmcache[i].count > reader->rewritemm){529 ecs=2; //skip emm530 }531 else532 ecs=1; //rewrite emm533 }534 break;535 }536 }537 538 //Ecs=0 not found in cache539 //Ecs=1 found in cache, rewrite emm540 //Ecs=2 skip541 542 if ((rc=ecs)<2)543 {544 if (is_cascading_reader(reader)) {545 rdr_debug_mask(reader, D_READER, "network emm reader");546 547 if (reader->ph.c_send_emm) {548 rc=reader->ph.c_send_emm(ep);549 } else {550 rdr_debug_mask(reader, D_READER, "send_emm() support missing");551 rc=0;552 }553 } else {554 rdr_debug_mask(reader, D_READER, "local emm reader");555 rc = cardreader_do_emm(reader, ep);556 }557 558 if (!ecs)559 i=reader_store_emm(ep->type, md5tmp);560 }561 562 reader_log_emm(reader, ep, i, rc, &tps);563 564 return(rc);565 453 } 566 454 -
trunk/oscam-simples.c
r8054 r8241 165 165 } 166 166 167 int8_t cs_emmlen_is_blocked(struct s_reader *rdr, int16_t len)168 {169 int i;170 for (i = 0; i < CS_MAXEMMBLOCKBYLEN; i++)171 if (rdr->blockemmbylen[i] == len)172 return 1;173 return 0;174 }175 176 167 struct s_cardsystem *get_cardsystem_by_caid(uint16_t caid) { 177 168 int32_t i, j; -
trunk/oscam.c
r8238 r8241 20 20 #include "oscam-client.h" 21 21 #include "oscam-config.h" 22 #include "oscam-emm.h" 22 23 #include "oscam-failban.h" 23 24 #include "oscam-files.h" … … 2799 2800 pthread_kill(timecheck_client->thread, OSCAM_SIGNAL_WAKEUP); 2800 2801 pthread_mutex_unlock(&timecheck_client->thread_lock); 2801 }2802 }2803 2804 /**2805 * Function to filter emm by cardsystem.2806 * Every cardsystem can export a function "get_emm_filter"2807 *2808 * the emm is checked against it an returns 1 for a valid emm or 0 if not2809 */2810 int8_t do_simple_emm_filter(struct s_reader *rdr, struct s_cardsystem *cs, EMM_PACKET *ep)2811 {2812 //copied and enhanced from module-dvbapi.c2813 //dvbapi_start_emm_filter()2814 2815 int32_t i, j, k, match;2816 uchar flt, mask;2817 uchar dmx_filter[342]; // 10 filter + 2 byte header2818 2819 2820 memset(dmx_filter, 0, sizeof(dmx_filter));2821 dmx_filter[0]=0xFF;2822 dmx_filter[1]=0;2823 2824 //Call cardsystems emm filter2825 cs->get_emm_filter(rdr, dmx_filter);2826 2827 //only check matching emmtypes:2828 uchar org_emmtype;2829 if (ep->type == UNKNOWN)2830 org_emmtype = EMM_UNKNOWN;2831 else2832 org_emmtype = 1 << (ep->type-1);2833 2834 2835 //Now check all filter values2836 2837 //dmx_filter has 2 bytes header:2838 //first byte is always 0xFF2839 //second byte is filter count2840 //all the other datas are the filter count * 34 bytes filter2841 2842 //every filter is 34 bytes2843 //2 bytes emmtype+count2844 //16 bytes filter data2845 //16 bytes filter mask2846 2847 int32_t filter_count=dmx_filter[1];2848 for (j=1;j<=filter_count && j <= 10;j++) {2849 int32_t startpos=2+(34*(j-1));2850 2851 if (dmx_filter[startpos+1] != 0x00)2852 continue;2853 2854 uchar emmtype=dmx_filter[startpos];2855 if (emmtype != org_emmtype)2856 continue;2857 2858 match = 1;2859 for (i=0,k=0; i<10 && k < ep->emmlen && match; i++,k++) {2860 flt = dmx_filter[startpos+2+i];2861 mask = dmx_filter[startpos+2+16+i];2862 if (!mask) break;2863 match = (flt == (ep->emm[k]&mask));2864 if (k==0) k+=2; //skip len2865 }2866 if (match)2867 return 1; //valid emm2868 2869 }2870 return 0; //emm filter does not match, illegal emm, return2871 }2872 2873 void do_emm(struct s_client * client, EMM_PACKET *ep)2874 {2875 char *typtext[]={"unknown", "unique", "shared", "global"};2876 char tmp[17];2877 int32_t emmnok=0;2878 2879 struct s_reader *aureader = NULL;2880 cs_ddump_mask(D_EMM, ep->emm, ep->emmlen, "emm:");2881 2882 LL_ITER itr = ll_iter_create(client->aureader_list);2883 while ((aureader = ll_iter_next(&itr))) {2884 if (!aureader->enable)2885 continue;2886 2887 uint16_t caid = b2i(2, ep->caid);2888 uint32_t provid = b2i(4, ep->provid);2889 2890 if (aureader->audisabled) {2891 rdr_debug_mask(aureader, D_EMM, "AU is disabled");2892 /* we have to write the log for blocked EMM here because2893 this EMM never reach the reader module where the rest2894 of EMM log is done. */2895 if (aureader->logemm & 0x10) {2896 rdr_log(aureader, "%s emmtype=%s, len=%d, idx=0, cnt=1: audisabled (0 ms)",2897 client->account->usr,2898 typtext[ep->type],2899 ep->emm[2]);2900 }2901 continue;2902 }2903 2904 if (!(aureader->grp & client->grp)) {2905 rdr_debug_mask(aureader, D_EMM, "skip emm, group mismatch");2906 continue;2907 }2908 2909 //TODO: provider possibly not set yet, this is done in get_emm_type()2910 if (!emm_reader_match(aureader, caid, provid))2911 continue;2912 2913 struct s_cardsystem *cs = NULL;2914 2915 if (is_cascading_reader(aureader)) { // network reader (R_CAMD35 R_NEWCAMD R_CS378X R_CCCAM)2916 if (!aureader->ph.c_send_emm) // no emm support2917 continue;2918 2919 cs = get_cardsystem_by_caid(caid);2920 if (!cs) {2921 rdr_debug_mask(aureader, D_EMM, "unable to find cardsystem for caid %04X", caid);2922 continue;2923 }2924 } else { // local reader2925 if (aureader->csystem.active)2926 cs=&aureader->csystem;2927 }2928 2929 if (cs && cs->get_emm_type) {2930 if(!cs->get_emm_type(ep, aureader)) {2931 rdr_debug_mask(aureader, D_EMM, "emm skipped, get_emm_type() returns error");2932 emmnok++;2933 continue;2934 }2935 }2936 2937 if (cs && cs->get_emm_filter) {2938 if (!do_simple_emm_filter(aureader, cs, ep)) {2939 rdr_debug_mask(aureader, D_EMM, "emm skipped, emm_filter() returns invalid");2940 emmnok++;2941 continue;2942 }2943 }2944 2945 rdr_debug_mask_sensitive(aureader, D_EMM, "emmtype %s. Reader serial {%s}.", typtext[ep->type],2946 cs_hexdump(0, aureader->hexserial, 8, tmp, sizeof(tmp)));2947 rdr_debug_mask_sensitive(aureader, D_EMM, "emm UA/SA: {%s}.",2948 cs_hexdump(0, ep->hexserial, 8, tmp, sizeof(tmp)));2949 2950 uint32_t emmtype;2951 if (ep->type == UNKNOWN)2952 emmtype = EMM_UNKNOWN;2953 else2954 emmtype = 1 << (ep->type-1);2955 client->last=time((time_t*)0);2956 if (((1<<(ep->emm[0] % 0x80)) & aureader->s_nano) || (aureader->saveemm & emmtype)) { //should this nano be saved?2957 char token[256];2958 char *tmp2;2959 FILE *fp;2960 time_t rawtime;2961 time (&rawtime);2962 struct tm timeinfo;2963 localtime_r (&rawtime, &timeinfo); /* to access LOCAL date/time info */2964 int32_t emm_length = ((ep->emm[1] & 0x0f) << 8) | ep->emm[2];2965 char buf[80];2966 strftime (buf, sizeof(buf), "%Y/%m/%d %H:%M:%S", &timeinfo);2967 snprintf (token, sizeof(token), "%s/%s_emm.log", cfg.emmlogdir?cfg.emmlogdir:cs_confdir, aureader->label);2968 2969 if (!(fp = fopen (token, "a"))) {2970 cs_log ("ERROR: Cannot open file '%s' (errno=%d: %s)\n", token, errno, strerror(errno));2971 } else if (cs_malloc(&tmp2, (emm_length + 3) * 2 + 1)) {2972 fprintf (fp, "%s %s ", buf, cs_hexdump(0, ep->hexserial, 8, tmp, sizeof(tmp)));2973 fprintf (fp, "%s\n", cs_hexdump(0, ep->emm, emm_length + 3, tmp2, (emm_length + 3)*2 + 1));2974 free(tmp2);2975 fclose (fp);2976 cs_log ("Successfully added EMM to %s.", token);2977 }2978 2979 snprintf (token, sizeof(token), "%s/%s_emm.bin", cfg.emmlogdir?cfg.emmlogdir:cs_confdir, aureader->label);2980 if (!(fp = fopen (token, "ab"))) {2981 cs_log ("ERROR: Cannot open file '%s' (errno=%d: %s)\n", token, errno, strerror(errno));2982 } else {2983 if ((int)fwrite(ep->emm, 1, emm_length+3, fp) == emm_length+3) {2984 cs_log ("Successfully added binary EMM to %s.", token);2985 } else {2986 cs_log ("ERROR: Cannot write binary EMM to %s (errno=%d: %s)\n", token, errno, strerror(errno));2987 }2988 fclose (fp);2989 }2990 }2991 2992 int32_t is_blocked = 0;2993 switch (ep->type) {2994 case UNKNOWN: is_blocked = (aureader->blockemm & EMM_UNKNOWN) ? 1 : 0;2995 break;2996 case UNIQUE: is_blocked = (aureader->blockemm & EMM_UNIQUE) ? 1 : 0;2997 break;2998 case SHARED: is_blocked = (aureader->blockemm & EMM_SHARED) ? 1 : 0;2999 break;3000 case GLOBAL: is_blocked = (aureader->blockemm & EMM_GLOBAL) ? 1 : 0;3001 break;3002 }3003 3004 // if not already blocked we check for block by len3005 if (!is_blocked) is_blocked = cs_emmlen_is_blocked( aureader, ep->emm[2] ) ;3006 3007 if (is_blocked != 0) {3008 #ifdef WEBIF3009 aureader->emmblocked[ep->type]++;3010 is_blocked = aureader->emmblocked[ep->type];3011 #endif3012 /* we have to write the log for blocked EMM here because3013 this EMM never reach the reader module where the rest3014 of EMM log is done. */3015 if (aureader->logemm & 0x08) {3016 rdr_log(aureader, "%s emmtype=%s, len=%d, idx=0, cnt=%d: blocked (0 ms)",3017 client->account->usr,3018 typtext[ep->type],3019 ep->emm[2],3020 is_blocked);3021 }3022 continue;3023 }3024 3025 client->lastemm = time((time_t*)0);3026 3027 client->emmok++;3028 if (client->account)3029 client->account->emmok++;3030 first_client->emmok++;3031 3032 //Check emmcache early:3033 int32_t i;3034 unsigned char md5tmp[CS_EMMSTORESIZE];3035 struct s_client *au_cl = aureader->client;3036 3037 MD5(ep->emm, ep->emm[2], md5tmp);3038 ep->client = client;3039 3040 for (i=0; i<CS_EMMCACHESIZE; i++) {3041 if (!memcmp(au_cl->emmcache[i].emmd5, md5tmp, CS_EMMSTORESIZE)) {3042 rdr_debug_mask(aureader, D_EMM, "emm found in cache: count %d rewrite %d",3043 au_cl->emmcache[i].count, aureader->rewritemm);3044 if (aureader->cachemm && (au_cl->emmcache[i].count > aureader->rewritemm)) {3045 reader_log_emm(aureader, ep, i, 2, NULL);3046 return;3047 }3048 }3049 }3050 3051 EMM_PACKET *emm_pack;3052 if (cs_malloc(&emm_pack, sizeof(EMM_PACKET))) {3053 rdr_debug_mask(aureader, D_EMM, "emm is being sent to reader");3054 memcpy(emm_pack, ep, sizeof(EMM_PACKET));3055 add_job(aureader->client, ACTION_READER_EMM, emm_pack, sizeof(EMM_PACKET));3056 }3057 }3058 if (emmnok > 0 && emmnok == ll_count(client->aureader_list)) {3059 client->emmnok++;3060 if (client->account)3061 client->account->emmnok++;3062 first_client->emmnok++;3063 2802 } 3064 2803 } -
trunk/reader-common.c
r8066 r8241 6 6 #include "oscam-chk.h" 7 7 #include "oscam-client.h" 8 #include "oscam-emm.h" 8 9 #include "oscam-net.h" 9 10 #include "oscam-time.h" … … 88 89 cs_sleepms(1000); 89 90 return(1); 90 }91 92 static void do_emm_from_file(struct s_reader * reader)93 {94 //now here check whether we have EMM's on file to load and write to card:95 if (reader->emmfile == NULL)96 return;97 98 //handling emmfile99 char token[256];100 FILE *fp;101 102 if (reader->emmfile[0] == '/')103 snprintf (token, sizeof(token), "%s", reader->emmfile); //pathname included104 else105 snprintf (token, sizeof(token), "%s%s", cs_confdir, reader->emmfile); //only file specified, look in confdir for this file106 107 if (!(fp = fopen (token, "rb"))) {108 rdr_log(reader, "ERROR: Cannot open EMM file '%s' (errno=%d %s)\n", token, errno, strerror(errno));109 return;110 }111 EMM_PACKET *eptmp;112 if (!cs_malloc(&eptmp, sizeof(EMM_PACKET))) {113 fclose (fp);114 return;115 }116 117 size_t ret = fread(eptmp, sizeof(EMM_PACKET), 1, fp);118 if (ret < 1 && ferror(fp)) {119 rdr_log(reader, "ERROR: Can't read EMM from file '%s' (errno=%d %s)", token, errno, strerror(errno));120 free(eptmp);121 fclose(fp);122 return;123 }124 fclose (fp);125 126 eptmp->caid[0] = (reader->caid >> 8) & 0xFF;127 eptmp->caid[1] = reader->caid & 0xFF;128 if (reader->nprov > 0)129 memcpy(eptmp->provid, reader->prid[0], sizeof(eptmp->provid));130 eptmp->emmlen = eptmp->emm[2] + 3;131 132 struct s_cardsystem *cs = get_cardsystem_by_caid(reader->caid);133 if (cs && cs->get_emm_type && !cs->get_emm_type(eptmp, reader)) {134 rdr_debug_mask(reader, D_EMM, "emm skipped, get_emm_type() returns error");135 free(eptmp);136 return;137 }138 //save old b_nano value139 //clear lsb and lsb+1, so no blocking, and no saving for this nano140 uint16_t save_s_nano = reader->s_nano;141 uint16_t save_b_nano = reader->b_nano;142 uint32_t save_saveemm = reader->saveemm;143 144 reader->s_nano = reader->b_nano = 0;145 reader->saveemm = 0;146 147 int32_t rc = cardreader_do_emm(reader, eptmp);148 if (rc == OK)149 rdr_log(reader, "EMM from file %s was successful written.", token);150 else151 rdr_log(reader, "ERROR: EMM read from file %s NOT processed correctly! (rc=%d)", token, rc);152 153 //restore old block/save settings154 reader->s_nano = save_s_nano;155 reader->b_nano = save_b_nano;156 reader->saveemm = save_saveemm;157 158 free(eptmp);159 91 } 160 92
Note:
See TracChangeset
for help on using the changeset viewer.