Commit 1a31316d authored by Sam Hocevar's avatar Sam Hocevar

* modules/demux/mp3/drms.c:

    + More code cleanup. Thanks a lot to jlj for testing my changes.
    + Removed AddNativeMD5 and merged Bordelize() into DoShuffle().
    + Decrypt the SCI data in-place and shuffle it in the same loop.
parent 8bfc4571
......@@ -2,7 +2,7 @@
* drms.c: DRMS
*****************************************************************************
* Copyright (C) 2004 VideoLAN
* $Id: drms.c,v 1.5 2004/01/16 18:26:57 sam Exp $
* $Id: drms.c,v 1.6 2004/01/18 01:21:33 sam Exp $
*
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
* Sam Hocevar <sam@zoy.org>
......@@ -100,14 +100,13 @@ struct drms_s
{
uint32_t i_user;
uint32_t i_key;
uint8_t *p_iviv;
uint8_t p_iviv[ 16 ];
uint8_t *p_name;
uint32_t i_name_len;
uint32_t p_key[ 4 ];
struct aes_s aes;
char *psz_homedir;
char psz_homedir[ PATH_MAX ];
};
/*****************************************************************************
......@@ -118,13 +117,11 @@ static void DecryptAES ( struct aes_s *, uint32_t *, const uint32_t * );
static void InitMD5 ( struct md5_s * );
static void AddMD5 ( struct md5_s *, const uint8_t *, uint32_t );
static void AddNativeMD5 ( struct md5_s *, uint32_t *, uint32_t );
static void EndMD5 ( struct md5_s * );
static void Digest ( struct md5_s *, const uint32_t * );
static void InitShuffle ( struct shuffle_s *, uint32_t * );
static void DoShuffle ( struct shuffle_s *, uint8_t *, uint32_t );
static void Bordelize ( uint32_t *, uint32_t );
static int GetSystemKey ( uint32_t * );
static int WriteUserKey ( void *, uint32_t * );
......@@ -132,14 +129,14 @@ static int ReadUserKey ( void *, uint32_t * );
static int GetUserKey ( void *, uint32_t * );
static int GetSCIData ( uint32_t **, uint32_t * );
static int HashSystemInfo ( struct md5_s * );
static int HashSystemInfo ( uint32_t * );
/*****************************************************************************
* BlockXOR: XOR two 128 bit blocks
*****************************************************************************/
static inline void BlockXOR( uint32_t *p_dest, uint32_t *p_s1, uint32_t *p_s2 )
{
uint32_t i;
int i;
for( i = 0; i < 4; i++ )
{
......@@ -163,17 +160,8 @@ void *drms_alloc( char *psz_homedir )
memset( p_drms, 0, sizeof(struct drms_s) );
p_drms->psz_homedir = malloc( PATH_MAX );
if( p_drms->psz_homedir != NULL )
{
strncpy( p_drms->psz_homedir, psz_homedir, PATH_MAX );
p_drms->psz_homedir[ PATH_MAX - 1 ] = '\0';
}
else
{
free( (void *)p_drms );
p_drms = NULL;
}
return (void *)p_drms;
}
......@@ -190,16 +178,6 @@ void drms_free( void *_p_drms )
free( (void *)p_drms->p_name );
}
if( p_drms->p_iviv != NULL )
{
free( (void *)p_drms->p_iviv );
}
if( p_drms->psz_homedir != NULL )
{
free( (void *)p_drms->psz_homedir );
}
free( p_drms );
}
......@@ -210,17 +188,17 @@ void drms_decrypt( void *_p_drms, uint32_t *p_buffer, uint32_t i_bytes )
{
struct drms_s *p_drms = (struct drms_s *)_p_drms;
uint32_t p_key[ 4 ];
uint32_t i_blocks, i;
unsigned int i_blocks;
/* AES is a block cypher, round down the byte count */
i_blocks = i_bytes / 16;
i_bytes = i_blocks * 16;
/* Initialise the key */
memcpy( p_key, p_drms->p_key, 4 * sizeof(uint32_t) );
memcpy( p_key, p_drms->p_key, 16 );
/* Unscramble */
for( i = i_blocks; i--; )
while( i_blocks-- )
{
uint32_t p_tmp[ 4 ];
......@@ -228,10 +206,10 @@ void drms_decrypt( void *_p_drms, uint32_t *p_buffer, uint32_t i_bytes )
BlockXOR( p_tmp, p_key, p_tmp );
/* Use the previous scrambled data as the key for next block */
memcpy( p_key, p_buffer, 4 * sizeof(uint32_t) );
memcpy( p_key, p_buffer, 16 );
/* Copy unscrambled data back to the buffer */
memcpy( p_buffer, p_tmp, 4 * sizeof(uint32_t) );
memcpy( p_buffer, p_tmp, 16 );
p_buffer += 4;
}
......@@ -249,7 +227,6 @@ int drms_init( void *_p_drms, uint32_t i_type,
switch( i_type )
{
case FOURCC_user:
{
if( i_len < sizeof(p_drms->i_user) )
{
i_ret = -1;
......@@ -257,11 +234,9 @@ int drms_init( void *_p_drms, uint32_t i_type,
}
p_drms->i_user = U32_AT( p_info );
}
break;
case FOURCC_key:
{
if( i_len < sizeof(p_drms->i_key) )
{
i_ret = -1;
......@@ -269,40 +244,24 @@ int drms_init( void *_p_drms, uint32_t i_type,
}
p_drms->i_key = U32_AT( p_info );
}
break;
case FOURCC_iviv:
{
if( i_len < sizeof(p_drms->p_key) )
{
i_ret = -1;
break;
}
p_drms->p_iviv = malloc( sizeof(p_drms->p_key) );
if( p_drms->p_iviv == NULL )
{
i_ret = -1;
break;
}
memcpy( p_drms->p_iviv, p_info, sizeof(p_drms->p_key) );
}
memcpy( p_drms->p_iviv, p_info, 16 );
break;
case FOURCC_name:
{
p_drms->i_name_len = strlen( p_info );
p_drms->p_name = strdup( p_info );
p_drms->p_name = malloc( p_drms->i_name_len );
if( p_drms->p_name == NULL )
{
i_ret = -1;
break;
}
memcpy( p_drms->p_name, p_info, p_drms->i_name_len );
}
break;
......@@ -318,8 +277,8 @@ int drms_init( void *_p_drms, uint32_t i_type,
}
InitMD5( &md5 );
AddMD5( &md5, p_drms->p_name, p_drms->i_name_len );
AddMD5( &md5, p_drms->p_iviv, sizeof(p_drms->p_key) );
AddMD5( &md5, p_drms->p_name, strlen( p_drms->p_name ) );
AddMD5( &md5, p_drms->p_iviv, 16 );
EndMD5( &md5 );
if( GetUserKey( p_drms, p_drms->p_key ) )
......@@ -331,18 +290,14 @@ int drms_init( void *_p_drms, uint32_t i_type,
InitAES( &p_drms->aes, p_drms->p_key );
memcpy( p_priv, p_info, 64 );
memcpy( p_drms->p_key, md5.p_digest, sizeof(p_drms->p_key) );
drms_decrypt( p_drms, p_priv, sizeof(p_priv) );
memcpy( p_drms->p_key, md5.p_digest, 16 );
drms_decrypt( p_drms, p_priv, 64 );
InitAES( &p_drms->aes, p_priv + 6 );
memcpy( p_drms->p_key, p_priv + 12, sizeof(p_drms->p_key) );
memcpy( p_drms->p_key, p_priv + 12, 16 );
free( (void *)p_drms->psz_homedir );
p_drms->psz_homedir = NULL;
free( (void *)p_drms->p_name );
p_drms->p_name = NULL;
free( (void *)p_drms->p_iviv );
p_drms->p_iviv = NULL;
}
break;
}
......@@ -359,26 +314,27 @@ int drms_init( void *_p_drms, uint32_t i_type,
*****************************************************************************/
static void InitAES( struct aes_s *p_aes, uint32_t *p_key )
{
uint32_t i, t, i_key, i_tmp;
unsigned int i, t;
uint32_t i_key, i_seed;
memset( p_aes->pp_enc_keys[1], 0, 4 * sizeof(uint32_t) );
memcpy( p_aes->pp_enc_keys[0], p_key, 4 * sizeof(uint32_t) );
memset( p_aes->pp_enc_keys[1], 0, 16 );
memcpy( p_aes->pp_enc_keys[0], p_key, 16 );
/* Generate the key tables */
i_tmp = p_aes->pp_enc_keys[ 0 ][ 3 ];
i_seed = p_aes->pp_enc_keys[ 0 ][ 3 ];
for( i_key = 0; i_key < AES_KEY_COUNT; i_key++ )
{
uint32_t j;
i_tmp = AES_ROR( i_tmp, 8 );
i_seed = AES_ROR( i_seed, 8 );
j = p_aes_table[ i_key ];
j ^= p_aes_encrypt[ (i_tmp >> 24) & 0xFF ]
^ AES_ROR( p_aes_encrypt[ (i_tmp >> 16) & 0xFF ], 8 )
^ AES_ROR( p_aes_encrypt[ (i_tmp >> 8) & 0xFF ], 16 )
^ AES_ROR( p_aes_encrypt[ i_tmp & 0xFF ], 24 );
j ^= p_aes_encrypt[ (i_seed >> 24) & 0xff ]
^ AES_ROR( p_aes_encrypt[ (i_seed >> 16) & 0xff ], 8 )
^ AES_ROR( p_aes_encrypt[ (i_seed >> 8) & 0xff ], 16 )
^ AES_ROR( p_aes_encrypt[ i_seed & 0xff ], 24 );
j ^= p_aes->pp_enc_keys[ i_key ][ 0 ];
p_aes->pp_enc_keys[ i_key + 1 ][ 0 ] = j;
......@@ -389,11 +345,11 @@ static void InitAES( struct aes_s *p_aes, uint32_t *p_key )
j ^= p_aes->pp_enc_keys[ i_key ][ 3 ];
p_aes->pp_enc_keys[ i_key + 1 ][ 3 ] = j;
i_tmp = j;
i_seed = j;
}
memcpy( p_aes->pp_dec_keys[ 0 ],
p_aes->pp_enc_keys[ 0 ], 4 * sizeof(uint32_t) );
p_aes->pp_enc_keys[ 0 ], 16 );
for( i = 1; i < AES_KEY_COUNT; i++ )
{
......@@ -403,9 +359,9 @@ static void InitAES( struct aes_s *p_aes, uint32_t *p_key )
j = p_aes->pp_enc_keys[ i ][ t ];
k = (((j >> 7) & 0x01010101) * 27) ^ ((j & 0xFF7F7F7F) << 1);
l = (((k >> 7) & 0x01010101) * 27) ^ ((k & 0xFF7F7F7F) << 1);
m = (((l >> 7) & 0x01010101) * 27) ^ ((l & 0xFF7F7F7F) << 1);
k = (((j >> 7) & 0x01010101) * 27) ^ ((j & 0xff7f7f7f) << 1);
l = (((k >> 7) & 0x01010101) * 27) ^ ((k & 0xff7f7f7f) << 1);
m = (((l >> 7) & 0x01010101) * 27) ^ ((l & 0xff7f7f7f) << 1);
j ^= m;
......@@ -424,7 +380,7 @@ static void DecryptAES( struct aes_s *p_aes,
{
uint32_t p_wtxt[ 4 ]; /* Working cyphertext */
uint32_t p_tmp[ 4 ];
uint32_t round, t;
unsigned int i_round, t;
for( t = 0; t < 4; t++ )
{
......@@ -433,7 +389,7 @@ static void DecryptAES( struct aes_s *p_aes,
}
/* Rounds 0 - 8 */
for( round = 0; round < (AES_KEY_COUNT - 1); round++ )
for( i_round = 0; i_round < (AES_KEY_COUNT - 1); i_round++ )
{
for( t = 0; t < 4; t++ )
{
......@@ -443,7 +399,7 @@ static void DecryptAES( struct aes_s *p_aes,
for( t = 0; t < 4; t++ )
{
p_wtxt[ t ] = p_tmp[ t ]
^ p_aes->pp_dec_keys[ (AES_KEY_COUNT - 1) - round ][ t ];
^ p_aes->pp_dec_keys[ (AES_KEY_COUNT - 1) - i_round ][ t ];
}
}
......@@ -451,7 +407,7 @@ static void DecryptAES( struct aes_s *p_aes,
for( t = 0; t < 4; t++ )
{
p_dest[ t ] = AES_XOR_ROR( p_aes_decrypt, p_wtxt );
p_dest[ t ] ^= p_aes->pp_dec_keys[ (AES_KEY_COUNT - 1) - round ][ t ];
p_dest[ t ] ^= p_aes->pp_dec_keys[ 0 ][ t ];
}
}
......@@ -463,11 +419,11 @@ static void DecryptAES( struct aes_s *p_aes,
static void InitMD5( struct md5_s *p_md5 )
{
p_md5->p_digest[ 0 ] = 0x67452301;
p_md5->p_digest[ 1 ] = 0xEFCDAB89;
p_md5->p_digest[ 2 ] = 0x98BADCFE;
p_md5->p_digest[ 1 ] = 0xefcdab89;
p_md5->p_digest[ 2 ] = 0x98badcfe;
p_md5->p_digest[ 3 ] = 0x10325476;
memset( p_md5->p_data, 0, 16 * sizeof(uint32_t) );
memset( p_md5->p_data, 0, 64 );
p_md5->i_bits = 0;
}
......@@ -476,8 +432,8 @@ static void InitMD5( struct md5_s *p_md5 )
*****************************************************************************/
static void AddMD5( struct md5_s *p_md5, const uint8_t *p_src, uint32_t i_len )
{
uint32_t i_current; /* Current bytes in the spare buffer */
uint32_t i_offset = 0;
unsigned int i_current; /* Current bytes in the spare buffer */
unsigned int i_offset = 0;
i_current = (p_md5->i_bits / 8) & 63;
......@@ -500,7 +456,7 @@ static void AddMD5( struct md5_s *p_md5, const uint8_t *p_src, uint32_t i_len )
while( i_len >= 64 )
{
uint32_t p_tmp[ 16 ];
memcpy( p_tmp, p_src + i_offset, 16 * sizeof(uint32_t) );
memcpy( p_tmp, p_src + i_offset, 64 );
Digest( p_md5, p_tmp );
i_offset += 64;
i_len -= 64;
......@@ -510,33 +466,6 @@ static void AddMD5( struct md5_s *p_md5, const uint8_t *p_src, uint32_t i_len )
memcpy( ((uint8_t *)p_md5->p_data) + i_current, p_src + i_offset, i_len );
}
/*****************************************************************************
* AddNativeMD5: add i_len big-endian uin32_t to an MD5 message
*****************************************************************************
* FIXME: I don't really understand what this is supposed to do, especially
* with big values of i_len ...
*****************************************************************************/
static void AddNativeMD5( struct md5_s *p_md5, uint32_t *p_src, uint32_t i_len )
{
uint32_t i, x, y;
/* XXX: it's 32, not 16! */
uint32_t p_tmp[ 32 ];
/* Convert big endian p_src to native-endian p_tmp */
for( x = i_len; x; x -= y )
{
/* XXX: this looks weird! */
y = x > 32 ? 32 : x;
for( i = 0; i < y; i++ )
{
p_tmp[ i ] = U32_AT(p_src + i);
}
}
AddMD5( p_md5, (uint8_t *)p_tmp, i_len * sizeof(uint32_t) );
}
/*****************************************************************************
* EndMD5: finish an MD5 message
*****************************************************************************
......@@ -545,7 +474,7 @@ static void AddNativeMD5( struct md5_s *p_md5, uint32_t *p_src, uint32_t i_len )
*****************************************************************************/
static void EndMD5( struct md5_s *p_md5 )
{
uint32_t i_current;
unsigned int i_current;
i_current = (p_md5->i_bits / 8) & 63;
......@@ -674,54 +603,37 @@ static void Digest( struct md5_s *p_md5, const uint32_t *p_input )
*****************************************************************************/
static void InitShuffle( struct shuffle_s *p_shuffle, uint32_t *p_sys_key )
{
uint32_t p_native_key[ 4 ];
uint32_t i, i_seed = 0x5476212A; /* *!vT */
/* Store the system key in native endianness */
for( i = 0; i < 4; i++ )
{
p_native_key[ i ] = U32_AT(p_sys_key + i);
}
char p_secret1[] = "*!vT";
static char const p_secret2[] = "v8rhvsaAvOKMFfUH%798=[;."
"f8677680a634ba87fnOIf)(*";
unsigned int i;
/* Fill p_commands using the native key and our seed */
/* Fill p_commands using the key and a secret seed */
for( i = 0; i < 20; i++ )
{
struct md5_s md5;
/* Convert the secret to big endian */
uint32_t i_big_secret = U32_AT(p_secret1);
int32_t i_hash;
InitMD5( &md5 );
AddNativeMD5( &md5, p_native_key, 4 );
AddNativeMD5( &md5, &i_seed, 1 );
AddMD5( &md5, (uint8_t *)p_sys_key, 16 );
AddMD5( &md5, (uint8_t *)&i_big_secret, 4 );
EndMD5( &md5 );
i_seed++;
p_secret1[ 0 ]++;
i_hash = ((int32_t)U32_AT(md5.p_digest)) % 1024;
p_shuffle->p_commands[ i ] = i_hash < 0 ? i_hash * -1 : i_hash;
}
/* Fill p_bordel with completely meaningless initial values.
* FIXME: check endianness issues. */
p_shuffle->p_bordel[ 0 ] = p_native_key[ 0 ];
p_shuffle->p_bordel[ 1 ] = 0x68723876; /* v8rh */
p_shuffle->p_bordel[ 2 ] = 0x41617376; /* vsaA */
p_shuffle->p_bordel[ 3 ] = 0x4D4B4F76; /* voKM */
p_shuffle->p_bordel[ 4 ] = p_native_key[ 1 ];
p_shuffle->p_bordel[ 5 ] = 0x48556646; /* FfUH */
p_shuffle->p_bordel[ 6 ] = 0x38393725; /* %798 */
p_shuffle->p_bordel[ 7 ] = 0x2E3B5B3D; /* =[;. */
p_shuffle->p_bordel[ 8 ] = p_native_key[ 2 ];
p_shuffle->p_bordel[ 9 ] = 0x37363866; /* f867 */
p_shuffle->p_bordel[ 10 ] = 0x30383637; /* 7680 */
p_shuffle->p_bordel[ 11 ] = 0x34333661; /* a634 */
p_shuffle->p_bordel[ 12 ] = p_native_key[ 3 ];
p_shuffle->p_bordel[ 13 ] = 0x37386162; /* ba87 */
p_shuffle->p_bordel[ 14 ] = 0x494F6E66; /* fnOI */
p_shuffle->p_bordel[ 15 ] = 0x2A282966; /* f)(* */
/* Fill p_bordel with completely meaningless initial values. */
for( i = 0; i < 4; i++ )
{
p_shuffle->p_bordel[ 4 * i ] = U32_AT(p_sys_key + i);
memcpy( p_shuffle->p_bordel + 4 * i + 1, p_secret2 + 12 * i, 12 );
}
}
/*****************************************************************************
......@@ -734,19 +646,51 @@ static void DoShuffle( struct shuffle_s *p_shuffle,
uint8_t *p_buffer, uint32_t i_len )
{
struct md5_s md5;
uint32_t i;
uint32_t p_big_bordel[ 16 ];
uint32_t *p_bordel = p_shuffle->p_bordel;
unsigned int i;
/* Randomize p_bordel and compute its MD5 checksum */
/* Using the MD5 hash of a memory block is probably not one-way enough
* for the iTunes people. This function randomises p_bordel depending on
* the values in p_commands to make things even more messy in p_bordel. */
for( i = 0; i < 20; i++ )
{
if( p_shuffle->p_commands[ i ] )
uint8_t i_command, i_index;
if( !p_shuffle->p_commands[ i ] )
{
Bordelize( p_shuffle->p_bordel, p_shuffle->p_commands[ i ] );
continue;
}
i_command = (p_shuffle->p_commands[ i ] & 0x300) >> 8;
i_index = p_shuffle->p_commands[ i ] & 0xff;
switch( i_command )
{
case 0x3:
p_bordel[ i_index & 0xf ] = p_bordel[ i_index >> 4 ]
+ p_bordel[ ((i_index + 0x10) >> 4) & 0xf ];
break;
case 0x2:
p_bordel[ i_index >> 4 ] ^= p_shuffle_xor[ 0xff - i_index ];
break;
case 0x1:
p_bordel[ i_index >> 4 ] -= p_shuffle_sub[ 0xff - i_index ];
break;
default:
p_bordel[ i_index >> 4 ] += p_shuffle_add[ 0xff - i_index ];
break;
}
}
/* Convert our newly randomised p_bordel to big endianness and take
* its MD5 hash. */
InitMD5( &md5 );
AddNativeMD5( &md5, p_shuffle->p_bordel, 16 );
for( i = 0; i < 16; i++ )
{
p_big_bordel[ i ] = U32_AT(p_bordel + i);
}
AddMD5( &md5, (uint8_t *)p_big_bordel, 64 );
EndMD5( &md5 );
/* There are only 16 bytes in an MD5 hash */
......@@ -762,41 +706,6 @@ static void DoShuffle( struct shuffle_s *p_shuffle,
}
}
/*****************************************************************************
* Bordelize: helper for DoShuffle
*****************************************************************************
* Using the MD5 hash of a string is probably not one-way enough. This
* function randomises p_bordel depending on the value of i_command to make
* things even more messy in p_bordel.
*****************************************************************************/
static void Bordelize( uint32_t *p_bordel, uint32_t i_command )
{
uint32_t i, x;
i = (i_command / 16) & 15;
x = (~(i_command & 15)) & 15;
if( (i_command & 768) == 768 )
{
x = (~i) & 15;
i = i_command & 15;
p_bordel[ i ] = p_bordel[ ((16 - x) & 15) ] + p_bordel[ (15 - x) ];
}
else if( (i_command & 512) == 512 )
{
p_bordel[ i ] ^= p_shuffle_xor[ 15 - i ][ x ];
}
else if( (i_command & 256) == 256 )
{
p_bordel[ i ] -= p_shuffle_sub[ 15 - i ][ x ];
}
else
{
p_bordel[ i ] += p_shuffle_add[ 15 - i ][ x ];
}
}
/*****************************************************************************
* GetSystemKey: get the system key
*****************************************************************************
......@@ -804,28 +713,28 @@ static void Bordelize( uint32_t *p_bordel, uint32_t i_command )
*****************************************************************************/
static int GetSystemKey( uint32_t *p_sys_key )
{
static char const p_secret1[ 8 ] = "YuaFlafu";
static char const p_secret2[ 8 ] = "zPif98ga";
struct md5_s md5;
uint32_t p_tmp_key[ 4 ];
uint32_t p_system_hash[ 4 ];
InitMD5( &md5 );
if( HashSystemInfo( &md5 ) )
/* Compute the MD5 hash of our system info */
if( HashSystemInfo( p_system_hash ) )
{
return -1;
}
EndMD5( &md5 );
/* Write our digest to p_tmp_key */
memcpy( p_tmp_key, md5.p_digest, 4 * sizeof(uint32_t) );
/* Combine our system info hash with additional secret data. The resulting
* MD5 hash will be our system key. */
InitMD5( &md5 );
AddMD5( &md5, "YuaFlafu", 8 );
AddMD5( &md5, (uint8_t *)p_tmp_key, 6 );
AddMD5( &md5, (uint8_t *)p_tmp_key, 6 );
AddMD5( &md5, (uint8_t *)p_tmp_key, 6 );
AddMD5( &md5, "zPif98ga", 8 );
AddMD5( &md5, p_secret1, 8 );
AddMD5( &md5, (uint8_t *)p_system_hash, 6 );
AddMD5( &md5, (uint8_t *)p_system_hash, 6 );
AddMD5( &md5, (uint8_t *)p_system_hash, 6 );
AddMD5( &md5, p_secret2, 8 );
EndMD5( &md5 );
memcpy( p_sys_key, md5.p_digest, 4 * sizeof(uint32_t) );
memcpy( p_sys_key, md5.p_digest, 16 );
return 0;
}
......@@ -913,25 +822,18 @@ static int ReadUserKey( void *_p_drms, uint32_t *p_user_key )
*****************************************************************************/
static int GetUserKey( void *_p_drms, uint32_t *p_user_key )
{
static char const p_secret[] = "mUfnpognadfgf873";
struct drms_s *p_drms = (struct drms_s *)_p_drms;
struct aes_s aes;
struct shuffle_s shuffle;
uint32_t i, y;
uint32_t *p_tmp;
uint32_t *p_cur_key;
uint32_t *p_sci_data;
uint32_t p_sys_key[ 4 ];
uint32_t i_sci_size;
uint32_t *pp_sci[ 2 ];
uint32_t i_sci_size, i_blocks;
uint32_t *p_sci0, *p_sci1, *p_buffer;
uint32_t p_sci_key[ 4 ];
int i_ret = -1;
uint32_t p_sci_key[ 4 ] =
{
0x6e66556d, /* nfUm */
0x6e676f70, /* ngop */
0x67666461, /* gfda */
0x33373866 /* 378f */
};
if( !ReadUserKey( p_drms, p_user_key ) )
{
return 0;
......@@ -942,85 +844,93 @@ static int GetUserKey( void *_p_drms, uint32_t *p_user_key )
return -1;
}
if( GetSCIData( pp_sci + 0, &i_sci_size ) )
if( GetSCIData( &p_sci_data, &i_sci_size ) )
{
return -1;
}
p_tmp = pp_sci[ 0 ];
pp_sci[ 1 ] = (uint32_t *)(((uint8_t *)pp_sci[ 0 ]) + i_sci_size);
i_sci_size -= sizeof(*pp_sci[ 0 ]);
/* Phase 1: unscramble the SCI data using the system key and shuffle
* it using DoShuffle(). */
/* Skip the first 4 bytes (some sort of header). Decrypt the rest. */
i_blocks = (i_sci_size - 4) / 16;
p_buffer = p_sci_data + 1;
/* Decrypt and shuffle our data at the same time */
InitAES( &aes, p_sys_key );
InitShuffle( &shuffle, p_sys_key );
/* FIXME: check for endianness */
memcpy( p_sci_key, p_secret, 16 );
for( i = 0, p_cur_key = p_sci_key;
i < i_sci_size / sizeof(p_drms->p_key); i++ )
while( i_blocks-- )
{
y = i * sizeof(*pp_sci[ 0 ]);
uint32_t p_tmp[ 4 ];
DecryptAES( &aes, pp_sci[ 1 ] + y + 1, pp_sci[ 0 ] + y + 1 );
BlockXOR( pp_sci[ 1 ] + y + 1, p_cur_key, pp_sci[ 1 ] + y + 1 );
DecryptAES( &aes, p_tmp, p_buffer );
BlockXOR( p_tmp, p_sci_key, p_tmp );
p_cur_key = pp_sci[ 0 ] + y + 1;
}
/* Use the previous scrambled data as the key for next block */
memcpy( p_sci_key, p_buffer, 16 );
/* Shuffle pp_sci[ 1 ] using a custom routine */
InitShuffle( &shuffle, p_sys_key );
/* Shuffle the decrypted data using a custom routine */
DoShuffle( &shuffle, (uint8_t *)p_tmp, 16 );
for( i = 0; i < i_sci_size / sizeof(p_drms->p_key); i++ )
{
y = i * sizeof(*pp_sci[ 1 ]);
/* Copy this block back to p_buffer */
memcpy( p_buffer, p_tmp, 16 );
DoShuffle( &shuffle, (uint8_t *)(pp_sci[ 1 ] + y + 1),
sizeof(p_drms->p_key) );
p_buffer += 4;
}
/* Phase 2: look for the user key in the generated data. I must admit I
* do not understand what is going on here, because it almost
* looks like we are browsing data that makes sense, even though
* the DoShuffle() part made it completely meaningless. */
y = 0;
i = U32_AT( &pp_sci[ 1 ][ 5 ] );
i_sci_size -= 21 * sizeof(*pp_sci[ 1 ]);
pp_sci[ 1 ] += 22;
pp_sci[ 0 ] = NULL;
i = U32_AT( p_sci_data + 5 );
i_sci_size -= 22 * sizeof(uint32_t);
p_sci1 = p_sci_data + 22;
p_sci0 = NULL;
while( i_sci_size > 0 && i > 0 )
while( i_sci_size >= 20 && i > 0 )
{
if( pp_sci[ 0 ] == NULL )
if( p_sci0 == NULL )
{
i_sci_size -= 18 * sizeof(*pp_sci[ 1 ]);
if( i_sci_size <= 0 )
i_sci_size -= 18 * sizeof(uint32_t);
if( i_sci_size < 20 )
{
break;
}
pp_sci[ 0 ] = pp_sci[ 1 ];
y = U32_AT( &pp_sci[ 1 ][ 17 ] );
pp_sci[ 1 ] += 18;
p_sci0 = p_sci1;
y = U32_AT( p_sci1 + 17 );
p_sci1 += 18;
}
if( !y )
{
i--;
pp_sci[ 0 ] = NULL;
p_sci0 = NULL;
continue;
}
if( U32_AT( &pp_sci[ 0 ][ 0 ] ) == p_drms->i_user &&
( i_sci_size >=
(sizeof(p_drms->p_key) + sizeof(pp_sci[ 1 ][ 0 ]) ) ) &&
( ( U32_AT( &pp_sci[ 1 ][ 0 ] ) == p_drms->i_key ) ||
( !p_drms->i_key ) || ( pp_sci[ 1 ] == (pp_sci[ 0 ] + 18) ) ) )
if( U32_AT( p_sci0 ) == p_drms->i_user &&
( ( U32_AT( p_sci1 ) == p_drms->i_key ) ||
( !p_drms->i_key ) || ( p_sci1 == (p_sci0 + 18) ) ) )
{
memcpy( p_user_key, &pp_sci[ 1 ][ 1 ], sizeof(p_drms->p_key) );
memcpy( p_user_key, p_sci1 + 1, 16 );
WriteUserKey( p_drms, p_user_key );
i_ret = 0;
break;
}
y--;
pp_sci[ 1 ] += 5;
i_sci_size -= 5 * sizeof(*pp_sci[ 1 ]);
p_sci1 += 5;
i_sci_size -= 5 * sizeof(uint32_t);
}
free( (void *)p_tmp );
free( p_sci_data );
return i_ret;
}
......@@ -1030,7 +940,7 @@ static int GetUserKey( void *_p_drms, uint32_t *p_user_key )
*****************************************************************************
* Read SCI data from "\Apple Computer\iTunes\SC Info\SC Info.sidb"
*****************************************************************************/
static int GetSCIData( uint32_t **pp_sci, uint32_t *p_sci_size )
static int GetSCIData( uint32_t **pp_sci, uint32_t *pi_sci_size )
{
int i_ret = -1;
......@@ -1070,15 +980,15 @@ static int GetSCIData( uint32_t **pp_sci, uint32_t *p_sci_size )
{
i_size = GetFileSize( i_file, NULL );
if( i_size != INVALID_FILE_SIZE &&
i_size > (sizeof(*pp_sci[ 0 ]) * 22) )
i_size > (sizeof(uint32_t) * 22) )
{
*pp_sci = malloc( i_size * 2 );
*pp_sci = malloc( i_size );
if( *pp_sci != NULL )
{
if( ReadFile( i_file, *pp_sci, i_size, &i_read, NULL ) &&
i_read == i_size )
{
*p_sci_size = i_size;
*pi_sci_size = i_size;
i_ret = 0;
}
else
......@@ -1103,18 +1013,21 @@ static int GetSCIData( uint32_t **pp_sci, uint32_t *p_sci_size )
}
/*****************************************************************************
* HashSystemInfo: add system information to an MD5 hash
* HashSystemInfo: hash system information
*****************************************************************************
* This function adds the C: hard drive serial number, BIOS version, CPU type
* and Windows version to an MD5 hash.
* This function computes the MD5 hash of the C: hard drive serial number,
* BIOS version, CPU type and Windows version.
*****************************************************************************/
static int HashSystemInfo( struct md5_s *p_md5 )
static int HashSystemInfo( uint32_t *p_system_hash )
{
struct md5_s md5;
int i_ret = 0;
InitMD5( &md5 );
#ifdef WIN32
HKEY i_key;
uint32_t i;
unsigned int i;
DWORD i_size;
DWORD i_serial;
LPBYTE p_reg_buf;
......@@ -1137,14 +1050,14 @@ static int HashSystemInfo( struct md5_s *p_md5 )
}
};
AddMD5( p_md5, "cache-control", 13 );
AddMD5( p_md5, "Ethernet", 8 );
AddMD5( &md5, "cache-control", 13 );
AddMD5( &md5, "Ethernet", 8 );
GetVolumeInformation( _T("C:\\"), NULL, 0, &i_serial,
NULL, NULL, NULL, 0 );
AddMD5( p_md5, (uint8_t *)&i_serial, 4 );
AddMD5( &md5, (uint8_t *)&i_serial, 4 );
for( i = 0; i < sizeof(p_reg_keys)/sizeof(p_reg_keys[ 0 ]); i++ )
for( i = 0; i < sizeof(p_reg_keys) / sizeof(p_reg_keys[ 0 ]); i++ )
{
if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, p_reg_keys[ i ][ 0 ],
0, KEY_READ, &i_key ) != ERROR_SUCCESS )
......@@ -1167,7 +1080,7 @@ static int HashSystemInfo( struct md5_s *p_md5 )
NULL, NULL, p_reg_buf,
&i_size ) == ERROR_SUCCESS )
{
AddMD5( p_md5, (uint8_t *)p_reg_buf, i_size );
AddMD5( &md5, (uint8_t *)p_reg_buf, i_size );
}
free( p_reg_buf );
......@@ -1180,6 +1093,9 @@ static int HashSystemInfo( struct md5_s *p_md5 )
i_ret = -1;
#endif
EndMD5( &md5 );
memcpy( p_system_hash, md5.p_digest, 16 );
return i_ret;
}
......@@ -2,7 +2,7 @@
* drmstables.h : AES/Rijndael block cipher and miscellaneous tables
*****************************************************************************
* Copyright (C) 2004 VideoLAN
* $Id: drmstables.h,v 1.2 2004/01/16 18:26:57 sam Exp $
* $Id: drmstables.h,v 1.3 2004/01/18 01:21:33 sam Exp $
*
* Author: Jon Lech Johansen <jon-vl@nanocrew.net>
*
......@@ -31,399 +31,258 @@
#define AES_KEY_COUNT 10
static uint32_t p_aes_table[ AES_KEY_COUNT ] =
static uint32_t const p_aes_table[ AES_KEY_COUNT ] =
{
0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020,
0x00000040, 0x00000080, 0x0000001B, 0x00000036
0x00000040, 0x00000080, 0x0000001b, 0x00000036
};
static uint32_t p_aes_encrypt[ 256 ] =
static uint32_t const p_aes_encrypt[ 256 ] =
{
0x63000000, 0x7C000000, 0x77000000, 0x7B000000, 0xF2000000, 0x6B000000,
0x6F000000, 0xC5000000, 0x30000000, 0x01000000, 0x67000000, 0x2B000000,
0xFE000000, 0xD7000000, 0xAB000000, 0x76000000, 0xCA000000, 0x82000000,
0xC9000000, 0x7D000000, 0xFA000000, 0x59000000, 0x47000000, 0xF0000000,
0xAD000000, 0xD4000000, 0xA2000000, 0xAF000000, 0x9C000000, 0xA4000000,
0x72000000, 0xC0000000, 0xB7000000, 0xFD000000, 0x93000000, 0x26000000,
0x36000000, 0x3F000000, 0xF7000000, 0xCC000000, 0x34000000, 0xA5000000,
0xE5000000, 0xF1000000, 0x71000000, 0xD8000000, 0x31000000, 0x15000000,
0x04000000, 0xC7000000, 0x23000000, 0xC3000000, 0x18000000, 0x96000000,
0x05000000, 0x9A000000, 0x07000000, 0x12000000, 0x80000000, 0xE2000000,
0xEB000000, 0x27000000, 0xB2000000, 0x75000000, 0x09000000, 0x83000000,
0x2C000000, 0x1A000000, 0x1B000000, 0x6E000000, 0x5A000000, 0xA0000000,
0x52000000, 0x3B000000, 0xD6000000, 0xB3000000, 0x29000000, 0xE3000000,
0x2F000000, 0x84000000, 0x53000000, 0xD1000000, 0x00000000, 0xED000000,
0x20000000, 0xFC000000, 0xB1000000, 0x5B000000, 0x6A000000, 0xCB000000,
0xBE000000, 0x39000000, 0x4A000000, 0x4C000000, 0x58000000, 0xCF000000,
0xD0000000, 0xEF000000, 0xAA000000, 0xFB000000, 0x43000000, 0x4D000000,
0x33000000, 0x85000000, 0x45000000, 0xF9000000, 0x02000000, 0x7F000000,
0x50000000, 0x3C000000, 0x9F000000, 0xA8000000, 0x51000000, 0xA3000000,
0x40000000, 0x8F000000, 0x92000000, 0x9D000000, 0x38000000, 0xF5000000,
0xBC000000, 0xB6000000, 0xDA000000, 0x21000000, 0x10000000, 0xFF000000,
0xF3000000, 0xD2000000, 0xCD000000, 0x0C000000, 0x13000000, 0xEC000000,
0x5F000000, 0x97000000, 0x44000000, 0x17000000, 0xC4000000, 0xA7000000,
0x7E000000, 0x3D000000, 0x64000000, 0x5D000000, 0x19000000, 0x73000000,
0x60000000, 0x81000000, 0x4F000000, 0xDC000000, 0x22000000, 0x2A000000,
0x90000000, 0x88000000, 0x46000000, 0xEE000000, 0xB8000000, 0x14000000,
0xDE000000, 0x5E000000, 0x0B000000, 0xDB000000, 0xE0000000, 0x32000000,
0x3A000000, 0x0A000000, 0x49000000, 0x06000000, 0x24000000, 0x5C000000,
0xC2000000, 0xD3000000, 0xAC000000, 0x62000000, 0x91000000, 0x95000000,
0xE4000000, 0x79000000, 0xE7000000, 0xC8000000, 0x37000000, 0x6D000000,
0x8D000000, 0xD5000000, 0x4E000000, 0xA9000000, 0x6C000000, 0x56000000,
0xF4000000, 0xEA000000, 0x65000000, 0x7A000000, 0xAE000000, 0x08000000,
0xBA000000, 0x78000000, 0x25000000, 0x2E000000, 0x1C000000, 0xA6000000,
0xB4000000, 0xC6000000, 0xE8000000, 0xDD000000, 0x74000000, 0x1F000000,
0x4B000000, 0xBD000000, 0x8B000000, 0x8A000000, 0x70000000, 0x3E000000,
0xB5000000, 0x66000000, 0x48000000, 0x03000000, 0xF6000000, 0x0E000000,
0x61000000, 0x35000000, 0x57000000, 0xB9000000, 0x86000000, 0xC1000000,
0x1D000000, 0x9E000000, 0xE1000000, 0xF8000000, 0x98000000, 0x11000000,
0x69000000, 0xD9000000, 0x8E000000, 0x94000000, 0x9B000000, 0x1E000000,
0x87000000, 0xE9000000, 0xCE000000, 0x55000000, 0x28000000, 0xDF000000,
0x8C000000, 0xA1000000, 0x89000000, 0x0D000000, 0xBF000000, 0xE6000000,
0x42000000, 0x68000000, 0x41000000, 0x99000000, 0x2D000000, 0x0F000000,
0xB0000000, 0x54000000, 0xBB000000, 0x16000000
0x63000000, 0x7c000000, 0x77000000, 0x7b000000, 0xf2000000, 0x6b000000,
0x6f000000, 0xc5000000, 0x30000000, 0x01000000, 0x67000000, 0x2b000000,
0xfe000000, 0xd7000000, 0xab000000, 0x76000000, 0xca000000, 0x82000000,
0xc9000000, 0x7d000000, 0xfa000000, 0x59000000, 0x47000000, 0xf0000000,
0xad000000, 0xd4000000, 0xa2000000, 0xaf000000, 0x9c000000, 0xa4000000,
0x72000000, 0xc0000000, 0xb7000000, 0xfd000000, 0x93000000, 0x26000000,
0x36000000, 0x3f000000, 0xf7000000, 0xcc000000, 0x34000000, 0xa5000000,
0xe5000000, 0xf1000000, 0x71000000, 0xd8000000, 0x31000000, 0x15000000,
0x04000000, 0xc7000000, 0x23000000, 0xc3000000, 0x18000000, 0x96000000,
0x05000000, 0x9a000000, 0x07000000, 0x12000000, 0x80000000, 0xe2000000,
0xeb000000, 0x27000000, 0xb2000000, 0x75000000, 0x09000000, 0x83000000,
0x2c000000, 0x1a000000, 0x1b000000, 0x6e000000, 0x5a000000, 0xa0000000,
0x52000000, 0x3b000000, 0xd6000000, 0xb3000000, 0x29000000, 0xe3000000,
0x2f000000, 0x84000000, 0x53000000, 0xd1000000, 0x00000000, 0xed000000,
0x20000000, 0xfc000000, 0xb1000000, 0x5b000000, 0x6a000000, 0xcb000000,
0xbe000000, 0x39000000, 0x4a000000, 0x4c000000, 0x58000000, 0xcf000000,
0xd0000000, 0xef000000, 0xaa000000, 0xfb000000, 0x43000000, 0x4d000000,
0x33000000, 0x85000000, 0x45000000, 0xf9000000, 0x02000000, 0x7f000000,
0x50000000, 0x3c000000, 0x9f000000, 0xa8000000, 0x51000000, 0xa3000000,
0x40000000, 0x8f000000, 0x92000000, 0x9d000000, 0x38000000, 0xf5000000,
0xbc000000, 0xb6000000, 0xda000000, 0x21000000, 0x10000000, 0xff000000,
0xf3000000, 0xd2000000, 0xcd000000, 0x0c000000, 0x13000000, 0xec000000,
0x5f000000, 0x97000000, 0x44000000, 0x17000000, 0xc4000000, 0xa7000000,
0x7e000000, 0x3d000000, 0x64000000, 0x5d000000, 0x19000000, 0x73000000,
0x60000000, 0x81000000, 0x4f000000, 0xdc000000, 0x22000000, 0x2a000000,
0x90000000, 0x88000000, 0x46000000, 0xee000000, 0xb8000000, 0x14000000,
0xde000000, 0x5e000000, 0x0b000000, 0xdb000000, 0xe0000000, 0x32000000,
0x3a000000, 0x0a000000, 0x49000000, 0x06000000, 0x24000000, 0x5c000000,
0xc2000000, 0xd3000000, 0xac000000, 0x62000000, 0x91000000, 0x95000000,
0xe4000000, 0x79000000, 0xe7000000, 0xc8000000, 0x37000000, 0x6d000000,
0x8d000000, 0xd5000000, 0x4e000000, 0xa9000000, 0x6c000000, 0x56000000,
0xf4000000, 0xea000000, 0x65000000, 0x7a000000, 0xae000000, 0x08000000,
0xba000000, 0x78000000, 0x25000000, 0x2e000000, 0x1c000000, 0xa6000000,
0xb4000000, 0xc6000000, 0xe8000000, 0xdd000000, 0x74000000, 0x1f000000,
0x4b000000, 0xbd000000, 0x8b000000, 0x8a000000, 0x70000000, 0x3e000000,
0xb5000000, 0x66000000, 0x48000000, 0x03000000, 0xf6000000, 0x0e000000,
0x61000000, 0x35000000, 0x57000000, 0xb9000000, 0x86000000, 0xc1000000,
0x1d000000, 0x9e000000, 0xe1000000, 0xf8000000, 0x98000000, 0x11000000,
0x69000000, 0xd9000000, 0x8e000000, 0x94000000, 0x9b000000, 0x1e000000,
0x87000000, 0xe9000000, 0xce000000, 0x55000000, 0x28000000, 0xdf000000,
0x8c000000, 0xa1000000, 0x89000000, 0x0d000000, 0xbf000000, 0xe6000000,
0x42000000, 0x68000000, 0x41000000, 0x99000000, 0x2d000000, 0x0f000000,
0xb0000000, 0x54000000, 0xbb000000, 0x16000000
};
static uint32_t p_aes_itable[ 256 ] =
static uint32_t const p_aes_itable[ 256 ] =
{
0x5150A7F4, 0x7E536541, 0x1AC3A417, 0x3A965E27, 0x3BCB6BAB, 0x1FF1459D,
0xACAB58FA, 0x4B9303E3, 0x2055FA30, 0xADF66D76, 0x889176CC, 0xF5254C02,
0x4FFCD7E5, 0xC5D7CB2A, 0x26804435, 0xB58FA362, 0xDE495AB1, 0x25671BBA,
0x45980EEA, 0x5DE1C0FE, 0xC302752F, 0x8112F04C, 0x8DA39746, 0x6BC6F9D3,
0x03E75F8F, 0x15959C92, 0xBFEB7A6D, 0x95DA5952, 0xD42D83BE, 0x58D32174,
0x492969E0, 0x8E44C8C9, 0x756A89C2, 0xF478798E, 0x996B3E58, 0x27DD71B9,
0xBEB64FE1, 0xF017AD88, 0xC966AC20, 0x7DB43ACE, 0x63184ADF, 0xE582311A,
0x97603351, 0x62457F53, 0xB1E07764, 0xBB84AE6B, 0xFE1CA081, 0xF9942B08,
0x70586848, 0x8F19FD45, 0x94876CDE, 0x52B7F87B, 0xAB23D373, 0x72E2024B,
0xE3578F1F, 0x662AAB55, 0xB20728EB, 0x2F03C2B5, 0x869A7BC5, 0xD3A50837,
0x30F28728, 0x23B2A5BF, 0x02BA6A03, 0xED5C8216, 0x8A2B1CCF, 0xA792B479,
0xF3F0F207, 0x4EA1E269, 0x65CDF4DA, 0x06D5BE05, 0xD11F6234, 0xC48AFEA6,
0x349D532E, 0xA2A055F3, 0x0532E18A, 0xA475EBF6, 0x0B39EC83, 0x40AAEF60,
0x5E069F71, 0xBD51106E, 0x3EF98A21, 0x963D06DD, 0xDDAE053E, 0x4D46BDE6,
0x91B58D54, 0x71055DC4, 0x046FD406, 0x60FF1550, 0x1924FB98, 0xD697E9BD,
0x89CC4340, 0x67779ED9, 0xB0BD42E8, 0x07888B89, 0xE7385B19, 0x79DBEEC8,
0xA1470A7C, 0x7CE90F42, 0xF8C91E84, 0x00000000, 0x09838680, 0x3248ED2B,
0x1EAC7011, 0x6C4E725A, 0xFDFBFF0E, 0x0F563885, 0x3D1ED5AE, 0x3627392D,
0x0A64D90F, 0x6821A65C, 0x9BD1545B, 0x243A2E36, 0x0CB1670A, 0x930FE757,
0xB4D296EE, 0x1B9E919B, 0x804FC5C0, 0x61A220DC, 0x5A694B77, 0x1C161A12,
0xE20ABA93, 0xC0E52AA0, 0x3C43E022, 0x121D171B, 0x0E0B0D09, 0xF2ADC78B,
0x2DB9A8B6, 0x14C8A91E, 0x578519F1, 0xAF4C0775, 0xEEBBDD99, 0xA3FD607F,
0xF79F2601, 0x5CBCF572, 0x44C53B66, 0x5B347EFB, 0x8B762943, 0xCBDCC623,
0xB668FCED, 0xB863F1E4, 0xD7CADC31, 0x42108563, 0x13402297, 0x842011C6,
0x857D244A, 0xD2F83DBB, 0xAE1132F9, 0xC76DA129, 0x1D4B2F9E, 0xDCF330B2,
0x0DEC5286, 0x77D0E3C1, 0x2B6C16B3, 0xA999B970, 0x11FA4894, 0x472264E9,
0xA8C48CFC, 0xA01A3FF0, 0x56D82C7D, 0x22EF9033, 0x87C74E49, 0xD9C1D138,
0x8CFEA2CA, 0x98360BD4, 0xA6CF81F5, 0xA528DE7A, 0xDA268EB7, 0x3FA4BFAD,
0x2CE49D3A, 0x500D9278, 0x6A9BCC5F, 0x5462467E, 0xF6C2138D, 0x90E8B8D8,
0x2E5EF739, 0x82F5AFC3, 0x9FBE805D, 0x697C93D0, 0x6FA92DD5, 0xCFB31225,
0xC83B99AC, 0x10A77D18, 0xE86E639C, 0xDB7BBB3B, 0xCD097826, 0x6EF41859,
0xEC01B79A, 0x83A89A4F, 0xE6656E95, 0xAA7EE6FF, 0x2108CFBC, 0xEFE6E815,
0xBAD99BE7, 0x4ACE366F, 0xEAD4099F, 0x29D67CB0, 0x31AFB2A4, 0x2A31233F,
0xC63094A5, 0x35C066A2, 0x7437BC4E, 0xFCA6CA82, 0xE0B0D090, 0x3315D8A7,
0xF14A9804, 0x41F7DAEC, 0x7F0E50CD, 0x172FF691, 0x768DD64D, 0x434DB0EF,
0xCC544DAA, 0xE4DF0496, 0x9EE3B5D1, 0x4C1B886A, 0xC1B81F2C, 0x467F5165,
0x9D04EA5E, 0x015D358C, 0xFA737487, 0xFB2E410B, 0xB35A1D67, 0x9252D2DB,
0xE9335610, 0x6D1347D6, 0x9A8C61D7, 0x377A0CA1, 0x598E14F8, 0xEB893C13,
0xCEEE27A9, 0xB735C961, 0xE1EDE51C, 0x7A3CB147, 0x9C59DFD2, 0x553F73F2,
0x1879CE14, 0x73BF37C7, 0x53EACDF7, 0x5F5BAAFD, 0xDF146F3D, 0x7886DB44,
0xCA81F3AF, 0xB93EC468, 0x382C3424, 0xC25F40A3, 0x1672C31D, 0xBC0C25E2,
0x288B493C, 0xFF41950D, 0x397101A8, 0x08DEB30C, 0xD89CE4B4, 0x6490C156,
0x7B6184CB, 0xD570B632, 0x48745C6C, 0xD04257B8
0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27, 0x3bcb6bab, 0x1ff1459d,
0xacab58fa, 0x4b9303e3, 0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02,
0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362, 0xde495ab1, 0x25671bba,
0x45980eea, 0x5de1c0fe, 0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3,
0x03e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952, 0xd42d83be, 0x58d32174,
0x492969e0, 0x8e44c8c9, 0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9,
0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace, 0x63184adf, 0xe582311a,
0x97603351, 0x62457f53, 0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08,
0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b, 0xab23d373, 0x72e2024b,
0xe3578f1f, 0x662aab55, 0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837,
0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216, 0x8a2b1ccf, 0xa792b479,
0xf3f0f207, 0x4ea1e269, 0x65cdf4da, 0x06d5be05, 0xd11f6234, 0xc48afea6,
0x349d532e, 0xa2a055f3, 0x0532e18a, 0xa475ebf6, 0x0b39ec83, 0x40aaef60,
0x5e069f71, 0xbd51106e, 0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6,
0x91b58d54, 0x71055dc4, 0x046fd406, 0x60ff1550, 0x1924fb98, 0xd697e9bd,
0x89cc4340, 0x67779ed9, 0xb0bd42e8, 0x07888b89, 0xe7385b19, 0x79dbeec8,
0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000, 0x09838680, 0x3248ed2b,
0x1eac7011, 0x6c4e725a, 0xfdfbff0e, 0x0f563885, 0x3d1ed5ae, 0x3627392d,
0x0a64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36, 0x0cb1670a, 0x930fe757,
0xb4d296ee, 0x1b9e919b, 0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12,
0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b, 0x0e0b0d09, 0xf2adc78b,
0x2db9a8b6, 0x14c8a91e, 0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f,
0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb, 0x8b762943, 0xcbdcc623,
0xb668fced, 0xb863f1e4, 0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6,
0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129, 0x1d4b2f9e, 0xdcf330b2,
0x0dec5286, 0x77d0e3c1, 0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9,
0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033, 0x87c74e49, 0xd9c1d138,
0x8cfea2ca, 0x98360bd4, 0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad,
0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e, 0xf6c2138d, 0x90e8b8d8,
0x2e5ef739, 0x82f5afc3, 0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225,
0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b, 0xcd097826, 0x6ef41859,
0xec01b79a, 0x83a89a4f, 0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815,
0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0, 0x31afb2a4, 0x2a31233f,
0xc63094a5, 0x35c066a2, 0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7,
0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691, 0x768dd64d, 0x434db0ef,
0xcc544daa, 0xe4df0496, 0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165,
0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b, 0xb35a1d67, 0x9252d2db,
0xe9335610, 0x6d1347d6, 0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13,
0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147, 0x9c59dfd2, 0x553f73f2,
0x1879ce14, 0x73bf37c7, 0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3, 0x1672c31d, 0xbc0c25e2,
0x288b493c, 0xff41950d, 0x397101a8, 0x08deb30c, 0xd89ce4b4, 0x6490c156,
0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8
};
static uint32_t p_aes_decrypt[ 256 ] =
static uint32_t const p_aes_decrypt[ 256 ] =
{
0x52000000, 0x09000000, 0x6A000000, 0xD5000000, 0x30000000, 0x36000000,
0xA5000000, 0x38000000, 0xBF000000, 0x40000000, 0xA3000000, 0x9E000000,
0x81000000, 0xF3000000, 0xD7000000, 0xFB000000, 0x7C000000, 0xE3000000,
0x39000000, 0x82000000, 0x9B000000, 0x2F000000, 0xFF000000, 0x87000000,
0x34000000, 0x8E000000, 0x43000000, 0x44000000, 0xC4000000, 0xDE000000,
0xE9000000, 0xCB000000, 0x54000000, 0x7B000000, 0x94000000, 0x32000000,
0xA6000000, 0xC2000000, 0x23000000, 0x3D000000, 0xEE000000, 0x4C000000,
0x95000000, 0x0B000000, 0x42000000, 0xFA000000, 0xC3000000, 0x4E000000,
0x08000000, 0x2E000000, 0xA1000000, 0x66000000, 0x28000000, 0xD9000000,
0x24000000, 0xB2000000, 0x76000000, 0x5B000000, 0xA2000000, 0x49000000,
0x6D000000, 0x8B000000, 0xD1000000, 0x25000000, 0x72000000, 0xF8000000,
0xF6000000, 0x64000000, 0x86000000, 0x68000000, 0x98000000, 0x16000000,
0xD4000000, 0xA4000000, 0x5C000000, 0xCC000000, 0x5D000000, 0x65000000,
0xB6000000, 0x92000000, 0x6C000000, 0x70000000, 0x48000000, 0x50000000,
0xFD000000, 0xED000000, 0xB9000000, 0xDA000000, 0x5E000000, 0x15000000,
0x46000000, 0x57000000, 0xA7000000, 0x8D000000, 0x9D000000, 0x84000000,
0x90000000, 0xD8000000, 0xAB000000, 0x00000000, 0x8C000000, 0xBC000000,
0xD3000000, 0x0A000000, 0xF7000000, 0xE4000000, 0x58000000, 0x05000000,
0xB8000000, 0xB3000000, 0x45000000, 0x06000000, 0xD0000000, 0x2C000000,
0x1E000000, 0x8F000000, 0xCA000000, 0x3F000000, 0x0F000000, 0x02000000,
0xC1000000, 0xAF000000, 0xBD000000, 0x03000000, 0x01000000, 0x13000000,
0x8A000000, 0x6B000000, 0x3A000000, 0x91000000, 0x11000000, 0x41000000,
0x4F000000, 0x67000000, 0xDC000000, 0xEA000000, 0x97000000, 0xF2000000,
0xCF000000, 0xCE000000, 0xF0000000, 0xB4000000, 0xE6000000, 0x73000000,
0x96000000, 0xAC000000, 0x74000000, 0x22000000, 0xE7000000, 0xAD000000,
0x35000000, 0x85000000, 0xE2000000, 0xF9000000, 0x37000000, 0xE8000000,
0x1C000000, 0x75000000, 0xDF000000, 0x6E000000, 0x47000000, 0xF1000000,
0x1A000000, 0x71000000, 0x1D000000, 0x29000000, 0xC5000000, 0x89000000,
0x6F000000, 0xB7000000, 0x62000000, 0x0E000000, 0xAA000000, 0x18000000,
0xBE000000, 0x1B000000, 0xFC000000, 0x56000000, 0x3E000000, 0x4B000000,
0xC6000000, 0xD2000000, 0x79000000, 0x20000000, 0x9A000000, 0xDB000000,
0xC0000000, 0xFE000000, 0x78000000, 0xCD000000, 0x5A000000, 0xF4000000,
0x1F000000, 0xDD000000, 0xA8000000, 0x33000000, 0x88000000, 0x07000000,
0xC7000000, 0x31000000, 0xB1000000, 0x12000000, 0x10000000, 0x59000000,
0x27000000, 0x80000000, 0xEC000000, 0x5F000000, 0x60000000, 0x51000000,
0x7F000000, 0xA9000000, 0x19000000, 0xB5000000, 0x4A000000, 0x0D000000,
0x2D000000, 0xE5000000, 0x7A000000, 0x9F000000, 0x93000000, 0xC9000000,
0x9C000000, 0xEF000000, 0xA0000000, 0xE0000000, 0x3B000000, 0x4D000000,
0xAE000000, 0x2A000000, 0xF5000000, 0xB0000000, 0xC8000000, 0xEB000000,
0xBB000000, 0x3C000000, 0x83000000, 0x53000000, 0x99000000, 0x61000000,
0x17000000, 0x2B000000, 0x04000000, 0x7E000000, 0xBA000000, 0x77000000,
0xD6000000, 0x26000000, 0xE1000000, 0x69000000, 0x14000000, 0x63000000,
0x55000000, 0x21000000, 0x0C000000, 0x7D000000
0x52000000, 0x09000000, 0x6a000000, 0xd5000000, 0x30000000, 0x36000000,
0xa5000000, 0x38000000, 0xbf000000, 0x40000000, 0xa3000000, 0x9e000000,
0x81000000, 0xf3000000, 0xd7000000, 0xfb000000, 0x7c000000, 0xe3000000,
0x39000000, 0x82000000, 0x9b000000, 0x2f000000, 0xff000000, 0x87000000,
0x34000000, 0x8e000000, 0x43000000, 0x44000000, 0xc4000000, 0xde000000,
0xe9000000, 0xcb000000, 0x54000000, 0x7b000000, 0x94000000, 0x32000000,
0xa6000000, 0xc2000000, 0x23000000, 0x3d000000, 0xee000000, 0x4c000000,
0x95000000, 0x0b000000, 0x42000000, 0xfa000000, 0xc3000000, 0x4e000000,
0x08000000, 0x2e000000, 0xa1000000, 0x66000000, 0x28000000, 0xd9000000,
0x24000000, 0xb2000000, 0x76000000, 0x5b000000, 0xa2000000, 0x49000000,
0x6d000000, 0x8b000000, 0xd1000000, 0x25000000, 0x72000000, 0xf8000000,
0xf6000000, 0x64000000, 0x86000000, 0x68000000, 0x98000000, 0x16000000,
0xd4000000, 0xa4000000, 0x5c000000, 0xcc000000, 0x5d000000, 0x65000000,
0xb6000000, 0x92000000, 0x6c000000, 0x70000000, 0x48000000, 0x50000000,
0xfd000000, 0xed000000, 0xb9000000, 0xda000000, 0x5e000000, 0x15000000,
0x46000000, 0x57000000, 0xa7000000, 0x8d000000, 0x9d000000, 0x84000000,
0x90000000, 0xd8000000, 0xab000000, 0x00000000, 0x8c000000, 0xbc000000,
0xd3000000, 0x0a000000, 0xf7000000, 0xe4000000, 0x58000000, 0x05000000,
0xb8000000, 0xb3000000, 0x45000000, 0x06000000, 0xd0000000, 0x2c000000,
0x1e000000, 0x8f000000, 0xca000000, 0x3f000000, 0x0f000000, 0x02000000,
0xc1000000, 0xaf000000, 0xbd000000, 0x03000000, 0x01000000, 0x13000000,
0x8a000000, 0x6b000000, 0x3a000000, 0x91000000, 0x11000000, 0x41000000,
0x4f000000, 0x67000000, 0xdc000000, 0xea000000, 0x97000000, 0xf2000000,
0xcf000000, 0xce000000, 0xf0000000, 0xb4000000, 0xe6000000, 0x73000000,
0x96000000, 0xac000000, 0x74000000, 0x22000000, 0xe7000000, 0xad000000,
0x35000000, 0x85000000, 0xe2000000, 0xf9000000, 0x37000000, 0xe8000000,
0x1c000000, 0x75000000, 0xdf000000, 0x6e000000, 0x47000000, 0xf1000000,
0x1a000000, 0x71000000, 0x1d000000, 0x29000000, 0xc5000000, 0x89000000,
0x6f000000, 0xb7000000, 0x62000000, 0x0e000000, 0xaa000000, 0x18000000,
0xbe000000, 0x1b000000, 0xfc000000, 0x56000000, 0x3e000000, 0x4b000000,
0xc6000000, 0xd2000000, 0x79000000, 0x20000000, 0x9a000000, 0xdb000000,
0xc0000000, 0xfe000000, 0x78000000, 0xcd000000, 0x5a000000, 0xf4000000,
0x1f000000, 0xdd000000, 0xa8000000, 0x33000000, 0x88000000, 0x07000000,
0xc7000000, 0x31000000, 0xb1000000, 0x12000000, 0x10000000, 0x59000000,
0x27000000, 0x80000000, 0xec000000, 0x5f000000, 0x60000000, 0x51000000,
0x7f000000, 0xa9000000, 0x19000000, 0xb5000000, 0x4a000000, 0x0d000000,
0x2d000000, 0xe5000000, 0x7a000000, 0x9f000000, 0x93000000, 0xc9000000,
0x9c000000, 0xef000000, 0xa0000000, 0xe0000000, 0x3b000000, 0x4d000000,
0xae000000, 0x2a000000, 0xf5000000, 0xb0000000, 0xc8000000, 0xeb000000,
0xbb000000, 0x3c000000, 0x83000000, 0x53000000, 0x99000000, 0x61000000,
0x17000000, 0x2b000000, 0x04000000, 0x7e000000, 0xba000000, 0x77000000,
0xd6000000, 0x26000000, 0xe1000000, 0x69000000, 0x14000000, 0x63000000,
0x55000000, 0x21000000, 0x0c000000, 0x7d000000
};
static uint16_t p_shuffle_xor[ 16 ][ 16 ] =
static uint16_t const p_shuffle_xor[ 256 ] =
{
{
0x00D1, 0x0315, 0x1A32, 0x19EC, 0x1BBB, 0x1D6F, 0x14FE, 0x0E9E,
0x029E, 0x1B8F, 0x0B70, 0x033A, 0x188E, 0x1D18, 0x0BD8, 0x0EDB
},
{
0x0C64, 0x1C2B, 0x149C, 0x047B, 0x1064, 0x1C7C, 0x118D, 0x1355,
0x0AE5, 0x0F18, 0x016F, 0x17D6, 0x1595, 0x0084, 0x0616, 0x1CCD
},
{
0x1D94, 0x0618, 0x182C, 0x195B, 0x196D, 0x0394, 0x07DB, 0x0287,
0x1636, 0x0B81, 0x1519, 0x0DF9, 0x1BA3, 0x1CC3, 0x0EE2, 0x1434
},
{
0x1457, 0x0CED, 0x0F7D, 0x0D7B, 0x0B9E, 0x0D13, 0x13D7, 0x18D0,
0x1259, 0x1977, 0x0606, 0x1E80, 0x05F2, 0x06B8, 0x1F07, 0x1365
},
{
0x0334, 0x0E30, 0x195F, 0x15F1, 0x058E, 0x0AA8, 0x045A, 0x0465,
0x0B3E, 0x071E, 0x0A36, 0x105C, 0x01AC, 0x1A1E, 0x04E4, 0x056B
},
{
0x12BF, 0x0DA2, 0x0B41, 0x0EAF, 0x034F, 0x0181, 0x04E2, 0x002B,
0x12E6, 0x01BE, 0x10E8, 0x128F, 0x0EB2, 0x1369, 0x05BE, 0x1A59
},
{
0x117E, 0x047C, 0x1E86, 0x056A, 0x0DA7, 0x0D61, 0x03FC, 0x1E6E,
0x1D0C, 0x1E6D, 0x14BF, 0x0C50, 0x063A, 0x1B47, 0x17AE, 0x1321
},
{
0x041B, 0x0A24, 0x0D4D, 0x1F2B, 0x1CB6, 0x1BED, 0x1549, 0x03A7,
0x0254, 0x006C, 0x0C9E, 0x0F73, 0x006C, 0x0008, 0x11F9, 0x0DD5
},
{
0x0BCF, 0x0AF9, 0x1DFE, 0x0341, 0x0E49, 0x0D38, 0x17CB, 0x1513,
0x0E96, 0x00ED, 0x0556, 0x1B28, 0x100C, 0x19D8, 0x14FA, 0x028C
},
{
0x1C60, 0x1232, 0x13D3, 0x0D00, 0x1534, 0x192C, 0x14B5, 0x1CF2,
0x0504, 0x0B5B, 0x1ECF, 0x0423, 0x183B, 0x06B0, 0x169E, 0x1066
},
{
0x04CB, 0x08A2, 0x1B4A, 0x1254, 0x198D, 0x1044, 0x0236, 0x1BD8,
0x18A1, 0x03FF, 0x1A0D, 0x0277, 0x0C2D, 0x17C9, 0x007C, 0x116E
},
{
0x048A, 0x1EAF, 0x0922, 0x0C45, 0x0766, 0x1E5F, 0x1A28, 0x0120,
0x1C15, 0x034C, 0x0508, 0x0E73, 0x0879, 0x0441, 0x09AE, 0x132F
},
{
0x14FE, 0x0413, 0x0A9D, 0x1727, 0x01D7, 0x1A2B, 0x0474, 0x18F0,
0x1F3B, 0x14F5, 0x1071, 0x0895, 0x1071, 0x18FF, 0x18E3, 0x0EB9
},
{
0x0BA9, 0x0961, 0x1599, 0x019E, 0x1D12, 0x1BAA, 0x1E94, 0x1921,
0x14DC, 0x124E, 0x0A25, 0x03AB, 0x1CC0, 0x1EBB, 0x0B4B, 0x16E5
},
{
0x11EA, 0x0D78, 0x1BB3, 0x1BA7, 0x1510, 0x1B7B, 0x0C64, 0x1995,
0x1A58, 0x1651, 0x1964, 0x147A, 0x15F2, 0x11BB, 0x1654, 0x166E
},
{
0x0EA9, 0x1DE1, 0x1443, 0x13C5, 0x00E1, 0x0B2F, 0x0B6F, 0x0A37,
0x18AC, 0x08E6, 0x06F0, 0x136E, 0x0853, 0x0B2E, 0x0813, 0x10D6
}
0x00d1, 0x0315, 0x1a32, 0x19ec, 0x1bbb, 0x1d6f, 0x14fe, 0x0e9e,
0x029e, 0x1b8f, 0x0b70, 0x033a, 0x188e, 0x1d18, 0x0bd8, 0x0edb,
0x0c64, 0x1c2b, 0x149c, 0x047b, 0x1064, 0x1c7c, 0x118d, 0x1355,
0x0ae5, 0x0f18, 0x016f, 0x17d6, 0x1595, 0x0084, 0x0616, 0x1ccd,
0x1d94, 0x0618, 0x182c, 0x195b, 0x196d, 0x0394, 0x07db, 0x0287,
0x1636, 0x0b81, 0x1519, 0x0df9, 0x1ba3, 0x1cc3, 0x0ee2, 0x1434,
0x1457, 0x0ced, 0x0f7d, 0x0d7b, 0x0b9e, 0x0d13, 0x13d7, 0x18d0,
0x1259, 0x1977, 0x0606, 0x1e80, 0x05f2, 0x06b8, 0x1f07, 0x1365,
0x0334, 0x0e30, 0x195f, 0x15f1, 0x058e, 0x0aa8, 0x045a, 0x0465,
0x0b3e, 0x071e, 0x0a36, 0x105c, 0x01ac, 0x1a1e, 0x04e4, 0x056b,
0x12bf, 0x0da2, 0x0b41, 0x0eaf, 0x034f, 0x0181, 0x04e2, 0x002b,
0x12e6, 0x01be, 0x10e8, 0x128f, 0x0eb2, 0x1369, 0x05be, 0x1a59,
0x117e, 0x047c, 0x1e86, 0x056a, 0x0da7, 0x0d61, 0x03fc, 0x1e6e,
0x1d0c, 0x1e6d, 0x14bf, 0x0c50, 0x063a, 0x1b47, 0x17ae, 0x1321,
0x041b, 0x0a24, 0x0d4d, 0x1f2b, 0x1cb6, 0x1bed, 0x1549, 0x03a7,
0x0254, 0x006c, 0x0c9e, 0x0f73, 0x006c, 0x0008, 0x11f9, 0x0dd5,
0x0bcf, 0x0af9, 0x1dfe, 0x0341, 0x0e49, 0x0d38, 0x17cb, 0x1513,
0x0e96, 0x00ed, 0x0556, 0x1b28, 0x100c, 0x19d8, 0x14fa, 0x028c,
0x1c60, 0x1232, 0x13d3, 0x0d00, 0x1534, 0x192c, 0x14b5, 0x1cf2,
0x0504, 0x0b5b, 0x1ecf, 0x0423, 0x183b, 0x06b0, 0x169e, 0x1066,
0x04cb, 0x08a2, 0x1b4a, 0x1254, 0x198d, 0x1044, 0x0236, 0x1bd8,
0x18a1, 0x03ff, 0x1a0d, 0x0277, 0x0c2d, 0x17c9, 0x007c, 0x116e,
0x048a, 0x1eaf, 0x0922, 0x0c45, 0x0766, 0x1e5f, 0x1a28, 0x0120,
0x1c15, 0x034c, 0x0508, 0x0e73, 0x0879, 0x0441, 0x09ae, 0x132f,
0x14fe, 0x0413, 0x0a9d, 0x1727, 0x01d7, 0x1a2b, 0x0474, 0x18f0,
0x1f3b, 0x14f5, 0x1071, 0x0895, 0x1071, 0x18ff, 0x18e3, 0x0eb9,
0x0ba9, 0x0961, 0x1599, 0x019e, 0x1d12, 0x1baa, 0x1e94, 0x1921,
0x14dc, 0x124e, 0x0a25, 0x03ab, 0x1cc0, 0x1ebb, 0x0b4b, 0x16e5,
0x11ea, 0x0d78, 0x1bb3, 0x1ba7, 0x1510, 0x1b7b, 0x0c64, 0x1995,
0x1a58, 0x1651, 0x1964, 0x147a, 0x15f2, 0x11bb, 0x1654, 0x166e,
0x0ea9, 0x1de1, 0x1443, 0x13c5, 0x00e1, 0x0b2f, 0x0b6f, 0x0a37,
0x18ac, 0x08e6, 0x06f0, 0x136e, 0x0853, 0x0b2e, 0x0813, 0x10d6
};
static uint16_t p_shuffle_sub[ 16 ][ 16 ] =
static uint16_t const p_shuffle_sub[ 256 ] =
{
{
0x067A, 0x0C7D, 0x0B4F, 0x127D, 0x0BD6, 0x04AC, 0x16E0, 0x1730,
0x0587, 0x0AFB, 0x1AC3, 0x0120, 0x14B5, 0x0F67, 0x11DE, 0x0961
},
{
0x1127, 0x1A68, 0x07F0, 0x17D0, 0x1A6F, 0x1F3B, 0x01EF, 0x0919,
0x131E, 0x0F90, 0x19E9, 0x18A8, 0x0CB2, 0x1AD0, 0x0C66, 0x0378
},
{
0x03B0, 0x01BE, 0x1866, 0x1159, 0x197C, 0x1105, 0x010B, 0x0353,
0x1ABB, 0x09A6, 0x028A, 0x1BAD, 0x1B20, 0x0455, 0x0F57, 0x0588
},
{
0x1491, 0x0A1D, 0x0F04, 0x0650, 0x191E, 0x1E0E, 0x174B, 0x016B,
0x051F, 0x0532, 0x00DF, 0x1AEA, 0x0005, 0x0E1B, 0x0FF6, 0x08D8
},
{
0x14B4, 0x086A, 0x0C20, 0x0149, 0x1971, 0x0F26, 0x1852, 0x017D,
0x1228, 0x0352, 0x0A44, 0x1330, 0x18DF, 0x1E38, 0x01BC, 0x0BAC
},
{
0x1A48, 0x021F, 0x02F7, 0x0C31, 0x0BC4, 0x1E75, 0x105C, 0x13E3,
0x0B20, 0x03A1, 0x1AF3, 0x1A36, 0x0E34, 0x181F, 0x09BD, 0x122B
},
{
0x0EE0, 0x163B, 0x0BE7, 0x103D, 0x1075, 0x1E9D, 0x02AF, 0x0BA2,
0x1DAA, 0x0CF1, 0x04B6, 0x0598, 0x06A1, 0x0D33, 0x1CFE, 0x04EE
},
{
0x1BAD, 0x07C8, 0x1A48, 0x05E6, 0x031F, 0x0E0A, 0x0326, 0x1650,
0x0526, 0x0B4E, 0x08FC, 0x0E4D, 0x0832, 0x06EA, 0x09BF, 0x0993
},
{
0x09EB, 0x0F31, 0x071B, 0x14D5, 0x11CA, 0x0722, 0x120D, 0x014C,
0x1993, 0x0AE4, 0x1CCB, 0x04E9, 0x0AEE, 0x1708, 0x0C3D, 0x12F2
},
{
0x1A19, 0x07C1, 0x05A7, 0x0744, 0x1606, 0x1A9B, 0x042D, 0x1BFC,
0x1841, 0x0C3C, 0x0FFE, 0x1AB1, 0x1416, 0x18A9, 0x0320, 0x1EC2
},
{
0x0AE7, 0x11C6, 0x124A, 0x11DF, 0x0F81, 0x06CF, 0x0ED9, 0x0253,
0x1D2B, 0x0349, 0x0805, 0x08B3, 0x1052, 0x12CF, 0x0A44, 0x0EA6
},
{
0x03BF, 0x1D90, 0x0EF8, 0x0657, 0x156D, 0x0405, 0x10BE, 0x091F,
0x1C82, 0x1725, 0x19EF, 0x0B8C, 0x04D9, 0x02C7, 0x025A, 0x1B89
},
{
0x0F5C, 0x013D, 0x02F7, 0x12E3, 0x0BC5, 0x1B56, 0x0848, 0x0239,
0x0FCF, 0x03A4, 0x092D, 0x1354, 0x1D83, 0x01BD, 0x071A, 0x0AF1
},
{
0x0875, 0x0793, 0x1B41, 0x1782, 0x0DEF, 0x1D20, 0x13BE, 0x0095,
0x1650, 0x19D4, 0x0DE3, 0x0980, 0x18F2, 0x0CA3, 0x0098, 0x149A
},
{
0x0B81, 0x0AD2, 0x1BBA, 0x1A02, 0x027B, 0x1906, 0x07F5, 0x1CAE,
0x0C3F, 0x02F6, 0x1298, 0x175E, 0x15B2, 0x13D8, 0x14CC, 0x161A
},
{
0x0A42, 0x15F3, 0x0870, 0x1C1D, 0x1203, 0x18B1, 0x1738, 0x1954,
0x1143, 0x1AE8, 0x1D9D, 0x155B, 0x11E8, 0x0ED9, 0x06F7, 0x04CA
}
0x067a, 0x0c7d, 0x0b4f, 0x127d, 0x0bd6, 0x04ac, 0x16e0, 0x1730,
0x0587, 0x0afb, 0x1ac3, 0x0120, 0x14b5, 0x0f67, 0x11de, 0x0961,
0x1127, 0x1a68, 0x07f0, 0x17d0, 0x1a6f, 0x1f3b, 0x01ef, 0x0919,
0x131e, 0x0f90, 0x19e9, 0x18a8, 0x0cb2, 0x1ad0, 0x0c66, 0x0378,
0x03b0, 0x01be, 0x1866, 0x1159, 0x197c, 0x1105, 0x010b, 0x0353,
0x1abb, 0x09a6, 0x028a, 0x1bad, 0x1b20, 0x0455, 0x0f57, 0x0588,
0x1491, 0x0a1d, 0x0f04, 0x0650, 0x191e, 0x1e0e, 0x174b, 0x016b,
0x051f, 0x0532, 0x00df, 0x1aea, 0x0005, 0x0e1b, 0x0ff6, 0x08d8,
0x14b4, 0x086a, 0x0c20, 0x0149, 0x1971, 0x0f26, 0x1852, 0x017d,
0x1228, 0x0352, 0x0a44, 0x1330, 0x18df, 0x1e38, 0x01bc, 0x0bac,
0x1a48, 0x021f, 0x02f7, 0x0c31, 0x0bc4, 0x1e75, 0x105c, 0x13e3,
0x0b20, 0x03a1, 0x1af3, 0x1a36, 0x0e34, 0x181f, 0x09bd, 0x122b,
0x0ee0, 0x163b, 0x0be7, 0x103d, 0x1075, 0x1e9d, 0x02af, 0x0ba2,
0x1daa, 0x0cf1, 0x04b6, 0x0598, 0x06a1, 0x0d33, 0x1cfe, 0x04ee,
0x1bad, 0x07c8, 0x1a48, 0x05e6, 0x031f, 0x0e0a, 0x0326, 0x1650,
0x0526, 0x0b4e, 0x08fc, 0x0e4d, 0x0832, 0x06ea, 0x09bf, 0x0993,
0x09eb, 0x0f31, 0x071b, 0x14d5, 0x11ca, 0x0722, 0x120d, 0x014c,
0x1993, 0x0ae4, 0x1ccb, 0x04e9, 0x0aee, 0x1708, 0x0c3d, 0x12f2,
0x1a19, 0x07c1, 0x05a7, 0x0744, 0x1606, 0x1a9b, 0x042d, 0x1bfc,
0x1841, 0x0c3c, 0x0ffe, 0x1ab1, 0x1416, 0x18a9, 0x0320, 0x1ec2,
0x0ae7, 0x11c6, 0x124a, 0x11df, 0x0f81, 0x06cf, 0x0ed9, 0x0253,
0x1d2b, 0x0349, 0x0805, 0x08b3, 0x1052, 0x12cf, 0x0a44, 0x0ea6,
0x03bf, 0x1d90, 0x0ef8, 0x0657, 0x156d, 0x0405, 0x10be, 0x091f,
0x1c82, 0x1725, 0x19ef, 0x0b8c, 0x04d9, 0x02c7, 0x025a, 0x1b89,
0x0f5c, 0x013d, 0x02f7, 0x12e3, 0x0bc5, 0x1b56, 0x0848, 0x0239,
0x0fcf, 0x03a4, 0x092d, 0x1354, 0x1d83, 0x01bd, 0x071a, 0x0af1,
0x0875, 0x0793, 0x1b41, 0x1782, 0x0def, 0x1d20, 0x13be, 0x0095,
0x1650, 0x19d4, 0x0de3, 0x0980, 0x18f2, 0x0ca3, 0x0098, 0x149a,
0x0b81, 0x0ad2, 0x1bba, 0x1a02, 0x027b, 0x1906, 0x07f5, 0x1cae,
0x0c3f, 0x02f6, 0x1298, 0x175e, 0x15b2, 0x13d8, 0x14cc, 0x161a,
0x0a42, 0x15f3, 0x0870, 0x1c1d, 0x1203, 0x18b1, 0x1738, 0x1954,
0x1143, 0x1ae8, 0x1d9d, 0x155b, 0x11e8, 0x0ed9, 0x06f7, 0x04ca
};
static uint16_t p_shuffle_add[ 16 ][ 16 ] =
static uint16_t const p_shuffle_add[ 256 ] =
{
{
0x0706, 0x175A, 0x0DEF, 0x1E72, 0x0297, 0x1B0E, 0x1D5A, 0x15B8,
0x13E2, 0x1347, 0x10C6, 0x0B4F, 0x0629, 0x0A75, 0x0A9B, 0x0F55
},
{
0x1A69, 0x09BF, 0x0BA6, 0x1582, 0x1086, 0x1921, 0x01CB, 0x1C6A,
0x0FF5, 0x00F7, 0x0A67, 0x0A1E, 0x1838, 0x0196, 0x10D6, 0x0C7A
},
{
0x180E, 0x038D, 0x1ADD, 0x0684, 0x154A, 0x0AB0, 0x18A4, 0x0D73,
0x1641, 0x0EC6, 0x09F1, 0x1A62, 0x0414, 0x162A, 0x194E, 0x1EC9
},
{
0x022F, 0x0296, 0x1104, 0x14FC, 0x096C, 0x1D02, 0x09BD, 0x027C,
0x080E, 0x1324, 0x128C, 0x0DC1, 0x00B9, 0x17F2, 0x0CBC, 0x0F97
},
{
0x1B93, 0x1C3C, 0x0415, 0x0395, 0x0C7A, 0x06CC, 0x0D4B, 0x16E2,
0x04A2, 0x0DAB, 0x1228, 0x012B, 0x0896, 0x0012, 0x1CD6, 0x1DAC
},
{
0x080D, 0x0446, 0x047A, 0x00AD, 0x029E, 0x0686, 0x17C3, 0x1466,
0x0D16, 0x1896, 0x076E, 0x00CD, 0x17DC, 0x1E9F, 0x1A7C, 0x02BB
},
{
0x0D06, 0x112B, 0x14CB, 0x0A03, 0x1541, 0x1290, 0x0F6D, 0x1503,
0x084B, 0x0382, 0x1A3F, 0x0371, 0x1977, 0x0B67, 0x0CAD, 0x1DF8
},
{
0x1CE3, 0x1306, 0x13F8, 0x1163, 0x1B0B, 0x00BD, 0x0BF0, 0x1A4F,
0x16F7, 0x0B4F, 0x0CF8, 0x1254, 0x0541, 0x100D, 0x0296, 0x0410
},
{
0x1A2B, 0x1169, 0x17D9, 0x0819, 0x03D6, 0x0D03, 0x194D, 0x184A,
0x07CA, 0x1989, 0x0FAD, 0x011C, 0x1C71, 0x0EF6, 0x0DC8, 0x0F2F
},
{
0x0FA5, 0x11BE, 0x0F3B, 0x1D52, 0x0DE2, 0x016E, 0x1AD1, 0x0C4A,
0x1BC2, 0x0AC9, 0x1485, 0x1BEE, 0x0949, 0x1A79, 0x1894, 0x12BB
},
{
0x17B6, 0x14F5, 0x16B1, 0x142C, 0x1301, 0x03EF, 0x16FF, 0x0D37,
0x0D78, 0x01FF, 0x00D6, 0x1053, 0x1A2A, 0x0F61, 0x1352, 0x0C7F
},
{
0x137F, 0x09C4, 0x1D96, 0x021D, 0x1037, 0x1B19, 0x10EF, 0x14E4,
0x02A0, 0x0236, 0x0A5D, 0x1519, 0x141C, 0x1399, 0x007E, 0x1E74
},
{
0x0941, 0x1B3C, 0x0062, 0x0371, 0x09AD, 0x08E8, 0x0A24, 0x0B97,
0x1ED2, 0x0889, 0x136B, 0x0006, 0x1C4C, 0x0444, 0x06F8, 0x0DFB
},
{
0x1D0F, 0x198D, 0x0700, 0x0AFC, 0x1781, 0x12F3, 0x10DA, 0x1F19,
0x1055, 0x0DC9, 0x1860, 0x012B, 0x05BF, 0x082D, 0x0C17, 0x1941
},
{
0x0359, 0x1232, 0x104C, 0x0762, 0x0897, 0x1D6C, 0x030F, 0x1A36,
0x16B0, 0x094D, 0x1782, 0x036F, 0x0EEA, 0x06E6, 0x0D00, 0x0187
},
{
0x17E2, 0x05E5, 0x19FA, 0x1950, 0x146A, 0x0B2A, 0x0512, 0x0EE0,
0x1E27, 0x112D, 0x1DF0, 0x0B13, 0x0378, 0x1DD0, 0x00C1, 0x01E6
}
0x0706, 0x175a, 0x0def, 0x1e72, 0x0297, 0x1b0e, 0x1d5a, 0x15b8,
0x13e2, 0x1347, 0x10c6, 0x0b4f, 0x0629, 0x0a75, 0x0a9b, 0x0f55,
0x1a69, 0x09bf, 0x0ba6, 0x1582, 0x1086, 0x1921, 0x01cb, 0x1c6a,
0x0ff5, 0x00f7, 0x0a67, 0x0a1e, 0x1838, 0x0196, 0x10d6, 0x0c7a,
0x180e, 0x038d, 0x1add, 0x0684, 0x154a, 0x0ab0, 0x18a4, 0x0d73,
0x1641, 0x0ec6, 0x09f1, 0x1a62, 0x0414, 0x162a, 0x194e, 0x1ec9,
0x022f, 0x0296, 0x1104, 0x14fc, 0x096c, 0x1d02, 0x09bd, 0x027c,
0x080e, 0x1324, 0x128c, 0x0dc1, 0x00b9, 0x17f2, 0x0cbc, 0x0f97,
0x1b93, 0x1c3c, 0x0415, 0x0395, 0x0c7a, 0x06cc, 0x0d4b, 0x16e2,
0x04a2, 0x0dab, 0x1228, 0x012b, 0x0896, 0x0012, 0x1cd6, 0x1dac,
0x080d, 0x0446, 0x047a, 0x00ad, 0x029e, 0x0686, 0x17c3, 0x1466,
0x0d16, 0x1896, 0x076e, 0x00cd, 0x17dc, 0x1e9f, 0x1a7c, 0x02bb,
0x0d06, 0x112b, 0x14cb, 0x0a03, 0x1541, 0x1290, 0x0f6d, 0x1503,
0x084b, 0x0382, 0x1a3f, 0x0371, 0x1977, 0x0b67, 0x0cad, 0x1df8,
0x1ce3, 0x1306, 0x13f8, 0x1163, 0x1b0b, 0x00bd, 0x0bf0, 0x1a4f,
0x16f7, 0x0b4f, 0x0cf8, 0x1254, 0x0541, 0x100d, 0x0296, 0x0410,
0x1a2b, 0x1169, 0x17d9, 0x0819, 0x03d6, 0x0d03, 0x194d, 0x184a,
0x07ca, 0x1989, 0x0fad, 0x011c, 0x1c71, 0x0ef6, 0x0dc8, 0x0f2f,
0x0fa5, 0x11be, 0x0f3b, 0x1d52, 0x0de2, 0x016e, 0x1ad1, 0x0c4a,
0x1bc2, 0x0ac9, 0x1485, 0x1bee, 0x0949, 0x1a79, 0x1894, 0x12bb,
0x17b6, 0x14f5, 0x16b1, 0x142c, 0x1301, 0x03ef, 0x16ff, 0x0d37,
0x0d78, 0x01ff, 0x00d6, 0x1053, 0x1a2a, 0x0f61, 0x1352, 0x0c7f,
0x137f, 0x09c4, 0x1d96, 0x021d, 0x1037, 0x1b19, 0x10ef, 0x14e4,
0x02a0, 0x0236, 0x0a5d, 0x1519, 0x141c, 0x1399, 0x007e, 0x1e74,
0x0941, 0x1b3c, 0x0062, 0x0371, 0x09ad, 0x08e8, 0x0a24, 0x0b97,
0x1ed2, 0x0889, 0x136b, 0x0006, 0x1c4c, 0x0444, 0x06f8, 0x0dfb,
0x1d0f, 0x198d, 0x0700, 0x0afc, 0x1781, 0x12f3, 0x10da, 0x1f19,
0x1055, 0x0dc9, 0x1860, 0x012b, 0x05bf, 0x082d, 0x0c17, 0x1941,
0x0359, 0x1232, 0x104c, 0x0762, 0x0897, 0x1d6c, 0x030f, 0x1a36,
0x16b0, 0x094d, 0x1782, 0x036f, 0x0eea, 0x06e6, 0x0d00, 0x0187,
0x17e2, 0x05e5, 0x19fa, 0x1950, 0x146a, 0x0b2a, 0x0512, 0x0ee0,
0x1e27, 0x112d, 0x1df0, 0x0b13, 0x0378, 0x1dd0, 0x00c1, 0x01e6
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment