CSSscramble.cpp

00001 #include "stdafx.h"
00002 
00003 #ifndef countof
00004 #define countof(array) (sizeof(array)/sizeof(array[0]))
00005 #endif
00006 
00007 unsigned int CSStab0[11]={5,0,1,2,3,4,0,1,2,3,4};
00008 
00009 unsigned char CSStab1[256]=
00010 {
00011         0x33,0x73,0x3b,0x26,0x63,0x23,0x6b,0x76,0x3e,0x7e,0x36,0x2b,0x6e,0x2e,0x66,0x7b,
00012         0xd3,0x93,0xdb,0x06,0x43,0x03,0x4b,0x96,0xde,0x9e,0xd6,0x0b,0x4e,0x0e,0x46,0x9b,
00013         0x57,0x17,0x5f,0x82,0xc7,0x87,0xcf,0x12,0x5a,0x1a,0x52,0x8f,0xca,0x8a,0xc2,0x1f,
00014         0xd9,0x99,0xd1,0x00,0x49,0x09,0x41,0x90,0xd8,0x98,0xd0,0x01,0x48,0x08,0x40,0x91,
00015         0x3d,0x7d,0x35,0x24,0x6d,0x2d,0x65,0x74,0x3c,0x7c,0x34,0x25,0x6c,0x2c,0x64,0x75,
00016         0xdd,0x9d,0xd5,0x04,0x4d,0x0d,0x45,0x94,0xdc,0x9c,0xd4,0x05,0x4c,0x0c,0x44,0x95,
00017         0x59,0x19,0x51,0x80,0xc9,0x89,0xc1,0x10,0x58,0x18,0x50,0x81,0xc8,0x88,0xc0,0x11,
00018         0xd7,0x97,0xdf,0x02,0x47,0x07,0x4f,0x92,0xda,0x9a,0xd2,0x0f,0x4a,0x0a,0x42,0x9f,
00019         0x53,0x13,0x5b,0x86,0xc3,0x83,0xcb,0x16,0x5e,0x1e,0x56,0x8b,0xce,0x8e,0xc6,0x1b,
00020         0xb3,0xf3,0xbb,0xa6,0xe3,0xa3,0xeb,0xf6,0xbe,0xfe,0xb6,0xab,0xee,0xae,0xe6,0xfb,
00021         0x37,0x77,0x3f,0x22,0x67,0x27,0x6f,0x72,0x3a,0x7a,0x32,0x2f,0x6a,0x2a,0x62,0x7f,
00022         0xb9,0xf9,0xb1,0xa0,0xe9,0xa9,0xe1,0xf0,0xb8,0xf8,0xb0,0xa1,0xe8,0xa8,0xe0,0xf1,
00023         0x5d,0x1d,0x55,0x84,0xcd,0x8d,0xc5,0x14,0x5c,0x1c,0x54,0x85,0xcc,0x8c,0xc4,0x15,
00024         0xbd,0xfd,0xb5,0xa4,0xed,0xad,0xe5,0xf4,0xbc,0xfc,0xb4,0xa5,0xec,0xac,0xe4,0xf5,
00025         0x39,0x79,0x31,0x20,0x69,0x29,0x61,0x70,0x38,0x78,0x30,0x21,0x68,0x28,0x60,0x71,
00026         0xb7,0xf7,0xbf,0xa2,0xe7,0xa7,0xef,0xf2,0xba,0xfa,0xb2,0xaf,0xea,0xaa,0xe2,0xff
00027 };
00028 
00029 unsigned char CSStab2[256]=
00030 {
00031         0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x08,0x0b,0x0a,0x0d,0x0c,0x0f,0x0e,
00032         0x12,0x13,0x10,0x11,0x16,0x17,0x14,0x15,0x1b,0x1a,0x19,0x18,0x1f,0x1e,0x1d,0x1c,
00033         0x24,0x25,0x26,0x27,0x20,0x21,0x22,0x23,0x2d,0x2c,0x2f,0x2e,0x29,0x28,0x2b,0x2a,
00034         0x36,0x37,0x34,0x35,0x32,0x33,0x30,0x31,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,
00035         0x49,0x48,0x4b,0x4a,0x4d,0x4c,0x4f,0x4e,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
00036         0x5b,0x5a,0x59,0x58,0x5f,0x5e,0x5d,0x5c,0x52,0x53,0x50,0x51,0x56,0x57,0x54,0x55,
00037         0x6d,0x6c,0x6f,0x6e,0x69,0x68,0x6b,0x6a,0x64,0x65,0x66,0x67,0x60,0x61,0x62,0x63,
00038         0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x76,0x77,0x74,0x75,0x72,0x73,0x70,0x71,
00039         0x92,0x93,0x90,0x91,0x96,0x97,0x94,0x95,0x9b,0x9a,0x99,0x98,0x9f,0x9e,0x9d,0x9c,
00040         0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x89,0x88,0x8b,0x8a,0x8d,0x8c,0x8f,0x8e,
00041         0xb6,0xb7,0xb4,0xb5,0xb2,0xb3,0xb0,0xb1,0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,
00042         0xa4,0xa5,0xa6,0xa7,0xa0,0xa1,0xa2,0xa3,0xad,0xac,0xaf,0xae,0xa9,0xa8,0xab,0xaa,
00043         0xdb,0xda,0xd9,0xd8,0xdf,0xde,0xdd,0xdc,0xd2,0xd3,0xd0,0xd1,0xd6,0xd7,0xd4,0xd5,
00044         0xc9,0xc8,0xcb,0xca,0xcd,0xcc,0xcf,0xce,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
00045         0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf6,0xf7,0xf4,0xf5,0xf2,0xf3,0xf0,0xf1,
00046         0xed,0xec,0xef,0xee,0xe9,0xe8,0xeb,0xea,0xe4,0xe5,0xe6,0xe7,0xe0,0xe1,0xe2,0xe3
00047 };
00048 
00049 unsigned char CSStab3[512]=
00050 {
00051         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00052         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00053         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00054         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00055         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00056         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00057         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00058         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00059         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00060         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00061         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00062         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00063         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00064         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00065         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00066         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00067         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00068         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00069         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00070         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00071         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00072         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00073         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00074         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00075         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00076         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00077         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00078         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00079         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00080         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00081         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
00082         0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff
00083 };
00084 
00085 unsigned char CSStab4[256]=
00086 {
00087         0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0,
00088         0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8,
00089         0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4,0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4,
00090         0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc,
00091         0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2,0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2,
00092         0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea,0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa,
00093         0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6,0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6,
00094         0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee,0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe,
00095         0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1,0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1,
00096         0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9,0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9,
00097         0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5,0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5,
00098         0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed,0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd,
00099         0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3,0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3,
00100         0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb,0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb,
00101         0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7,0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7,
00102         0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff
00103 };
00104 
00105 unsigned char CSStab5[256]=
00106 {
00107         0xff,0x7f,0xbf,0x3f,0xdf,0x5f,0x9f,0x1f,0xef,0x6f,0xaf,0x2f,0xcf,0x4f,0x8f,0x0f,
00108         0xf7,0x77,0xb7,0x37,0xd7,0x57,0x97,0x17,0xe7,0x67,0xa7,0x27,0xc7,0x47,0x87,0x07,
00109         0xfb,0x7b,0xbb,0x3b,0xdb,0x5b,0x9b,0x1b,0xeb,0x6b,0xab,0x2b,0xcb,0x4b,0x8b,0x0b,
00110         0xf3,0x73,0xb3,0x33,0xd3,0x53,0x93,0x13,0xe3,0x63,0xa3,0x23,0xc3,0x43,0x83,0x03,
00111         0xfd,0x7d,0xbd,0x3d,0xdd,0x5d,0x9d,0x1d,0xed,0x6d,0xad,0x2d,0xcd,0x4d,0x8d,0x0d,
00112         0xf5,0x75,0xb5,0x35,0xd5,0x55,0x95,0x15,0xe5,0x65,0xa5,0x25,0xc5,0x45,0x85,0x05,
00113         0xf9,0x79,0xb9,0x39,0xd9,0x59,0x99,0x19,0xe9,0x69,0xa9,0x29,0xc9,0x49,0x89,0x09,
00114         0xf1,0x71,0xb1,0x31,0xd1,0x51,0x91,0x11,0xe1,0x61,0xa1,0x21,0xc1,0x41,0x81,0x01,
00115         0xfe,0x7e,0xbe,0x3e,0xde,0x5e,0x9e,0x1e,0xee,0x6e,0xae,0x2e,0xce,0x4e,0x8e,0x0e,
00116         0xf6,0x76,0xb6,0x36,0xd6,0x56,0x96,0x16,0xe6,0x66,0xa6,0x26,0xc6,0x46,0x86,0x06,
00117         0xfa,0x7a,0xba,0x3a,0xda,0x5a,0x9a,0x1a,0xea,0x6a,0xaa,0x2a,0xca,0x4a,0x8a,0x0a,
00118         0xf2,0x72,0xb2,0x32,0xd2,0x52,0x92,0x12,0xe2,0x62,0xa2,0x22,0xc2,0x42,0x82,0x02,
00119         0xfc,0x7c,0xbc,0x3c,0xdc,0x5c,0x9c,0x1c,0xec,0x6c,0xac,0x2c,0xcc,0x4c,0x8c,0x0c,
00120         0xf4,0x74,0xb4,0x34,0xd4,0x54,0x94,0x14,0xe4,0x64,0xa4,0x24,0xc4,0x44,0x84,0x04,
00121         0xf8,0x78,0xb8,0x38,0xd8,0x58,0x98,0x18,0xe8,0x68,0xa8,0x28,0xc8,0x48,0x88,0x08,
00122         0xf0,0x70,0xb0,0x30,0xd0,0x50,0x90,0x10,0xe0,0x60,0xa0,0x20,0xc0,0x40,0x80,0x00
00123 };
00124 
00125 void CSSdescramble(unsigned char *sec,unsigned char *tkey)
00126 {
00127         unsigned int t1,t2,t3,t4,t5,t6;
00128         unsigned char *end=sec+0x800;
00129 
00130         t1=tkey[0]^sec[0x54]|0x100;
00131         t2=tkey[1]^sec[0x55];
00132         t3=(*((unsigned int *)(tkey+2)))^(*((unsigned int *)(sec+0x56)));
00133         t4=t3&7;
00134         t3=t3*2+8-t4;
00135         sec+=0x80;
00136         t5=0;
00137         while(sec!=end)
00138         {
00139                 t4=CSStab2[t2]^CSStab3[t1];
00140                 t2=t1>>1;
00141                 t1=((t1&1)<<8)^t4;
00142                 t4=CSStab5[t4];
00143                 t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
00144                 t3=(t3<<8)|t6;
00145                 t6=CSStab4[t6];
00146                 t5+=t6+t4;
00147                 *sec++=CSStab1[*sec]^(t5&0xff);
00148                 t5>>=8;
00149         }
00150 }
00151 
00152 void CSSdisckey(unsigned char *dkey,unsigned char *pkey)
00153 {
00154         unsigned int t1,t2,t3,t4,t5,t6;
00155         unsigned char k[5];
00156         int i;
00157 
00158         t1=pkey[0]|0x100;
00159         t2=pkey[1];
00160         t3=*((unsigned int *)(pkey+2));
00161         t4=t3&7;
00162         t3=t3*2+8-t4;
00163         t5=0;
00164         for(i=0;i<5;i++)
00165         {
00166                 t4=CSStab2[t2]^CSStab3[t1];
00167                 t2=t1>>1;
00168                 t1=((t1&1)<<8)^t4;
00169                 t4=CSStab4[t4];
00170                 t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
00171                 t3=(t3<<8)|t6;
00172                 t6=CSStab4[t6];
00173                 t5+=t6+t4;
00174                 k[i]=t5&0xff;
00175                 t5>>=8;
00176         }
00177         for(i=9;i>=0;i--)
00178                 dkey[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[dkey[CSStab0[i+1]]]^dkey[CSStab0[i]];
00179 }
00180 
00181 void CSStitlekey(unsigned char *tkey,unsigned char *dkey)
00182 {
00183         unsigned int t1,t2,t3,t4,t5,t6;
00184         unsigned char k[5];
00185         int i;
00186 
00187         t1=dkey[0]|0x100;
00188         t2=dkey[1];
00189         t3=*((unsigned int *)(dkey+2));
00190         t4=t3&7;
00191         t3=t3*2+8-t4;
00192         t5=0;
00193         for(i=0;i<5;i++)
00194         {
00195                 t4=CSStab2[t2]^CSStab3[t1];
00196                 t2=t1>>1;
00197                 t1=((t1&1)<<8)^t4;
00198                 t4=CSStab4[t4];
00199                 t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
00200                 t3=(t3<<8)|t6;
00201                 t6=CSStab5[t6];
00202                 t5+=t6+t4;
00203                 k[i]=t5&0xff;
00204                 t5>>=8;
00205         }
00206         for(i=9;i>=0;i--)
00207                 tkey[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[tkey[CSStab0[i+1]]]^tkey[CSStab0[i]];
00208 }
00209 
00210 unsigned char g_PlayerKeys[][6] = 
00211 {
00212         // from mplayer:
00213         {0x01, 0xaf, 0xe3, 0x12, 0x80},
00214         {0x12, 0x11, 0xca, 0x04, 0x3b},
00215         {0x14, 0x0c, 0x9e, 0xd0, 0x09},
00216         {0x14, 0x71, 0x35, 0xba, 0xe2},
00217         {0x1a, 0xa4, 0x33, 0x21, 0xa6},
00218         {0x26, 0xec, 0xc4, 0xa7, 0x4e},
00219         {0x2c, 0xb2, 0xc1, 0x09, 0xee},
00220         {0x2f, 0x25, 0x9e, 0x96, 0xdd},
00221         {0x33, 0x2f, 0x49, 0x6c, 0xe0},
00222         {0x35, 0x5b, 0xc1, 0x31, 0x0f},
00223         {0x36, 0x67, 0xb2, 0xe3, 0x85},
00224         {0x39, 0x3d, 0xf1, 0xf1, 0xbd},
00225         {0x3b, 0x31, 0x34, 0x0d, 0x91},
00226         {0x45, 0xed, 0x28, 0xeb, 0xd3},
00227         {0x48, 0xb7, 0x6c, 0xce, 0x69},
00228         {0x4b, 0x65, 0x0d, 0xc1, 0xee},
00229         {0x4c, 0xbb, 0xf5, 0x5b, 0x23},
00230         {0x51, 0x67, 0x67, 0xc5, 0xe0},
00231         {0x53, 0x94, 0xe1, 0x75, 0xbf},
00232         {0x57, 0x2c, 0x8b, 0x31, 0xae},
00233         {0x63, 0xdb, 0x4c, 0x5b, 0x4a},
00234         {0x7b, 0x1e, 0x5e, 0x2b, 0x57},
00235         {0x85, 0xf3, 0x85, 0xa0, 0xe0},
00236         {0xab, 0x1e, 0xe7, 0x7b, 0x72},
00237         {0xab, 0x36, 0xe3, 0xeb, 0x76},
00238         {0xb1, 0xb8, 0xf9, 0x38, 0x03},
00239         {0xb8, 0x5d, 0xd8, 0x53, 0xbd},
00240         {0xbf, 0x92, 0xc3, 0xb0, 0xe2},
00241         {0xcf, 0x1a, 0xb2, 0xf8, 0x0a},
00242         {0xec, 0xa0, 0xcf, 0xb3, 0xff},
00243         {0xfc, 0x95, 0xa9, 0x87, 0x35}
00244         // TODO: find more player keys
00245 };
00246 
00247 int g_nPlayerKeys = countof(g_PlayerKeys);

Generated on Tue Dec 13 14:47:06 2005 for guliverkli by  doxygen 1.4.5