Changeset 4619c0a56757e47963f5f4c65b414d14468f92b1

Show
Ignore:
Timestamp:
06/07/08 10:26:42 (3 months ago)
Author:
Rémi Denis-Courmont <rdenis@simphalempin.com>
git-committer:
Rémi Denis-Courmont <rdenis@simphalempin.com> 1212827202 +0300
git-parent:

[d9810ce021930691108ea74812d4ce6f5e3df547]

git-author:
Kaloyan Kovachev <kkovachev@varna.net> 1212607095 +0300
Message:

Move the CSA Key parsing inside csa_SetCW function

Signed-off-by: Rémi Denis-Courmont <rdenis@simphalempin.com>

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/demux/ts.c

    r3561b9b r4619c0a  
    778778    if( val.psz_string && *val.psz_string ) 
    779779    { 
    780         char *psz = val.psz_string; 
    781         if( psz[0] == '0' && ( psz[1] == 'x' || psz[1] == 'X' ) ) 
    782         { 
    783             psz += 2; 
    784         } 
    785         if( strlen( psz ) != 16 ) 
    786         { 
    787             msg_Warn( p_demux, "invalid csa ck (it must be 16 chars long)" ); 
    788         } 
    789         else 
    790         { 
    791 #ifndef UNDER_CE 
    792             uint64_t i_ck = strtoull( psz, NULL, 16 ); 
    793 #else 
    794             uint64_t i_ck = strtoll( psz, NULL, 16 ); 
    795 #endif 
    796             uint8_t ck[8]; 
    797             int     i; 
    798             for( i = 0; i < 8; i++ ) 
    799             { 
    800                 ck[i] = ( i_ck >> ( 56 - 8*i) )&0xff; 
    801             } 
    802 #ifndef TS_NO_CSA_CK_MSG 
    803             msg_Dbg( p_demux, "using CSA scrambling with " 
    804                      "ck=%x:%x:%x:%x:%x:%x:%x:%x", 
    805                      ck[0], ck[1], ck[2], ck[3], ck[4], ck[5], ck[6], ck[7] ); 
    806 #endif 
    807             p_sys->csa = csa_New(); 
    808  
    809             if( p_sys->csa ) 
    810             { 
    811                 vlc_value_t pkt_val; 
    812  
    813                 csa_SetCW( p_sys->csa, ck, ck ); 
    814  
    815                 var_Create( p_demux, "ts-csa-pkt", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); 
    816                 var_Get( p_demux, "ts-csa-pkt", &pkt_val ); 
    817                 if( pkt_val.i_int < 4 || pkt_val.i_int > 188 ) 
    818                 { 
    819                     msg_Err( p_demux, "wrong packet size %d specified.", pkt_val.i_int ); 
    820                     msg_Warn( p_demux, "using default packet size of 188 bytes" ); 
    821                     p_sys->i_csa_pkt_size = 188; 
    822                 } 
    823                 else p_sys->i_csa_pkt_size = pkt_val.i_int; 
    824                 msg_Dbg( p_demux, "decrypting %d bytes of packet", p_sys->i_csa_pkt_size ); 
    825             } 
     780        int i_res; 
     781 
     782        p_sys->csa = csa_New(); 
     783 
     784        i_res = csa_SetCW( (vlc_object_t*)p_demux, p_sys->csa, val.psz_string, 1 ); 
     785        if( i_res != VLC_SUCCESS || csa_SetCW( (vlc_object_t*)p_demux, p_sys->csa, val.psz_string, 0 ) != VLC_SUCCESS ) 
     786        { 
     787            csa_Delete( p_sys->csa ); 
     788        } 
     789 
     790        if( p_sys->csa ) 
     791        { 
     792            vlc_value_t pkt_val; 
     793 
     794            var_Create( p_demux, "ts-csa-pkt", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); 
     795            var_Get( p_demux, "ts-csa-pkt", &pkt_val ); 
     796            if( pkt_val.i_int < 4 || pkt_val.i_int > 188 ) 
     797            { 
     798                msg_Err( p_demux, "wrong packet size %d specified.", pkt_val.i_int ); 
     799                msg_Warn( p_demux, "using default packet size of 188 bytes" ); 
     800                p_sys->i_csa_pkt_size = 188; 
     801            } 
     802            else p_sys->i_csa_pkt_size = pkt_val.i_int; 
     803            msg_Dbg( p_demux, "decrypting %d bytes of packet", p_sys->i_csa_pkt_size ); 
    826804        } 
    827805    } 
  • modules/mux/mpeg/csa.c

    r3561b9b r4619c0a  
    8282 * csa_SetCW: 
    8383 *****************************************************************************/ 
    84 void csa_SetCW( csa_t *c, uint8_t o_ck[8], uint8_t e_ck[8] ) 
    85 
    86     memcpy( c->o_ck, o_ck, 8 ); 
    87     csa_ComputeKey( c->o_kk, o_ck ); 
    88  
    89     memcpy( c->e_ck, e_ck, 8 ); 
    90     csa_ComputeKey( c->e_kk, e_ck ); 
     84int csa_SetCW( vlc_object_t *p_caller, csa_t *c, char *psz_ck, int set_odd ) 
     85
     86    if ( !c ) 
     87    { 
     88        msg_Dbg( p_caller, "no CSA found" ); 
     89        return VLC_EGENERIC; 
     90    } 
     91    /* skip 0x */ 
     92    if( psz_ck[0] == '0' && ( psz_ck[1] == 'x' || psz_ck[1] == 'X' ) ) 
     93    { 
     94        psz_ck += 2; 
     95    } 
     96    if( strlen( psz_ck ) != 16 ) 
     97    { 
     98        msg_Warn( p_caller, "invalid csa ck (it must be 16 chars long)" ); 
     99        return VLC_EGENERIC; 
     100    } 
     101    else 
     102    { 
     103#ifndef UNDER_CE 
     104        uint64_t i_ck = strtoull( psz_ck, NULL, 16 ); 
     105#else 
     106        uint64_t i_ck = strtoll( psz_ck, NULL, 16 ); 
     107#endif 
     108        uint8_t  ck[8]; 
     109        int      i; 
     110 
     111        for( i = 0; i < 8; i++ ) 
     112        { 
     113            ck[i] = ( i_ck >> ( 56 - 8*i) )&0xff; 
     114        } 
     115#ifndef TS_NO_CSA_CK_MSG 
     116        msg_Dbg( p_caller, "using CSA (de)scrambling with %s key=%x:%x:%x:%x:%x:%x:%x:%x", ((set_odd == 1) ? "odd" : "even" ), 
     117                 ck[0], ck[1], ck[2], ck[3], ck[4], ck[5], ck[6], ck[7] ); 
     118#endif 
     119        if ( set_odd == 1 ) 
     120        { 
     121                 memcpy( c->o_ck, ck, 8 ); 
     122                 csa_ComputeKey( c->o_kk, ck ); 
     123        } 
     124        else 
     125        { 
     126                 memcpy( c->e_ck , ck, 8 ); 
     127                 csa_ComputeKey( c->e_kk , ck ); 
     128        } 
     129        return VLC_SUCCESS; 
     130    } 
    91131} 
    92132 
  • modules/mux/mpeg/csa.h

    r6300760 r4619c0a  
    3535void   csa_Delete( csa_t * ); 
    3636 
    37 void   csa_SetCW( csa_t *, uint8_t o_ck[8], uint8_t e_ck[8] ); 
     37int    csa_SetCW( vlc_object_t *p_caller, csa_t *c, char *psz_ck, int set_odd ); 
    3838 
    3939void   csa_Decrypt( csa_t *, uint8_t *pkt, int i_pkt_size ); 
  • modules/mux/mpeg/ts.c

    r3561b9b r4619c0a  
    772772    if( val.psz_string && *val.psz_string ) 
    773773    { 
    774         char *psz = val.psz_string; 
    775  
    776         /* skip 0x */ 
    777         if( psz[0] == '0' && ( psz[1] == 'x' || psz[1] == 'X' ) ) 
    778         { 
    779             psz += 2; 
    780         } 
    781         if( strlen( psz ) != 16 ) 
    782         { 
    783             msg_Dbg( p_mux, "invalid csa ck (it must be 16 chars long)" ); 
    784         } 
    785         else 
    786         { 
    787             uint64_t i_ck = strtoull( psz, NULL, 16 ); 
    788             uint8_t  ck[8]; 
    789             int      i; 
    790  
    791             for( i = 0; i < 8; i++ ) 
    792             { 
    793                 ck[i] = ( i_ck >> ( 56 - 8*i) )&0xff; 
    794             } 
    795 #ifndef TS_NO_CSA_CK_MSG 
    796             msg_Dbg( p_mux, "using CSA scrambling with ck=%x:%x:%x:%x:%x:%x:%x:%x", 
    797                      ck[0], ck[1], ck[2], ck[3], ck[4], ck[5], ck[6], ck[7] ); 
    798 #endif 
    799             p_sys->csa = csa_New(); 
    800             if( p_sys->csa ) 
    801             { 
    802                 vlc_value_t pkt_val; 
    803  
    804                 csa_SetCW( p_sys->csa, ck, ck ); 
    805  
    806                 var_Get( p_mux, SOUT_CFG_PREFIX "csa-pkt", &pkt_val ); 
    807                 if( pkt_val.i_int < 12 || pkt_val.i_int > 188 ) 
    808                 { 
    809                     msg_Err( p_mux, "wrong packet size %d specified.", pkt_val.i_int ); 
    810                     msg_Warn( p_mux, "using default packet size of 188 bytes" ); 
    811                     p_sys->i_csa_pkt_size = 188; 
    812                 } 
    813                 else p_sys->i_csa_pkt_size = pkt_val.i_int; 
    814                 msg_Dbg( p_mux, "encrypting %d bytes of packet", p_sys->i_csa_pkt_size ); 
    815             } 
     774        int i_res; 
     775 
     776        p_sys->csa = csa_New(); 
     777 
     778        i_res = csa_SetCW( (vlc_object_t*)p_mux, p_sys->csa, val.psz_string, 1 ); 
     779        if( i_res != VLC_SUCCESS || csa_SetCW( (vlc_object_t*)p_mux, p_sys->csa, val.psz_string, 0 ) != VLC_SUCCESS ) 
     780        { 
     781            csa_Delete( p_sys->csa ); 
     782        } 
     783 
     784        if( p_sys->csa ) 
     785        { 
     786            vlc_value_t pkt_val; 
     787 
     788            var_Get( p_mux, SOUT_CFG_PREFIX "csa-pkt", &pkt_val ); 
     789            if( pkt_val.i_int < 12 || pkt_val.i_int > 188 ) 
     790            { 
     791                msg_Err( p_mux, "wrong packet size %d specified.", pkt_val.i_int ); 
     792                msg_Warn( p_mux, "using default packet size of 188 bytes" ); 
     793                p_sys->i_csa_pkt_size = 188; 
     794            } 
     795            else p_sys->i_csa_pkt_size = pkt_val.i_int; 
     796            msg_Dbg( p_mux, "encrypting %d bytes of packet", p_sys->i_csa_pkt_size ); 
    816797        } 
    817798    }