]> git.sesse.net Git - vlc/commitdiff
* modules/demux/mp4: added more comments and debug information to the DRMS
authorSam Hocevar <sam@videolan.org>
Wed, 1 Feb 2006 09:57:37 +0000 (09:57 +0000)
committerSam Hocevar <sam@videolan.org>
Wed, 1 Feb 2006 09:57:37 +0000 (09:57 +0000)
    code.

modules/demux/mp4/drms.c
modules/demux/mp4/drmstables.h
modules/demux/mp4/libmp4.c

index 92f5f2c92ce85ec4f861f87a2ae07b244e68ad81..f4f7bebae590fbfdeb0e1c9b2eb9b3c55bea7d62 100644 (file)
@@ -63,7 +63,7 @@
 #   include <limits.h>
 #endif
 
-#ifdef SYS_DARWIN
+#ifdef __APPLE__
 #   include <mach/mach.h>
 #   include <IOKit/IOKitLib.h>
 #   include <CoreFoundation/CFNumber.h>
@@ -284,6 +284,13 @@ void drms_decrypt( void *_p_drms, uint32_t *p_buffer, uint32_t i_bytes )
 
 /*****************************************************************************
  * drms_init: initialise a DRMS structure
+ *****************************************************************************
+ * Return values:
+ *  0: success
+ * -1: unimplemented
+ * -2: invalid argument
+ * -3: failed to get user key
+ * -4: invalid user key
  *****************************************************************************/
 int drms_init( void *_p_drms, uint32_t i_type,
                uint8_t *p_info, uint32_t i_len )
@@ -296,7 +303,7 @@ int drms_init( void *_p_drms, uint32_t i_type,
         case FOURCC_user:
             if( i_len < sizeof(p_drms->i_user) )
             {
-                i_ret = -1;
+                i_ret = -2;
                 break;
             }
 
@@ -306,7 +313,7 @@ int drms_init( void *_p_drms, uint32_t i_type,
         case FOURCC_key:
             if( i_len < sizeof(p_drms->i_key) )
             {
-                i_ret = -1;
+                i_ret = -2;
                 break;
             }
 
@@ -316,7 +323,7 @@ int drms_init( void *_p_drms, uint32_t i_type,
         case FOURCC_iviv:
             if( i_len < sizeof(p_drms->p_key) )
             {
-                i_ret = -1;
+                i_ret = -2;
                 break;
             }
 
@@ -328,7 +335,7 @@ int drms_init( void *_p_drms, uint32_t i_type,
 
             if( p_drms->p_name == NULL )
             {
-                i_ret = -1;
+                i_ret = -2;
             }
             break;
 
@@ -339,7 +346,7 @@ int drms_init( void *_p_drms, uint32_t i_type,
 
             if( i_len < 64 )
             {
-                i_ret = -1;
+                i_ret = -2;
                 break;
             }
 
@@ -358,7 +365,7 @@ int drms_init( void *_p_drms, uint32_t i_type,
             {
                 if( GetUserKey( p_drms, p_drms->p_key ) )
                 {
-                    i_ret = -1;
+                    i_ret = -3;
                     break;
                 }
             }
@@ -372,7 +379,7 @@ int drms_init( void *_p_drms, uint32_t i_type,
 
             if( p_priv[ 0 ] != 0x6e757469 ) /* itun */
             {
-                i_ret = -1;
+                i_ret = -4;
                 break;
             }
 
@@ -1956,7 +1963,7 @@ static int GetiPodID( int64_t *p_ipod_id )
         return 0;
     }
 
-#ifdef SYS_DARWIN
+#ifdef __APPLE__
     CFTypeRef value;
     mach_port_t port;
     io_object_t device;
@@ -2049,7 +2056,7 @@ static int GetiPodID( int64_t *p_ipod_id )
                             break;
                         }
                     }
-                }
+               }
 
                 if( !i_ret ) break;
             }
index 9afbe9ec8bb488460eafdbfa6f9ac1c5fb446ba8..027af26bdb4447f6c1ac255145f1bb4688e00cd2 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * drmstables.h : AES/Rijndael block cipher and miscellaneous tables
  *****************************************************************************
- * Copyright (C) 2004 the VideoLAN team
+ * Copyright (C) 2004, 2006 the VideoLAN team
  * $Id$
  *
  * Author: Jon Lech Johansen <jon-vl@nanocrew.net>
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
+/*****************************************************************************
+ * p_aes_table, p_aes_encrypt, p_aes_itable, p_aes_decrypt: AES tables
+ *****************************************************************************
+ * The following tables and macros are used for the AES (Rijndael) cypher.
+ *****************************************************************************/
 #define AES_ROR( x, n ) (((x) << (32-(n))) | ((x) >> (n)))
 
 #define AES_XOR_ROR( p_table, p_tmp ) \
@@ -178,6 +183,12 @@ static uint32_t const p_aes_decrypt[ 256 ] =
     0x55000000, 0x21000000, 0x0c000000, 0x7d000000
 };
 
+/*****************************************************************************
+ * p_shuffle_xor, p_shuffle_sub, p_shuffle_add: iTMS drms v1
+ *****************************************************************************
+ * The following tables are used for the first version of the iTMS drms key
+ * scrambling algorithm.
+ *****************************************************************************/
 static uint16_t const p_shuffle_xor[ 256 ] =
 {
     0x00d1, 0x0315, 0x1a32, 0x19ec, 0x1bbb, 0x1d6f, 0x14fe, 0x0e9e,
index 6f555d2904aeb90aa7cd0d76f68f4db17b734db3..b985f3deaa1933ae0bdefe5d5660b6e89a8a81a1 100644 (file)
@@ -2035,11 +2035,23 @@ static int MP4_ReadBox_drms( stream_t *p_stream, MP4_Box_t *p_box )
 
     if( p_drms_box && p_drms_box->data.p_sample_soun->p_drms )
     {
-        if( drms_init( p_drms_box->data.p_sample_soun->p_drms,
-                       p_box->i_type, p_peek, i_read ) )
+        int i_ret = drms_init( p_drms_box->data.p_sample_soun->p_drms,
+                               p_box->i_type, p_peek, i_read );
+        if( i_ret )
         {
-            msg_Err( p_stream, "drms_init( %4.4s ) failed",
-                     (char *)&p_box->i_type );
+            char *psz_error;
+
+            switch( i_ret )
+            {
+                case -1: psz_error = "unimplemented"; break;
+                case -2: psz_error = "invalid argument"; break;
+                case -3: psz_error = "could not get user key"; break;
+                case -4: psz_error = "invalid user key"; break;
+                default: psz_error = "unknown error"; break;
+            }
+
+            msg_Err( p_stream, "drms_init(%4.4s) failed (%s)",
+                     (char *)&p_box->i_type, psz_error );
 
             drms_free( p_drms_box->data.p_sample_soun->p_drms );
             p_drms_box->data.p_sample_soun->p_drms = NULL;