diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2011-06-09 20:19:56 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2011-06-09 20:19:56 +0400 |
commit | bd86f1cf3f935fc92ece8bc0c5ff3a9b651d18dd (patch) | |
tree | 007cf8bc5b6cc1b28c471f306a185577100181b8 /common | |
parent | 95b0c6e4d749effa3098b9d40207607bc25de0bd (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.vcxproj | 6 | ||||
-rw-r--r-- | common/DSUtilLite/DSUtilLite.vcxproj.filters | 24 | ||||
-rw-r--r-- | common/DSUtilLite/DeCSS/CSSauth.cpp | 339 | ||||
-rw-r--r-- | common/DSUtilLite/DeCSS/CSSauth.h | 5 | ||||
-rw-r--r-- | common/DSUtilLite/DeCSS/CSSscramble.cpp | 240 | ||||
-rw-r--r-- | common/DSUtilLite/DeCSS/CSSscramble.h | 8 | ||||
-rw-r--r-- | common/DSUtilLite/DeCSS/DeCSSInputPin.cpp | 359 | ||||
-rw-r--r-- | common/DSUtilLite/DeCSS/DeCSSInputPin.h | 52 |
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); +}; |