ref: ad53e785b3558f82b50bb570f22187f46fee062b
parent: 92cc4b7d1617d548a4a79895cfeccba10dcae92b
author: Håkan Hjort <d95hjort@dtek.chalmers.se>
date: Mon Feb 25 13:21:57 EST 2002
Cleanup some formating, indentation and types and add a small comment.
--- a/src/css.c
+++ b/src/css.c
@@ -2,7 +2,7 @@
* css.c: Functions for DVD authentification and unscrambling
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: css.c,v 1.2 2002/01/20 17:04:54 hjort Exp $
+ * $Id: css.c,v 1.3 2002/02/25 18:21:57 hjort Exp $
*
* Author: St�phane Borel <stef@via.ecp.fr>
* H�kan Hjort <d95hjort@dtek.chalmers.se>
@@ -57,12 +57,12 @@
static int CSSAuth ( dvdcss_handle dvdcss );
static int CSSGetASF ( dvdcss_handle dvdcss );
static void CSSCryptKey ( int i_key_type, int i_varient,
- u8 const * p_challenge, u8* p_key );
-static void CSSDecryptKey( u8* p_crypted, u8* p_key, u8 );
-static int CSSDiscCrack ( dvdcss_handle dvdcss, u8 * p_disc_key );
-static int CSSTitleCrack( int i_start, unsigned char * p_crypted,
- unsigned char * p_decrypted,
- dvd_key_t * p_sector_key, dvd_key_t * p_key );
+ u8 const *p_challenge, u8 *p_key );
+static void CSSDecryptKey( u8 *p_crypted, u8 const *p_key, u8 );
+static int CSSDiscCrack ( dvdcss_handle dvdcss, u8 *p_disc_key );
+static int CSSTitleCrack( int i_start, unsigned char *p_crypted,
+ unsigned char *p_decrypted,
+ u8 *p_sector_key, u8 *p_key );
/*****************************************************************************
* CSSTest : check if the disc is encrypted or not
@@ -108,12 +108,6 @@
int i_ret = -1;
int i;
- /* So this isn't really necessary except for debuging. */
- if( CSSGetASF( dvdcss ) < 0 )
- {
- _dvdcss_error( dvdcss, "fatal error in CSSAuth" );
- }
-
_dvdcss_debug( dvdcss, "requesting AGID" );
i_ret = ioctl_ReportAgid( dvdcss->i_fd, &dvdcss->css.i_agid );
@@ -121,7 +115,7 @@
by invalidating the corresponding AGID'. As long as we haven't got
an AGID, invalidate one (in sequence) and try again. */
for( i = 0; i_ret == -1 && i < 4 ; ++i )
- {
+ {
_dvdcss_debug( dvdcss, "ioctl_ReportAgid failed" );
sprintf( psz_warning, "invalidating AGID %d", i );
@@ -158,7 +152,7 @@
/* Send challenge to LU */
if( ioctl_SendChallenge( dvdcss->i_fd,
- &dvdcss->css.i_agid, p_buffer ) < 0 )
+ &dvdcss->css.i_agid, p_buffer ) < 0 )
{
_dvdcss_error( dvdcss, "ioctl_SendChallenge failed" );
ioctl_InvalidateAgid( dvdcss->i_fd, &dvdcss->css.i_agid );
@@ -244,7 +238,7 @@
/*****************************************************************************
* CSSPrintKey : debug function that dumps a key value
- *****************************************************************************/static void CSSPrintKey( dvdcss_handle dvdcss, u8* data )
+ *****************************************************************************/static void CSSPrintKey( dvdcss_handle dvdcss, u8 *data )
{
char psz_output[80];
@@ -416,8 +410,8 @@
{
i = CSSTitleCrack( 0, &p_buf[0x80],
&p_buf[0x80 - ( i_best_plen / i_best_p) *i_best_p],
- (dvd_key_t*)&p_buf[0x54],
- &p_key );
+ &p_buf[0x54],
+ p_key );
b_stop_scanning = ( i >= 0 );
}
}
@@ -497,18 +491,18 @@
* sec : sector to descramble
* key : title key for this sector
*****************************************************************************/
-int CSSDescrambleSector( dvd_key_t p_key, u8* p_sec )
+int CSSDescrambleSector( dvd_key_t p_key, u8 *p_sec )
{
unsigned int i_t1, i_t2, i_t3, i_t4, i_t5, i_t6;
- u8* p_end = p_sec + 0x800;
+ u8 * p_end = p_sec + 0x800;
/* PES_scrambling_control */
if( p_sec[0x14] & 0x30)
{
- i_t1 = ((p_key)[0] ^ p_sec[0x54]) | 0x100;
- i_t2 = (p_key)[1] ^ p_sec[0x55];
- i_t3 = (((p_key)[2]) | ((p_key)[3] << 8) |
- ((p_key)[4] << 16)) ^ ((p_sec[0x56]) |
+ i_t1 = (p_key[0] ^ p_sec[0x54]) | 0x100;
+ i_t2 = p_key[1] ^ p_sec[0x55];
+ i_t3 = (p_key[2] | (p_key[3] << 8) |
+ (p_key[4] << 16)) ^ (p_sec[0x56] |
(p_sec[0x57] << 8) | (p_sec[0x58] << 16));
i_t4 = i_t3 & 7;
i_t3 = i_t3 * 2 + 8 - i_t4;
@@ -526,7 +520,7 @@
i_t3 = (i_t3 << 8 ) | i_t6;
i_t6 = p_css_tab4[i_t6];
i_t5 += i_t6 + i_t4;
- *p_sec = p_css_tab1[*p_sec] ^( i_t5 & 0xff );
+ *p_sec = p_css_tab1[*p_sec] ^ ( i_t5 & 0xff );
p_sec++;
i_t5 >>= 8;
}
@@ -576,7 +570,7 @@
* i_varient : between 0 and 31.
*****************************************************************************/
static void CSSCryptKey( int i_key_type, int i_varient,
- u8 const * p_challenge, u8* p_key )
+ u8 const *p_challenge, u8 *p_key )
{
/* Permutation table for challenge */
u8 pp_perm_challenge[3][10] =
@@ -778,11 +772,13 @@
/*****************************************************************************
* CSSDecryptKey: decrypt p_crypted with p_key.
*****************************************************************************
+ * The player keys and the resulting disc key are only used as KEKs
+ * (key encryption keys).
* Decryption is slightly dependant on the type of key:
* -for disc key, invert is 0x00,
* -for title key, invert if 0xff.
*****************************************************************************/
-static void CSSDecryptKey( u8* p_crypted, u8* p_key, u8 invert )
+static void CSSDecryptKey( u8 *p_crypted, u8 const *p_key, u8 invert )
{
unsigned int i_lfsr1_lo;
unsigned int i_lfsr1_hi;
@@ -849,7 +845,7 @@
/*
* Simple function to test if a candidate key produces the given hash
*/
-static int investigate( unsigned char* hash, unsigned char *ckey )
+static int investigate( unsigned char *hash, unsigned char *ckey )
{
unsigned char key[5];
unsigned char pkey[5];
@@ -862,7 +858,7 @@
return memcmp( key, pkey, 5 );
}
-static int CSSDiscCrack( dvdcss_handle dvdcss, u8 * p_disc_key )
+static int CSSDiscCrack( dvdcss_handle dvdcss, u8 *p_disc_key )
{
unsigned char B[5] = { 0,0,0,0,0 }; /* Second Stage of mangle cipher */
unsigned char C[5] = { 0,0,0,0,0 }; /* Output Stage of mangle cipher
@@ -1066,10 +1062,10 @@
* chosen to crack title key instead of decrypting it with the disc key.
*****************************************************************************/
static int CSSTitleCrack( int i_start,
- unsigned char * p_crypted,
- unsigned char * p_decrypted,
- dvd_key_t * p_sector_key,
- dvd_key_t * p_key )
+ unsigned char *p_crypted,
+ unsigned char *p_decrypted,
+ u8 *p_sector_seed,
+ u8 *p_key )
{
unsigned char p_buffer[10];
unsigned int i_t1, i_t2, i_t3, i_t4, i_t5, i_t6;
@@ -1151,7 +1147,7 @@
* search for byte shifted in */
for( j = 0 ; j < 256 ; j++ )
{
- i_t3 = ( i_t3 & 0x1ffff) | ( j << 17 );
+ i_t3 = ( i_t3 & 0x1ffff ) | ( j << 17 );
i_t6 = ((((((( i_t3 >> 3 ) ^ i_t3 ) >> 1 ) ^
i_t3 ) >> 8 ) ^ i_t3 ) >> 5 ) & 0xff;
if( i_t6 == i_t1 )
@@ -1167,11 +1163,11 @@
if( ( ( i_t4 + i_t5 ) * 2 + 8 - ( (i_t4 + i_t5 ) & 7 ) )
== i_t3 )
{
- (*p_key)[0] = i_try>>8;
- (*p_key)[1] = i_try & 0xFF;
- (*p_key)[2] = ( ( i_t4 + i_t5 ) >> 0) & 0xFF;
- (*p_key)[3] = ( ( i_t4 + i_t5 ) >> 8) & 0xFF;
- (*p_key)[4] = ( ( i_t4 + i_t5 ) >> 16) & 0xFF;
+ p_key[0] = i_try>>8;
+ p_key[1] = i_try & 0xFF;
+ p_key[2] = ( ( i_t4 + i_t5 ) >> 0 ) & 0xFF;
+ p_key[3] = ( ( i_t4 + i_t5 ) >> 8 ) & 0xFF;
+ p_key[4] = ( ( i_t4 + i_t5 ) >> 16 ) & 0xFF;
i_exit = i_try + 1;
}
}
@@ -1180,11 +1176,11 @@
if( i_exit >= 0 )
{
- (*p_key)[0] ^= (*p_sector_key)[0];
- (*p_key)[1] ^= (*p_sector_key)[1];
- (*p_key)[2] ^= (*p_sector_key)[2];
- (*p_key)[3] ^= (*p_sector_key)[3];
- (*p_key)[4] ^= (*p_sector_key)[4];
+ p_key[0] ^= p_sector_seed[0];
+ p_key[1] ^= p_sector_seed[1];
+ p_key[2] ^= p_sector_seed[2];
+ p_key[3] ^= p_sector_seed[3];
+ p_key[4] ^= p_sector_seed[4];
}
return i_exit;
--- a/src/css.h
+++ b/src/css.h
@@ -2,7 +2,7 @@
* css.h: Structures for DVD authentification and unscrambling
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: css.h,v 1.2 2002/01/20 17:04:54 hjort Exp $
+ * $Id: css.h,v 1.3 2002/02/25 18:21:57 hjort Exp $
*
* Author: St�phane Borel <stef@via.ecp.fr>
*
@@ -51,5 +51,5 @@
int CSSTest ( dvdcss_handle );
int CSSGetDiscKey ( dvdcss_handle );
int CSSGetTitleKey ( dvdcss_handle, int );
-int CSSDescrambleSector ( u8 * , u8 * );
+int CSSDescrambleSector ( u8 *, u8 * );