private:
unsigned char keytable[256];
unsigned char state, counter, sum;
+ bool log;
//
static void Swap(unsigned char *p1, unsigned char *p2);
public:
- void Init(const unsigned char *key, int length);
+ void Init(const unsigned char *key, int length, bool l=false);
void Decrypt(const unsigned char *in, unsigned char *out, int length);
void Encrypt(const unsigned char *in, unsigned char *out, int length);
static void ScrambleDcw(unsigned char *data, const unsigned char *nodeid, unsigned int shareid);
static void Xor(unsigned char *data, int length);
};
-void cCCcamCrypt::Init(const unsigned char *key, int length)
+void cCCcamCrypt::Init(const unsigned char *key, int length, bool l)
{
+ log=l;
for(int pos=0; pos<=255; pos++) keytable[pos]=pos;
int result=0;
unsigned char curr_char=0;
result=(result+1)%length;
}
state=key[0]; counter=0; sum=0;
- LDUMP(L_CC_CCCAM2EX,keytable,sizeof(keytable),"cccrypt init state=%d table",state);
+ if(log) LDUMP(L_CC_CCCAM2EX,keytable,sizeof(keytable),"cccrypt init state=%d table",state);
}
void cCCcamCrypt::Decrypt(const unsigned char *in, unsigned char *out, int length)
out[pos]=in[pos] ^ state ^ keytable[(keytable[sum]+keytable[counter])&0xFF];
state^=out[pos];
}
- LDUMP(L_CC_CCCAM2EX,keytable,sizeof(keytable),"cccrypt init state=%d table",state);
+ if(log) LDUMP(L_CC_CCCAM2EX,keytable,sizeof(keytable),"cccrypt decrypt state=%d table",state);
}
void cCCcamCrypt::Encrypt(const unsigned char *in, unsigned char *out, int length)
out[pos]=in[pos] ^ state ^ keytable[(keytable[sum]+keytable[counter])&0xFF];
state^=in[pos];
}
- LDUMP(L_CC_CCCAM2EX,keytable,sizeof(keytable),"cccrypt init state=%d table",state);
+ if(log) LDUMP(L_CC_CCCAM2EX,keytable,sizeof(keytable),"cccrypt encrypt state=%d table",state);
}
void cCCcamCrypt::Swap(unsigned char *p1, unsigned char *p2)
break;
case CMD0C_MODE_RC4:
case CMD0C_MODE_CC:
- cc.Init(buff,32);
+ cc.Init(buff,32,true);
break;
case CMD0C_MODE_AES:
aes.SetKey(buff);
LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,256,"cmd 05 aes in");
aes.SetKey(cmd05aes);
aes.Encrypt(((struct GenericCmd *)hdr)->payload,256,gen->payload);
- LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,256,"cmd 05 aes out");
+ LDUMP(L_CC_CCCAM2EX,gen->payload,256,"cmd 05 aes out");
break;
}
case CMD05_MODE_CC:
LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,256,"cmd 05 cc in");
cmd05crypt.Encrypt(((struct GenericCmd *)hdr)->payload,gen->payload,256);
- LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,256,"cmd 05 cc out");
+ LDUMP(L_CC_CCCAM2EX,gen->payload,256,"cmd 05 cc out");
break;
case CMD05_MODE_RC4:
LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,256,"cmd 05 rc4 in");
cmd05crypt.Decrypt(((struct GenericCmd *)hdr)->payload,gen->payload,256);
- LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,256,"cmd 05 rc4 out");
+ LDUMP(L_CC_CCCAM2EX,gen->payload,256,"cmd 05 rc4 out");
break;
default:
mode=CMD05_MODE_UNKNOWN;
PRINTF(L_CC_CCCAM2EX,"cmd 05 offset now %d",cmd05off);
}
else if((plen>=0x10 && plen<=0x1f) || (plen>=0x24 && plen<=0x2b)) {
- cmd05crypt.Init(((struct GenericCmd *)hdr)->payload,plen);
+ cmd05crypt.Init(((struct GenericCmd *)hdr)->payload,plen,true);
cmd05mode=CMD05_MODE_RC4;
PRINTF(L_CC_CCCAM2EX,"cmd 05 mode now RC4");
LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,plen,"cmd 05 key payload");
LDUMP(L_CC_CCCAM2EX,cmd05aes,sizeof(cmd05aes),"cmd 05 aes key");
}
else if(plen==0x21) {
- cmd05crypt.Init(((struct GenericCmd *)hdr)->payload+cmd05off,plen);
+ cmd05crypt.Init(((struct GenericCmd *)hdr)->payload+cmd05off,plen,true);
cmd05mode=CMD05_MODE_RC4;
PRINTF(L_CC_CCCAM2EX,"cmd 05 mode now CC (offset=%d)",cmd05off);
LDUMP(L_CC_CCCAM2EX,((struct GenericCmd *)hdr)->payload,plen,"cmd 05 key payload");