@ -416,7 +416,7 @@ static void encipher(AVCAST5* cs, uint8_t* dst, const uint8_t* src)
AV_WB32 ( dst + 4 , l ) ;
}
static void decipher ( AVCAST5 * cs , uint8_t * dst , const uint8_t * src )
static void decipher ( AVCAST5 * cs , uint8_t * dst , const uint8_t * src , uint8_t * iv )
{
uint32_t f , I , r , l ;
l = AV_RB32 ( src ) ;
@ -439,6 +439,11 @@ static void decipher(AVCAST5* cs, uint8_t* dst, const uint8_t* src)
F3 ( r , l , 3 ) ;
F2 ( l , r , 2 ) ;
F1 ( r , l , 1 ) ;
if ( iv ) {
r ^ = AV_RB32 ( iv ) ;
l ^ = AV_RB32 ( iv + 4 ) ;
memcpy ( iv , src , 8 ) ;
}
AV_WB32 ( dst , r ) ;
AV_WB32 ( dst + 4 , l ) ;
}
@ -468,11 +473,31 @@ av_cold int av_cast5_init(AVCAST5* cs, const uint8_t *key, int key_bits)
return 0 ;
}
void av_cast5_crypt2 ( AVCAST5 * cs , uint8_t * dst , const uint8_t * src , int count , uint8_t * iv , int decrypt )
{
int i ;
while ( count - - ) {
if ( decrypt ) {
decipher ( cs , dst , src , iv ) ;
} else {
if ( iv ) {
for ( i = 0 ; i < 8 ; i + + )
dst [ i ] = src [ i ] ^ iv [ i ] ;
encipher ( cs , dst , dst ) ;
memcpy ( iv , dst , 8 ) ;
} else {
encipher ( cs , dst , src ) ;
}
}
src = src + 8 ;
dst = dst + 8 ;
}
}
void av_cast5_crypt ( AVCAST5 * cs , uint8_t * dst , const uint8_t * src , int count , int decrypt )
{
while ( count - - ) {
if ( decrypt ) {
decipher ( cs , dst , src ) ;
decipher ( cs , dst , src , NULL ) ;
} else {
encipher ( cs , dst , src ) ;
}
@ -504,6 +529,7 @@ int main(int argc, char** argv)
{ 0xee , 0xa9 , 0xd0 , 0xa2 , 0x49 , 0xfd , 0x3b , 0xa6 , 0xb3 , 0x43 , 0x6f , 0xb8 , 0x9d , 0x6d , 0xca , 0x92 } ,
{ 0xb2 , 0xc9 , 0x5e , 0xb0 , 0x0c , 0x31 , 0xad , 0x71 , 0x80 , 0xac , 0x05 , 0xb8 , 0xe8 , 0x3d , 0x69 , 0x6e }
} ;
const uint8_t iv [ 8 ] = { 0xee , 0xa9 , 0xd0 , 0xa2 , 0x49 , 0xfd , 0x3b , 0xa6 } ;
static uint8_t rpt2 [ 2 ] [ 16 ] ;
int i , j , err = 0 ;
static int key_bits [ 3 ] = { 128 , 80 , 40 } ;
@ -547,6 +573,20 @@ int main(int argc, char** argv)
}
}
}
for ( j = 0 ; j < 3 ; j + + ) {
av_cast5_init ( cs , Key [ j ] , key_bits [ j ] ) ;
memcpy ( temp , iv , 8 ) ;
av_cast5_crypt2 ( cs , rpt2 [ 0 ] , rct2 [ 0 ] , 2 , temp , 0 ) ;
memcpy ( temp , iv , 8 ) ;
av_cast5_crypt2 ( cs , rpt2 [ 0 ] , rpt2 [ 0 ] , 2 , temp , 1 ) ;
for ( i = 0 ; i < 16 ; i + + ) {
if ( rct2 [ 0 ] [ i ] ! = rpt2 [ 0 ] [ i ] ) {
av_log ( NULL , AV_LOG_ERROR , " %d %02x %02x \n " , i , rct2 [ 0 ] [ i ] , rpt2 [ 0 ] [ i ] ) ;
err = 1 ;
}
}
}
av_free ( cs ) ;
return err ;
}