Slashdot Mirror


Hollywood Dealt Setback in California DeCSS Case

AxsDeny writes "The motion picture industry's effort to ban computer code that subverts its DVD encryption scheme has suffered a setback in California, with the state's high court issuing an order that could see many of the defendants dropped from the closely watched case." Basically they may have to drop non Californians from the case, which happens to be almost all of them.

50 of 123 comments (clear)

  1. Re:Where have I seen this before?? by Anonymous Coward · · Score: 2
    I could swear I've seen it on OSOpinion... Ah, here we are:

    http://www.osopinion.com/Opinions/DeanPannell/Dean Pannell5.html

  2. Information wants to be free by Anonymous Coward · · Score: 5

    /*
    * Copyright (C) 1999 Derek Fawcus <derek@spider.com>
    *
    * This code may be used under the terms of Version 2 of the GPL,
    * read the file COPYING for details.
    *
    */

    /*
    * These routines do some reordering of the supplied data before
    * calling engine() to do the main work.
    *
    * The reordering seems similar to that done by the initial stages of
    * the DES algorithm, in that it looks like it's just been done to
    * try and make software decoding slower. I'm not sure that it
    * actually adds anything to the security.
    *
    * The nature of the shuffling is that the bits of the supplied
    * parameter 'varient' are reorganised (and some inverted), and
    * the bytes of the parameter 'challenge' are reorganised.
    *
    * The reorganisation in each routine is different, and the first
    * (CryptKey1) does not bother of play with the 'varient' parameter.
    *
    * Since this code is only run once per disk change, I've made the
    * code table driven in order to improve readability.
    *
    * Since these routines are so similar to each other, one could even
    * abstract them all to one routine supplied a parameter determining
    * the nature of the reordering it has to do.
    */

    #include "css-auth.h"

    typedef unsigned long u32;

    static void engine(int varient, byte const *input, struct block *output);

    void CryptKey1(int varient, byte const *challenge, struct block *key)
    {

    static byte perm_challenge[] = {1,3,0,7,5, 2,9,6,4,8};

    byte scratch[10];
    int i;
    for(i = 9; i >= 0; --i)
    scratch[i] = challenge[perm_challenge[i]];

    engine(varient, scratch, key); }

    /* This shuffles the bits in varient to make perm_varient such that
    * 4 -> !3
    * 3 -> 4
    * varient bits: 2 -> 0 perm_varient bits
    * 1 -> 2
    * 0 -> !1
    */
    void CryptKey2(int varient, byte const *challenge, struct block *key)
    {

    static byte perm_challenge[] = {6,1,9,3,8, 5,7,4,0,2};

    static byte 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};

    byte scratch[10];
    int i;
    for(i = 9; i >= 0; --i)
    scratch[i] = challenge[perm_challenge[i]];

    engine(perm_varient[varient], scratch, key); }

    /* This shuffles the bits in varient to make perm_varient such that
    * 4 -> 0
    * 3 -> !1
    * varient bits: 2 -> !4 perm_varient bits
    * 1 -> 2
    * 0 -> 3
    */
    void CryptBusKey(int varient, byte const *challenge, struct block *key)
    {
    static byte perm_challenge[] = {4,0,3,5,7, 2,8,6,1,9};
    static byte 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};

    byte scratch[10];
    int i;
    for(i = 9; i >= 0; --i)
    scratch[i] = challenge[perm_challenge[i]];

    engine(perm_varient[varient], scratch, key); }

    /*
    * We use two LFSR's (seeded from some of the input data bytes) to
    * generate two streams of pseudo-random bits. These two bit streams
    * are then combined by simply adding with carry to generate a final
    * sequence of pseudo-random bits which is stored in the buffer that
    * 'output' points to the end of - len is the size of this buffer.
    *
    * The first LFSR is of degree 25, and has a polynomial of:
    * x^13 + x^5 + x^4 + x^1 + 1
    *
    * The second LSFR is of degree 17, and has a (primitive) polynomial of: * x^15 + x^1 + 1
    *
    * I don't know if these polynomials are primitive modulo 2, and thus
    * represent maximal-period LFSR's.
    *
    *
    * Note that we take the output of each LFSR from the new shifted in
    * bit, not the old shifted out bit. Thus for ease of use the LFSR's
    * are implemented in bit reversed order.
    *
    */
    static void generate_bits(byte *output, int len, struct block const *s)
    {
    u32 lfsr0, lfsr1;
    byte carry;

    /* 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->b[0] << 17) | (s->b[1] << 9) | ((s->b[2] & ~7) < < 1) | 8 | (s->b[2] & 7); lfsr1 = (s->b[3] << 9) | 0x100 | s->b[4];

    ++output;

    carry = 0;
    do {
    int bit;
    byte val;
    for(bit = 0, val = 0; bit < 8; ++bit) {
    byte o_lfsr0, o_lfsr1; /* Actually only 1 bit each */ byte 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 + carry + !o_lfsr0;
    carry = BIT1(combined);
    val |= BIT0(combined) << bit;
    }

    *--output = val; } while (--len > 0);
    }

    static byte Secret[];
    static byte Varients[];
    static byte Table0[];
    static byte Table1[];
    static byte Table2[];
    static byte Table3[];

    /*
    * This encryption engine implements one of 32 variations
    * one the same theme depending upon the choice in the
    * varient parameter (0 - 31).
    *
    * The algorithm itself manipulates a 40 bit input into
    * a 40 bit output.
    * The parameter 'input' is 80 bits. It consists of
    * the 40 bit input value that is to be encrypted followed
    * by a 40 bit seed value for the pseudo random number
    * generators.
    */
    static void engine(int varient, byte const *input, struct block *output) {
    byte cse, term, index;
    struct block temp1;
    struct block temp2;
    byte bits[30];

    int i;

    /* Feed the secret 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.b[i] = input[5 + i] ^ Secret[i] ^ Table2[i];

    generate_bits(&bits[29], sizeof bits, &temp1);

    /* This term is used throughout the following to
    * select one of 32 different variations on the
    * algorithm.
    */
    cse = Varients[varient] ^ Table2[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 = Table1[index] ^ ~Table2[index] ^ cse;

    temp1.b[i] = Table2[index] ^ Table3[index] ^ term; }
    temp1.b[4] ^= temp1.b[0];
    for(i = 5, term = 0; --i >= 0; term = temp1.b[i]) {
    index = bits[20 + i] ^ temp1.b[i]; index = Table1[index] ^ ~Table2[index] ^ cse;

    temp2.b[i] = Table2[index] ^ Table3[index] ^ term; }
    temp2.b[4] ^= temp2.b[0];
    for(i = 5, term = 0; --i >= 0; term = temp2.b[i]) {
    index = bits[15 + i] ^ temp2.b[i]; index = Table1[index] ^ ~Table2[index] ^ cse; index = Table2[index] ^ Table3[index] ^ term;

    temp1.b[i] = Table0[index] ^ Table2[index]; }
    temp1.b[4] ^= temp1.b[0];
    for(i = 5, term = 0; --i >= 0; term = temp1.b[i]) {
    index = bits[10 + i] ^ temp1.b[i]; index = Table1[index] ^ ~Table2[index] ^ cse;

    index = Table2[index] ^ Table3[index] ^ term;

    temp2.b[i] = Table0[index] ^ Table2[index]; }
    temp2.b[4] ^= temp2.b[0];
    for(i = 5, term = 0; --i >= 0; term = temp2.b[i]) {
    index = bits[5 + i] ^ temp2.b[i]; index = Table1[index] ^ ~Table2[index] ^ cse;

    temp1.b[i] = Table2[index] ^ Table3[index] ^ term; }
    temp1.b[4] ^= temp1.b[0];
    for(i = 5, term = 0; --i >= 0; term = temp1.b[i]) {
    index = bits[i] ^ temp1.b[i]; index = Table1[index] ^ ~Table2[index] ^ cse;

    output->b[i] = Table2[index] ^ Table3[index] ^ term; }
    }

    static byte Varients[] = {
    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 byte Secret[] = {0x55, 0xD6, 0xC4, 0xC5, 0x28};

    static byte Table0[] = {
    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 byte Table1[] = {
    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 byte Table2[] = {
    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 byte Table3[] = {
    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};

    /*
    * css-cat.c
    *
    * Copyright 1999 Derek Fawcus.
    *
    * Released under version 2 of the GPL.
    *
    * Decode selected sector types from a CSS encoded DVD to stdout. Use as a * filter on the input to mpeg2player or ac3dec.
    *
    */

    #include <stdio.h>
    #include <stdlib.h>
    #if defined(__linux__)
    # include <getopt.h>
    #endif /* __linux__ */
    #include <string.h>
    #include <unistd.h>
    #include <fcntl.h>

    #include "css-descramble.h"

    static struct playkey pkey1a1 = {0x36b, {0x51,0x67,0x67,0xc5,0xe0}};
    static struct playkey pkey2a1 = {0x762, {0x2c,0xb2,0xc1,0x09,0xee}};
    static struct playkey pkey1b1 = {0x36b, {0x90,0xc1,0xd7,0x84,0x48}};

    static struct playkey pkey1a2 = {0x2f3, {0x51,0x67,0x67,0xc5,0xe0}};
    static struct playkey pkey2a2 = {0x730, {0x2c,0xb2,0xc1,0x09,0xee}};
    static struct playkey pkey1b2 = {0x2f3, {0x90,0xc1,0xd7,0x84,0x48}};

    static struct playkey pkey1a3 = {0x235, {0x51,0x67,0x67,0xc5,0xe0}};
    static struct playkey pkey1b3 = {0x235, {0x90,0xc1,0xd7,0x84,0x48}};

    static struct playkey pkey3a1 = {0x249, {0xb7,0x3f,0xd4,0xaa,0x14}}; /* DVD specific ? */ static struct playkey pkey4a1 = {0x028, {0x53,0xd4,0xf7,0xd9,0x8f}}; /* DVD specific ? */

    static struct playkey *playkeys[] = {
    &pkey1a1, &pkey2a1, &pkey1b1,
    &pkey1a2, &pkey2a2, &pkey1b2,
    &pkey1a3, &pkey1b3,
    &pkey3a1, &pkey4a1,
    NULL};

    static unsigned char disk_key[2048];
    static unsigned char title_key[5];

    static unsigned char sector[2048];

    unsigned long sectors = 0;
    unsigned long crypted = 0;
    unsigned long skipped = 0;

    int do_all = 0;
    int do_video = 0;
    int do_ac3 = 0;
    int do_mpg = 0;
    int verbose = 0;
    int keep_pack = 0;
    int keep_pes = -1;

    #define STCODE(p,a,b,c,d) ((p)[0] == a && (p)[1] == b && (p)[2] == c && (p)[3] == d)

    static void un_css(int fdi, int fdo)
    {
    unsigned char *sp, *pes;
    int writen, wr, peslen, hdrlen;

    while (read(fdi, sector, 2048) == 2048) {
    ++sectors;
    if (!STCODE(sector,0x00,0x00,0x01,0xba)) {
    fputs("Not Pack start code\n", stderr);
    ++skipped; continue;
    }

    if (do_all)
    goto write_it;

    pes = sector + 14 + (sector[13] & 0x07);
    if (STCODE(pes,0x00,0x00,0x01,0xbb)) {/* System Header Pack Layer */ peslen = (pes[0x04] << 8) + pes[0x05];
    pes += peslen + 6;
    }

    if (pes[0x00] || pes[0x01] || pes[0x02] != 0x01 || pes[0x03] < 0xbc) { ++skipped; continue;
    }
    peslen = (pes[0x04] << 8) + pes[0x05];
    hdrlen = pes[0x08] + 6 + 3;
    if ((pes[0x03] & 0xf0) == 0xe0) {
    if (do_video)
    goto write_it;
    } else if (do_mpg && pes[0x03] == (0xc0 | (do_mpg - 1))) { /* MPEG Audio */ goto write_it;
    } else if (pes[0x03] == 0xbd) { /* AC3 Audio */
    if (do_ac3) {
    int audiotrack = do_ac3 - 1;
    if (pes[hdrlen] == (0x80|(audiotrack & 7))) {
    hdrlen += 4;
    goto write_it;
    }
    }
    } else
    ++skipped;
    continue;

    write_it:
    if (sector[20] & 0x30) {
    ++crypted;
    css_descramble(sector, title_key);
    sector[20] &= 0x8f;
    }
    writen = 0;
    if (keep_pack)
    sp = sector, peslen = 2048;
    else if (keep_pes)
    sp = pes, peslen = 2048 - (pes - sector);
    else
    sp = pes + hdrlen, peslen -= hdrlen - 6;

    do {
    wr = write(fdo, sp, peslen - writen);
    sp += wr;
    writen += wr;
    } while (wr > 0 && writen < peslen);
    }
    }

    static void usage_exit(void)
    {
    fputs("usage: css-cat [-t title-no] [-m mpeg-audio-no ] [-avPp12345678] vob_file\n", stderr); exit(2);
    }

    static char *title = "1";

    static int parse_args(int ac, char **av)
    {
    int c;
    opterr = 0;
    while (1)
    switch((c = getopt(ac, av, "at:Ppvm:01234567"))) {
    case 'a':
    do_all = 1;
    /* fall through */
    case 'P':
    keep_pack = 1;
    break;
    case 'p':
    keep_pes = 1;
    break;
    case 't':
    title = optarg;
    break;
    case 'v':
    do_video = 1;
    ++keep_pes;
    break;
    case 'm':
    if ((do_mpg = atoi(optarg)) < 1 || do_mpg > 32)
    usage_exit();
    ++keep_pes;
    break;
    case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8':
    do_ac3 = c - '0';
    ++keep_pes;
    break;
    case EOF:
    goto got_args;
    default:
    usage_exit();
    break;
    }

    got_args:

    keep_pes = (keep_pes > 0) ? 1 : 0;

    return optind; }

    int main(int ac, char **av)
    {
    int ai, fd;
    char titlef[12];

    if ((fd = open("disk-key", O_RDONLY)) == -1) {
    perror("can't open disk-key");
    exit(1);
    }
    if (read(fd, disk_key, 2048) != 2048) {
    perror("can't read disk-key");
    close(fd);
    exit(1);
    }
    close(fd);

    if ((ai = parse_args(ac, av)) >= ac)
    usage_exit();

    strcpy(titlef, "title");
    strcat(titlef, title);
    strcat(titlef, "-key");

    if ((fd = open(titlef, O_RDONLY)) == -1) {
    perror("can't open title-key");
    exit(1);
    }
    if (read(fd, title_key, 5) != 5) {
    perror("can't read title-key");
    close(fd);
    exit(1);
    }
    close(fd);

    if (strcmp(av[ai], "-") == 0)
    fd = 0;
    else if ((fd = open(av[ai], O_RDONLY)) == -1) {
    fputs("can't open VOB file ", stderr);
    fputs(av[ai], stderr);
    perror("");
    exit(1);
    }

    if (!css_decrypttitlekey(title_key, disk_key, playkeys)) {
    close(fd);
    return 3;
    }

    un_css(fd, 1);

    fprintf(stderr, "Total %lu, skipped %lu, crvid %lu\n",
    sectors, skipped, crypted);

    close(fd);

    return 0; }

    /*
    * css_descramble.c
    *
    * Released under the version 2 of the GPL.
    *
    * Copyright 1999 Derek Fawcus
    *
    * This file contains functions to descramble CSS encrypted DVD content *
    */

    /*
    * Still in progress: Remove the use of the bit_reverse[] table by recoding * the generation of LFSR1. Finish combining this with * the css authentication code.
    *
    */

    #include <stdio.h>
    #include <string.h>
    #include "css-descramble.h"

    typedef unsigned char byte;

    /*
    *
    * some tables used for descrambling sectors and/or decrypting title keys *
    */

    static byte csstab1[256]=
    {
    0x33,0x73,0x3b,0x26,0x63,0x23,0x6b,0x76,0x3e,0x7 e, 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 };

    static byte lfsr1_bits0[256]=
    {
    0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x09,0x0 8, 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 };

    static byte lfsr1_bits1[512]=
    {
    0x00,0x24,0x49,0x6d,0x92,0xb6,0xdb,0xff,0x00,0x2 4, 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 };

    /* Reverse the order of the bits within a byte.

    */ static byte bit_reverse[256]=
    {
    0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x9 0, 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 };

    /*
    *
    * this function is only used internally when decrypting title key
    *
    */
    static void css_titlekey(byte *key, byte *im, byte invert)
    {
    unsigned int lfsr1_lo,lfsr1_hi,lfsr0,combined;
    byte o_lfsr0, o_lfsr1;
    byte k[5];
    int i;

    lfsr1_lo = im[0] | 0x100;
    lfsr1_hi = im[1];

    lfsr0 = ((im[4] << 17) | (im[3] << 9) | (im[2] << 1)) + 8 - (im[2] &7); lfsr0 = (bit_reverse[lfsr0&0xff]<<24) | (bit_reverse[(lfsr0>>8)&0xff] << 16) | (bit_reverse[(lfsr0>>16)&0xff]<<8) | bit_reverse[(lfsr0>>24) &0xff];

    combined = 0;
    for (i = 0; i < 5; ++i) {
    o_lfsr1 = lfsr1_bits0[lfsr1_hi] ^ lfsr1_bits1[lfsr1_lo];
    lfsr1_hi = lfsr1_lo>>1;
    lfsr1_lo = ((lfsr1_lo&1)<<8) ^ o_lfsr1;
    o_lfsr1 = bit_reverse[o_lfsr1];

    /*o_lfsr0 = (lfsr0>>7)^(lfsr0>>10)^(lfsr0>>1 1)^(lfsr0>>19);*/ o_lfsr0 = (((((((lfsr0>>8)^lfsr0)>>1)^lfsr0)> >3)^lfsr0)>>7); lfsr0 = (lfsr0>>8)|(o_lfsr0<<24);

    combined += (o_lfsr0 ^ invert) + o_lfsr1;
    k[i] = combined & 0xff;
    combined >>= 8;
    }

    key[4]=k[4]^csstab1[key[4]]^key[3];
    key[3]=k[3]^csstab1[key[3]]^key[2];
    key[2]=k[2]^csstab1[key[2]]^key[1];
    key[1]=k[1]^csstab1[key[1]]^key[0];
    key[0]=k[0]^csstab1[key[0]]^key[4];

    key[4]=k[4]^csstab1[key[4]]^key[3];
    key[3]=k[3]^csstab1[key[3]]^key[2];
    key[2]=k[2]^csstab1[key[2]]^key[1];
    key[1]=k[1]^csstab1[key[1]]^key[0];
    key[0]=k[0]^csstab1[key[0]];
    }

    /*
    *
    * this function decrypts a title key with the specified disk key
    *
    * tkey: the unobfuscated title key (XORed with BusKey)
    * dkey: the unobfuscated disk key (XORed with BusKey)
    * 2048 bytes in length (though only 5 bytes are needed, see below) * pkey: array of pointers to player keys and disk key offsets
    *
    *
    * use the result returned in tkey with css_descramble
    *
    */

    int css_decrypttitlekey(byte *tkey, byte *dkey, struct playkey **pkey)
    {
    byte test[5], pretkey[5];
    int i = 0;
    for(; *pkey; ++pkey, ++i) {
    memcpy(pretkey, dkey + (*pkey)->offset, 5); css_titlekey(pretkey, (*pkey)->key, 0);

    memcpy(test, dkey, 5);
    css_titlekey(test, pretkey, 0);

    if (memcmp(test, pretkey, 5) == 0) {
    fprintf(stderr, "Using Key %d\n", i+1);
    break;
    }
    }

    if (!*pkey) {
    fprintf(stderr, "Shit - Need Key %d\n", i+1);
    return 0;
    }

    css_titlekey(tkey, pretkey, 0xff);

    return 1; }

    /*
    *
    * this function does the actual descrambling
    *
    * sec: encrypted sector (2048 bytes)
    * key: decrypted title key obtained from css_decrypttitlekey
    *
    */
    void css_descramble(byte *sec,byte *key)
    {
    unsigned int lfsr1_lo,lfsr1_hi,lfsr0,combined;
    unsigned char o_lfsr0, o_lfsr1;
    unsigned char *end = sec + 0x800;
    #define SALTED(i) (key[i] ^ sec[0x54 + (i)])

    lfsr1_lo = SALTED(0) | 0x100;
    lfsr1_hi = SALTED(1);

    lfsr0 = ((SALTED(4) << 17) | (SALTED(3) << 9) | (SALTED(2) << 1)) + 8 - (SALTED(2)&7);
    lfsr0= (bit_reverse[lfsr0&0xff]<<24) | (bit_reverse[(lfsr0> >8)&0xff] << 16) | (bit_reverse[(lfsr0>>16)&0xff]<<8) | bit_reverse[(lfsr0>>24) &0xff];

    sec+=0x80;
    combined = 0;
    while (sec != end) {
    o_lfsr1 = lfsr1_bits0[lfsr1_hi] ^ lfsr1_bits1[lfsr1_lo];
    lfsr1_hi = lfsr1_lo>>1;
    lfsr1_lo = ((lfsr1_lo&1)<<8) ^ o_lfsr1;
    o_lfsr1 = bit_reverse[o_lfsr1];

    /*o_lfsr0 = (lfsr0>>7)^(lfsr0>>10)^(lfsr0>>1 1)^(lfsr0>>19);*/ o_lfsr0 = (((((((lfsr0>>8)^lfsr0)>>1)^lfsr0)> >3)^lfsr0)>>7); lfsr0 = (lfsr0>>8)|(o_lfsr0<<24);

    combined += o_lfsr0 + (byte)~o_lfsr1;
    *sec++ = csstab1[*sec] ^ (combined&0xff);
    combined >>= 8;
    }
    }

    /*
    * A noddy program for getting and printing some info from the
    * DVD-ROM drive.
    */

    #include <stdio.h>
    #include <fcntl.h>
    #if defined(__OpenBSD__)
    # include <sys/dvdio.h>
    #elif defined(__linux__)
    # include <linux/cdrom.h>
    #else
    # error "Need the DVD ioctls"
    #endif
    #include <sys/ioctl.h>
    #include <errno.h>

    #define DVD "/dev/cdrom"

    int GetASF(int fd)
    {

    dvd_authinfo ai;

    ai.type = DVD_LU_SEND_ASF;
    ai.lsasf.agid = 0;
    ai.lsasf.asf = 0;

    if (ioctl(fd, DVD_AUTH, &ai)) {
    printf("GetASF failed\n");
    return 0;
    }

    printf("%sAuthenticated\n", (ai.lsasf.asf) ? "" : "not ");

    return 1; }

    int GetPhysical(int fd)
    {
    dvd_struct d;
    int layer = 0, layers = 4;

    d.physical.type = DVD_STRUCT_PHYSICAL;
    while (layer < layers) {
    d.physical.layer_num = layer;

    if (ioctl(fd, DVD_READ_STRUCT, &d)<0)
    {
    printf("Could not read Physical layer %d\n", layer); return 0;
    }

    layers = d.physical.layer[layer].nlayers + 1;

    printf("Layer %d[%d]\n", layer, layers);
    printf(" Book Version: %d\n", d.physical.layer[layer].book_version); printf(" Book Type: %d\n", d.physical.layer[layer].book_type); printf(" Min Rate: %d\n", d.physical.layer[layer].min_rate); printf(" Disk Size: %d\n", d.physical.layer[layer].disc_size); printf(" Layer Type: %d\n", d.physical.layer[layer].layer_type); printf(" Track Path: %d\n", d.physical.layer[layer].track_path); printf(" Num Layers: %d\n", d.physical.layer[layer].nlayers); printf(" Track Density: %d\n", d.physical.layer[layer].track_density); printf(" Linear Density: %d\n", d.physical.layer[layer].linear_density); printf(" BCA: %d\n", d.physical.layer[layer].bca); printf(" Start Sector %#x\n", d.physical.layer[layer].start_sector); printf(" End Sector %#x\n", d.physical.layer[layer].end_sector); printf(" End Sector L0 %#x\n", d.physical.layer[layer].end_sector_l0);

    ++layer; }

    return 1; }

    int GetCopyright(int fd)
    {

    dvd_struct d;

    d.copyright.type = DVD_STRUCT_COPYRIGHT;
    d.copyright.layer_num = 0;

    if (ioctl(fd, DVD_READ_STRUCT, &d)<0)
    {
    printf("Could not read Copyright Struct\n");
    return 0;
    }

    printf("Copyright: CPST=%d, RMI=%#02x\n", d.copyright.cpst, d.copyright.rmi);

    return 1; }

    int main(int ac, char **av)
    {
    int fd;
    char *device = DVD;

    if (ac > 1)
    device = av[1];

    fd = open(device, O_RDONLY | O_NONBLOCK);

    if (fd < 0) {
    printf("unable to open dvd drive (%s).\n", device);
    return 1;
    }

    GetASF(fd);

    GetPhysical(fd);
    GetCopyright(fd);

    return 0; }

    /*
    * A noddy program which tries to reset all AGID's on the DVD-ROM drive. */

    #include<stdio.h>
    #include<fcntl.h>
    #if defined(__OpenBSD__)
    # include <sys/dvdio.h>
    #elif defined(__linux__)
    # include <linux/cdrom.h>
    #else
    # error "Need the DVD ioctls"
    #endif
    #include<sys/ioctl.h>
    #include<errno.h>

    static int fd;

    #define DVD "/dev/cdrom"

    int main(int ac, char **av)
    {
    dvd_authinfo ai;
    char *device = DVD;
    int i;

    if (ac > 1)
    device = av[1];

    fd = open(device, O_RDONLY | O_NONBLOCK);

    if (fd < 0) {
    printf("unable to open dvd drive (%s).\n", device);
    return 1;
    }
    for(i = 0; i < 4; i++) {
    memset(&ai, 0, sizeof(ai)); ai.type = DVD_INVALIDATE_AGID; ai.lsa.agid = i; ioctl(fd, DVD_AUTH, &ai);

    }

    return 0; }

  3. Re:Hey Taco! by Masem · · Score: 2
    The fact that there are repeat stories within a short time period (a few days) implies either the story moderators aren't reading the site and/or there's too many story moderators and sections of the site. It's completely understandable if a story is repeated after 4 or so months by a different moderator, but on the same day?

    What I think needs to be done if they wish to keep all the story moderators is to make it require more than just one person needed to post a story; a moderator sees a story he'd like to post from the submissions pool, does the necessary editing, then goes on to two other editors for 'approval'; the chance that 3 out of 12(?) editors would not recognize a recently repeat story is low, and lower than the chance of 1 out of 12. Sure, this might 'slow' a story down, but /. is not a instant news wire service, only that the content is generally regarding events of the last 48hrs, so this extra moderation step should not be a problem and would improve the declining quality of slashdot.

    (and if this goes through, something's wrong with the (post XOR moderate) system)....

    --
    "Pinky, you've left the lens cap of your mind on again." - P&TB
    "I can see my house from here!" - ST:
  4. Score -1, Plagarism by roystgnr · · Score: 5

    The guy who actually wrote this, Dean Pannell (who goes by "dinotrac", not "Maldivian") does say "Copying with proper attribution is expressly permitted" on his essay... but that copyright statement and attribution seems to be the only thing that wasn't cut and pasted here.

    Please, people; some of us want legal Linux DVD players even more than we want DVD ripper software. Can you at least try to look like you care about copyright law?

    1. Re:Score -1, Plagarism by Rakarra · · Score: 2
      Please, people; some of us want legal Linux DVD players even more than we want DVD ripper software. Can you at least try to look like you care about copyright law?

      I believe that having legal DVD rippers is at least as important a fight as having a "legal Linux DVD program." Perhaps more so. The Linux DVD player is about your right to view your property, the legal ripper is about your right to do what you wish with your property, as long as you do not break copyright law.

      I've certainly benefited greatly from being able to rip mp3's from my CDs. I can't anticipate the uses of DVD ripping, people rarely can see the benefits of technological advances before they happen.

    2. Re:Score -1, Plagarism by wishus · · Score: 2
      I could generate everything covered under copyright law.

      It would only take you several billion years. You start generating, and when your computer produces an exact replica of, say, the new U2 album.. hell, when it produces an exact replica of any album to come out of a multitrack studio since 1968, we'll start discussing the end of human creativity.

      The point is not that someone has "invented" tones, or arrangements of syllables, and copyrighted it. It's that someone has created an arrangement of sounds (in the case of music) that has never been heard before, with (if it's a lyrical piece) words that have never quite been arranged that way before - and, and this is most important, it all comes together and has meaning to human beings..

      do you "get it" now?

      wish
      ---

    3. Re:Score -1, Plagarism by Fervent · · Score: 3
      One could argue that creation is a process that turns something out of nothing (as I argue -- imagination itself is a miracle). Then copyright law would not apply to the media being used, but the content one wishes to represent.

      Also, you could never get a computer program to simulate every song ever to be created. That goes against infinity and Goedl's theroum. That is, no system is ever fully complete. You can create what you think is every song in existence, but I could easily create a song that doesn't fit the ones you already made (point to be taken: there's no such thing as reaching infinity).

      Read G.E.B. for interesting takes on infinity, the mind and thelogy.

      --

      - I don't care if they globalize against free speech. All my best free thoughts are done in my head.

    4. Re:Score -1, Plagarism by Cardhore · · Score: 2

      Copyright is a lie. You didn't invent the English language, you didn't invent electromagnetic waves (sound, light), you didn't invent music. You didn't invent paper, pens, sentences or phrases. You took matter that existed before humans ever existed and arranged it. I could write a computer program that takes every word, every letter, and infinitely creates combinations of them. In theory I would "write" every orignal work, so if you came up with something, I could simply say, "Too bad, my computer wrote it first, therefore it's not oringial." I could do the same with sound: generate random sound until I've created every musical composition every to be invented. I could generate everything covered under copyright law.

  5. Hey Taco! by emag · · Score: 3

    You should read YRO periodically. This has been there since 07:34!


    --

    --
    "The urge to save humanity is almost always a false front for the urge to rule." --H.L. Mencken
  6. Re:I want my DVD, your honor by jht · · Score: 3

    This deserves Post Of The Year honors, if any post on Slashdot ever has. Bravo!

    Now, if only a real judge was this good...

    - -Josh Turiel

    --
    -- Josh Turiel
    "2. Do not eat iPod Shuffle."
  7. maybe they'll also drop underage defendants by adraken · · Score: 2

    maybe they'll drop underage defendants as well. i'm a named defendant, i have no clue why they continue to list me although i'm STILL 17 and a MINNESOTA resident. geez.

    --
    -- adraken
    1. Re:maybe they'll also drop underage defendants by krlynch · · Score: 3

      Didn't your lawyer tell you not to talk about this case in public? If not, find a new lawyer....in either case, shut up before you shoot yourself in the foot.....

  8. Re:I want my DVD, your honor by ch-chuck · · Score: 2

    Right on the mark about DATs as well - I just bought 8 for backups. Sure hope Madonna appreciates the extra bucks.

    --
    try { do() || do_not(); } catch (JediException err) { yoda(err); }
  9. Not only that by ch-chuck · · Score: 2

    but you can rearrange the letters in "Church of Satanism" to spell "Chum of Christians" which seems to indicate some kind of divine conspiracy going on.

    --
    try { do() || do_not(); } catch (JediException err) { yoda(err); }
  10. Re:uh... by Phexro · · Score: 2

    "...if Matthew Pavlovich is ordered dropped from the case solely on the basis that he doesn't reside in California, all the other non-Californians will be dropped as a matter of course."

    in a world where logic prevailed, that would be the case. however, in a world where courts in california slap people overseas with injunctions, it seems that is not the case.

    just pointing out that it may be likely, but it's not guaranteed.
    --

  11. uh... by Phexro · · Score: 5

    did anyone actually read the link?

    "The order applies only to [Matthew] Pavlovich..."

    Pavlovich's laywer hopes that this will force the lower court to drop the other non-californians, but that has not happened yet.
    --

    1. Re:uh... by startled · · Score: 2

      Yes, and the people who made the link made came to the obvious conclusion that if Matthew Pavlovich is ordered dropped from the case solely on the basis that he doesn't reside in California, all the other non-Californians will be dropped as a matter of course. Jurisdiction questions such as this one are a very common method by which lawsuits are dismissed.

    2. Re:uh... by Prior+Restraint · · Score: 4

      ...if Matthew Pavlovich is ordered dropped from the case...

      The operative word is "if". The circuit court didn't order the lower court to quash with respect to Pavlovich, but rather ordered it to explain why it didn't quash. While this might seem like a semantic difference, it isn't. Judicial review requires something to review. Unlike most responsible judges, the one on the lower court (sorry, don't remember the name) simply denied the motion to quash without explanation.

      Long story short: that judge just writes up a plausible explanation for denying the motion, and the appeal starts over from scratch.

  12. "Linux computer code known as DeCSS" :) by ToastyKen · · Score: 2
    From the article:

    "The suits target open-source Linux computer code known as DeCSS that..."

    Uh.. YEAH..... :P

  13. Re:Reverse engineering by rnturn · · Score: 2

    I believe the the MPAA and CSS brought suit on the basis of the protection they were claiming was provided by the DMCA. I thought their claim was the DeCSS bypassed their lame encryption scheme, not some copyright or patent.


    --

    --
    CUR ALLOC 20195.....5804M
  14. Re:Reverse engineering by Detritus · · Score: 2
    The author of the article is confused. You can use reverse engineering to discover trade secrets and then use them in your own products. A patent, is by definition, public information.

    I can reverse engineer the formula for Coca-Cola, a trade secret, and use it for my own soft drink. I just can't call it Coca-Cola(TM) or Coke(TM), due to trademark law.

    --
    Mea navis aericumbens anguillis abundat
  15. Re:Poor word choice? by Dr.Dubious+DDQ · · Score: 2
    So I rip the DVD and transfer it through the network to my desktop. Is that wrong? Legally, yes, but not morally.]

    I doubt that's illegal - it sounds like "space shifting" to me - much as making a cassette copy of a CD (or MP3's!) that you legally own to play in your car's cassette (or mp3) player.

    I've not actually seen any DivX;) movies yet, but what I've been reading seems to indicate that there IS a loss of quality when you "crunch down" the DVD data for CDs, so I would expect the situation to be analogous to videotape or cassette copying, in legal terms.

    At least, until the MPAA/RIAA scrapes together enough money to make a down payment on some more legislators....


    A vote for the lesser of two evils is still a vote for Evil.
  16. Re:Poor word choice? by Flavio · · Score: 3

    The motion picture industry's effort to ban computer code that undermines the morals of its DVD encryption scheme.

    Fine, but as you very well put it, subvert can also mean "overthrow completely" or "ruin". So "The motion picture industry's effort to ban computer code that ruins its DVD encryption scheme" makes sense.

    DeCSS DOES destroy encryption and to make an open DVD player you must openly break encryption.

    Is that so hard to understand?

    sigh!

    [Since we're on it, DeCSS does make piracy possible and can serve as a stimulus. There are tons of DivX movies ripped from DVD's on the internet, so let's not hide the truth.

    Napster also encourage piracy.

    The truth is obvious.

    Now what I and most people out there defend is our rights to legitimately use the DVD's that we've bought at a normal store.

    For example, some days ago I wanted to play a DVD on my [desktop] computer, but it doesn't have a DVD drive. My laptop _does_ have a DVD drive, but I just think DVDs look like crap on it. So I rip the DVD and transfer it through the network to my desktop. Is that wrong? Legally, yes, but not morally.]

    Flavio

  17. Re:I want my DVD, your honor== Glad you liked it. by dinotrac · · Score: 2

    Maldivian, please consider yourself a friend after the fact. Although I do ask for attribution when somebody posts one of my pieces, that seems to have been handled and not harm was done. Quite the opposite, in fact. Judge Motion has been introduced to a few more people and I've gotten some really nice e-mails. Yahoo!! (the exclamation, not the portal) I would like to share the gist of my favorite e-mail so far, even though it wasn't prompted by this posting. While all that mess was going on down in Florida, one friend watched the proceedings of Judge Sauls in the Leon County court. He e-mailed me to say that Judge Motion was alive and well in Leon County. I took it as quite the compliment.

  18. Re:Reverse engineering by Thalia · · Score: 2

    In general, you are correct, reverse engineering may be used to discover trade secrets. In this case, the MPAA's assertion is that reverse engineering is prohibited by license. Since to acquire a player, one must agree to the license (apparently it shows up before you can play anything, or it's in the box or something), you can not legitimately obtain a copy of the player without having agreed to this license. Therefore, the reverse engineering, generally acceptable, is prohibited.

    Anyway, this decision is really about jurisdiction only, and whether the overburdened California courts are willing to take on cases which must be decided under laws of other states.

    I must admit, I've never read a license that comes with a DVD. However, if it is the standard license, it probably does have a clause to the effect that "Purchaser agrees to submit to jurisdiction in the Courts of California." In that case, the California courts would probably be forced to deal with the case. But, California courts are notoriously overburdened, and would love to chuck out this case, to lighten their dockets. So, maybe the defendants have a chance on this basis.

    Thalia
    This is not legal advice, so don't even think it.

  19. Re:Hollywood wants to lose! by Steve+B · · Score: 2
    Er, why? Supporting Hollywood would be leaning strongly against the political biases of the conservatives on the court.

    (Hmmm... how to get conservative Republican disdain for Hollywood channeled into constructive directions -- copyright terms trimmed to something within reason, fair use back to its traditional scope, and perhaps even mech-licensing for all media -- and away from their usual censorship fetish?)
    /.

    --
    /. If the government wants us to respect the law, it should set a better example.
  20. Poor word choice? by mwalker · · Score: 2

    "The motion picture industry's effort to ban computer code that subverts its DVD encryption scheme"

    subvert (sb-vûrt)
    v. tr. subverted, subverting, subverts.

    - To destroy completely; ruin:
    - To undermine the character, morals, or allegiance of; corrupt.
    - To overthrow completely: "Economic assistance . . . must subvert the existing . . . feudal or tribal order" (Henry A. Kissinger).


    So, in context:

    The motion picture industry's effort to ban computer code that undermines the morals of its DVD encryption scheme.

    Playing a movie on Linux hardly destroys it, or subverts its morals. When will this press bias end? DeCSS is is part of the development of an open project to play DVDs. The fact that playing DVD's may expose them to copying is an artifact of the DVD-CCA's decision to blend play protection and copy protection.

    We should all politely remind Mr. Hansen to read openDVD's fact sheet before press time.

    sigh!

  21. Re:Reverse engineering by linuxbert · · Score: 2

    you can produce a pantentable object because most technologies arnt patented, they are trade secrets. if you patent something it is publicly avalible but protected, trade secrets arnont patented and prtected only through the silence of its creator, if someone revese enginers it and figures it out, then they can patent it, because trade secrets have no protection
    as far as i know css was a trade secret and not patented

  22. Hollywood wants to lose! by zeiche · · Score: 3

    If they lose the case, they can appeal to the US Supreme Court. They now know 5 of the 9 justices will rule in their favor.

  23. Re:Clap! Clap! Clap! by AtrN · · Score: 2

    It's just as funny now as it was when it was written.

  24. Re:I don't get it by donutello · · Score: 2

    But it's not funny. It's a made up story - about the same maturity as a 3rd grader would find interesting. Obviously posted by someone with friends who moderate down any dissenting post too.

    --
    Mmmm.. Donuts
  25. I don't know that I'd put it that way by Galvatron · · Score: 2
    This is NOT the same Supreme Court that ruled in Roe vs. Wade. Same institution, sure, but different justices.

    Now that said, I think the Supreme Court would still rule in favor of DeCSS, because you tend not to have the same kinds of "conservatives" and "liberals" in law that you have in politics. In law, the "conservatives" tend to support a stricter interpretation of the Constitutuion, more along the lines of libertarians really than Republicans. Not that they are Libertarians, not by any means, but they are more libertarian than they are bible thumping fundamentalists. The current Supreme Court has consistently ruled to limit federal power, even in benign cases like when they struck down a federal domestic abuse law, not because it was a bad law, but because they saw nothing in the Constitution that permitted Congress to pass such a law.

    So, what I'm trying to say is, this is not the same Supreme Court that ruled in Roe vs. Wade (and I bet if Roe vs. Wade came up today, and there were no precedent, they would not have found a "constitutional abortion right," because as I said, the current SC tends to interpret things more literally than they did then), but they still come down heavily on the pro-free speech side of things.

    --
    "The question of whether a computer can think is no more interesting than that of whether a submarine can swim" -EWD
  26. I know I've seen this before by Galvatron · · Score: 3

    I guess as long as lots of people haven't seen it before, I can't fault the guy too much for reposting it, but this HAS been up before, and the fact that the comment ID is 9 obviously shows this guy's been waiting for an opportunity to put it up. So stop falling all over yourselves trying to praise him already.

    --
    "The question of whether a computer can think is no more interesting than that of whether a submarine can swim" -EWD
  27. If it makes you feel any better Re:Devil Details by Dr.+Nonsense · · Score: 2

    If it makes you feel any better, I laughed.
    Especially that Fudboy Line.
    For those of you that don't get the reference, it's a Devo reference paraphrased. The original line goes "I'm just a spudboy, looking for that real Tomato." Heck, now that I look at it, even his email address "fudpatrol" is also a Devo reference.
    Score me -1 offtopic +1 informative.

  28. M-m-m-my Chalupa! by crashnbur · · Score: 2
    I think the world has realized by now that any digital medium will be subject to pirating. The only point in such cases as this to delay the mass outbreak before the industry is forced to come out with the next medium.

    This being the "Age of Technology," supposedly, I would suspect that we will begin seeing the lifespans of such mediums drastically shortened from that of, say, the compact disc.

  29. Make them have every case seperate by Strog · · Score: 2

    The more cases they have to have open at a time the better. They all need to demand that they get their own trials and make MPAA rethink how long they can keep this up.

  30. Re:I want my DVD, your honor by istartedi · · Score: 2

    Someone who reads /., is familiar with DeCSS, understands why Louisana law is different, *and* has time to post that early? I think it had to be obvious to just about anybody that this was a prepared piece "held in reserve" for the right occasion, but I'm surprised that he didn't link it or credit it in the first place.

    --
    For all intensive purposes, "whom" is no longer a word. That begs the question, "who cares"?
  31. Re:Not about DeCSS! by www.sorehands.com · · Score: 2
    ts amazing they even got this far. With money like they have, anything is possible.
    I saw this with the CPHack case too. In their lawsuit and request for injunction, Mattel claimed that if the injunction was not granted, they would suffer irrepreable harm. But, in an article wirtten by their attorney (Schwartz), they claimed that software was changed the next day. If the software was changed, then the encrypted stream would have to be changed. If the encryption has been changed, how can there be any further damage?

  32. Not about DeCSS! by www.sorehands.com · · Score: 3
    This ruling is not about the DeCSS lawsuit validity. This is about jurisidiction!

    The judge is saying, that the MPAA, Mattel,RIAA, or any other large company can't bring a lawsuit against someone in a inconvient forum, just because the website/post/email can be read in that far away forum.

    It's easier to defend a lawsuit when you don't have to fly across 3 timezones to appear or to investigate. It's hard enough to fight a case, when they sic 3 or more lawyers on you, but then add in having to take days off of work to defend a baseless lawsuit, it gets really bad.

    Companies know this and it calculate it into their litigation strategy.

  33. Give credit to the author! by |guillaume| · · Score: 2
    That's a good one, but credit should have been given to the author, Dean Pannell.

    ---
    Guillaume

    --

    give me all your garmonbozia

  34. Great for the defendants, what about the cause? by Modab · · Score: 3
    It looks like a ray of hope for those defendants who live outside of California, and I don't mean to belittle their possible victory, but does this lend anything to our war against the MPAA?

    It seems like the Californian defendants are still in bad shape, and if they lose, it will be just as bad as if ALL the defendants lost. The MPAA will use any victorious ruling they get to prosecute related issues in later cases, whether just one of us loses, or 100.
    I'm still worried.

    ----------------
    It is easy to control all that you see,

  35. No action has been taken yet by Global-Lightning · · Score: 2

    From the article:
    "The California Supreme Court on Thursday effectively ordered a lower court to show why defendant Matthew Pavlovich should remain in the case even though he is not a California resident."

    The California Supreme Court is asking for for more information, and then based on that it will make a decision on if non-state residents can be sued in the jurisdiction.

    Should the Cal SC decide non-residents can't be sued in California, there is no reason why they couldn't be sued in their home state. Of course, the resources to do that will be enormous, even for a well funded group.

    Finally, the Court's question has no impact on the central issues in the case, which affects reverse engineering, "click through" licensing, and free speech.

  36. Does this affect open-source licenses? by bcrowell · · Score: 2

    The article says the judge invalidated the license that people had to click to agree to when they downloaded the software. Is this sauce for the goose also going to be sauce for the gander? What's the legal status of copyleft licenses? Last I heard, they'd never really been tested in court.

  37. Re:DeCSS by CyberKnet · · Score: 2

    and where did you read that article at?

    ---

    --
    Video meliora proboque deteriora sequor - Ovidius
  38. Re:Possible related question: by pianoman113 · · Score: 2

    Yes there is a pact keeping this type of product off the market. The DVD CCA has a stipulation in the licensing contract that says if you make a DVD player, it can't have those high bandwidth outputs. So if you are an HDTV owner, the MPAA says "Screw you."

    --

    Free as in speech, free as in beer, or free as in lunch?
  39. good thing to hear by darthpenguin · · Score: 3

    This is a good thing to hear. One of my sites that I used to spread information about DeCSS was in effect shut down. Even though I hosted off my own server at home, over my own internet connection, they went to the people who provided me with my dynamic DNS network services: dyndns.org. The guy in charge of the service just suspended my account when HE was contacted by the MPAA. This pretty much shut down the only way most people could access my site, which really pissed me off, because I didn't even provide DeCSS anymore on it, but rather instructions on how to install the Linux DVD player once you got the source, and reasons why I thought DeCSS should be allowed.

    Anyway, anything that weakens the power that the MPAA has in the courtroom is fine by me

    BTW, I still think dyndns is a cool service, even though they blocked my account. I recommend it to anyone who wants a server, but has a dynamic IP address.
    -mdek.net

  40. Re:I want my DVD, your honor by hammock · · Score: 2

    It would be nice if the judge could look at the case from an impartial stance like this, purely based on law.

    However, like the American election that just took place, big money and big corporations control the courtroom, this DVD kid is going to get squashed.

    Do you actually believe anything will happen to Microsoft with thier antitrust suit?

    No, for the same reason.
    That kid is going to San Quentin

  41. Countless ways around banning code by c_g12 · · Score: 5
    Why not make the source "fill in the blanks?"

    The code itself would be benign, except when people make simple modifications to it... Then Hollywood would have to go after the countless people who made the modifications! Impossible!

    In B.C., we have photo radar where cameras take pictures of speeding cars' licence plates. As a result, several entrepreneurs have created a licence plate "cleaner" with a big warning: WARNING: This cleaner may inadvertantly cause poor images of licence plates when using flash photography.

  42. I want my DVD, your honor by Maldivian · · Score: 5
    T.C. Pip, a small California ISP operator, didn't think twice about posting DeCSS to one of his web sites. Now he was standing, shaky and pale, before a judge. His lawyer was nowhere to be found.

    Judge Buford I. Motion, Chief Judge for the Half Moon Junction ("We put the Southern in Southern California") Superior Court, had news. "Mr. Pip, your lawyer is real bad lost and won't be here for at least an hour. We can't wait that long, so we gonna proceed right now."

    Pip swallowed hard.

    Jerry Whiplash, attorney for the DVD Copy Control Association, allowed himself to smile. After all, he was a partner with the prestigious New York firm of Bile, GotGall and Mange. Resplendent in fine wool pinstripes, silk club tie and gold-rimmed glasses, he sneered at Pip's clip-on tie and Dockers.

    Judge Motion turned to the lawyer. "Mr. Whiplash, I'll bet you're a Harvard boy."

    "Why, yes, your Honor. How did you know?"

    The judge smiled knowingly. "Piece o' cake, son. When a fella comes to my court wearing such a fine suit but filing such a shabby one, I figure he's a Harvard boy."

    Whiplash's smile disappears beneath a lawyer's poker face. Pip's color improves.

    "How dare you bring this load of horse manure before my court, son? You think I'm some kind of damned fool?"

    Whiplash is shaken, but doesn't flinch. "No, your honor, not at all."

    "Then explain paragraph one to me. You say Mr. Pip here is continually misappropriating your trade secrets."

    "That's right, your honor."

    The judge's face turned crimson and tight." Son, this is not a patent infringement case. How do you 'continually' misappropriate a trade secret. Once the cat's out of the bag, it's gone."

    "Your honor, a group of Norwegian hackers illegally reverse-engineered a DVD player software..."

    The judge's eyes narrowed as they focused on Whiplash.

    "Stop right there, son. Did Mr. Pip reverse-engineer this software"

    "No, Your Honor. He posted a program called DeCSS that allows you to copy DVD content in a way that doesn't need the encryption keys."

    "So, he's not the one who misappropriated the secrets?", the judge asked.

    "In California, your honor, it is illegal to pass on or profit from a trade secret that you know was improperly obtained."

    "Well son, I know that patents and copyrights are published for all the world to see. Were these trade secrets published anywhere?"

    "They weren't, your honor. They're secrets. We sent Mr. Pip a letter clearly explaining that his actions were illegal," came Whiplash's reply.

    "Ah. You sent him a letter and now you're upset that he didn't take your word for it. Tell me, Mr. Whiplash, are you as stupid as your case or are you just a Jackass? From your pleadings, I'd say both."

    Whiplash fumed bright red. "Your honor, I must object to this treatment. It is highly irregular and unprofessional."

    Motion's gaze froze Whiplash in his tracks. "You know what it's called when someone in my courtroom doesn't show this court the appropriate respect," he asked.

    "Contempt, your honor."

    "That's right. Very good. Now, son, do you know what it's called when I don't show you the respect you think you deserve?"

    "Reviewable?"

    Judge Motion laughed out loud. " No. It's called I'm the judge and this is my courtroom. You got that, son?"

    The judge continued, " It looks to me like you're trying to create a whole new class of action based on infringing a trade secret, but I don't see no limits to your secrets. I don't see any publication and I sure don't see any authority for granting some damned manufacturer's association this kind of power. The Constitution reserved that power to the Federal Government and they said 'No, thank you'. To my knowledge, it has always been the responsibility of secret holders to protect their own secrets. The use of public enforcement power is typically reserved for the wrongful appropriation itself."

    "But your honor, California law..." Whiplash is cut off mid-sentence by Motion's impatient voice.

    "And that's another thing," his honor continues, " you name defendants in Australia, Denmark, France, Germany, England and all over. Now, would you kindly explain to me how some fella in Australia is supposed to come under California law? "

    "By putting it on the Internet, your honor, they brought it into California."

    "You ever hear of radio, son?"

    "Of course, your honor."

    "Do you think that the FCC goes after radio stations overseas if they violate U.S. law?"

    "Why no, sir, but the Internet reaches right into California," Whiplash replies.

    "Like radio. That ol' boy in Australia doesn't connect to California and Californians don't dial into his site to view it. When an ISP connects to the Internet, they are using it as a broadcast medium. They don't give a damn about California law and California can't make them. That takes an international treaty, and that takes Federal Executive action with U.S. Senate ratification. I know they teach constitutional law at Harvard. You should know this stuff."

    "Yes, your honor."

    "Let's go on, Mr. Whiplash. Does Australian law forbid someone from publishing trade secrets, regardless of the source?"

    "I don't know, your honor."

    "How about French law, Danish law?"

    "I don't know, your honor."

    "Louisiana? You up on the Code of Napoleon, son?"

    "But, your honor," Whiplash protests, "this case is about California law."

    "Really? Well, does Norwegian law allow a software license to forbid reverse engineering?"

    "I don't know, your Honor."

    "What if the reverse engineering was done by a minor or somebody else incompetent to make a contract?"

    Whiplash hemmed and hawed. "We don't know the age of the hackers, your honor." You could almost hear him go "Oops."

    "So, the fancy New York lawyer doesn't know if the so-called trade secrets were obtained illegally. However, the ISP operator should know because the lawyer, who doesn't know, sent him a letter." The judge was on a roll.

    "That's not exactly...." Whiplash couldn't finish his sentence.

    "Never interrupt the judge, son. Now, if these folks around the world didn't break any local laws, they would have been acting legally and Mr. Pip could have gotten the program from one of them legally. But, between you and me, Mr. Whiplash, that don't matter anyhow."

    "It don't, er, doesn't, " came the weak reply.

    "No, it doesn't. These so-called secrets of yours are published on the freakin' Internet, man. They ain't secrets no more!"

    "But, your Honor."

    "I'm not finished, Son. Now, Mr. Pip operates in California, which I believe to be part of the United States. Like or not, his right to free speech is protected by the first amendment of the Constitution. Now, Harvard may not cover the second and tenth amendments, but I'm real sure they teach the first amendment."

    "Yes, your honor."

    "So, Mr. Pip is supposed to surrender his Constitutional rights because some New York lawyer who doesn't know what he's talking about writes him a letter."

    "Not exactly, your honor," Whiplash interjects. "He could check with his own counsel."

    "I hope his lawyer knows more than you do. I'm sorry, son, but your position creates a bigger chilling effect than the Sub-Zero in my kitchen. The Constitution won't tolerate that, and I won't grant your motion."

    Pip relaxed. Whiplash did not. "But, your honor...."

    "Hold on, Mr. Whiplash, I'm not finished. I understand that anybody with a commercial stamper can copy DVDs by the bushel. Is that right?"

    "Yes, your honor. The copy protection is intended to stop casual copying," Whiplash replied.

    "It seems to me that it's also designed to keep people from playing DVDs they bought and paid for. Didn't this whole thing come about because people whose computers used Linux or BeOS wanted to play their legally purchased DVDs?"

    "I don't think that's the case at all, your honor."

    "Well, Mr. Whiplash, I'll tell you something I know. Your so-called copy protection won't stop pirates, but it does hurt consumers, and not just people who use Linux. My daughter spent last year in France. She bought a DVD player and a nice collection of DVDs. Her DVD player was lost in her move back home. You wanna know what happened when we bought her a new one? She couldn't play a single one of those DVDs that she had bought and paid for because they were all region coded."

    "It occurs to me, Mr. Whiplash, that your client is being short-sighted. Movie studios are making a fortune on unprotected videotapes. The music industry is selling unprotected CDs by the ton. Digital AudioTape, which has the industry's grubby little prints all over it, isn't making money for anyone. If you make something easy to buy and use, people will buy it and use it. Y'all are free to go."

    As Pip and Whiplash prepared to leave, the Judge motioned the bailiff over to the bench.

    "Remember askin' me why my bio doesn't mention my scholarship to Yale or how big my practice was before I retired," he whispers. "It would just ruin all my fun if they knew. Now, let's see what's up next. Hmmm. Amazon.com is suing somebody for patent infringement. This'll be fun."

    --
    Trust the source!
    1. Re:I want my DVD, your honor by Maldivian · · Score: 5

      I think all praise should be redirected to Dean Pannell (a.k.a. dinotrac), the orginal author of that excellent piece. I had it bookmarked for a while and then saw this slashdot story, both clicked and thus the post.

      --
      Trust the source!