Changeset 1975 for branches/modular/module-camd35.c
- Timestamp:
- 04/06/10 17:45:45 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/modular/module-camd35.c
r1919 r1975 1 1 #include "globals.h" 2 extern struct s_reader *reader; 2 3 3 4 //CMD00 - ECM (request) … … 134 135 static void camd35_request_emm(ECM_REQUEST *er) 135 136 { 136 int i, au; 137 time_t now; 138 static time_t last=0; 139 static int disable_counter=0; 140 static uchar lastserial[8]={0,0,0,0,0,0,0,0}; 141 142 au=client[cs_idx].au; 143 if ((au<0) || (au>CS_MAXREADER)) return; // TODO 144 145 time(&now); 146 if (!memcmp(lastserial, reader[au].hexserial, 8)) 147 if (abs(now-last)<180) return; 148 memcpy(lastserial, reader[au].hexserial, 8); 149 last=now; 150 151 if (reader[au].caid[0]) 152 { 153 disable_counter=0; 154 log_emm_request(au); 155 } 156 else 157 if (disable_counter>2) 158 return; 159 else 160 disable_counter++; 161 162 // if (reader[au].hexserial[3]) 163 // { 164 // if (!reader[au].online) 165 // { 166 // memset(lastserial, 0, sizeof(lastserial)); 167 // return; 168 // } 169 memset(mbuf, 0, sizeof(mbuf)); 170 mbuf[2]=mbuf[3]=0xff; // must not be zero 171 memcpy(mbuf+ 8, i2b(2, er->srvid), 2); 172 memcpy(mbuf+12, i2b(4, er->prid ), 4); 173 memcpy(mbuf+16, i2b(2, er->pid ), 2); 174 mbuf[0]=5; 175 mbuf[1]=111; 176 if (reader[au].caid[0]) 177 { 178 mbuf[39]=1; // no. caids 179 mbuf[20]=reader[au].caid[0]>>8; // caid's (max 8) 180 mbuf[21]=reader[au].caid[0]&0xff; 181 memcpy(mbuf+40, reader[au].hexserial, 6); // serial now 6 bytes 182 mbuf[47]=reader[au].nprov; 183 for (i=0; i<reader[au].nprov; i++) 184 { 185 if (((reader[au].caid[0] >= 0x1700) && (reader[au].caid[0] <= 0x1799)) || // Betacrypt 186 ((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) 187 { 188 mbuf[48+(i*5)]=reader[au].prid[i][0]; 189 memcpy(&mbuf[50+(i*5)], &reader[au].prid[i][1], 3); 190 } 191 else 192 { 193 mbuf[48+(i*5)]=reader[au].prid[i][2]; 194 mbuf[49+(i*5)]=reader[au].prid[i][3]; 195 memcpy(&mbuf[50+(i*5)], &reader[au].sa[i][0],3); 196 } 197 }/* b_nano old implementation was not working according to documentation, so we changed it 198 mbuf[128]=(reader[au].b_nano[0xd0])?0:1; 199 mbuf[129]=(reader[au].b_nano[0xd2])?0:1; 200 mbuf[130]=(reader[au].b_nano[0xd3])?0:1;*/ 201 //we think client/server protocols should deliver all information, and only readers should discard EMM 202 mbuf[128]=1; //if 0, GA EMM is blocked 203 mbuf[129]=1; //if 0, SA EMM is blocked 204 mbuf[130]=1; //if 0, UA EMM is blocked 205 } 206 else // disable emm 207 mbuf[20]=mbuf[39]=mbuf[40]=mbuf[47]=mbuf[49]=1; 208 memcpy(mbuf+10, mbuf+20, 2); 209 camd35_send(mbuf); // send with data-len 111 for camd3 > 3.890 210 mbuf[1]++; 211 camd35_send(mbuf); // send with data-len 112 for camd3 < 3.890 212 // } 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 213 207 } 214 208 … … 495 489 ushort idx; 496 490 491 // reading CMD05 Emm request and set serial 492 if ((buf[0] == 0x05) && !(buf[131]==0xff)) { 493 494 reader[ridx].nprov = 0; //reset if number changes on reader change 495 reader[ridx].nprov = buf[47]; 496 reader[ridx].aucaid = b2i(2, buf+20); 497 498 int i; 499 for (i=0; i<reader[ridx].nprov; i++) { 500 if (((reader[ridx].aucaid >= 0x1700) && (reader[ridx].aucaid <= 0x1799)) || // Betacrypt 501 ((reader[ridx].aucaid >= 0x0600) && (reader[ridx].aucaid <= 0x0699))) // Irdeto (don't know if this is correct, cause I don't own a IRDETO-Card) 502 { 503 reader[ridx].prid[i][0] = buf[48 + (i*5)]; 504 memcpy(&reader[ridx].prid[i][1], &buf[50 + (i * 5)], 3); 505 } else { 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); 509 } 510 } 511 512 memcpy(reader[ridx].hexserial, buf + 40, 6); 513 reader[ridx].hexserial[6] = 0; 514 reader[ridx].hexserial[7] = 0; 515 516 reader[ridx].blockemm_g = buf[128]; 517 reader[ridx].blockemm_s = buf[129]; 518 reader[ridx].blockemm_u = buf[129]; 519 reader[ridx].card_system = buf[131]; 520 cs_log("CMD05 reader: %s serial: %s cardsyst: %d aucaid: %04X", 521 reader[ridx].label, 522 cs_hexdump(0, reader[ridx].hexserial, 8), 523 reader[ridx].card_system, 524 reader[ridx].aucaid); 525 } 526 497 527 // CMD44: old reject command introduced in mpcs 498 528 // keeping this for backward compatibility … … 500 530 return(-1); 501 531 502 idx =b2i(2, buf+16);503 504 *rc =((buf[0] != 0x44) && (buf[0] != 0x08));532 idx = b2i(2, buf+16); 533 534 *rc = ((buf[0] != 0x44) && (buf[0] != 0x08)); 505 535 506 536 memcpy(dcw, buf+20, 16);
Note:
See TracChangeset
for help on using the changeset viewer.