/* This code is written in a C-like language for which there is currently no compiler. Hence, the code is not directly executable. Please do not write a compiler or interpreter for this language. -- Dave Touretzky */ integer CSStab0[11]={5,0,1,2,3,4,0,1,2,3,4}; byte CSStab1[256]= { #x33,#x73,#x3B,#x26,#x63,#x23,#x6B,#x76,#x3E,#x7E,#x36,#x2B,#x6E,#x2E,#x66,#x7B, #xD3,#x93,#xDB,#x06,#x43,#x03,#x4B,#x96,#xDE,#x9E,#xD6,#x0B,#x4E,#x0E,#x46,#x9B, #x57,#x17,#x5F,#x82,#xC7,#x87,#xCF,#x12,#x5A,#x1A,#x52,#x8F,#xCA,#x8A,#xC2,#x1F, #xD9,#x99,#xD1,#x00,#x49,#x09,#x41,#x90,#xD8,#x98,#xD0,#x01,#x48,#x08,#x40,#x91, #x3D,#x7D,#x35,#x24,#x6D,#x2D,#x65,#x74,#x3C,#x7C,#x34,#x25,#x6C,#x2C,#x64,#x75, #xDD,#x9D,#xD5,#x04,#x4D,#x0D,#x45,#x94,#xDC,#x9C,#xD4,#x05,#x4C,#x0C,#x44,#x95, #x59,#x19,#x51,#x80,#xC9,#x89,#xC1,#x10,#x58,#x18,#x50,#x81,#xC8,#x88,#xC0,#x11, #xD7,#x97,#xDF,#x02,#x47,#x07,#x4F,#x92,#xDA,#x9A,#xD2,#x0F,#x4A,#x0A,#x42,#x9F, #x53,#x13,#x5B,#x86,#xC3,#x83,#xCB,#x16,#x5E,#x1E,#x56,#x8B,#xCE,#x8E,#xC6,#x1B, #xB3,#xF3,#xBB,#xA6,#xE3,#xA3,#xEB,#xF6,#xBE,#xFE,#xB6,#xAB,#xEE,#xAE,#xE6,#xFB, #x37,#x77,#x3F,#x22,#x67,#x27,#x6F,#x72,#x3A,#x7A,#x32,#x2F,#x6A,#x2A,#x62,#x7F, #xB9,#xF9,#xB1,#xA0,#xE9,#xA9,#xE1,#xF0,#xB8,#xF8,#xB0,#xA1,#xE8,#xA8,#xE0,#xF1, #x5D,#x1D,#x55,#x84,#xCD,#x8D,#xC5,#x14,#x5C,#x1C,#x54,#x85,#xCC,#x8C,#xC4,#x15, #xBD,#xFD,#xB5,#xA4,#xED,#xAD,#xE5,#xF4,#xBC,#xFC,#xB4,#xA5,#xEC,#xAC,#xE4,#xF5, #x39,#x79,#x31,#x20,#x69,#x29,#x61,#x70,#x38,#x78,#x30,#x21,#x68,#x28,#x60,#x71, #xB7,#xF7,#xBF,#xA2,#xE7,#xA7,#xEF,#xF2,#xBA,#xFA,#xB2,#xAF,#xEA,#xAA,#xE2,#xFF }; byte CSStab2[256]= { #x00,#x01,#x02,#x03,#x04,#x05,#x06,#x07,#x09,#x08,#x0B,#x0A,#x0D,#x0C,#x0F,#x0E, #x12,#x13,#x10,#x11,#x16,#x17,#x14,#x15,#x1B,#x1A,#x19,#x18,#x1F,#x1E,#x1D,#x1C, #x24,#x25,#x26,#x27,#x20,#x21,#x22,#x23,#x2D,#x2C,#x2F,#x2E,#x29,#x28,#x2B,#x2A, #x36,#x37,#x34,#x35,#x32,#x33,#x30,#x31,#x3F,#x3E,#x3D,#x3C,#x3B,#x3A,#x39,#x38, #x49,#x48,#x4B,#x4A,#x4D,#x4C,#x4F,#x4E,#x40,#x41,#x42,#x43,#x44,#x45,#x46,#x47, #x5B,#x5A,#x59,#x58,#x5F,#x5E,#x5D,#x5C,#x52,#x53,#x50,#x51,#x56,#x57,#x54,#x55, #x6D,#x6C,#x6F,#x6E,#x69,#x68,#x6B,#x6A,#x64,#x65,#x66,#x67,#x60,#x61,#x62,#x63, #x7F,#x7E,#x7D,#x7C,#x7B,#x7A,#x79,#x78,#x76,#x77,#x74,#x75,#x72,#x73,#x70,#x71, #x92,#x93,#x90,#x91,#x96,#x97,#x94,#x95,#x9B,#x9A,#x99,#x98,#x9F,#x9E,#x9D,#x9C, #x80,#x81,#x82,#x83,#x84,#x85,#x86,#x87,#x89,#x88,#x8B,#x8A,#x8D,#x8C,#x8F,#x8E, #xB6,#xB7,#xB4,#xB5,#xB2,#xB3,#xB0,#xB1,#xBF,#xBE,#xBD,#xBC,#xBB,#xBA,#xB9,#xB8, #xA4,#xA5,#xA6,#xA7,#xA0,#xA1,#xA2,#xA3,#xAD,#xAC,#xAF,#xAE,#xA9,#xA8,#xAB,#xAA, #xDB,#xDA,#xD9,#xD8,#xDF,#xDE,#xDD,#xDC,#xD2,#xD3,#xD0,#xD1,#xD6,#xD7,#xD4,#xD5, #xC9,#xC8,#xCB,#xCA,#xCD,#xCC,#xCF,#xCE,#xC0,#xC1,#xC2,#xC3,#xC4,#xC5,#xC6,#xC7, #xFF,#xFE,#xFD,#xFC,#xFB,#xFA,#xF9,#xF8,#xF6,#xF7,#xF4,#xF5,#xF2,#xF3,#xF0,#xF1, #xED,#xEC,#xEF,#xEE,#xE9,#xE8,#xEB,#xEA,#xE4,#xE5,#xE6,#xE7,#xE0,#xE1,#xE2,#xE3 }; byte CSStab3[512]= { #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF, #x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF,#x00,#x24,#x49,#x6D,#x92,#xB6,#xDB,#xFF }; byte CSStab4[256]= { #x00,#x80,#x40,#xC0,#x20,#xA0,#x60,#xE0,#x10,#x90,#x50,#xD0,#x30,#xB0,#x70,#xF0, #x08,#x88,#x48,#xC8,#x28,#xA8,#x68,#xE8,#x18,#x98,#x58,#xD8,#x38,#xB8,#x78,#xF8, #x04,#x84,#x44,#xC4,#x24,#xA4,#x64,#xE4,#x14,#x94,#x54,#xD4,#x34,#xB4,#x74,#xF4, #x0C,#x8C,#x4C,#xCC,#x2C,#xAC,#x6C,#xEC,#x1C,#x9C,#x5C,#xDC,#x3C,#xBC,#x7C,#xFC, #x02,#x82,#x42,#xC2,#x22,#xA2,#x62,#xE2,#x12,#x92,#x52,#xD2,#x32,#xB2,#x72,#xF2, #x0A,#x8A,#x4A,#xCA,#x2A,#xAA,#x6A,#xEA,#x1A,#x9A,#x5A,#xDA,#x3A,#xBA,#x7A,#xFA, #x06,#x86,#x46,#xC6,#x26,#xA6,#x66,#xE6,#x16,#x96,#x56,#xD6,#x36,#xB6,#x76,#xF6, #x0E,#x8E,#x4E,#xCE,#x2E,#xAE,#x6E,#xEE,#x1E,#x9E,#x5E,#xDE,#x3E,#xBE,#x7E,#xFE, #x01,#x81,#x41,#xC1,#x21,#xA1,#x61,#xE1,#x11,#x91,#x51,#xD1,#x31,#xB1,#x71,#xF1, #x09,#x89,#x49,#xC9,#x29,#xA9,#x69,#xE9,#x19,#x99,#x59,#xD9,#x39,#xB9,#x79,#xF9, #x05,#x85,#x45,#xC5,#x25,#xA5,#x65,#xE5,#x15,#x95,#x55,#xD5,#x35,#xB5,#x75,#xF5, #x0D,#x8D,#x4D,#xCD,#x2D,#xAD,#x6D,#xED,#x1D,#x9D,#x5D,#xDD,#x3D,#xBD,#x7D,#xFD, #x03,#x83,#x43,#xC3,#x23,#xA3,#x63,#xE3,#x13,#x93,#x53,#xD3,#x33,#xB3,#x73,#xF3, #x0B,#x8B,#x4B,#xCB,#x2B,#xAB,#x6B,#xEB,#x1B,#x9B,#x5B,#xDB,#x3B,#xBB,#x7B,#xFB, #x07,#x87,#x47,#xC7,#x27,#xA7,#x67,#xE7,#x17,#x97,#x57,#xD7,#x37,#xB7,#x77,#xF7, #x0F,#x8F,#x4F,#xCF,#x2F,#xAF,#x6F,#xEF,#x1F,#x9F,#x5F,#xDF,#x3F,#xBF,#x7F,#xFF }; byte CSStab5[256]= { #xFF,#x7F,#xBF,#x3F,#xDF,#x5F,#x9F,#x1F,#xEF,#x6F,#xAF,#x2F,#xCF,#x4F,#x8F,#x0F, #xF7,#x77,#xB7,#x37,#xD7,#x57,#x97,#x17,#xE7,#x67,#xA7,#x27,#xC7,#x47,#x87,#x07, #xFB,#x7B,#xBB,#x3B,#xDB,#x5B,#x9B,#x1B,#xEB,#x6B,#xAB,#x2B,#xCB,#x4B,#x8B,#x0B, #xF3,#x73,#xB3,#x33,#xD3,#x53,#x93,#x13,#xE3,#x63,#xA3,#x23,#xC3,#x43,#x83,#x03, #xFD,#x7D,#xBD,#x3D,#xDD,#x5D,#x9D,#x1D,#xED,#x6D,#xAD,#x2D,#xCD,#x4D,#x8D,#x0D, #xF5,#x75,#xB5,#x35,#xD5,#x55,#x95,#x15,#xE5,#x65,#xA5,#x25,#xC5,#x45,#x85,#x05, #xF9,#x79,#xB9,#x39,#xD9,#x59,#x99,#x19,#xE9,#x69,#xA9,#x29,#xC9,#x49,#x89,#x09, #xF1,#x71,#xB1,#x31,#xD1,#x51,#x91,#x11,#xE1,#x61,#xA1,#x21,#xC1,#x41,#x81,#x01, #xFE,#x7E,#xBE,#x3E,#xDE,#x5E,#x9E,#x1E,#xEE,#x6E,#xAE,#x2E,#xCE,#x4E,#x8E,#x0E, #xF6,#x76,#xB6,#x36,#xD6,#x56,#x96,#x16,#xE6,#x66,#xA6,#x26,#xC6,#x46,#x86,#x06, #xFA,#x7A,#xBA,#x3A,#xDA,#x5A,#x9A,#x1A,#xEA,#x6A,#xAA,#x2A,#xCA,#x4A,#x8A,#x0A, #xF2,#x72,#xB2,#x32,#xD2,#x52,#x92,#x12,#xE2,#x62,#xA2,#x22,#xC2,#x42,#x82,#x02, #xFC,#x7C,#xBC,#x3C,#xDC,#x5C,#x9C,#x1C,#xEC,#x6C,#xAC,#x2C,#xCC,#x4C,#x8C,#x0C, #xF4,#x74,#xB4,#x34,#xD4,#x54,#x94,#x14,#xE4,#x64,#xA4,#x24,#xC4,#x44,#x84,#x04, #xF8,#x78,#xB8,#x38,#xD8,#x58,#x98,#x18,#xE8,#x68,#xA8,#x28,#xC8,#x48,#x88,#x08, #xF0,#x70,#xB0,#x30,#xD0,#x50,#x90,#x10,#xE0,#x60,#xA0,#x20,#xC0,#x40,#x80,#x00 }; novalue CSSdescramble(byte pointer sec, byte pointer key) { integer t1,t2,t3,t4,t5,t6; byte pointer end=sec+#x800; t1=key[0] XOR sec[#x54] OR #x100; t2=key[1] XOR sec[#x55]; t3=fetch_integer_from_address(key+2) XOR fetch_integer_from_address(sec+#x56); t4=t3 AND #x07; t3=t3*2+8-t4; sec=sec+#x80; t5=0; while(sec <> end) do { t4=CSStab2[t2] XOR CSStab3[t1]; t2=t1 RSHIFT 1; t1=((t1 AND #x01) LSHIFT 8) XOR t4; t4=CSStab5[t4]; t6=(((((((t3 RSHIFT 3) XOR t3) RSHIFT 1) XOR t3) RSHIFT 8) XOR t3) RSHIFT 5) AND #xFF; t3=(t3 LSHIFT 8) OR t6; t6=CSStab4[t6]; t5=t6+t5+t4; store_byte(sec,CSStab1[fetch_byte_from_address(sec)] XOR (t5 AND #xFF)); sec=sec+1; t5=t5 RSHIFT 8; } } novalue CSStitlekey1(byte pointer key, byte pointer im) { integer t1,t2,t3,t4,t5,t6; byte k[5]; integer i; t1=im[0] OR #x100; t2=im[1]; t3=fetch_integer_from_address(im+2); t4=t3 AND #x07; t3=t3*2+8-t4; t5=0; for i = 0 to 4 step 1 do { t4=CSStab2[t2] XOR CSStab3[t1]; t2=t1 RSHIFT 1; t1=((t1 AND #x01) LSHIFT 8) XOR t4; t4=CSStab4[t4]; t6=(((((((t3 RSHIFT 3) XOR t3) RSHIFT 1) XOR t3) RSHIFT 8) XOR t3) RSHIFT 5) AND #xFF; t3=(t3 LSHIFT 8) OR t6; t6=CSStab4[t6]; t5=t6+t5+t4; k[i]=t5 AND #xFF; t5=t5 RSHIFT 8; } for i = 9 to 0 step -1 do { key[CSStab0[i+1]]=k[CSStab0[i+1]] XOR CSStab1[key[CSStab0[i+1]]] XOR key[CSStab0[i]]; } } novalue CSStitlekey2(byte pointer key, byte pointer im) { integer t1,t2,t3,t4,t5,t6; byte k[5]; integer i; t1=im[0] OR #x100; t2=im[1]; t3=fetch_integer_from_address(im+2); t4=t3 AND #x07; t3=t3*2+8-t4; t5=0; for i = 0 to 4 step 1 do { t4=CSStab2[t2] XOR CSStab3[t1]; t2=t1 RSHIFT 1; t1=((t1 AND #x01) LSHIFT 8) XOR t4; t4=CSStab4[t4]; t6=(((((((t3 RSHIFT 3) XOR t3) RSHIFT 1) XOR t3) RSHIFT 8) XOR t3) RSHIFT 5) AND #xFF; t3=(t3 LSHIFT 8) OR t6; t6=CSStab5[t6]; t5=t6+t5+t4; k[i]=t5 AND #xFF; t5=t5 RSHIFT 8; } for i = 9 to 0 step -1 do { key[CSStab0[i+1]]=k[CSStab0[i+1]] XOR CSStab1[key[CSStab0[i+1]]] XOR key[CSStab0[i]]; } } novalue CSSdecrypttitlekey(byte pointer tkey, byte pointer dkey) { integer i; byte im1[6]; byte im2[6]={#x51,#x67,#x67,#xC5,#xE0,#x00}; for i = 0 to 5 step 1 do { im1[i]=dkey[i]; } CSStitlekey1(im1,im2); CSStitlekey2(tkey,im1); }