From f13d8db5ff2628448cdb99d9d8b34bd86006018c Mon Sep 17 00:00:00 2001 From: leslie Date: Thu, 6 Aug 2009 08:15:02 +0800 Subject: [PATCH] cardclient-cccam2: fix handling partial CW & checksum error --- systems/cardclient/cccam2.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/systems/cardclient/cccam2.c b/systems/cardclient/cccam2.c index 3b07d17..26ef012 100644 --- a/systems/cardclient/cccam2.c +++ b/systems/cardclient/cccam2.c @@ -120,10 +120,18 @@ void cCCcamCrypt::ScrambleDcw(unsigned char *data, unsigned int length, const un bool cCCcamCrypt::DcwChecksum(const unsigned char *data) { - return ((data[0]+data[1]+data[2])&0xff)==data[3] && - ((data[4]+data[5]+data[6])&0xff)==data[7] && - ((data[8]+data[9]+data[10])&0xff)==data[11] && - ((data[12]+data[13]+data[14])&0xff)==data[15]; + bool res=true; + if(((data[0]+data[1]+data[2])&0xff)!=data[3] || + ((data[4]+data[5]+data[6])&0xff)!=data[7]) { + res=false; + PRINTF(L_CC_CCCAM2,"warning: even CW checksum failed"); + } + if(((data[8]+data[9]+data[10])&0xff)!=data[11] || + ((data[12]+data[13]+data[14])&0xff)!=data[15]) { + res=false; + PRINTF(L_CC_CCCAM2,"warning: odd CW checksum failed"); + } + return res; } bool cCCcamCrypt::CheckConnectChecksum(const unsigned char *data, int length) @@ -422,14 +430,13 @@ void cCardClientCCcam2::PacketAnalyzer(const unsigned char *data, int length) LDUMP(L_CC_CCCAM2,tempcw,16,"scrambled CW"); cCCcamCrypt::ScrambleDcw(tempcw,16,nodeid,shareid); LDUMP(L_CC_CCCAM2,tempcw,16,"un-scrambled CW"); - if(cCCcamCrypt::DcwChecksum(tempcw)) { - cwmutex.Lock(); - newcw=true; - memcpy(cw,tempcw,16); - cwwait.Broadcast(); - cwmutex.Unlock(); - } - else PRINTF(L_CC_CCCAM2,"CW checksum failed"); + cCCcamCrypt::DcwChecksum(tempcw); + cwmutex.Lock(); + newcw=true; + if(!CheckNull(tempcw+0,8)) memcpy(cw+0,tempcw+0,8); + if(!CheckNull(tempcw+8,8)) memcpy(cw+8,tempcw+8,8); + cwwait.Broadcast(); + cwmutex.Unlock(); decr.Decrypt(tempcw,tempcw,16); break; } -- 2.39.5