r584: Fixed crash when an UI update switches between Radial and Linear gradient.
[cinelerra_cv.git] / libmpeg3 / mpeg3css.c
blobb898e9e91f9a8308c7a3516d124aaa7455065079
1 /*
2 * Copyright (C) 2000 Derek Fawcus et. al. <derek@spider.com>
3 * Ported to libmpeg3 by et. al.
5 * This code may be used under the terms of Version 2 of the GPL,
6 * read the file COPYING for details.
8 */
11 * These routines do some reordering of the supplied data before
12 * calling engine() to do the main work.
14 * The reordering seems similar to that done by the initial stages of
15 * the DES algorithm, in that it looks like it's just been done to
16 * try and make software decoding slower. I'm not sure that it
17 * actually adds anything to the security.
19 * The nature of the shuffling is that the bits of the supplied
20 * parameter 'varient' are reorganised (and some inverted), and
21 * the bytes of the parameter 'challenge' are reorganised.
23 * The reorganisation in each routine is different, and the first
24 * (CryptKey1) does not bother of play with the 'varient' parameter.
26 * Since this code is only run once per disk change, I've made the
27 * code table driven in order to improve readability.
29 * Since these routines are so similar to each other, one could even
30 * abstract them all to one routine supplied a parameter determining
31 * the nature of the reordering it has to do.
35 #ifdef HAVE_CSS
37 #include "mpeg3css.h"
38 #include "mpeg3private.h"
40 #include <unistd.h>
41 #include <fcntl.h>
42 #include <stdlib.h>
43 #include <string.h>
44 #include <sys/ioctl.h>
45 #include <sys/types.h>
46 #include <sys/stat.h>
47 #include <sys/types.h>
48 #include <linux/cdrom.h>
50 #ifndef FIBMAP
51 #define FIBMAP _IO(0x00,1) /* bmap access */
52 //#define FIBMAP 1
53 #endif
55 /* =================================== TABLES ================================ */
57 static unsigned char mpeg3css_varients[] =
59 0xB7, 0x74, 0x85, 0xD0, 0xCC, 0xDB, 0xCA, 0x73,
60 0x03, 0xFE, 0x31, 0x03, 0x52, 0xE0, 0xB7, 0x42,
61 0x63, 0x16, 0xF2, 0x2A, 0x79, 0x52, 0xFF, 0x1B,
62 0x7A, 0x11, 0xCA, 0x1A, 0x9B, 0x40, 0xAD, 0x01
65 static unsigned char mpeg3css_secret[] = {0x55, 0xD6, 0xC4, 0xC5, 0x28};
67 static unsigned char mpeg3css_table0[] =
69 0xB7, 0xF4, 0x82, 0x57, 0xDA, 0x4D, 0xDB, 0xE2,
70 0x2F, 0x52, 0x1A, 0xA8, 0x68, 0x5A, 0x8A, 0xFF,
71 0xFB, 0x0E, 0x6D, 0x35, 0xF7, 0x5C, 0x76, 0x12,
72 0xCE, 0x25, 0x79, 0x29, 0x39, 0x62, 0x08, 0x24,
73 0xA5, 0x85, 0x7B, 0x56, 0x01, 0x23, 0x68, 0xCF,
74 0x0A, 0xE2, 0x5A, 0xED, 0x3D, 0x59, 0xB0, 0xA9,
75 0xB0, 0x2C, 0xF2, 0xB8, 0xEF, 0x32, 0xA9, 0x40,
76 0x80, 0x71, 0xAF, 0x1E, 0xDE, 0x8F, 0x58, 0x88,
77 0xB8, 0x3A, 0xD0, 0xFC, 0xC4, 0x1E, 0xB5, 0xA0,
78 0xBB, 0x3B, 0x0F, 0x01, 0x7E, 0x1F, 0x9F, 0xD9,
79 0xAA, 0xB8, 0x3D, 0x9D, 0x74, 0x1E, 0x25, 0xDB,
80 0x37, 0x56, 0x8F, 0x16, 0xBA, 0x49, 0x2B, 0xAC,
81 0xD0, 0xBD, 0x95, 0x20, 0xBE, 0x7A, 0x28, 0xD0,
82 0x51, 0x64, 0x63, 0x1C, 0x7F, 0x66, 0x10, 0xBB,
83 0xC4, 0x56, 0x1A, 0x04, 0x6E, 0x0A, 0xEC, 0x9C,
84 0xD6, 0xE8, 0x9A, 0x7A, 0xCF, 0x8C, 0xDB, 0xB1,
85 0xEF, 0x71, 0xDE, 0x31, 0xFF, 0x54, 0x3E, 0x5E,
86 0x07, 0x69, 0x96, 0xB0, 0xCF, 0xDD, 0x9E, 0x47,
87 0xC7, 0x96, 0x8F, 0xE4, 0x2B, 0x59, 0xC6, 0xEE,
88 0xB9, 0x86, 0x9A, 0x64, 0x84, 0x72, 0xE2, 0x5B,
89 0xA2, 0x96, 0x58, 0x99, 0x50, 0x03, 0xF5, 0x38,
90 0x4D, 0x02, 0x7D, 0xE7, 0x7D, 0x75, 0xA7, 0xB8,
91 0x67, 0x87, 0x84, 0x3F, 0x1D, 0x11, 0xE5, 0xFC,
92 0x1E, 0xD3, 0x83, 0x16, 0xA5, 0x29, 0xF6, 0xC7,
93 0x15, 0x61, 0x29, 0x1A, 0x43, 0x4F, 0x9B, 0xAF,
94 0xC5, 0x87, 0x34, 0x6C, 0x0F, 0x3B, 0xA8, 0x1D,
95 0x45, 0x58, 0x25, 0xDC, 0xA8, 0xA3, 0x3B, 0xD1,
96 0x79, 0x1B, 0x48, 0xF2, 0xE9, 0x93, 0x1F, 0xFC,
97 0xDB, 0x2A, 0x90, 0xA9, 0x8A, 0x3D, 0x39, 0x18,
98 0xA3, 0x8E, 0x58, 0x6C, 0xE0, 0x12, 0xBB, 0x25,
99 0xCD, 0x71, 0x22, 0xA2, 0x64, 0xC6, 0xE7, 0xFB,
100 0xAD, 0x94, 0x77, 0x04, 0x9A, 0x39, 0xCF, 0x7C
103 static unsigned char mpeg3css_table1[] =
105 0x8C, 0x47, 0xB0, 0xE1, 0xEB, 0xFC, 0xEB, 0x56,
106 0x10, 0xE5, 0x2C, 0x1A, 0x5D, 0xEF, 0xBE, 0x4F,
107 0x08, 0x75, 0x97, 0x4B, 0x0E, 0x25, 0x8E, 0x6E,
108 0x39, 0x5A, 0x87, 0x53, 0xC4, 0x1F, 0xF4, 0x5C,
109 0x4E, 0xE6, 0x99, 0x30, 0xE0, 0x42, 0x88, 0xAB,
110 0xE5, 0x85, 0xBC, 0x8F, 0xD8, 0x3C, 0x54, 0xC9,
111 0x53, 0x47, 0x18, 0xD6, 0x06, 0x5B, 0x41, 0x2C,
112 0x67, 0x1E, 0x41, 0x74, 0x33, 0xE2, 0xB4, 0xE0,
113 0x23, 0x29, 0x42, 0xEA, 0x55, 0x0F, 0x25, 0xB4,
114 0x24, 0x2C, 0x99, 0x13, 0xEB, 0x0A, 0x0B, 0xC9,
115 0xF9, 0x63, 0x67, 0x43, 0x2D, 0xC7, 0x7D, 0x07,
116 0x60, 0x89, 0xD1, 0xCC, 0xE7, 0x94, 0x77, 0x74,
117 0x9B, 0x7E, 0xD7, 0xE6, 0xFF, 0xBB, 0x68, 0x14,
118 0x1E, 0xA3, 0x25, 0xDE, 0x3A, 0xA3, 0x54, 0x7B,
119 0x87, 0x9D, 0x50, 0xCA, 0x27, 0xC3, 0xA4, 0x50,
120 0x91, 0x27, 0xD4, 0xB0, 0x82, 0x41, 0x97, 0x79,
121 0x94, 0x82, 0xAC, 0xC7, 0x8E, 0xA5, 0x4E, 0xAA,
122 0x78, 0x9E, 0xE0, 0x42, 0xBA, 0x28, 0xEA, 0xB7,
123 0x74, 0xAD, 0x35, 0xDA, 0x92, 0x60, 0x7E, 0xD2,
124 0x0E, 0xB9, 0x24, 0x5E, 0x39, 0x4F, 0x5E, 0x63,
125 0x09, 0xB5, 0xFA, 0xBF, 0xF1, 0x22, 0x55, 0x1C,
126 0xE2, 0x25, 0xDB, 0xC5, 0xD8, 0x50, 0x03, 0x98,
127 0xC4, 0xAC, 0x2E, 0x11, 0xB4, 0x38, 0x4D, 0xD0,
128 0xB9, 0xFC, 0x2D, 0x3C, 0x08, 0x04, 0x5A, 0xEF,
129 0xCE, 0x32, 0xFB, 0x4C, 0x92, 0x1E, 0x4B, 0xFB,
130 0x1A, 0xD0, 0xE2, 0x3E, 0xDA, 0x6E, 0x7C, 0x4D,
131 0x56, 0xC3, 0x3F, 0x42, 0xB1, 0x3A, 0x23, 0x4D,
132 0x6E, 0x84, 0x56, 0x68, 0xF4, 0x0E, 0x03, 0x64,
133 0xD0, 0xA9, 0x92, 0x2F, 0x8B, 0xBC, 0x39, 0x9C,
134 0xAC, 0x09, 0x5E, 0xEE, 0xE5, 0x97, 0xBF, 0xA5,
135 0xCE, 0xFA, 0x28, 0x2C, 0x6D, 0x4F, 0xEF, 0x77,
136 0xAA, 0x1B, 0x79, 0x8E, 0x97, 0xB4, 0xC3, 0xF4
139 static unsigned char mpeg3css_table2[] =
141 0xB7, 0x75, 0x81, 0xD5, 0xDC, 0xCA, 0xDE, 0x66,
142 0x23, 0xDF, 0x15, 0x26, 0x62, 0xD1, 0x83, 0x77,
143 0xE3, 0x97, 0x76, 0xAF, 0xE9, 0xC3, 0x6B, 0x8E,
144 0xDA, 0xB0, 0x6E, 0xBF, 0x2B, 0xF1, 0x19, 0xB4,
145 0x95, 0x34, 0x48, 0xE4, 0x37, 0x94, 0x5D, 0x7B,
146 0x36, 0x5F, 0x65, 0x53, 0x07, 0xE2, 0x89, 0x11,
147 0x98, 0x85, 0xD9, 0x12, 0xC1, 0x9D, 0x84, 0xEC,
148 0xA4, 0xD4, 0x88, 0xB8, 0xFC, 0x2C, 0x79, 0x28,
149 0xD8, 0xDB, 0xB3, 0x1E, 0xA2, 0xF9, 0xD0, 0x44,
150 0xD7, 0xD6, 0x60, 0xEF, 0x14, 0xF4, 0xF6, 0x31,
151 0xD2, 0x41, 0x46, 0x67, 0x0A, 0xE1, 0x58, 0x27,
152 0x43, 0xA3, 0xF8, 0xE0, 0xC8, 0xBA, 0x5A, 0x5C,
153 0x80, 0x6C, 0xC6, 0xF2, 0xE8, 0xAD, 0x7D, 0x04,
154 0x0D, 0xB9, 0x3C, 0xC2, 0x25, 0xBD, 0x49, 0x63,
155 0x8C, 0x9F, 0x51, 0xCE, 0x20, 0xC5, 0xA1, 0x50,
156 0x92, 0x2D, 0xDD, 0xBC, 0x8D, 0x4F, 0x9A, 0x71,
157 0x2F, 0x30, 0x1D, 0x73, 0x39, 0x13, 0xFB, 0x1A,
158 0xCB, 0x24, 0x59, 0xFE, 0x05, 0x96, 0x57, 0x0F,
159 0x1F, 0xCF, 0x54, 0xBE, 0xF5, 0x06, 0x1B, 0xB2,
160 0x6D, 0xD3, 0x4D, 0x32, 0x56, 0x21, 0x33, 0x0B,
161 0x52, 0xE7, 0xAB, 0xEB, 0xA6, 0x74, 0x00, 0x4C,
162 0xB1, 0x7F, 0x82, 0x99, 0x87, 0x0E, 0x5E, 0xC0,
163 0x8F, 0xEE, 0x6F, 0x55, 0xF3, 0x7E, 0x08, 0x90,
164 0xFA, 0xB6, 0x64, 0x70, 0x47, 0x4A, 0x17, 0xA7,
165 0xB5, 0x40, 0x8A, 0x38, 0xE5, 0x68, 0x3E, 0x8B,
166 0x69, 0xAA, 0x9B, 0x42, 0xA5, 0x10, 0x01, 0x35,
167 0xFD, 0x61, 0x9E, 0xE6, 0x16, 0x9C, 0x86, 0xED,
168 0xCD, 0x2E, 0xFF, 0xC4, 0x5B, 0xA0, 0xAE, 0xCC,
169 0x4B, 0x3B, 0x03, 0xBB, 0x1C, 0x2A, 0xAC, 0x0C,
170 0x3F, 0x93, 0xC7, 0x72, 0x7A, 0x09, 0x22, 0x3D,
171 0x45, 0x78, 0xA9, 0xA8, 0xEA, 0xC9, 0x6A, 0xF7,
172 0x29, 0x91, 0xF0, 0x02, 0x18, 0x3A, 0x4E, 0x7C
175 static unsigned char mpeg3css_table3[] =
177 0x73, 0x51, 0x95, 0xE1, 0x12, 0xE4, 0xC0, 0x58,
178 0xEE, 0xF2, 0x08, 0x1B, 0xA9, 0xFA, 0x98, 0x4C,
179 0xA7, 0x33, 0xE2, 0x1B, 0xA7, 0x6D, 0xF5, 0x30,
180 0x97, 0x1D, 0xF3, 0x02, 0x60, 0x5A, 0x82, 0x0F,
181 0x91, 0xD0, 0x9C, 0x10, 0x39, 0x7A, 0x83, 0x85,
182 0x3B, 0xB2, 0xB8, 0xAE, 0x0C, 0x09, 0x52, 0xEA,
183 0x1C, 0xE1, 0x8D, 0x66, 0x4F, 0xF3, 0xDA, 0x92,
184 0x29, 0xB9, 0xD5, 0xC5, 0x77, 0x47, 0x22, 0x53,
185 0x14, 0xF7, 0xAF, 0x22, 0x64, 0xDF, 0xC6, 0x72,
186 0x12, 0xF3, 0x75, 0xDA, 0xD7, 0xD7, 0xE5, 0x02,
187 0x9E, 0xED, 0xDA, 0xDB, 0x4C, 0x47, 0xCE, 0x91,
188 0x06, 0x06, 0x6D, 0x55, 0x8B, 0x19, 0xC9, 0xEF,
189 0x8C, 0x80, 0x1A, 0x0E, 0xEE, 0x4B, 0xAB, 0xF2,
190 0x08, 0x5C, 0xE9, 0x37, 0x26, 0x5E, 0x9A, 0x90,
191 0x00, 0xF3, 0x0D, 0xB2, 0xA6, 0xA3, 0xF7, 0x26,
192 0x17, 0x48, 0x88, 0xC9, 0x0E, 0x2C, 0xC9, 0x02,
193 0xE7, 0x18, 0x05, 0x4B, 0xF3, 0x39, 0xE1, 0x20,
194 0x02, 0x0D, 0x40, 0xC7, 0xCA, 0xB9, 0x48, 0x30,
195 0x57, 0x67, 0xCC, 0x06, 0xBF, 0xAC, 0x81, 0x08,
196 0x24, 0x7A, 0xD4, 0x8B, 0x19, 0x8E, 0xAC, 0xB4,
197 0x5A, 0x0F, 0x73, 0x13, 0xAC, 0x9E, 0xDA, 0xB6,
198 0xB8, 0x96, 0x5B, 0x60, 0x88, 0xE1, 0x81, 0x3F,
199 0x07, 0x86, 0x37, 0x2D, 0x79, 0x14, 0x52, 0xEA,
200 0x73, 0xDF, 0x3D, 0x09, 0xC8, 0x25, 0x48, 0xD8,
201 0x75, 0x60, 0x9A, 0x08, 0x27, 0x4A, 0x2C, 0xB9,
202 0xA8, 0x8B, 0x8A, 0x73, 0x62, 0x37, 0x16, 0x02,
203 0xBD, 0xC1, 0x0E, 0x56, 0x54, 0x3E, 0x14, 0x5F,
204 0x8C, 0x8F, 0x6E, 0x75, 0x1C, 0x07, 0x39, 0x7B,
205 0x4B, 0xDB, 0xD3, 0x4B, 0x1E, 0xC8, 0x7E, 0xFE,
206 0x3E, 0x72, 0x16, 0x83, 0x7D, 0xEE, 0xF5, 0xCA,
207 0xC5, 0x18, 0xF9, 0xD8, 0x68, 0xAB, 0x38, 0x85,
208 0xA8, 0xF0, 0xA1, 0x73, 0x9F, 0x5D, 0x19, 0x0B,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210 0x33, 0x72, 0x39, 0x25, 0x67, 0x26, 0x6D, 0x71,
211 0x36, 0x77, 0x3C, 0x20, 0x62, 0x23, 0x68, 0x74,
212 0xC3, 0x82, 0xC9, 0x15, 0x57, 0x16, 0x5D, 0x81
215 static struct mpeg3_playkey mpeg3_pkey1a1 = {0x36b, {0x51,0x67,0x67,0xc5,0xe0}};
216 static struct mpeg3_playkey mpeg3_pkey2a1 = {0x762, {0x2c,0xb2,0xc1,0x09,0xee}};
217 static struct mpeg3_playkey mpeg3_pkey1b1 = {0x36b, {0x90,0xc1,0xd7,0x84,0x48}};
219 static struct mpeg3_playkey mpeg3_pkey1a2 = {0x2f3, {0x51,0x67,0x67,0xc5,0xe0}};
220 static struct mpeg3_playkey mpeg3_pkey2a2 = {0x730, {0x2c,0xb2,0xc1,0x09,0xee}};
221 static struct mpeg3_playkey mpeg3_pkey1b2 = {0x2f3, {0x90,0xc1,0xd7,0x84,0x48}};
223 static struct mpeg3_playkey mpeg3_pkey1a3 = {0x235, {0x51,0x67,0x67,0xc5,0xe0}};
224 static struct mpeg3_playkey mpeg3_pkey1b3 = {0x235, {0x90,0xc1,0xd7,0x84,0x48}};
226 static struct mpeg3_playkey mpeg3_pkey3a1 = {0x249, {0xb7,0x3f,0xd4,0xaa,0x14}}; /* DVD specific ? */
227 static struct mpeg3_playkey mpeg3_pkey4a1 = {0x028, {0x53,0xd4,0xf7,0xd9,0x8f}}; /* DVD specific ? */
229 static struct mpeg3_playkey *mpeg3_playkeys[] =
231 &mpeg3_pkey1a1, &mpeg3_pkey2a1, &mpeg3_pkey1b1,
232 &mpeg3_pkey1a2, &mpeg3_pkey2a2, &mpeg3_pkey1b2,
233 &mpeg3_pkey1a3, &mpeg3_pkey1b3,
234 &mpeg3_pkey3a1, &mpeg3_pkey4a1,
235 NULL
240 * some tables used for descrambling sectors and/or decrypting title keys
244 static unsigned char csstab1[256]=
246 0x33,0x73,0x3b,0x26,0x63,0x23,0x6b,0x76,0x3e,0x7e,0x36,0x2b,0x6e,0x2e,0x66,0x7b,
247 0xd3,0x93,0xdb,0x06,0x43,0x03,0x4b,0x96,0xde,0x9e,0xd6,0x0b,0x4e,0x0e,0x46,0x9b,
248 0x57,0x17,0x5f,0x82,0xc7,0x87,0xcf,0x12,0x5a,0x1a,0x52,0x8f,0xca,0x8a,0xc2,0x1f,
249 0xd9,0x99,0xd1,0x00,0x49,0x09,0x41,0x90,0xd8,0x98,0xd0,0x01,0x48,0x08,0x40,0x91,
250 0x3d,0x7d,0x35,0x24,0x6d,0x2d,0x65,0x74,0x3c,0x7c,0x34,0x25,0x6c,0x2c,0x64,0x75,
251 0xdd,0x9d,0xd5,0x04,0x4d,0x0d,0x45,0x94,0xdc,0x9c,0xd4,0x05,0x4c,0x0c,0x44,0x95,
252 0x59,0x19,0x51,0x80,0xc9,0x89,0xc1,0x10,0x58,0x18,0x50,0x81,0xc8,0x88,0xc0,0x11,
253 0xd7,0x97,0xdf,0x02,0x47,0x07,0x4f,0x92,0xda,0x9a,0xd2,0x0f,0x4a,0x0a,0x42,0x9f,
254 0x53,0x13,0x5b,0x86,0xc3,0x83,0xcb,0x16,0x5e,0x1e,0x56,0x8b,0xce,0x8e,0xc6,0x1b,
255 0xb3,0xf3,0xbb,0xa6,0xe3,0xa3,0xeb,0xf6,0xbe,0xfe,0xb6,0xab,0xee,0xae,0xe6,0xfb,
256 0x37,0x77,0x3f,0x22,0x67,0x27,0x6f,0x72,0x3a,0x7a,0x32,0x2f,0x6a,0x2a,0x62,0x7f,
257 0xb9,0xf9,0xb1,0xa0,0xe9,0xa9,0xe1,0xf0,0xb8,0xf8,0xb0,0xa1,0xe8,0xa8,0xe0,0xf1,
258 0x5d,0x1d,0x55,0x84,0xcd,0x8d,0xc5,0x14,0x5c,0x1c,0x54,0x85,0xcc,0x8c,0xc4,0x15,
259 0xbd,0xfd,0xb5,0xa4,0xed,0xad,0xe5,0xf4,0xbc,0xfc,0xb4,0xa5,0xec,0xac,0xe4,0xf5,
260 0x39,0x79,0x31,0x20,0x69,0x29,0x61,0x70,0x38,0x78,0x30,0x21,0x68,0x28,0x60,0x71,
261 0xb7,0xf7,0xbf,0xa2,0xe7,0xa7,0xef,0xf2,0xba,0xfa,0xb2,0xaf,0xea,0xaa,0xe2,0xff
264 static unsigned char lfsr1_bits0[256]=
266 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x08,0x0b,0x0a,0x0d,0x0c,0x0f,0x0e,
267 0x12,0x13,0x10,0x11,0x16,0x17,0x14,0x15,0x1b,0x1a,0x19,0x18,0x1f,0x1e,0x1d,0x1c,
268 0x24,0x25,0x26,0x27,0x20,0x21,0x22,0x23,0x2d,0x2c,0x2f,0x2e,0x29,0x28,0x2b,0x2a,
269 0x36,0x37,0x34,0x35,0x32,0x33,0x30,0x31,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,
270 0x49,0x48,0x4b,0x4a,0x4d,0x4c,0x4f,0x4e,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
271 0x5b,0x5a,0x59,0x58,0x5f,0x5e,0x5d,0x5c,0x52,0x53,0x50,0x51,0x56,0x57,0x54,0x55,
272 0x6d,0x6c,0x6f,0x6e,0x69,0x68,0x6b,0x6a,0x64,0x65,0x66,0x67,0x60,0x61,0x62,0x63,
273 0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x76,0x77,0x74,0x75,0x72,0x73,0x70,0x71,
274 0x92,0x93,0x90,0x91,0x96,0x97,0x94,0x95,0x9b,0x9a,0x99,0x98,0x9f,0x9e,0x9d,0x9c,
275 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x89,0x88,0x8b,0x8a,0x8d,0x8c,0x8f,0x8e,
276 0xb6,0xb7,0xb4,0xb5,0xb2,0xb3,0xb0,0xb1,0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,
277 0xa4,0xa5,0xa6,0xa7,0xa0,0xa1,0xa2,0xa3,0xad,0xac,0xaf,0xae,0xa9,0xa8,0xab,0xaa,
278 0xdb,0xda,0xd9,0xd8,0xdf,0xde,0xdd,0xdc,0xd2,0xd3,0xd0,0xd1,0xd6,0xd7,0xd4,0xd5,
279 0xc9,0xc8,0xcb,0xca,0xcd,0xcc,0xcf,0xce,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
280 0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf6,0xf7,0xf4,0xf5,0xf2,0xf3,0xf0,0xf1,
281 0xed,0xec,0xef,0xee,0xe9,0xe8,0xeb,0xea,0xe4,0xe5,0xe6,0xe7,0xe0,0xe1,0xe2,0xe3
284 static unsigned char lfsr1_bits1[512]=
286 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
287 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
288 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
289 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
290 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
291 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
292 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
293 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
294 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
295 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
296 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
297 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
298 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
299 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
300 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
301 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
302 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
303 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
304 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
305 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
306 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
307 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
308 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
309 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
310 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
311 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
312 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
313 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
314 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
315 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
316 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
317 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff
320 /* Reverse the order of the bits within a byte.
322 static unsigned char bit_reverse[256]=
324 0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0,
325 0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8,
326 0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4,0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4,
327 0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc,
328 0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2,0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2,
329 0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea,0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa,
330 0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6,0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6,
331 0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee,0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe,
332 0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1,0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1,
333 0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9,0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9,
334 0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5,0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5,
335 0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed,0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd,
336 0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3,0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3,
337 0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb,0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb,
338 0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7,0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7,
339 0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff
342 /* ================================= Functions ====================================== */
345 * We use two LFSR's (seeded from some of the input data bytes) to
346 * generate two streams of pseudo-random bits. These two bit streams
347 * are then combined by simply adding with carry to generate a final
348 * sequence of pseudo-random bits which is stored in the buffer that
349 * 'output' points to the end of - len is the size of this buffer.
351 * The first LFSR is of degree 25, and has a polynomial of:
352 * x^13 + x^5 + x^4 + x^1 + 1
354 * The second LSFR is of degree 17, and has a (primitive) polynomial of:
355 * x^15 + x^1 + 1
357 * I don't know if these polynomials are primitive modulo 2, and thus
358 * represent maximal-period LFSR's.
361 * Note that we take the output of each LFSR from the new shifted in
362 * bit, not the old shifted out bit. Thus for ease of use the LFSR's
363 * are implemented in bit reversed order.
367 #define BIT0(x) ((x) & 1)
368 #define BIT1(x) (((x) >> 1) & 1)
370 static void generate_bits(unsigned char *output, int len, struct mpeg3_block const *s)
372 unsigned long lfsr0, lfsr1;
373 unsigned char carry;
375 /* In order to ensure that the LFSR works we need to ensure that the
376 * initial values are non-zero. Thus when we initialise them from
377 * the seed, we ensure that a bit is set.
379 lfsr0 = (s->b[0] << 17) | (s->b[1] << 9) | ((s->b[2] & ~7) << 1) | 8 | (s->b[2] & 7);
380 lfsr1 = (s->b[3] << 9) | 0x100 | s->b[4];
382 ++output;
384 carry = 0;
386 int bit;
387 unsigned char val;
389 for (bit = 0, val = 0; bit < 8; ++bit)
391 unsigned char o_lfsr0, o_lfsr1; /* Actually only 1 bit each */
392 unsigned char combined;
394 o_lfsr0 = ((lfsr0 >> 24) ^ (lfsr0 >> 21) ^ (lfsr0 >> 20) ^ (lfsr0 >> 12)) & 1;
395 lfsr0 = (lfsr0 << 1) | o_lfsr0;
397 o_lfsr1 = ((lfsr1 >> 16) ^ (lfsr1 >> 2)) & 1;
398 lfsr1 = (lfsr1 << 1) | o_lfsr1;
400 combined = !o_lfsr1 + carry + !o_lfsr0;
401 carry = BIT1(combined);
402 val |= BIT0(combined) << bit;
405 *--output = val;
406 }while (--len > 0);
411 * This encryption engine implements one of 32 variations
412 * one the same theme depending upon the choice in the
413 * varient parameter (0 - 31).
415 * The algorithm itself manipulates a 40 bit input into
416 * a 40 bit output.
417 * The parameter 'input' is 80 bits. It consists of
418 * the 40 bit input value that is to be encrypted followed
419 * by a 40 bit seed value for the pseudo random number
420 * generators.
422 static void css_engine(int varient, unsigned char const *input, struct mpeg3_block *output)
424 unsigned char cse, term, index;
425 struct mpeg3_block temp1;
426 struct mpeg3_block temp2;
427 unsigned char bits[30];
429 int i;
431 /* Feed the secret into the input values such that
432 * we alter the seed to the LFSR's used above, then
433 * generate the bits to play with.
435 for(i = 5; --i >= 0; )
436 temp1.b[i] = input[5 + i] ^ mpeg3css_secret[i] ^ mpeg3css_table2[i];
438 generate_bits(&bits[29], sizeof bits, &temp1);
440 /* This term is used throughout the following to
441 * select one of 32 different variations on the
442 * algorithm.
444 cse = mpeg3css_varients[varient] ^ mpeg3css_table2[varient];
446 /* Now the actual blocks doing the encryption. Each
447 * of these works on 40 bits at a time and are quite
448 * similar.
450 for(i = 5, term = 0; --i >= 0; term = input[i])
452 index = bits[25 + i] ^ input[i];
453 index = mpeg3css_table1[index] ^ ~mpeg3css_table2[index] ^ cse;
455 temp1.b[i] = mpeg3css_table2[index] ^ mpeg3css_table3[index] ^ term;
457 temp1.b[4] ^= temp1.b[0];
459 for(i = 5, term = 0; --i >= 0; term = temp1.b[i])
461 index = bits[20 + i] ^ temp1.b[i];
462 index = mpeg3css_table1[index] ^ ~mpeg3css_table2[index] ^ cse;
464 temp2.b[i] = mpeg3css_table2[index] ^ mpeg3css_table3[index] ^ term;
466 temp2.b[4] ^= temp2.b[0];
468 for (i = 5, term = 0; --i >= 0; term = temp2.b[i])
470 index = bits[15 + i] ^ temp2.b[i];
471 index = mpeg3css_table1[index] ^ ~mpeg3css_table2[index] ^ cse;
472 index = mpeg3css_table2[index] ^ mpeg3css_table3[index] ^ term;
474 temp1.b[i] = mpeg3css_table0[index] ^ mpeg3css_table2[index];
476 temp1.b[4] ^= temp1.b[0];
478 for (i = 5, term = 0; --i >= 0; term = temp1.b[i])
480 index = bits[10 + i] ^ temp1.b[i];
481 index = mpeg3css_table1[index] ^ ~mpeg3css_table2[index] ^ cse;
483 index = mpeg3css_table2[index] ^ mpeg3css_table3[index] ^ term;
485 temp2.b[i] = mpeg3css_table0[index] ^ mpeg3css_table2[index];
487 temp2.b[4] ^= temp2.b[0];
489 for (i = 5, term = 0; --i >= 0; term = temp2.b[i])
491 index = bits[5 + i] ^ temp2.b[i];
492 index = mpeg3css_table1[index] ^ ~mpeg3css_table2[index] ^ cse;
494 temp1.b[i] = mpeg3css_table2[index] ^ mpeg3css_table3[index] ^ term;
496 temp1.b[4] ^= temp1.b[0];
498 for (i = 5, term = 0; --i >= 0; term = temp1.b[i])
500 index = bits[i] ^ temp1.b[i];
501 index = mpeg3css_table1[index] ^ ~mpeg3css_table2[index] ^ cse;
503 output->b[i] = mpeg3css_table2[index] ^ mpeg3css_table3[index] ^ term;
507 static void crypt_key1(mpeg3_css_t *css, int varient, unsigned char const *challenge, struct mpeg3_block *key)
509 static unsigned char perm_challenge[] = {1, 3, 0, 7, 5, 2, 9, 6, 4, 8};
511 unsigned char scratch[10];
512 int i;
514 for (i = 9; i >= 0; i--)
515 scratch[i] = challenge[perm_challenge[i]];
517 css_engine(varient, scratch, key);
520 /* This shuffles the bits in varient to make perm_varient such that
521 * 4 -> !3
522 * 3 -> 4
523 * varient bits: 2 -> 0 perm_varient bits
524 * 1 -> 2
525 * 0 -> !1
527 static void crypt_key2(mpeg3_css_t *css, int varient, unsigned char const *challenge, struct mpeg3_block *key)
529 static unsigned char perm_challenge[] = {6, 1, 9, 3, 8, 5, 7, 4, 0, 2};
531 static unsigned char perm_varient[] =
533 0x0a, 0x08, 0x0e, 0x0c, 0x0b, 0x09, 0x0f, 0x0d,
534 0x1a, 0x18, 0x1e, 0x1c, 0x1b, 0x19, 0x1f, 0x1d,
535 0x02, 0x00, 0x06, 0x04, 0x03, 0x01, 0x07, 0x05,
536 0x12, 0x10, 0x16, 0x14, 0x13, 0x11, 0x17, 0x15
539 unsigned char scratch[10];
540 int i;
542 for(i = 9; i >= 0; i--)
543 scratch[i] = css->challenge[perm_challenge[i]];
545 css_engine(perm_varient[varient], scratch, key);
548 /* This shuffles the bits in varient to make perm_varient such that
549 * 4 -> 0
550 * 3 -> !1
551 * varient bits: 2 -> !4 perm_varient bits
552 * 1 -> 2
553 * 0 -> 3
555 static void crypt_bus_key(mpeg3_css_t *css, int varient, unsigned char const *challenge, struct mpeg3_block *key)
557 static unsigned char perm_challenge[] = {4,0,3,5,7, 2,8,6,1,9};
558 static unsigned char perm_varient[] = {
559 0x12, 0x1a, 0x16, 0x1e, 0x02, 0x0a, 0x06, 0x0e,
560 0x10, 0x18, 0x14, 0x1c, 0x00, 0x08, 0x04, 0x0c,
561 0x13, 0x1b, 0x17, 0x1f, 0x03, 0x0b, 0x07, 0x0f,
562 0x11, 0x19, 0x15, 0x1d, 0x01, 0x09, 0x05, 0x0d};
564 unsigned char scratch[10];
565 int i;
567 for(i = 9; i >= 0; i--)
568 scratch[i] = css->challenge[perm_challenge[i]];
570 css_engine(perm_varient[varient], scratch, key);
573 static int get_asf(mpeg3_css_t *css)
575 dvd_authinfo ai;
577 ai.type = DVD_LU_SEND_ASF;
578 ai.lsasf.agid = 0;
579 ai.lsasf.asf = 0;
581 if(ioctl(css->fd, DVD_AUTH, &ai))
583 /* Exit here for a hard drive or unencrypted CD-ROM. */
584 return 1;
587 return 0;
590 static int authenticate_drive(mpeg3_css_t *css, const unsigned char *key)
592 int i;
594 for(i = 0; i < 5; i++)
595 css->key1.b[i] = key[4 - i];
597 for(i = 0; i < 32; ++i)
599 crypt_key1(css, i, css->challenge, &(css->keycheck));
600 if(memcmp(css->keycheck.b, css->key1.b, 5) == 0)
602 css->varient = i;
603 return 0;
607 if (css->varient == -1) return 1;
609 return 0;
612 /* Simulation of a non-CSS compliant host (i.e. the authentication fails,
613 * but idea is here for a real CSS compliant authentication scheme). */
614 static int hostauth(mpeg3_css_t *css, dvd_authinfo *ai)
616 int i;
618 switch(ai->type)
620 /* Host data receive (host changes state) */
621 case DVD_LU_SEND_AGID:
622 ai->type = DVD_HOST_SEND_CHALLENGE;
623 break;
625 case DVD_LU_SEND_KEY1:
626 /* printf("Key 1: %02x %02x %02x %02x %02x\n", */
627 /* ai->lsk.key[4], ai->lsk.key[3], ai->lsk.key[2], ai->lsk.key[1], ai->lsk.key[0]); */
628 if(authenticate_drive(css, ai->lsk.key))
630 ai->type = DVD_AUTH_FAILURE;
631 return 1;
633 ai->type = DVD_LU_SEND_CHALLENGE;
634 break;
636 case DVD_LU_SEND_CHALLENGE:
637 for(i = 0; i < 10; i++)
638 css->challenge[i] = ai->hsc.chal[9-i];
639 crypt_key2(css, css->varient, css->challenge, &(css->key2));
640 ai->type = DVD_HOST_SEND_KEY2;
641 break;
643 /* Host data send */
644 case DVD_HOST_SEND_CHALLENGE:
645 for(i = 0; i < 10; i++)
646 ai->hsc.chal[9 - i] = css->challenge[i];
647 /* Returning data, let LU change state */
648 break;
650 case DVD_HOST_SEND_KEY2:
651 for(i = 0; i < 5; i++)
653 ai->hsk.key[4 - i] = css->key2.b[i];
655 /* printf("Key 2: %02x %02x %02x %02x %02x\n", */
656 /* ai->hsk.key[4], ai->hsk.key[3], ai->hsk.key[2], ai->hsk.key[1], ai->hsk.key[0]); */
657 /* Returning data, let LU change state */
658 break;
660 default:
661 fprintf(stderr, "Got invalid state %d\n", ai->type);
662 return 1;
665 return 0;
668 static int get_title_key(mpeg3_css_t *css, int agid, int lba, unsigned char *key)
670 dvd_authinfo ai;
671 int i;
673 ai.type = DVD_LU_SEND_TITLE_KEY;
675 ai.lstk.agid = agid;
676 ai.lstk.lba = lba;
678 if(ioctl(css->fd, DVD_AUTH, &ai))
680 //perror("GetTitleKey");
681 return 1;
684 for (i = 0; i < 5; i++)
686 ai.lstk.title_key[i] ^= key[4 - (i % 5)];
689 /* Save the title key */
690 for(i = 0; i < 5; i++)
692 css->title_key[i] = ai.lstk.title_key[i];
695 return 0;
698 static int get_disk_key(mpeg3_css_t *css, int agid, unsigned char *key)
700 dvd_struct s;
701 int index, i;
703 s.type = DVD_STRUCT_DISCKEY;
704 s.disckey.agid = agid;
705 memset(s.disckey.value, 0, MPEG3_DVD_PACKET_SIZE);
706 if(ioctl(css->fd, DVD_READ_STRUCT, &s) < 0)
708 /*perror("get_disk_key"); */
709 return 1;
712 for(index = 0; index < sizeof s.disckey.value; index ++)
713 s.disckey.value[index] ^= key[4 - (index%5)];
715 /* Save disk key */
716 for(i = 0; i < MPEG3_DVD_PACKET_SIZE; i++)
717 css->disk_key[i] = s.disckey.value[i];
719 return 0;
722 static int validate(mpeg3_css_t *css, int lba, int do_title)
724 dvd_authinfo ai;
725 dvd_struct dvds;
726 int result = 0;
727 int i, rv, tries, agid;
729 memset(&ai, 0, sizeof (ai));
730 memset(&dvds, 0, sizeof (dvds));
732 if(get_asf(css)) return 1;
734 /* Init sequence, request AGID */
735 for(tries = 1, rv = -1; rv == -1 && tries < 4; tries++)
737 ai.type = DVD_LU_SEND_AGID;
738 ai.lsa.agid = 0;
739 rv = ioctl(css->fd, DVD_AUTH, &ai);
740 if(rv == -1)
742 /* perror("validate: request AGID"); */
743 ai.type = DVD_INVALIDATE_AGID;
744 ai.lsa.agid = 0;
745 ioctl(css->fd, DVD_AUTH, &ai);
748 if(tries >= 4) return 1;
750 for(i = 0; i < 10; i++) css->challenge[i] = i;
752 /* Send AGID to host */
753 if(hostauth(css, &ai)) return 1;
755 /* Get challenge from host */
756 if(hostauth(css, &ai)) return 1;
757 agid = ai.lsa.agid;
759 /* Send challenge to LU */
760 if(ioctl(css->fd, DVD_AUTH, &ai) < 0) return 1;
762 /* Get key1 from LU */
763 if(ioctl(css->fd, DVD_AUTH, &ai) < 0) return 1;
765 /* Send key1 to host */
766 if(hostauth(css, &ai)) return 1;
768 /* Get challenge from LU */
769 if(ioctl(css->fd, DVD_AUTH, &ai) < 0) return 1;
771 /* Send challenge to host */
772 if(hostauth(css, &ai)) return 1;
774 /* Get key2 from host */
775 if(hostauth(css, &ai)) return 1;
777 /* Send key2 to LU */
778 if(ioctl(css->fd, DVD_AUTH, &ai) < 0)
780 perror("validate: Send key2 to LU");
781 return 1;
784 if(ai.type == DVD_AUTH_FAILURE)
786 fprintf(stderr, "validate: authorization failed\n");
787 return 1;
789 memcpy(css->challenge, css->key1.b, 5);
790 memcpy(css->challenge + 5, css->key2.b, 5);
791 crypt_bus_key(css, css->varient, css->challenge, &(css->keycheck));
793 get_asf(css);
795 if(do_title)
796 return get_title_key(css, agid, lba, css->keycheck.b);
797 else
798 return get_disk_key(css, agid, css->keycheck.b);
800 return 0;
803 static int validate_path(mpeg3_css_t *css, int do_title)
805 int result = 0;
806 int lba = 0, file_fd;
808 if(do_title)
810 if((file_fd = open(css->path, O_RDONLY)) == -1)
812 perror("validate_path: open");
813 return 1;
816 if(ioctl(file_fd, FIBMAP, &lba) != 0)
818 perror("validate_path: FIBMAP");
819 close(file_fd);
820 return 1;
823 close(file_fd);
826 result = mpeg3io_device(css->path, css->device_path);
828 //printf("validate_path 1 %d\n", result);
829 if(!result) result = (css->fd = open(css->device_path, O_RDONLY | O_NONBLOCK)) < 0;
830 //printf("validate_path 2 %d\n", result);
832 if(!result) result = validate(css, lba, do_title);
834 //printf("validate_path 3 %d\n", result);
835 /* Definitely encrypted if we got here. */
838 if(!result) css->encrypted = 1;
840 close(css->fd);
841 return result;
846 * this function is only used internally when decrypting title key
849 static void title_key(unsigned char *key, unsigned char *im, unsigned char invert)
851 unsigned int lfsr1_lo, lfsr1_hi, lfsr0, combined;
852 unsigned char o_lfsr0, o_lfsr1;
853 unsigned char k[5];
854 int i;
856 lfsr1_lo = im[0] | 0x100;
857 lfsr1_hi = im[1];
859 lfsr0 = ((im[4] << 17) | (im[3] << 9) | (im[2] << 1)) + 8 - (im[2]&7);
860 lfsr0 = (bit_reverse[lfsr0 & 0xff] << 24) | (bit_reverse[(lfsr0 >> 8) & 0xff] << 16)
861 | (bit_reverse[(lfsr0 >> 16) & 0xff] << 8) | bit_reverse[(lfsr0 >> 24) & 0xff];
863 combined = 0;
864 for (i = 0; i < 5; ++i) {
865 o_lfsr1 = lfsr1_bits0[lfsr1_hi] ^ lfsr1_bits1[lfsr1_lo];
866 lfsr1_hi = lfsr1_lo>>1;
867 lfsr1_lo = ((lfsr1_lo&1)<<8) ^ o_lfsr1;
868 o_lfsr1 = bit_reverse[o_lfsr1];
870 /*o_lfsr0 = (lfsr0>>7)^(lfsr0>>10)^(lfsr0>>11)^(lfsr0>>19);*/
871 o_lfsr0 = (((((((lfsr0>>8)^lfsr0)>>1)^lfsr0)>>3)^lfsr0)>>7);
872 lfsr0 = (lfsr0>>8)|(o_lfsr0<<24);
874 combined += (o_lfsr0 ^ invert) + o_lfsr1;
875 k[i] = combined & 0xff;
876 combined >>= 8;
879 key[4] = k[4] ^ csstab1[key[4]] ^ key[3];
880 key[3] = k[3] ^ csstab1[key[3]] ^ key[2];
881 key[2] = k[2] ^ csstab1[key[2]] ^ key[1];
882 key[1] = k[1] ^ csstab1[key[1]] ^ key[0];
883 key[0] = k[0] ^ csstab1[key[0]] ^ key[4];
885 key[4] = k[4] ^ csstab1[key[4]] ^ key[3];
886 key[3] = k[3] ^ csstab1[key[3]] ^ key[2];
887 key[2] = k[2] ^ csstab1[key[2]] ^ key[1];
888 key[1] = k[1] ^ csstab1[key[1]] ^ key[0];
889 key[0] = k[0] ^ csstab1[key[0]];
894 * this function decrypts a title key with the specified disk key
896 * tkey: the unobfuscated title key (XORed with BusKey)
897 * dkey: the unobfuscated disk key (XORed with BusKey)
898 * 2048 bytes in length (though only 5 bytes are needed, see below)
900 * use the result returned in tkey with css_descramble
904 static int decrypt_title_key(mpeg3_css_t *css, unsigned char *dkey, unsigned char *tkey)
906 unsigned char test[5], pretkey[5];
907 int i = 0;
909 for(i = 0; mpeg3_playkeys[i]; i++)
911 memcpy(pretkey, dkey + mpeg3_playkeys[i]->offset, 5);
912 title_key(pretkey, mpeg3_playkeys[i]->key, 0);
914 memcpy(test, dkey, 5);
915 title_key(test, pretkey, 0);
917 if(memcmp(test, pretkey, 5) == 0)
918 break;
921 if(!mpeg3_playkeys[i])
923 fprintf(stderr, "mpeg3_decrypttitlekey: Shit - Need key %d\n", i + 1);
924 return 1;
927 title_key(css->title_key, pretkey, 0xff);
929 return 0;
934 * The descrambling core
936 * sec: encrypted sector (2048 bytes)
937 * key: decrypted title key obtained from css_decrypttitlekey
941 #define SALTED(i) (key[i] ^ sec[0x54 - offset + (i)])
943 static void descramble(unsigned char *sec, unsigned char *key, int offset)
945 unsigned int lfsr1_lo, lfsr1_hi, lfsr0, combined;
946 unsigned char o_lfsr0, o_lfsr1;
947 unsigned char *end = sec + 0x800 - offset;
949 if(offset > 0x54)
950 fprintf(stderr, "mpeg3css.c: descramble: offset > 0x54 offset=%x\n", offset);
952 lfsr1_lo = SALTED(0) | 0x100;
953 lfsr1_hi = SALTED(1);
955 lfsr0 = ((SALTED(4) << 17) | (SALTED(3) << 9) | (SALTED(2) << 1)) + 8 - (SALTED(2) & 7);
956 lfsr0 = (bit_reverse[lfsr0 & 0xff] << 24) | (bit_reverse[(lfsr0 >> 8) & 0xff] << 16)
957 | (bit_reverse[(lfsr0 >> 16) & 0xff] << 8) | bit_reverse[(lfsr0 >> 24) & 0xff];
959 sec += 0x80 - offset;
960 combined = 0;
961 while(sec != end)
963 o_lfsr1 = lfsr1_bits0[lfsr1_hi] ^ lfsr1_bits1[lfsr1_lo];
964 lfsr1_hi = lfsr1_lo >> 1;
965 lfsr1_lo = ((lfsr1_lo&1) << 8) ^ o_lfsr1;
966 o_lfsr1 = bit_reverse[o_lfsr1];
968 /*o_lfsr0 = (lfsr0 >> 7) ^ (lfsr0 >> 10) ^ (lfsr0 >> 11) ^ (lfsr0 >> 19);*/
969 o_lfsr0 = (((((((lfsr0 >> 8) ^ lfsr0) >> 1) ^ lfsr0) >> 3) ^ lfsr0) >> 7);
970 lfsr0 = (lfsr0 >> 8) | (o_lfsr0 << 24);
972 combined += o_lfsr0 + (unsigned char)~o_lfsr1;
974 *sec = csstab1[*sec] ^ (combined & 0xff);
975 sec++;
977 combined >>= 8;
979 //printf("descramble\n");
982 /* =============================== Entry Points ================================= */
984 mpeg3_css_t* mpeg3_new_css()
986 mpeg3_css_t *css = calloc(1, sizeof(mpeg3_css_t));
987 css->varient = -1;
988 return css;
991 int mpeg3_delete_css(mpeg3_css_t *css)
993 free(css);
994 return 0;
997 int mpeg3_get_keys(mpeg3_css_t *css, char *path)
999 int result = 0;
1001 strcpy(css->path, path);
1002 /* Get disk key */
1003 result = validate_path(css, 0);
1004 /* Get title key */
1005 if(!result) result = validate_path(css, 1);
1006 /* Descramble the title key */
1007 if(!result) result = decrypt_title_key(css, css->disk_key, css->title_key);
1009 return css->encrypted ? result : 0;
1012 /* sector is the full 2048 byte sector */
1013 int mpeg3_decrypt_packet(mpeg3_css_t *css, unsigned char *sector, int offset)
1015 //printf("mpeg3_decrypt_packet %d\n", css->encrypted);
1016 if(!css->encrypted) return 0; /* Not encrypted */
1017 descramble(sector, css->title_key, offset);
1018 return 0;
1021 #else // HAVE_CSS
1023 #include "mpeg3css_fake.c"
1025 #endif