Advertisement
Proxima

sub_53c

Sep 17th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.63 KB | None | 0 0
  1. int __cdecl init_eeprom_key(int eeprom_offset_id, void *key_seed1)
  2. {
  3.   int _offset_id; // r5
  4.   int _offset_0x80_block_id; // r0
  5.   int addr_0x320_0x80block; // r6
  6.   int addr_0x340_0x80block; // r7
  7.   unsigned int counter0; // r4
  8.   unsigned int v7; // r5
  9.   unsigned int counter1; // r4
  10.   int status_enc_data; // [sp+0h] [bp-50h]
  11.   unsigned __int8 *addr_0x300_0x80block; // [sp+10h] [bp-40h]
  12.   unsigned __int8 *cmac; // [sp+14h] [bp-3Ch]
  13.   unsigned __int8 data_buffer; // [sp+18h] [bp-38h]
  14.   int _secondary_offset; // [sp+28h] [bp-28h]
  15.   void *aes_ctx; // [sp+2Ch] [bp-24h]
  16.   unsigned __int8 *derived_key1_; // [sp+30h] [bp-20h]
  17.   unsigned __int8 *key_0x40; // [sp+34h] [bp-1Ch]
  18.   unsigned __int8 *key_seed_data1_; // [sp+38h] [bp-18h]
  19.  
  20.   _offset_id = eeprom_offset_id;
  21.   _secondary_offset = 0x10 * eeprom_offset_id + 0x2A0;
  22.   _offset_0x80_block_id = eeprom_offset_id << 7;
  23.   cmac = (unsigned __int8 *)(_offset_0x80_block_id + 0x2E0);
  24.   addr_0x320_0x80block = _offset_0x80_block_id + 0x320;
  25.   addr_0x340_0x80block = _offset_0x80_block_id + 0x340;
  26.   key_seed_data1_ = (unsigned __int8 *)&key_seed_data1;
  27.   addr_0x300_0x80block = (unsigned __int8 *)(_offset_0x80_block_id + 0x300);
  28.   memcpy(&key_seed_data1, key_seed1, 0x10);
  29.   key_0x40 = (unsigned __int8 *)&key_0x40buf;
  30.   aes_ctx = &aes_ctx_30;
  31.   derived_key1_ = (unsigned __int8 *)&derived_key1;
  32.   if ( !get_key_from_secure_vault(0x40, &key_0x40buf, 0x10) )
  33.   {
  34.     aes_ebc_encrypt_init_wrapper(key_0x40, aes_ctx);
  35.     counter0 = 0;
  36.     v7 = _offset_id + 1;
  37.     while ( counter0 < v7 )
  38.     {
  39.       aes_ecb_encrypt_wrapper(key_seed_data1_, aes_ctx);
  40.       ++counter0;
  41.     }
  42.     memcpy(derived_key1_, key_seed_data1_, 0x10);
  43.     counter1 = 0;
  44.     do
  45.     {
  46.       aes_ecb_encrypt_wrapper(derived_key1_, aes_ctx);
  47.       ++counter1;
  48.     }
  49.     while ( counter1 < 4 );
  50.     memcpy(&data_buffer, sc_init_status_unk1, 0x10);
  51.     aes_ebc_encrypt_init_wrapper(key_seed_data1_, aes_ctx);
  52.     aes_ecb_encrypt_wrapper(&data_buffer, aes_ctx);
  53.     if ( !write_eprom2(_secondary_offset, &data_buffer, 0x10) )
  54.     {
  55.       memcpy(&status_enc_data, sc_init_status_unk1, 0x10);
  56.       aes_ebc_encrypt_init_wrapper(derived_key1_, aes_ctx);
  57.       aes_ecb_encrypt_wrapper((unsigned __int8 *)&status_enc_data, aes_ctx);
  58.       if ( !update_eprom_cmac((unsigned __int8 *)&status_enc_data, 0x10, key_seed_data1_, (int)cmac) )
  59.       {
  60.         memcpy(&status_enc_data, sc_init_status_unk2, 0x10);
  61.         aes_ebc_encrypt_init_wrapper(derived_key1_, aes_ctx);
  62.         aes_ecb_encrypt_wrapper((unsigned __int8 *)&status_enc_data, aes_ctx);
  63.         if ( !update_eprom_cmac((unsigned __int8 *)&status_enc_data, 0x10, key_seed_data1_, (int)addr_0x300_0x80block) )
  64.         {
  65.           memcpy(&status_enc_data, sc_init_status_unk3, 0x10);
  66.           aes_ebc_encrypt_init_wrapper(derived_key1_, aes_ctx);
  67.           aes_ecb_encrypt_wrapper((unsigned __int8 *)&status_enc_data, aes_ctx);
  68.           if ( !update_eprom_cmac((unsigned __int8 *)&status_enc_data, 0x10, key_seed_data1_, addr_0x320_0x80block) )
  69.           {
  70.             memcpy(&status_enc_data, sc_init_status_unk4, 0x10);
  71.             aes_ebc_encrypt_init_wrapper(derived_key1_, aes_ctx);
  72.             aes_ecb_encrypt_wrapper((unsigned __int8 *)&status_enc_data, aes_ctx);
  73.             update_eprom_cmac((unsigned __int8 *)&status_enc_data, 0x10, key_seed_data1_, addr_0x340_0x80block);
  74.           }
  75.         }
  76.       }
  77.     }
  78.   }
  79.   memset_func(key_0x40, 0, 0x10);
  80.   memset_func(key_seed_data1_, 0, 0x10);
  81.   memset_func(derived_key1_, 0, 0x10);
  82.   memset_func(aes_ctx, 0, 0xC0);
  83.   memset_func(&data_buffer, 0, 0x10);
  84.   memset_func(&status_enc_data, 0, 0x10);
  85.   JUMPOUT(loc_700);
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement