Changeset 1782


Ignore:
Timestamp:
Mar 5, 2010, 11:46:20 AM (10 years ago)
Author:
merek
Message:

Rewrite irdeto_get_emm_type(), fixes d0/d2/d3 emm nano problems

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/reader-irdeto.c

    r1775 r1782  
    366366}
    367367
    368 int irdeto_get_emm_type(EMM_PACKET *ep, struct s_reader * rdr) //returns TRUE if shared emm matches SA, unique emm matches serial, or global or unknown
    369 {
    370     int i, l = (ep->emm[3]&0x07), ok=0;
    371     int mode = (ep->emm[3]>>3);
    372     if (mode&0x10) {
    373         // Hex addressed
    374         ep->type = UNIQUE;
    375         memset(ep->hexserial,0,8);
    376         memcpy(ep->hexserial, ep->emm + 4, l);
    377         return (mode == rdr->hexserial[3] && (!l || !memcmp(ep->emm+4, rdr->hexserial, l)));
     368int irdeto_get_emm_type(EMM_PACKET *ep, struct s_reader * rdr) {
     369
     370    int i, ok = 0;
     371    int l = (ep->emm[3]&0x07);
     372
     373    cs_debug_mask(D_EMM, "Entered irdeto_get_emm_type ep->emm[3]=%02x",ep->emm[3]);
     374
     375    switch (ep->emm[3]) {
     376
     377        case 0xd0:
     378            ep->type = GLOBAL;
     379            cs_debug_mask(D_EMM, "IRDETO EMM: GLOBAL");
     380            return TRUE;
     381        case 0xd2:
     382            ep->type = SHARED;
     383            memset(ep->hexserial, 0, 8);
     384            //prid in hexserial instead of SA
     385            memcpy(ep->hexserial, ep->emm + 4, l);
     386            for(i = 0; i < rdr->nprov; i++) {
     387                ok = (!l || !memcmp(ep->hexserial, &rdr->prid[i][1], l));
     388
     389                // FIXME: Betacrypt/Nagra Aladin reports wrong provider id
     390                if ((rdr->caid[0] >= 0x1700) && (rdr->caid[0] <= 0x1799))
     391                    ok = 1;
     392
     393                if (ok) break;
     394            }
     395            cs_debug_mask(D_EMM, "IRDETO EMM: SHARED, ep->hexserial = %s", cs_hexdump(1, ep->hexserial, 8));
     396            return ok; 
     397           
     398        case 0xd3:
     399            ep->type = UNIQUE;
     400            memset(ep->hexserial, 0, 8);
     401            memcpy(ep->hexserial, ep->emm + 4, l);
     402            cs_debug_mask(D_EMM, "IRDETO EMM: UNIQUE, ep->hexserial = %s", cs_hexdump(1, ep->hexserial, 8));
     403            return (!l || !memcmp(ep->hexserial, rdr->hexserial, l));
     404        default:
     405            ep->type = UNKNOWN;
     406            cs_debug_mask(D_EMM, "IRDETO EMM: UNKNOWN");
     407            return TRUE;
    378408    }
    379     else {
    380         // Provider addressed
    381         for(i = 0; i < rdr->nprov; i++) {
    382             ok = (mode == rdr->prid[i][0] && (!l || !memcmp(ep->emm+4, &rdr->prid[i][1], l)));
    383             if (ok) break;
    384         }
    385        
    386         ep->type = SHARED;
    387         memset(ep->hexserial,0,8);
    388         //prid in hexserial instead of SA
    389         memcpy(ep->hexserial, ep->emm+4, l);
    390         return ok;
    391     }
     409
    392410}
    393411
Note: See TracChangeset for help on using the changeset viewer.