void CSSdescramble(unsigned char *sec,unsigned char *key) { unsigned int t1,t2,t3,t4,t5,t6; unsigned char *end=sec+0x800; t1=key[0]^sec[0x54]|0x100; t2=key[1]^sec[0x55]; t3=(*((unsigned int *)(key+2)))^(*((unsigned int *)(sec+0x56))); t4=t3&7; t3=t3*2+8-t4; sec+=0x80; t5=0; while(sec!=end) { t4=CSStab2[t2]^CSStab3[t1]; t2=t1>>1; t1=((t1&1)<<8)^t4; t4=CSStab5[t4]; t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff; t3=(t3<<8)|t6; t6=CSStab4[t6]; t5+=t6+t4; *sec++=CSStab1[*sec]^(t5&0xff); t5>>=8; } } void CSStitlekey1(unsigned char *key,unsigned char *im) { unsigned int t1,t2,t3,t4,t5,t6; unsigned char k[5]; int i; t1=im[0]|0x100; t2=im[1]; t3=*((unsigned int *)(im+2)); t4=t3&7; t3=t3*2+8-t4; t5=0; for(i=0;i<5;i++) { t4=CSStab2[t2]^CSStab3[t1]; t2=t1>>1; t1=((t1&1)<<8)^t4; t4=CSStab4[t4]; t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff; t3=(t3<<8)|t6; t6=CSStab4[t6]; t5+=t6+t4; k[i]=t5&0xff; t5>>=8; } for(i=9;i>=0;i--) key[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[key[CSStab0[i+1]]]^key[CSStab0[i]]; } void CSStitlekey2(unsigned char *key,unsigned char *im) { unsigned int t1,t2,t3,t4,t5,t6; unsigned char k[5]; int i; t1=im[0]|0x100; t2=im[1]; t3=*((unsigned int *)(im+2)); t4=t3&7; t3=t3*2+8-t4; t5=0; for(i=0;i<5;i++) { t4=CSStab2[t2]^CSStab3[t1]; t2=t1>>1; t1=((t1&1)<<8)^t4; t4=CSStab4[t4]; t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff; t3=(t3<<8)|t6; t6=CSStab5[t6]; t5+=t6+t4; k[i]=t5&0xff; t5>>=8; } for(i=9;i>=0;i--) key[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[key[CSStab0[i+1]]]^key[CSStab0[i]]; } void CSSdecrypttitlekey(unsigned char *tkey,unsigned char *dkey) { int i; unsigned char im1[6]; unsigned char im2[6]={0x51,0x67,0x67,0xc5,0xe0,0x00}; for(i=0;i<6;i++) im1[i]=dkey[i]; CSStitlekey1(im1,im2); CSStitlekey2(tkey,im1); }