Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2011-06-09 20:19:56 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2011-06-09 20:19:56 +0400
commitbd86f1cf3f935fc92ece8bc0c5ff3a9b651d18dd (patch)
tree007cf8bc5b6cc1b28c471f306a185577100181b8 /common
parent95b0c6e4d749effa3098b9d40207607bc25de0bd (diff)
Add support for decoding audio delivered by the MS DVD Navigator, as well as some other filters directly providing PES streams instead of demuxed audio.
Diffstat (limited to 'common')
-rw-r--r--common/DSUtilLite/DSUtilLite.vcxproj6
-rw-r--r--common/DSUtilLite/DSUtilLite.vcxproj.filters24
-rw-r--r--common/DSUtilLite/DeCSS/CSSauth.cpp339
-rw-r--r--common/DSUtilLite/DeCSS/CSSauth.h5
-rw-r--r--common/DSUtilLite/DeCSS/CSSscramble.cpp240
-rw-r--r--common/DSUtilLite/DeCSS/CSSscramble.h8
-rw-r--r--common/DSUtilLite/DeCSS/DeCSSInputPin.cpp359
-rw-r--r--common/DSUtilLite/DeCSS/DeCSSInputPin.h52
8 files changed, 1033 insertions, 0 deletions
diff --git a/common/DSUtilLite/DSUtilLite.vcxproj b/common/DSUtilLite/DSUtilLite.vcxproj
index 273635b1..9f86df4e 100644
--- a/common/DSUtilLite/DSUtilLite.vcxproj
+++ b/common/DSUtilLite/DSUtilLite.vcxproj
@@ -117,6 +117,9 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="BaseDSPropPage.h" />
+ <ClInclude Include="DeCSS\CSSauth.h" />
+ <ClInclude Include="DeCSS\CSSscramble.h" />
+ <ClInclude Include="DeCSS\DeCSSInputPin.h" />
<ClInclude Include="DShowUtil.h" />
<ClInclude Include="FloatingAverage.h" />
<ClInclude Include="FontInstaller.h" />
@@ -127,6 +130,9 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="BaseDSPropPage.cpp" />
+ <ClCompile Include="DeCSS\CSSauth.cpp" />
+ <ClCompile Include="DeCSS\CSSscramble.cpp" />
+ <ClCompile Include="DeCSS\DeCSSInputPin.cpp" />
<ClCompile Include="DShowUtil.cpp" />
<ClCompile Include="filterreg.cpp" />
<ClCompile Include="FontInstaller.cpp" />
diff --git a/common/DSUtilLite/DSUtilLite.vcxproj.filters b/common/DSUtilLite/DSUtilLite.vcxproj.filters
index 95028060..8d614698 100644
--- a/common/DSUtilLite/DSUtilLite.vcxproj.filters
+++ b/common/DSUtilLite/DSUtilLite.vcxproj.filters
@@ -13,6 +13,12 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
+ <Filter Include="Header Files\DeCSS">
+ <UniqueIdentifier>{a130de5c-2e03-4582-92a8-2675b370e46f}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="Source Files\DeCSS">
+ <UniqueIdentifier>{b645319e-a7a0-4188-b5cb-516008bf32c5}</UniqueIdentifier>
+ </Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
@@ -39,6 +45,15 @@
<ClInclude Include="FontInstaller.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="DeCSS\CSSauth.h">
+ <Filter>Header Files\DeCSS</Filter>
+ </ClInclude>
+ <ClInclude Include="DeCSS\CSSscramble.h">
+ <Filter>Header Files\DeCSS</Filter>
+ </ClInclude>
+ <ClInclude Include="DeCSS\DeCSSInputPin.h">
+ <Filter>Header Files\DeCSS</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
@@ -65,5 +80,14 @@
<ClCompile Include="FontInstaller.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="DeCSS\CSSauth.cpp">
+ <Filter>Source Files\DeCSS</Filter>
+ </ClCompile>
+ <ClCompile Include="DeCSS\CSSscramble.cpp">
+ <Filter>Source Files\DeCSS</Filter>
+ </ClCompile>
+ <ClCompile Include="DeCSS\DeCSSInputPin.cpp">
+ <Filter>Source Files\DeCSS</Filter>
+ </ClCompile>
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/common/DSUtilLite/DeCSS/CSSauth.cpp b/common/DSUtilLite/DeCSS/CSSauth.cpp
new file mode 100644
index 00000000..f05ebd92
--- /dev/null
+++ b/common/DSUtilLite/DeCSS/CSSauth.cpp
@@ -0,0 +1,339 @@
+#include "stdafx.h"
+
+static void CSSengine(int varient,unsigned char const *input,unsigned char *output);
+
+void CSSkey1(int varient,unsigned char const *challenge,unsigned char *key)
+{
+ static unsigned char perm_challenge[] = {1,3,0,7,5, 2,9,6,4,8};
+
+ unsigned char scratch[10];
+ int i;
+
+ for (i = 9; i >= 0; --i) {
+ scratch[i] = challenge[perm_challenge[i]];
+ }
+
+ CSSengine(varient, scratch, key);
+}
+
+void CSSkey2(int varient,unsigned char const *challenge,unsigned char *key)
+{
+ static unsigned char perm_challenge[] = {6,1,9,3,8, 5,7,4,0,2};
+
+ static unsigned char perm_varient[] = {
+ 0x0a, 0x08, 0x0e, 0x0c, 0x0b, 0x09, 0x0f, 0x0d,
+ 0x1a, 0x18, 0x1e, 0x1c, 0x1b, 0x19, 0x1f, 0x1d,
+ 0x02, 0x00, 0x06, 0x04, 0x03, 0x01, 0x07, 0x05,
+ 0x12, 0x10, 0x16, 0x14, 0x13, 0x11, 0x17, 0x15
+ };
+
+ unsigned char scratch[10];
+ int i;
+
+ for (i = 9; i >= 0; --i) {
+ scratch[i] = challenge[perm_challenge[i]];
+ }
+
+ CSSengine(perm_varient[varient], scratch, key);
+}
+
+void CSSbuskey(int varient,unsigned char const *challenge,unsigned char *key)
+{
+ static unsigned char perm_challenge[] = {4,0,3,5,7, 2,8,6,1,9};
+ static unsigned char perm_varient[] = {
+ 0x12, 0x1a, 0x16, 0x1e, 0x02, 0x0a, 0x06, 0x0e,
+ 0x10, 0x18, 0x14, 0x1c, 0x00, 0x08, 0x04, 0x0c,
+ 0x13, 0x1b, 0x17, 0x1f, 0x03, 0x0b, 0x07, 0x0f,
+ 0x11, 0x19, 0x15, 0x1d, 0x01, 0x09, 0x05, 0x0d
+ };
+
+ unsigned char scratch[10];
+ int i;
+
+ for (i = 9; i >= 0; --i) {
+ scratch[i] = challenge[perm_challenge[i]];
+ }
+
+ CSSengine(perm_varient[varient], scratch, key);
+}
+
+static void CSSgenbits(unsigned char *output, int len,unsigned char const *s)
+{
+ unsigned long lfsr0, lfsr1;
+ unsigned char b1_combined; /* Save the old value of bit 1 for feedback */
+
+ /* In order to ensure that the LFSR works we need to ensure that the
+ * initial values are non-zero. Thus when we initialise them from
+ * the seed, we ensure that a bit is set.
+ */
+ lfsr0 = (s[0] << 17) | (s[1] << 9) | ((s[2] & ~7) << 1) | 8 | (s[2] & 7);
+ lfsr1 = (s[3] << 9) | 0x100 | s[4];
+
+ ++output;
+
+ b1_combined = 0;
+ do {
+ int bit;
+ unsigned char val;
+
+ for (bit = 0, val = 0; bit < 8; ++bit) {
+ unsigned char o_lfsr0, o_lfsr1; /* Actually only 1 bit each */
+ unsigned char combined;
+
+ o_lfsr0 = ((lfsr0 >> 24) ^ (lfsr0 >> 21) ^ (lfsr0 >> 20) ^ (lfsr0 >> 12)) & 1;
+ lfsr0 = (lfsr0 << 1) | o_lfsr0;
+
+ o_lfsr1 = ((lfsr1 >> 16) ^ (lfsr1 >> 2)) & 1;
+ lfsr1 = (lfsr1 << 1) | o_lfsr1;
+
+#define BIT0(x) ((x) & 1)
+#define BIT1(x) (((x) >> 1) & 1)
+
+ combined = !o_lfsr1 + b1_combined + !o_lfsr0;
+ b1_combined = BIT1(combined);
+ val |= BIT0(combined) << bit;
+ }
+
+ *--output = val;
+ } while (--len > 0);
+}
+
+unsigned char CSSsecret[];
+unsigned char CSSvarients[];
+unsigned char CSStable0[];
+unsigned char CSStable1[];
+unsigned char CSStable2[];
+unsigned char CSStable3[];
+
+static void CSSengine(int varient, unsigned char const *input,unsigned char *output)
+{
+ unsigned char cse, term, index;
+ unsigned char temp1[5];
+ unsigned char temp2[5];
+ unsigned char bits[30];
+
+ int i;
+
+ /* Feed the CSSsecret into the input values such that
+ * we alter the seed to the LFSR's used above, then
+ * generate the bits to play with.
+ */
+ for (i = 5; --i >= 0; ) {
+ temp1[i] = input[5 + i] ^ CSSsecret[i] ^ CSStable2[i];
+ }
+
+ CSSgenbits(&bits[29], sizeof bits, temp1);
+
+ /* This term is used throughout the following to
+ * select one of 32 different variations on the
+ * algorithm.
+ */
+ cse = CSSvarients[varient] ^ CSStable2[varient];
+
+ /* Now the actual blocks doing the encryption. Each
+ * of these works on 40 bits at a time and are quite
+ * similar.
+ */
+ for (i = 5, term = 0; --i >= 0; term = input[i]) {
+ index = bits[25 + i] ^ input[i];
+ index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
+
+ temp1[i] = CSStable2[index] ^ CSStable3[index] ^ term;
+ }
+ temp1[4] ^= temp1[0];
+
+ for (i = 5, term = 0; --i >= 0; term = temp1[i]) {
+ index = bits[20 + i] ^ temp1[i];
+ index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
+
+ temp2[i] = CSStable2[index] ^ CSStable3[index] ^ term;
+ }
+ temp2[4] ^= temp2[0];
+
+ for (i = 5, term = 0; --i >= 0; term = temp2[i]) {
+ index = bits[15 + i] ^ temp2[i];
+ index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
+ index = CSStable2[index] ^ CSStable3[index] ^ term;
+
+ temp1[i] = CSStable0[index] ^ CSStable2[index];
+ }
+ temp1[4] ^= temp1[0];
+
+ for (i = 5, term = 0; --i >= 0; term = temp1[i]) {
+ index = bits[10 + i] ^ temp1[i];
+ index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
+
+ index = CSStable2[index] ^ CSStable3[index] ^ term;
+
+ temp2[i] = CSStable0[index] ^ CSStable2[index];
+ }
+ temp2[4] ^= temp2[0];
+
+ for (i = 5, term = 0; --i >= 0; term = temp2[i]) {
+ index = bits[5 + i] ^ temp2[i];
+ index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
+
+ temp1[i] = CSStable2[index] ^ CSStable3[index] ^ term;
+ }
+ temp1[4] ^= temp1[0];
+
+ for (i = 5, term = 0; --i >= 0; term = temp1[i]) {
+ index = bits[i] ^ temp1[i];
+ index = CSStable1[index] ^ ~CSStable2[index] ^ cse;
+
+ output[i] = CSStable2[index] ^ CSStable3[index] ^ term;
+ }
+}
+
+static unsigned char CSSvarients[] = {
+ 0xB7, 0x74, 0x85, 0xD0, 0xCC, 0xDB, 0xCA, 0x73,
+ 0x03, 0xFE, 0x31, 0x03, 0x52, 0xE0, 0xB7, 0x42,
+ 0x63, 0x16, 0xF2, 0x2A, 0x79, 0x52, 0xFF, 0x1B,
+ 0x7A, 0x11, 0xCA, 0x1A, 0x9B, 0x40, 0xAD, 0x01
+};
+
+static unsigned char CSSsecret[] = {0x55, 0xD6, 0xC4, 0xC5, 0x28};
+
+static unsigned char CSStable0[] = {
+ 0xB7, 0xF4, 0x82, 0x57, 0xDA, 0x4D, 0xDB, 0xE2,
+ 0x2F, 0x52, 0x1A, 0xA8, 0x68, 0x5A, 0x8A, 0xFF,
+ 0xFB, 0x0E, 0x6D, 0x35, 0xF7, 0x5C, 0x76, 0x12,
+ 0xCE, 0x25, 0x79, 0x29, 0x39, 0x62, 0x08, 0x24,
+ 0xA5, 0x85, 0x7B, 0x56, 0x01, 0x23, 0x68, 0xCF,
+ 0x0A, 0xE2, 0x5A, 0xED, 0x3D, 0x59, 0xB0, 0xA9,
+ 0xB0, 0x2C, 0xF2, 0xB8, 0xEF, 0x32, 0xA9, 0x40,
+ 0x80, 0x71, 0xAF, 0x1E, 0xDE, 0x8F, 0x58, 0x88,
+ 0xB8, 0x3A, 0xD0, 0xFC, 0xC4, 0x1E, 0xB5, 0xA0,
+ 0xBB, 0x3B, 0x0F, 0x01, 0x7E, 0x1F, 0x9F, 0xD9,
+ 0xAA, 0xB8, 0x3D, 0x9D, 0x74, 0x1E, 0x25, 0xDB,
+ 0x37, 0x56, 0x8F, 0x16, 0xBA, 0x49, 0x2B, 0xAC,
+ 0xD0, 0xBD, 0x95, 0x20, 0xBE, 0x7A, 0x28, 0xD0,
+ 0x51, 0x64, 0x63, 0x1C, 0x7F, 0x66, 0x10, 0xBB,
+ 0xC4, 0x56, 0x1A, 0x04, 0x6E, 0x0A, 0xEC, 0x9C,
+ 0xD6, 0xE8, 0x9A, 0x7A, 0xCF, 0x8C, 0xDB, 0xB1,
+ 0xEF, 0x71, 0xDE, 0x31, 0xFF, 0x54, 0x3E, 0x5E,
+ 0x07, 0x69, 0x96, 0xB0, 0xCF, 0xDD, 0x9E, 0x47,
+ 0xC7, 0x96, 0x8F, 0xE4, 0x2B, 0x59, 0xC6, 0xEE,
+ 0xB9, 0x86, 0x9A, 0x64, 0x84, 0x72, 0xE2, 0x5B,
+ 0xA2, 0x96, 0x58, 0x99, 0x50, 0x03, 0xF5, 0x38,
+ 0x4D, 0x02, 0x7D, 0xE7, 0x7D, 0x75, 0xA7, 0xB8,
+ 0x67, 0x87, 0x84, 0x3F, 0x1D, 0x11, 0xE5, 0xFC,
+ 0x1E, 0xD3, 0x83, 0x16, 0xA5, 0x29, 0xF6, 0xC7,
+ 0x15, 0x61, 0x29, 0x1A, 0x43, 0x4F, 0x9B, 0xAF,
+ 0xC5, 0x87, 0x34, 0x6C, 0x0F, 0x3B, 0xA8, 0x1D,
+ 0x45, 0x58, 0x25, 0xDC, 0xA8, 0xA3, 0x3B, 0xD1,
+ 0x79, 0x1B, 0x48, 0xF2, 0xE9, 0x93, 0x1F, 0xFC,
+ 0xDB, 0x2A, 0x90, 0xA9, 0x8A, 0x3D, 0x39, 0x18,
+ 0xA3, 0x8E, 0x58, 0x6C, 0xE0, 0x12, 0xBB, 0x25,
+ 0xCD, 0x71, 0x22, 0xA2, 0x64, 0xC6, 0xE7, 0xFB,
+ 0xAD, 0x94, 0x77, 0x04, 0x9A, 0x39, 0xCF, 0x7C
+};
+
+static unsigned char CSStable1[] = {
+ 0x8C, 0x47, 0xB0, 0xE1, 0xEB, 0xFC, 0xEB, 0x56,
+ 0x10, 0xE5, 0x2C, 0x1A, 0x5D, 0xEF, 0xBE, 0x4F,
+ 0x08, 0x75, 0x97, 0x4B, 0x0E, 0x25, 0x8E, 0x6E,
+ 0x39, 0x5A, 0x87, 0x53, 0xC4, 0x1F, 0xF4, 0x5C,
+ 0x4E, 0xE6, 0x99, 0x30, 0xE0, 0x42, 0x88, 0xAB,
+ 0xE5, 0x85, 0xBC, 0x8F, 0xD8, 0x3C, 0x54, 0xC9,
+ 0x53, 0x47, 0x18, 0xD6, 0x06, 0x5B, 0x41, 0x2C,
+ 0x67, 0x1E, 0x41, 0x74, 0x33, 0xE2, 0xB4, 0xE0,
+ 0x23, 0x29, 0x42, 0xEA, 0x55, 0x0F, 0x25, 0xB4,
+ 0x24, 0x2C, 0x99, 0x13, 0xEB, 0x0A, 0x0B, 0xC9,
+ 0xF9, 0x63, 0x67, 0x43, 0x2D, 0xC7, 0x7D, 0x07,
+ 0x60, 0x89, 0xD1, 0xCC, 0xE7, 0x94, 0x77, 0x74,
+ 0x9B, 0x7E, 0xD7, 0xE6, 0xFF, 0xBB, 0x68, 0x14,
+ 0x1E, 0xA3, 0x25, 0xDE, 0x3A, 0xA3, 0x54, 0x7B,
+ 0x87, 0x9D, 0x50, 0xCA, 0x27, 0xC3, 0xA4, 0x50,
+ 0x91, 0x27, 0xD4, 0xB0, 0x82, 0x41, 0x97, 0x79,
+ 0x94, 0x82, 0xAC, 0xC7, 0x8E, 0xA5, 0x4E, 0xAA,
+ 0x78, 0x9E, 0xE0, 0x42, 0xBA, 0x28, 0xEA, 0xB7,
+ 0x74, 0xAD, 0x35, 0xDA, 0x92, 0x60, 0x7E, 0xD2,
+ 0x0E, 0xB9, 0x24, 0x5E, 0x39, 0x4F, 0x5E, 0x63,
+ 0x09, 0xB5, 0xFA, 0xBF, 0xF1, 0x22, 0x55, 0x1C,
+ 0xE2, 0x25, 0xDB, 0xC5, 0xD8, 0x50, 0x03, 0x98,
+ 0xC4, 0xAC, 0x2E, 0x11, 0xB4, 0x38, 0x4D, 0xD0,
+ 0xB9, 0xFC, 0x2D, 0x3C, 0x08, 0x04, 0x5A, 0xEF,
+ 0xCE, 0x32, 0xFB, 0x4C, 0x92, 0x1E, 0x4B, 0xFB,
+ 0x1A, 0xD0, 0xE2, 0x3E, 0xDA, 0x6E, 0x7C, 0x4D,
+ 0x56, 0xC3, 0x3F, 0x42, 0xB1, 0x3A, 0x23, 0x4D,
+ 0x6E, 0x84, 0x56, 0x68, 0xF4, 0x0E, 0x03, 0x64,
+ 0xD0, 0xA9, 0x92, 0x2F, 0x8B, 0xBC, 0x39, 0x9C,
+ 0xAC, 0x09, 0x5E, 0xEE, 0xE5, 0x97, 0xBF, 0xA5,
+ 0xCE, 0xFA, 0x28, 0x2C, 0x6D, 0x4F, 0xEF, 0x77,
+ 0xAA, 0x1B, 0x79, 0x8E, 0x97, 0xB4, 0xC3, 0xF4
+};
+
+static unsigned char CSStable2[] = {
+ 0xB7, 0x75, 0x81, 0xD5, 0xDC, 0xCA, 0xDE, 0x66,
+ 0x23, 0xDF, 0x15, 0x26, 0x62, 0xD1, 0x83, 0x77,
+ 0xE3, 0x97, 0x76, 0xAF, 0xE9, 0xC3, 0x6B, 0x8E,
+ 0xDA, 0xB0, 0x6E, 0xBF, 0x2B, 0xF1, 0x19, 0xB4,
+ 0x95, 0x34, 0x48, 0xE4, 0x37, 0x94, 0x5D, 0x7B,
+ 0x36, 0x5F, 0x65, 0x53, 0x07, 0xE2, 0x89, 0x11,
+ 0x98, 0x85, 0xD9, 0x12, 0xC1, 0x9D, 0x84, 0xEC,
+ 0xA4, 0xD4, 0x88, 0xB8, 0xFC, 0x2C, 0x79, 0x28,
+ 0xD8, 0xDB, 0xB3, 0x1E, 0xA2, 0xF9, 0xD0, 0x44,
+ 0xD7, 0xD6, 0x60, 0xEF, 0x14, 0xF4, 0xF6, 0x31,
+ 0xD2, 0x41, 0x46, 0x67, 0x0A, 0xE1, 0x58, 0x27,
+ 0x43, 0xA3, 0xF8, 0xE0, 0xC8, 0xBA, 0x5A, 0x5C,
+ 0x80, 0x6C, 0xC6, 0xF2, 0xE8, 0xAD, 0x7D, 0x04,
+ 0x0D, 0xB9, 0x3C, 0xC2, 0x25, 0xBD, 0x49, 0x63,
+ 0x8C, 0x9F, 0x51, 0xCE, 0x20, 0xC5, 0xA1, 0x50,
+ 0x92, 0x2D, 0xDD, 0xBC, 0x8D, 0x4F, 0x9A, 0x71,
+ 0x2F, 0x30, 0x1D, 0x73, 0x39, 0x13, 0xFB, 0x1A,
+ 0xCB, 0x24, 0x59, 0xFE, 0x05, 0x96, 0x57, 0x0F,
+ 0x1F, 0xCF, 0x54, 0xBE, 0xF5, 0x06, 0x1B, 0xB2,
+ 0x6D, 0xD3, 0x4D, 0x32, 0x56, 0x21, 0x33, 0x0B,
+ 0x52, 0xE7, 0xAB, 0xEB, 0xA6, 0x74, 0x00, 0x4C,
+ 0xB1, 0x7F, 0x82, 0x99, 0x87, 0x0E, 0x5E, 0xC0,
+ 0x8F, 0xEE, 0x6F, 0x55, 0xF3, 0x7E, 0x08, 0x90,
+ 0xFA, 0xB6, 0x64, 0x70, 0x47, 0x4A, 0x17, 0xA7,
+ 0xB5, 0x40, 0x8A, 0x38, 0xE5, 0x68, 0x3E, 0x8B,
+ 0x69, 0xAA, 0x9B, 0x42, 0xA5, 0x10, 0x01, 0x35,
+ 0xFD, 0x61, 0x9E, 0xE6, 0x16, 0x9C, 0x86, 0xED,
+ 0xCD, 0x2E, 0xFF, 0xC4, 0x5B, 0xA0, 0xAE, 0xCC,
+ 0x4B, 0x3B, 0x03, 0xBB, 0x1C, 0x2A, 0xAC, 0x0C,
+ 0x3F, 0x93, 0xC7, 0x72, 0x7A, 0x09, 0x22, 0x3D,
+ 0x45, 0x78, 0xA9, 0xA8, 0xEA, 0xC9, 0x6A, 0xF7,
+ 0x29, 0x91, 0xF0, 0x02, 0x18, 0x3A, 0x4E, 0x7C
+};
+
+static unsigned char CSStable3[] = {
+ 0x73, 0x51, 0x95, 0xE1, 0x12, 0xE4, 0xC0, 0x58,
+ 0xEE, 0xF2, 0x08, 0x1B, 0xA9, 0xFA, 0x98, 0x4C,
+ 0xA7, 0x33, 0xE2, 0x1B, 0xA7, 0x6D, 0xF5, 0x30,
+ 0x97, 0x1D, 0xF3, 0x02, 0x60, 0x5A, 0x82, 0x0F,
+ 0x91, 0xD0, 0x9C, 0x10, 0x39, 0x7A, 0x83, 0x85,
+ 0x3B, 0xB2, 0xB8, 0xAE, 0x0C, 0x09, 0x52, 0xEA,
+ 0x1C, 0xE1, 0x8D, 0x66, 0x4F, 0xF3, 0xDA, 0x92,
+ 0x29, 0xB9, 0xD5, 0xC5, 0x77, 0x47, 0x22, 0x53,
+ 0x14, 0xF7, 0xAF, 0x22, 0x64, 0xDF, 0xC6, 0x72,
+ 0x12, 0xF3, 0x75, 0xDA, 0xD7, 0xD7, 0xE5, 0x02,
+ 0x9E, 0xED, 0xDA, 0xDB, 0x4C, 0x47, 0xCE, 0x91,
+ 0x06, 0x06, 0x6D, 0x55, 0x8B, 0x19, 0xC9, 0xEF,
+ 0x8C, 0x80, 0x1A, 0x0E, 0xEE, 0x4B, 0xAB, 0xF2,
+ 0x08, 0x5C, 0xE9, 0x37, 0x26, 0x5E, 0x9A, 0x90,
+ 0x00, 0xF3, 0x0D, 0xB2, 0xA6, 0xA3, 0xF7, 0x26,
+ 0x17, 0x48, 0x88, 0xC9, 0x0E, 0x2C, 0xC9, 0x02,
+ 0xE7, 0x18, 0x05, 0x4B, 0xF3, 0x39, 0xE1, 0x20,
+ 0x02, 0x0D, 0x40, 0xC7, 0xCA, 0xB9, 0x48, 0x30,
+ 0x57, 0x67, 0xCC, 0x06, 0xBF, 0xAC, 0x81, 0x08,
+ 0x24, 0x7A, 0xD4, 0x8B, 0x19, 0x8E, 0xAC, 0xB4,
+ 0x5A, 0x0F, 0x73, 0x13, 0xAC, 0x9E, 0xDA, 0xB6,
+ 0xB8, 0x96, 0x5B, 0x60, 0x88, 0xE1, 0x81, 0x3F,
+ 0x07, 0x86, 0x37, 0x2D, 0x79, 0x14, 0x52, 0xEA,
+ 0x73, 0xDF, 0x3D, 0x09, 0xC8, 0x25, 0x48, 0xD8,
+ 0x75, 0x60, 0x9A, 0x08, 0x27, 0x4A, 0x2C, 0xB9,
+ 0xA8, 0x8B, 0x8A, 0x73, 0x62, 0x37, 0x16, 0x02,
+ 0xBD, 0xC1, 0x0E, 0x56, 0x54, 0x3E, 0x14, 0x5F,
+ 0x8C, 0x8F, 0x6E, 0x75, 0x1C, 0x07, 0x39, 0x7B,
+ 0x4B, 0xDB, 0xD3, 0x4B, 0x1E, 0xC8, 0x7E, 0xFE,
+ 0x3E, 0x72, 0x16, 0x83, 0x7D, 0xEE, 0xF5, 0xCA,
+ 0xC5, 0x18, 0xF9, 0xD8, 0x68, 0xAB, 0x38, 0x85,
+ 0xA8, 0xF0, 0xA1, 0x73, 0x9F, 0x5D, 0x19, 0x0B,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x33, 0x72, 0x39, 0x25, 0x67, 0x26, 0x6D, 0x71,
+ 0x36, 0x77, 0x3C, 0x20, 0x62, 0x23, 0x68, 0x74,
+ 0xC3, 0x82, 0xC9, 0x15, 0x57, 0x16, 0x5D, 0x81
+};
diff --git a/common/DSUtilLite/DeCSS/CSSauth.h b/common/DSUtilLite/DeCSS/CSSauth.h
new file mode 100644
index 00000000..ee2950cd
--- /dev/null
+++ b/common/DSUtilLite/DeCSS/CSSauth.h
@@ -0,0 +1,5 @@
+#pragma once
+
+extern void CSSkey1(int varient, byte const *challenge, byte *key);
+extern void CSSkey2(int varient, byte const *challenge, byte *key);
+extern void CSSbuskey(int varient, byte const *challenge, byte *key);
diff --git a/common/DSUtilLite/DeCSS/CSSscramble.cpp b/common/DSUtilLite/DeCSS/CSSscramble.cpp
new file mode 100644
index 00000000..dde24d58
--- /dev/null
+++ b/common/DSUtilLite/DeCSS/CSSscramble.cpp
@@ -0,0 +1,240 @@
+#include "stdafx.h"
+
+#ifndef countof
+#define countof(array) (sizeof(array)/sizeof(array[0]))
+#endif
+
+unsigned int CSStab0[11]= {5,0,1,2,3,4,0,1,2,3,4};
+
+unsigned char CSStab1[256]= {
+ 0x33,0x73,0x3b,0x26,0x63,0x23,0x6b,0x76,0x3e,0x7e,0x36,0x2b,0x6e,0x2e,0x66,0x7b,
+ 0xd3,0x93,0xdb,0x06,0x43,0x03,0x4b,0x96,0xde,0x9e,0xd6,0x0b,0x4e,0x0e,0x46,0x9b,
+ 0x57,0x17,0x5f,0x82,0xc7,0x87,0xcf,0x12,0x5a,0x1a,0x52,0x8f,0xca,0x8a,0xc2,0x1f,
+ 0xd9,0x99,0xd1,0x00,0x49,0x09,0x41,0x90,0xd8,0x98,0xd0,0x01,0x48,0x08,0x40,0x91,
+ 0x3d,0x7d,0x35,0x24,0x6d,0x2d,0x65,0x74,0x3c,0x7c,0x34,0x25,0x6c,0x2c,0x64,0x75,
+ 0xdd,0x9d,0xd5,0x04,0x4d,0x0d,0x45,0x94,0xdc,0x9c,0xd4,0x05,0x4c,0x0c,0x44,0x95,
+ 0x59,0x19,0x51,0x80,0xc9,0x89,0xc1,0x10,0x58,0x18,0x50,0x81,0xc8,0x88,0xc0,0x11,
+ 0xd7,0x97,0xdf,0x02,0x47,0x07,0x4f,0x92,0xda,0x9a,0xd2,0x0f,0x4a,0x0a,0x42,0x9f,
+ 0x53,0x13,0x5b,0x86,0xc3,0x83,0xcb,0x16,0x5e,0x1e,0x56,0x8b,0xce,0x8e,0xc6,0x1b,
+ 0xb3,0xf3,0xbb,0xa6,0xe3,0xa3,0xeb,0xf6,0xbe,0xfe,0xb6,0xab,0xee,0xae,0xe6,0xfb,
+ 0x37,0x77,0x3f,0x22,0x67,0x27,0x6f,0x72,0x3a,0x7a,0x32,0x2f,0x6a,0x2a,0x62,0x7f,
+ 0xb9,0xf9,0xb1,0xa0,0xe9,0xa9,0xe1,0xf0,0xb8,0xf8,0xb0,0xa1,0xe8,0xa8,0xe0,0xf1,
+ 0x5d,0x1d,0x55,0x84,0xcd,0x8d,0xc5,0x14,0x5c,0x1c,0x54,0x85,0xcc,0x8c,0xc4,0x15,
+ 0xbd,0xfd,0xb5,0xa4,0xed,0xad,0xe5,0xf4,0xbc,0xfc,0xb4,0xa5,0xec,0xac,0xe4,0xf5,
+ 0x39,0x79,0x31,0x20,0x69,0x29,0x61,0x70,0x38,0x78,0x30,0x21,0x68,0x28,0x60,0x71,
+ 0xb7,0xf7,0xbf,0xa2,0xe7,0xa7,0xef,0xf2,0xba,0xfa,0xb2,0xaf,0xea,0xaa,0xe2,0xff
+};
+
+unsigned char CSStab2[256]= {
+ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x08,0x0b,0x0a,0x0d,0x0c,0x0f,0x0e,
+ 0x12,0x13,0x10,0x11,0x16,0x17,0x14,0x15,0x1b,0x1a,0x19,0x18,0x1f,0x1e,0x1d,0x1c,
+ 0x24,0x25,0x26,0x27,0x20,0x21,0x22,0x23,0x2d,0x2c,0x2f,0x2e,0x29,0x28,0x2b,0x2a,
+ 0x36,0x37,0x34,0x35,0x32,0x33,0x30,0x31,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,
+ 0x49,0x48,0x4b,0x4a,0x4d,0x4c,0x4f,0x4e,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
+ 0x5b,0x5a,0x59,0x58,0x5f,0x5e,0x5d,0x5c,0x52,0x53,0x50,0x51,0x56,0x57,0x54,0x55,
+ 0x6d,0x6c,0x6f,0x6e,0x69,0x68,0x6b,0x6a,0x64,0x65,0x66,0x67,0x60,0x61,0x62,0x63,
+ 0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x76,0x77,0x74,0x75,0x72,0x73,0x70,0x71,
+ 0x92,0x93,0x90,0x91,0x96,0x97,0x94,0x95,0x9b,0x9a,0x99,0x98,0x9f,0x9e,0x9d,0x9c,
+ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x89,0x88,0x8b,0x8a,0x8d,0x8c,0x8f,0x8e,
+ 0xb6,0xb7,0xb4,0xb5,0xb2,0xb3,0xb0,0xb1,0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,
+ 0xa4,0xa5,0xa6,0xa7,0xa0,0xa1,0xa2,0xa3,0xad,0xac,0xaf,0xae,0xa9,0xa8,0xab,0xaa,
+ 0xdb,0xda,0xd9,0xd8,0xdf,0xde,0xdd,0xdc,0xd2,0xd3,0xd0,0xd1,0xd6,0xd7,0xd4,0xd5,
+ 0xc9,0xc8,0xcb,0xca,0xcd,0xcc,0xcf,0xce,0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
+ 0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf6,0xf7,0xf4,0xf5,0xf2,0xf3,0xf0,0xf1,
+ 0xed,0xec,0xef,0xee,0xe9,0xe8,0xeb,0xea,0xe4,0xe5,0xe6,0xe7,0xe0,0xe1,0xe2,0xe3
+};
+
+unsigned char CSStab3[512]= {
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,
+ 0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff
+};
+
+unsigned char CSStab4[256]= {
+ 0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0,
+ 0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8,
+ 0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4,0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4,
+ 0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc,
+ 0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2,0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2,
+ 0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea,0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa,
+ 0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6,0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6,
+ 0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee,0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe,
+ 0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1,0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1,
+ 0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9,0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9,
+ 0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5,0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5,
+ 0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed,0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd,
+ 0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3,0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3,
+ 0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb,0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb,
+ 0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7,0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7,
+ 0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff
+};
+
+unsigned char CSStab5[256]= {
+ 0xff,0x7f,0xbf,0x3f,0xdf,0x5f,0x9f,0x1f,0xef,0x6f,0xaf,0x2f,0xcf,0x4f,0x8f,0x0f,
+ 0xf7,0x77,0xb7,0x37,0xd7,0x57,0x97,0x17,0xe7,0x67,0xa7,0x27,0xc7,0x47,0x87,0x07,
+ 0xfb,0x7b,0xbb,0x3b,0xdb,0x5b,0x9b,0x1b,0xeb,0x6b,0xab,0x2b,0xcb,0x4b,0x8b,0x0b,
+ 0xf3,0x73,0xb3,0x33,0xd3,0x53,0x93,0x13,0xe3,0x63,0xa3,0x23,0xc3,0x43,0x83,0x03,
+ 0xfd,0x7d,0xbd,0x3d,0xdd,0x5d,0x9d,0x1d,0xed,0x6d,0xad,0x2d,0xcd,0x4d,0x8d,0x0d,
+ 0xf5,0x75,0xb5,0x35,0xd5,0x55,0x95,0x15,0xe5,0x65,0xa5,0x25,0xc5,0x45,0x85,0x05,
+ 0xf9,0x79,0xb9,0x39,0xd9,0x59,0x99,0x19,0xe9,0x69,0xa9,0x29,0xc9,0x49,0x89,0x09,
+ 0xf1,0x71,0xb1,0x31,0xd1,0x51,0x91,0x11,0xe1,0x61,0xa1,0x21,0xc1,0x41,0x81,0x01,
+ 0xfe,0x7e,0xbe,0x3e,0xde,0x5e,0x9e,0x1e,0xee,0x6e,0xae,0x2e,0xce,0x4e,0x8e,0x0e,
+ 0xf6,0x76,0xb6,0x36,0xd6,0x56,0x96,0x16,0xe6,0x66,0xa6,0x26,0xc6,0x46,0x86,0x06,
+ 0xfa,0x7a,0xba,0x3a,0xda,0x5a,0x9a,0x1a,0xea,0x6a,0xaa,0x2a,0xca,0x4a,0x8a,0x0a,
+ 0xf2,0x72,0xb2,0x32,0xd2,0x52,0x92,0x12,0xe2,0x62,0xa2,0x22,0xc2,0x42,0x82,0x02,
+ 0xfc,0x7c,0xbc,0x3c,0xdc,0x5c,0x9c,0x1c,0xec,0x6c,0xac,0x2c,0xcc,0x4c,0x8c,0x0c,
+ 0xf4,0x74,0xb4,0x34,0xd4,0x54,0x94,0x14,0xe4,0x64,0xa4,0x24,0xc4,0x44,0x84,0x04,
+ 0xf8,0x78,0xb8,0x38,0xd8,0x58,0x98,0x18,0xe8,0x68,0xa8,0x28,0xc8,0x48,0x88,0x08,
+ 0xf0,0x70,0xb0,0x30,0xd0,0x50,0x90,0x10,0xe0,0x60,0xa0,0x20,0xc0,0x40,0x80,0x00
+};
+
+void CSSdescramble(unsigned char *sec,unsigned char *tkey)
+{
+ unsigned int t1,t2,t3,t4,t5,t6;
+ unsigned char *end=sec+0x800;
+
+ t1=tkey[0]^sec[0x54]|0x100;
+ t2=tkey[1]^sec[0x55];
+ t3=(*((unsigned int *)(tkey+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 CSSdisckey(unsigned char *dkey,unsigned char *pkey)
+{
+ unsigned int t1,t2,t3,t4,t5,t6;
+ unsigned char k[5];
+ int i;
+
+ t1=pkey[0]|0x100;
+ t2=pkey[1];
+ t3=*((unsigned int *)(pkey+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--) {
+ dkey[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[dkey[CSStab0[i+1]]]^dkey[CSStab0[i]];
+ }
+}
+
+void CSStitlekey(unsigned char *tkey,unsigned char *dkey)
+{
+ unsigned int t1,t2,t3,t4,t5,t6;
+ unsigned char k[5];
+ int i;
+
+ t1=dkey[0]|0x100;
+ t2=dkey[1];
+ t3=*((unsigned int *)(dkey+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--) {
+ tkey[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[tkey[CSStab0[i+1]]]^tkey[CSStab0[i]];
+ }
+}
+
+unsigned char g_PlayerKeys[][6] = {
+ // from mplayer:
+ {0x01, 0xaf, 0xe3, 0x12, 0x80},
+ {0x12, 0x11, 0xca, 0x04, 0x3b},
+ {0x14, 0x0c, 0x9e, 0xd0, 0x09},
+ {0x14, 0x71, 0x35, 0xba, 0xe2},
+ {0x1a, 0xa4, 0x33, 0x21, 0xa6},
+ {0x26, 0xec, 0xc4, 0xa7, 0x4e},
+ {0x2c, 0xb2, 0xc1, 0x09, 0xee},
+ {0x2f, 0x25, 0x9e, 0x96, 0xdd},
+ {0x33, 0x2f, 0x49, 0x6c, 0xe0},
+ {0x35, 0x5b, 0xc1, 0x31, 0x0f},
+ {0x36, 0x67, 0xb2, 0xe3, 0x85},
+ {0x39, 0x3d, 0xf1, 0xf1, 0xbd},
+ {0x3b, 0x31, 0x34, 0x0d, 0x91},
+ {0x45, 0xed, 0x28, 0xeb, 0xd3},
+ {0x48, 0xb7, 0x6c, 0xce, 0x69},
+ {0x4b, 0x65, 0x0d, 0xc1, 0xee},
+ {0x4c, 0xbb, 0xf5, 0x5b, 0x23},
+ {0x51, 0x67, 0x67, 0xc5, 0xe0},
+ {0x53, 0x94, 0xe1, 0x75, 0xbf},
+ {0x57, 0x2c, 0x8b, 0x31, 0xae},
+ {0x63, 0xdb, 0x4c, 0x5b, 0x4a},
+ {0x7b, 0x1e, 0x5e, 0x2b, 0x57},
+ {0x85, 0xf3, 0x85, 0xa0, 0xe0},
+ {0xab, 0x1e, 0xe7, 0x7b, 0x72},
+ {0xab, 0x36, 0xe3, 0xeb, 0x76},
+ {0xb1, 0xb8, 0xf9, 0x38, 0x03},
+ {0xb8, 0x5d, 0xd8, 0x53, 0xbd},
+ {0xbf, 0x92, 0xc3, 0xb0, 0xe2},
+ {0xcf, 0x1a, 0xb2, 0xf8, 0x0a},
+ {0xec, 0xa0, 0xcf, 0xb3, 0xff},
+ {0xfc, 0x95, 0xa9, 0x87, 0x35}
+ // TODO: find more player keys
+};
+
+int g_nPlayerKeys = countof(g_PlayerKeys);
diff --git a/common/DSUtilLite/DeCSS/CSSscramble.h b/common/DSUtilLite/DeCSS/CSSscramble.h
new file mode 100644
index 00000000..d52f556e
--- /dev/null
+++ b/common/DSUtilLite/DeCSS/CSSscramble.h
@@ -0,0 +1,8 @@
+#pragma once
+
+extern void CSSdisckey(unsigned char *dkey,unsigned char *pkey);
+extern void CSStitlekey(unsigned char *tkey,unsigned char *dkey);
+extern void CSSdescramble(unsigned char *sector,unsigned char *tkey);
+
+extern unsigned char g_PlayerKeys[][6];
+extern int g_nPlayerKeys; \ No newline at end of file
diff --git a/common/DSUtilLite/DeCSS/DeCSSInputPin.cpp b/common/DSUtilLite/DeCSS/DeCSSInputPin.cpp
new file mode 100644
index 00000000..767bd08c
--- /dev/null
+++ b/common/DSUtilLite/DeCSS/DeCSSInputPin.cpp
@@ -0,0 +1,359 @@
+/*
+ * Copyright (C) 2003-2006 Gabest
+ * http://www.gabest.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include "stdafx.h"
+
+#include <dvdmedia.h>
+#include <ks.h>
+#include <ksmedia.h>
+
+#include "DeCSSInputPin.h"
+#include "CSSauth.h"
+#include "CSSscramble.h"
+
+#include "../DShowUtil.h"
+
+//
+// CDeCSSInputPin
+//
+
+CDeCSSInputPin::CDeCSSInputPin(TCHAR* pObjectName, CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName)
+ : CTransformInputPin(pObjectName, pFilter, phr, pName)
+{
+ m_varient = -1;
+ memset(m_Challenge, 0, sizeof(m_Challenge));
+ memset(m_KeyCheck, 0, sizeof(m_KeyCheck));
+ memset(m_DiscKey, 0, sizeof(m_DiscKey));
+ memset(m_TitleKey, 0, sizeof(m_TitleKey));
+}
+
+STDMETHODIMP CDeCSSInputPin::NonDelegatingQueryInterface(REFIID riid, void** ppv)
+{
+ CheckPointer(ppv, E_POINTER);
+
+ return
+ QI(IKsPropertySet)
+ __super::NonDelegatingQueryInterface(riid, ppv);
+}
+
+// IMemInputPin
+
+STDMETHODIMP CDeCSSInputPin::Receive(IMediaSample* pSample)
+{
+ long len = pSample->GetActualDataLength();
+
+ BYTE* p = NULL;
+ if(SUCCEEDED(pSample->GetPointer(&p)) && len > 0) {
+ if(m_mt.majortype == MEDIATYPE_DVD_ENCRYPTED_PACK && len == 2048 && (p[0x14]&0x30)) {
+ CSSdescramble(p, m_TitleKey);
+ p[0x14] &= ~0x30;
+
+ IMediaSample2 *pMS2 = NULL;
+ if(SUCCEEDED(pSample->QueryInterface(&pMS2)) && pMS2) {
+ AM_SAMPLE2_PROPERTIES props;
+ memset(&props, 0, sizeof(props));
+ if(SUCCEEDED(pMS2->GetProperties(sizeof(props), (BYTE*)&props))
+ && (props.dwTypeSpecificFlags & AM_UseNewCSSKey)) {
+ props.dwTypeSpecificFlags &= ~AM_UseNewCSSKey;
+ pMS2->SetProperties(sizeof(props), (BYTE*)&props);
+ }
+ pMS2->Release();
+ }
+ }
+ }
+
+ HRESULT hr = Transform(pSample);
+
+ return hr == S_OK ? __super::Receive(pSample) :
+ hr == S_FALSE ? S_OK : hr;
+}
+
+void CDeCSSInputPin::StripPacket(BYTE*& p, long& len)
+{
+ GUID majortype = m_mt.majortype;
+
+ if(majortype == MEDIATYPE_MPEG2_PACK || majortype == MEDIATYPE_DVD_ENCRYPTED_PACK)
+ if(len > 0 && *(DWORD*)p == 0xba010000) { // MEDIATYPE_*_PACK
+ len -= 14;
+ p += 14;
+ if(int stuffing = (p[-1]&7)) {
+ len -= stuffing;
+ p += stuffing;
+ }
+ majortype = MEDIATYPE_MPEG2_PES;
+ }
+
+ if(majortype == MEDIATYPE_MPEG2_PES)
+ if(len > 0 && *(DWORD*)p == 0xbb010000) {
+ len -= 4;
+ p += 4;
+ int hdrlen = ((p[0]<<8)|p[1]) + 2;
+ len -= hdrlen;
+ p += hdrlen;
+ }
+
+ if(majortype == MEDIATYPE_MPEG2_PES)
+ if(len > 0
+ && ((*(DWORD*)p&0xf0ffffff) == 0xe0010000
+ || (*(DWORD*)p&0xe0ffffff) == 0xc0010000
+ || (*(DWORD*)p&0xbdffffff) == 0xbd010000)) { // PES
+ bool ps1 = (*(DWORD*)p&0xbdffffff) == 0xbd010000;
+
+ len -= 4;
+ p += 4;
+ int expected = ((p[0]<<8)|p[1]);
+ len -= 2;
+ p += 2;
+ BYTE* p0 = p;
+
+ for(int i = 0; i < 16 && *p == 0xff; i++, len--, p++) {
+ ;
+ }
+
+ if((*p&0xc0) == 0x80) { // mpeg2
+ len -= 2;
+ p += 2;
+ len -= *p+1;
+ p += *p+1;
+ } else { // mpeg1
+ if((*p&0xc0) == 0x40) {
+ len -= 2;
+ p += 2;
+ }
+
+ if((*p&0x30) == 0x30 || (*p&0x30) == 0x20) {
+ bool pts = !!(*p&0x20), dts = !!(*p&0x10);
+ if(pts) {
+ len -= 5;
+ }
+ p += 5;
+ if(dts) {
+ ASSERT((*p&0xf0) == 0x10);
+ len -= 5;
+ p += 5;
+ }
+ } else {
+ len--;
+ p++;
+ }
+ }
+
+ if(ps1) {
+ len--;
+ p++;
+ if(m_mt.subtype == MEDIASUBTYPE_DVD_LPCM_AUDIO) {
+ len -= 6;
+ p += 6;
+ } else if(m_mt.subtype == MEDIASUBTYPE_DOLBY_AC3 || m_mt.subtype == FOURCCMap(0x2000)
+ || m_mt.subtype == MEDIASUBTYPE_DTS || m_mt.subtype == FOURCCMap(0x2001)) {
+ len -= 3;
+ p += 3;
+ }
+ }
+
+ if(expected > 0) {
+ expected -= (p - p0);
+ len = min(expected, len);
+ }
+ }
+
+ if(len < 0) {
+ ASSERT(0);
+ len = 0;
+ }
+}
+
+// IKsPropertySet
+
+STDMETHODIMP CDeCSSInputPin::Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength)
+{
+ if(PropSet != AM_KSPROPSETID_CopyProt) {
+ return E_NOTIMPL;
+ }
+
+ switch(Id) {
+ case AM_PROPERTY_COPY_MACROVISION:
+ break;
+ case AM_PROPERTY_DVDCOPY_CHLG_KEY: { // 3. auth: receive drive nonce word, also store and encrypt the buskey made up of the two nonce words
+ AM_DVDCOPY_CHLGKEY* pChlgKey = (AM_DVDCOPY_CHLGKEY*)pPropertyData;
+ for(int i = 0; i < 10; i++) {
+ m_Challenge[i] = pChlgKey->ChlgKey[9-i];
+ }
+
+ CSSkey2(m_varient, m_Challenge, &m_Key[5]);
+
+ CSSbuskey(m_varient, m_Key, m_KeyCheck);
+ }
+ break;
+ case AM_PROPERTY_DVDCOPY_DISC_KEY: { // 5. receive the disckey
+ AM_DVDCOPY_DISCKEY* pDiscKey = (AM_DVDCOPY_DISCKEY*)pPropertyData; // pDiscKey->DiscKey holds the disckey encrypted with itself and the 408 disckeys encrypted with the playerkeys
+
+ bool fSuccess = false;
+
+ for(int j = 0; j < g_nPlayerKeys; j++) {
+ for(int k = 1; k < 409; k++) {
+ BYTE DiscKey[6];
+ for(int i = 0; i < 5; i++) {
+ DiscKey[i] = pDiscKey->DiscKey[k*5+i] ^ m_KeyCheck[4-i];
+ }
+ DiscKey[5] = 0;
+
+ CSSdisckey(DiscKey, g_PlayerKeys[j]);
+
+ BYTE Hash[6];
+ for(int i = 0; i < 5; i++) {
+ Hash[i] = pDiscKey->DiscKey[i] ^ m_KeyCheck[4-i];
+ }
+ Hash[5] = 0;
+
+ CSSdisckey(Hash, DiscKey);
+
+ if(!memcmp(Hash, DiscKey, 6)) {
+ memcpy(m_DiscKey, DiscKey, 6);
+ j = g_nPlayerKeys;
+ fSuccess = true;
+ break;
+ }
+ }
+ }
+
+ if(!fSuccess) {
+ return E_FAIL;
+ }
+ }
+ break;
+ case AM_PROPERTY_DVDCOPY_DVD_KEY1: { // 2. auth: receive our drive-encrypted nonce word and decrypt it for verification
+ AM_DVDCOPY_BUSKEY* pKey1 = (AM_DVDCOPY_BUSKEY*)pPropertyData;
+ for(int i = 0; i < 5; i++) {
+ m_Key[i] = pKey1->BusKey[4-i];
+ }
+
+ m_varient = -1;
+
+ for(int i = 31; i >= 0; i--) {
+ CSSkey1(i, m_Challenge, m_KeyCheck);
+
+ if(memcmp(m_KeyCheck, &m_Key[0], 5) == 0) {
+ m_varient = i;
+ }
+ }
+ }
+ break;
+ case AM_PROPERTY_DVDCOPY_REGION:
+ break;
+ case AM_PROPERTY_DVDCOPY_SET_COPY_STATE:
+ break;
+ case AM_PROPERTY_DVDCOPY_TITLE_KEY: { // 6. receive the title key and decrypt it with the disc key
+ AM_DVDCOPY_TITLEKEY* pTitleKey = (AM_DVDCOPY_TITLEKEY*)pPropertyData;
+ for(int i = 0; i < 5; i++) {
+ m_TitleKey[i] = pTitleKey->TitleKey[i] ^ m_KeyCheck[4-i];
+ }
+ m_TitleKey[5] = 0;
+ CSStitlekey(m_TitleKey, m_DiscKey);
+ }
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+
+ return S_OK;
+}
+
+STDMETHODIMP CDeCSSInputPin::Get(REFGUID PropSet, ULONG Id, LPVOID pInstanceData, ULONG InstanceLength, LPVOID pPropertyData, ULONG DataLength, ULONG* pBytesReturned)
+{
+ if(PropSet != AM_KSPROPSETID_CopyProt) {
+ return E_NOTIMPL;
+ }
+
+ switch(Id) {
+ case AM_PROPERTY_DVDCOPY_CHLG_KEY: { // 1. auth: send our nonce word
+ AM_DVDCOPY_CHLGKEY* pChlgKey = (AM_DVDCOPY_CHLGKEY*)pPropertyData;
+ for(int i = 0; i < 10; i++) {
+ pChlgKey->ChlgKey[i] = 9 - (m_Challenge[i] = i);
+ }
+ *pBytesReturned = sizeof(AM_DVDCOPY_CHLGKEY);
+ }
+ break;
+ case AM_PROPERTY_DVDCOPY_DEC_KEY2: { // 4. auth: send back the encrypted drive nonce word to finish the authentication
+ AM_DVDCOPY_BUSKEY* pKey2 = (AM_DVDCOPY_BUSKEY*)pPropertyData;
+ for(int i = 0; i < 5; i++) {
+ pKey2->BusKey[4-i] = m_Key[5+i];
+ }
+ *pBytesReturned = sizeof(AM_DVDCOPY_BUSKEY);
+ }
+ break;
+ case AM_PROPERTY_DVDCOPY_REGION: {
+ DVD_REGION* pRegion = (DVD_REGION*)pPropertyData;
+ pRegion->RegionData = 0;
+ pRegion->SystemRegion = 0;
+ *pBytesReturned = sizeof(DVD_REGION);
+ }
+ break;
+ case AM_PROPERTY_DVDCOPY_SET_COPY_STATE: {
+ AM_DVDCOPY_SET_COPY_STATE* pState = (AM_DVDCOPY_SET_COPY_STATE*)pPropertyData;
+ pState->DVDCopyState = AM_DVDCOPYSTATE_AUTHENTICATION_REQUIRED;
+ *pBytesReturned = sizeof(AM_DVDCOPY_SET_COPY_STATE);
+ }
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+
+ return S_OK;
+}
+
+STDMETHODIMP CDeCSSInputPin::QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport)
+{
+ if(PropSet != AM_KSPROPSETID_CopyProt) {
+ return E_NOTIMPL;
+ }
+
+ switch(Id) {
+ case AM_PROPERTY_COPY_MACROVISION:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDCOPY_CHLG_KEY:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDCOPY_DEC_KEY2:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET;
+ break;
+ case AM_PROPERTY_DVDCOPY_DISC_KEY:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDCOPY_DVD_KEY1:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDCOPY_REGION:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDCOPY_SET_COPY_STATE:
+ *pTypeSupport = KSPROPERTY_SUPPORT_GET | KSPROPERTY_SUPPORT_SET;
+ break;
+ case AM_PROPERTY_DVDCOPY_TITLE_KEY:
+ *pTypeSupport = KSPROPERTY_SUPPORT_SET;
+ break;
+ default:
+ return E_PROP_ID_UNSUPPORTED;
+ }
+
+ return S_OK;
+}
diff --git a/common/DSUtilLite/DeCSS/DeCSSInputPin.h b/common/DSUtilLite/DeCSS/DeCSSInputPin.h
new file mode 100644
index 00000000..c7388ed4
--- /dev/null
+++ b/common/DSUtilLite/DeCSS/DeCSSInputPin.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2003-2006 Gabest
+ * http://www.gabest.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#pragma once
+
+class CDeCSSInputPin : public CTransformInputPin, public IKsPropertySet
+{
+ int m_varient;
+ BYTE m_Challenge[10], m_KeyCheck[5], m_Key[10];
+ BYTE m_DiscKey[6], m_TitleKey[6];
+
+protected:
+ // return S_FALSE here if you don't want the base class
+ // to call CTransformFilter::Receive with this sample
+ virtual HRESULT Transform(IMediaSample* pSample) {
+ return S_OK;
+ }
+
+public:
+ CDeCSSInputPin(TCHAR* pObjectName, CTransformFilter* pFilter, HRESULT* phr, LPWSTR pName);
+
+ DECLARE_IUNKNOWN
+ STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
+
+ void StripPacket(BYTE*& p, long& len);
+
+ // IMemInputPin
+ STDMETHODIMP Receive(IMediaSample* pSample);
+
+ // IKsPropertySet
+ STDMETHODIMP Set(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength);
+ STDMETHODIMP Get(REFGUID PropSet, ULONG Id, LPVOID InstanceData, ULONG InstanceLength, LPVOID PropertyData, ULONG DataLength, ULONG* pBytesReturned);
+ STDMETHODIMP QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport);
+};