int len;
if((len=so.Read(buffer,sizeof(buffer),10000))<=0) {
PRINTF(L_CC_CCCAM2,"no welcome from server");
+ Logout();
return false;
}
LDUMP(L_CC_CCCAM2,buffer,len,"welcome answer:");
if(len!=16 || !cCCcamCrypt::CheckConnectChecksum(buffer,len)) {
PRINTF(L_CC_CCCAM2,"bad welcome from server");
+ Logout();
return false;
}
PRINTF(L_CC_CCCAM2,"welcome checksum correct");
encr.Encrypt(buff2,buffer,20);
if(so.Write(buffer,20)!=20) {
PRINTF(L_CC_CCCAM2,"failed to send welcome response");
+ Logout();
return false;
}
encr.Encrypt(buff2,buffer,20);
if(so.Write(buffer,20)!=20) {
PRINTF(L_CC_CCCAM2,"failed to send username");
+ Logout();
return false;
}
encr.Encrypt((unsigned char *)cccamstr,buffer,6);
if(so.Write(buffer,6)!=6) {
PRINTF(L_CC_CCCAM2,"failed to send password hash");
+ Logout();
return false;
}
if((len=so.Read(buffer,sizeof(buffer),6000))<=0) {
PRINTF(L_CC_CCCAM2,"no login answer from server");
+ Logout();
return false;
}
decr.Decrypt(buffer,buffer,len);
if(len<20 || strcmp(cccamstr,(char *)buffer)!=0) {
PRINTF(L_CC_CCCAM2,"login failed");
+ Logout();
return false;
}
PRINTF(L_CC_LOGIN,"CCcam login succeed");
encr.Encrypt(clientinfo,buffer,sizeof(clientinfo));
if(so.Write(buffer,sizeof(clientinfo))!=sizeof(clientinfo)) {
PRINTF(L_CC_CCCAM2,"failed to send clientinfo");
+ Logout();
return false;
}
Start();
bool cCardClientCCcam2::ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *Cw, int cardnum)
{
cMutexLock lock(this);
- if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false;
+ if(!so.Connected() && !Login()) { Logout(); return false; }
+ if(!CanHandle(ecm->caId)) return false;
static const unsigned char ecm_head[] = {
0x00,
encr.Encrypt(buffer,netbuff,ecm_len);
if(so.Write(netbuff,ecm_len)!=ecm_len) {
PRINTF(L_CC_CCCAM2,"failed so send ecm request");
- continue;
+ Logout();
+ break;
}
cwmutex.Lock();
newcw=false;