Changeset 1961


Ignore:
Timestamp:
04/05/10 20:55:09 (12 years ago)
Author:
alno
Message:

Fix conax AU - shared key now 4 Bytes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-camd35.c

    r1958 r1961  
    135135static void camd35_request_emm(ECM_REQUEST *er)
    136136{
    137   int i, au;
    138   time_t now;
    139   static time_t last=0;
    140   static int disable_counter=0;
    141   static uchar lastserial[8]={0,0,0,0,0,0,0,0};
    142 
    143   au=client[cs_idx].au;
    144   if ((au<0) || (au>CS_MAXREADER)) return;  // TODO
    145 
    146   time(&now);
    147   if (!memcmp(lastserial, reader[au].hexserial, 8))
    148       if (abs(now-last)<180) return;
    149   memcpy(lastserial, reader[au].hexserial, 8);
    150   last=now;
    151 
    152   if (reader[au].caid[0])
    153   {
    154     disable_counter=0;
    155     log_emm_request(au);
    156   }
    157   else
    158     if (disable_counter>2)
    159       return;
    160     else
    161       disable_counter++;
    162 
    163 //  if (reader[au].hexserial[3])
    164 //  {
    165 //    if (!reader[au].online)
    166 //    {
    167 //      memset(lastserial, 0, sizeof(lastserial));
    168 //      return;
    169 //    }
    170     memset(mbuf, 0, sizeof(mbuf));
    171     mbuf[2]=mbuf[3]=0xff;           // must not be zero
    172     memcpy(mbuf+ 8, i2b(2, er->srvid), 2);
    173     memcpy(mbuf+12, i2b(4, er->prid ), 4);
    174     memcpy(mbuf+16, i2b(2, er->pid  ), 2);
    175     mbuf[0]=5;
    176     mbuf[1]=111;
    177     if (reader[au].caid[0])
    178     {
    179       mbuf[39]=1;               // no. caids
    180       mbuf[20]=reader[au].caid[0]>>8;       // caid's (max 8)
    181       mbuf[21]=reader[au].caid[0]&0xff;
    182       memcpy(mbuf+40, reader[au].hexserial, 6); // serial now 6 bytes
    183       mbuf[47]=reader[au].nprov;
    184       for (i=0; i<reader[au].nprov; i++)
    185       {
    186         if (((reader[au].caid[0] >= 0x1700) && (reader[au].caid[0] <= 0x1799))  || // Betacrypt
    187             ((reader[au].caid[0] >= 0x0600) && (reader[au].caid[0] <= 0x0699)))    // Irdeto (don't know if this is correct, cause I don't own a IRDETO-Card)
    188         {
    189           mbuf[48+(i*5)]=reader[au].prid[i][0];
    190           memcpy(&mbuf[50+(i*5)], &reader[au].prid[i][1], 3);
    191         }
    192         else
    193         {
    194             mbuf[48+(i*5)]=reader[au].prid[i][2];
    195             mbuf[49+(i*5)]=reader[au].prid[i][3];
    196               memcpy(&mbuf[50+(i*5)], &reader[au].sa[i][0],3);
    197             }
    198       }/* b_nano old implementation was not working according to documentation, so we changed it
    199       mbuf[128]=(reader[au].b_nano[0xd0])?0:1;
    200       mbuf[129]=(reader[au].b_nano[0xd2])?0:1;
    201       mbuf[130]=(reader[au].b_nano[0xd3])?0:1;*/
    202       //we think client/server protocols should deliver all information, and only readers should discard EMM
    203       mbuf[128]=reader[au].blockemm_g; //if 0, GA EMM is blocked
    204       mbuf[129]=reader[au].blockemm_s; //if 0, SA EMM is blocked
    205       mbuf[130]=reader[au].blockemm_u; //if 0, UA EMM is blocked
    206       mbuf[131]=reader[au].card_system; //Cardsystem for Oscam client
    207     }
    208     else        // disable emm
    209       mbuf[20]=mbuf[39]=mbuf[40]=mbuf[47]=mbuf[49]=1;
    210     memcpy(mbuf+10, mbuf+20, 2);
    211     camd35_send(mbuf);      // send with data-len 111 for camd3 > 3.890
    212     mbuf[1]++;
    213     camd35_send(mbuf);      // send with data-len 112 for camd3 < 3.890
    214 //  }
     137    int i, au;
     138    time_t now;
     139    static time_t last = 0;
     140    static int disable_counter = 0;
     141    static uchar lastserial[8] = {0,0,0,0,0,0,0,0};
     142
     143    au = client[cs_idx].au;
     144    if ((au < 0) || (au > CS_MAXREADER))
     145        return;  // TODO
     146
     147    time(&now);
     148    if (!memcmp(lastserial, reader[au].hexserial, 8))
     149        if (abs(now-last) < 180) return;
     150
     151    memcpy(lastserial, reader[au].hexserial, 8);
     152    last = now;
     153
     154    if (reader[au].caid[0])
     155    {
     156        disable_counter = 0;
     157        log_emm_request(au);
     158    }
     159    else
     160        if (disable_counter > 2)
     161            return;
     162        else
     163            disable_counter++;
     164
     165    memset(mbuf, 0, sizeof(mbuf));
     166    mbuf[2] = mbuf[3] = 0xff;           // must not be zero
     167    memcpy(mbuf + 8, i2b(2, er->srvid), 2);
     168    memcpy(mbuf + 12, i2b(4, er->prid), 4);
     169    memcpy(mbuf + 16, i2b(2, er->pid), 2);
     170    mbuf[0] = 5;
     171    mbuf[1] = 111;
     172    if (reader[au].caid[0])
     173    {
     174        mbuf[39] = 1;                           // no. caids
     175        mbuf[20] = reader[au].caid[0]>>8;       // caid's (max 8)
     176        mbuf[21] = reader[au].caid[0]&0xff;
     177        memcpy(mbuf + 40, reader[au].hexserial, 6); // serial now 6 bytes
     178        mbuf[47] = reader[au].nprov;
     179        for (i = 0; i < reader[au].nprov; i++)
     180        {
     181            if (((reader[au].caid[0] >= 0x1700) && (reader[au].caid[0] <= 0x1799))  || // Betacrypt
     182                    ((reader[au].caid[0] >= 0x0600) && (reader[au].caid[0] <= 0x0699)))    // Irdeto (don't know if this is correct, cause I don't own a IRDETO-Card)
     183            {
     184                mbuf[48 + (i*5)] = reader[au].prid[i][0];
     185                memcpy(&mbuf[50 + (i*5)], &reader[au].prid[i][1], 3);
     186            }
     187            else
     188            {
     189                mbuf[48 + (i * 5)] = reader[au].prid[i][2];
     190                mbuf[49 + (i * 5)] =reader[au].prid[i][3];
     191                memcpy(&mbuf[50 + (i * 5)], &reader[au].sa[i][0],4); // for conax we need at least 4 Bytes
     192            }
     193        }
     194        //we think client/server protocols should deliver all information, and only readers should discard EMM
     195        mbuf[128] = reader[au].blockemm_g;
     196        mbuf[129] = reader[au].blockemm_s;
     197        mbuf[130] = reader[au].blockemm_u;
     198        mbuf[131] = reader[au].card_system; //Cardsystem for Oscam client
     199    }
     200    else        // disable emm
     201        mbuf[20] = mbuf[39] = mbuf[40] = mbuf[47] = mbuf[49] = 1;
     202
     203    memcpy(mbuf + 10, mbuf + 20, 2);
     204    camd35_send(mbuf);      // send with data-len 111 for camd3 > 3.890
     205    mbuf[1]++;
     206    camd35_send(mbuf);      // send with data-len 112 for camd3 < 3.890
    215207}
    216208
     
    509501                    ((reader[ridx].aucaid >= 0x0600) && (reader[ridx].aucaid <= 0x0699)))   // Irdeto (don't know if this is correct, cause I don't own a IRDETO-Card)
    510502            {
    511                 reader[ridx].prid[i][0] = buf[48+(i*5)];
    512                 memcpy(&reader[ridx].prid[i][1], &buf[50+(i*5)], 3);
     503                reader[ridx].prid[i][0] = buf[48 + (i*5)];
     504                memcpy(&reader[ridx].prid[i][1], &buf[50 + (i * 5)], 3);
    513505            } else {
    514                 reader[ridx].prid[i][2] = buf[48+(i*5)];
    515                 reader[ridx].prid[i][3] = buf[49+(i*5)];
    516                 memcpy(&reader[ridx].sa[i][0], &buf[50+(i*5)], 3);
     506                reader[ridx].prid[i][2] = buf[48 + (i * 5)];
     507                reader[ridx].prid[i][3] = buf[49+ (i * 5)];
     508                memcpy(&reader[ridx].sa[i][0], &buf[50 + (i * 5)], 4);
    517509            }
    518510        }
Note: See TracChangeset for help on using the changeset viewer.