wbfs_t*wbfs_open_hd( rw_sector_callback_t read_hdsector, rw_sector_callback_t write_hdsector, #ifdef WIN32 close_callback_t close_hd, #endif void *callback_data, int hd_sector_size, #ifdef WIN32 int num_hd_sector, #else int num_hd_sector __attribute((unused)), #endif int reset) { int i #ifdef UNUSED_STUFF = num_hd_sector #endif , ret; u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size); u8 part_table[16*4]; ret = read_hdsector(callback_data,0,1,tmp_buffer); if(ret) return 0; //find wbfs partition wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4); ptr = part_table; for(i=0;i<4;i++,ptr+=16) { u32 part_lba = read_le32_unaligned(ptr+0x8); wbfs_head_t *head = (wbfs_head_t *)tmp_buffer; #ifdef UNUSED_STUFF ret = #endif read_hdsector(callback_data,part_lba,1,tmp_buffer); // verify there is the magic. if (head->magic == wbfs_htonl(WBFS_MAGIC)) { wbfs_t *p = wbfs_open_partition( read_hdsector, write_hdsector, #ifdef WIN32 close_hd, #endif callback_data, hd_sector_size, 0, part_lba,reset ); return p; } } if(reset)// XXX make a empty hd partition.. { } return 0; }
static void _decrypt_title_key(u8 *tik, u8 *title_key) { u8 common_key[16] = { 0xeb, 0xe4, 0x2a, 0x22, 0x5e, 0x85, 0x93, 0xe4, 0x48, 0xd9, 0xc5, 0x45, 0x73, 0x81, 0xaa, 0xf7 }; u8 iv[16]; wbfs_memset(iv, 0, sizeof iv); wbfs_memcpy(iv, tik + 0x01dc, 8); aes_set_key(common_key); //_aes_cbc_dec(common_key, iv, tik + 0x01bf, 16, title_key); aes_decrypt(iv, tik + 0x01bf, title_key, 16); }
u32 wbfs_get_list( u8 **headers,u32 num) { u32 i; u32 count = 0; for(i=0;i<max_disc;i++) { if (head->disc_table[i]) { read_sectors(1+i*header_size/512,header_size/512,header); u32 magic=wbfs_be32(header+24); if(magic!=0x5D1C9EA3) continue; headers[i] = wbfs_malloc(header_size); wbfs_memcpy(headers[i],header,header_size); if(++count == num) return count; } } return count; }