Fix some encrypted FSB .bank

This commit is contained in:
bnnm 2023-12-30 17:03:09 +01:00
parent 948c55f4f9
commit 242e10f80c
2 changed files with 10 additions and 10 deletions

View File

@ -3,7 +3,7 @@
#include "../util/chunks.h" #include "../util/chunks.h"
static int get_subsongs(STREAMFILE* sf, off_t fsb5_offset, size_t fsb5_size); static int get_subsongs(STREAMFILE* sf, uint32_t fsb5_offset, uint32_t fsb5_size);
/* FEV+FSB5 container [Just Cause 3 (PC), Shantae: Half-Genie Hero (Switch)] */ /* FEV+FSB5 container [Just Cause 3 (PC), Shantae: Half-Genie Hero (Switch)] */
VGMSTREAM* init_vgmstream_fsb5_fev_bank(STREAMFILE* sf) { VGMSTREAM* init_vgmstream_fsb5_fev_bank(STREAMFILE* sf) {
@ -99,11 +99,11 @@ VGMSTREAM* init_vgmstream_fsb5_fev_bank(STREAMFILE* sf) {
total_subsongs = 0; total_subsongs = 0;
for (i = 0; i < banks; i++) { for (i = 0; i < banks; i++) {
//TODO: fsb5_size fails for v0x28< + encrypted, but only used with multibanks = unlikely //TODO: fsb5_size fails for v0x28< + encrypted, but only used with multibanks = unlikely
off_t fsb5_offset = read_u32le(bank_offset + 0x04 + entry_size*i + 0x00,sf); uint32_t fsb5_offset = read_u32le(bank_offset + 0x04 + entry_size*i + 0x00,sf);
size_t fsb5_size = read_u32le(bank_offset+0x08 + entry_size*i,sf); uint32_t fsb5_size = read_u32le(bank_offset + 0x08 + entry_size*i,sf);
int fsb5_subsongs = get_subsongs(sf, fsb5_offset, fsb5_size); int fsb5_subsongs = get_subsongs(sf, fsb5_offset, fsb5_size);
if (!fsb5_subsongs) { if (!fsb5_subsongs) {
vgm_logi("FSB: couldn't load bank (encrypted?)\n"); vgm_logi("FSB: couldn't load bank %i at %x (encrypted?)\n", i, fsb5_offset);
goto fail; goto fail;
} }
@ -159,14 +159,13 @@ fail:
return NULL; return NULL;
} }
static int get_subsongs(STREAMFILE* sf, off_t fsb5_offset, size_t fsb5_size) { static int get_subsongs(STREAMFILE* sf, uint32_t fsb5_offset, uint32_t fsb5_size) {
VGMSTREAM* vgmstream = NULL; VGMSTREAM* vgmstream = NULL;
STREAMFILE* temp_sf = NULL; STREAMFILE* temp_sf = NULL;
int subsongs = 0; int subsongs = 0;
/* standard */ /* standard */
if (read_u32be(fsb5_offset, sf) == 0x46534235) { /* FSB5 */ if (is_id32be(fsb5_offset, sf, "FSB5")) {
return read_s32le(fsb5_offset + 0x08,sf); return read_s32le(fsb5_offset + 0x08,sf);
} }
@ -174,6 +173,7 @@ static int get_subsongs(STREAMFILE* sf, off_t fsb5_offset, size_t fsb5_size) {
temp_sf = setup_subfile_streamfile(sf, fsb5_offset, fsb5_size, "fsb"); temp_sf = setup_subfile_streamfile(sf, fsb5_offset, fsb5_size, "fsb");
if (!temp_sf) goto end; if (!temp_sf) goto end;
temp_sf->stream_index = 0;
vgmstream = init_vgmstream_fsb_encrypted(temp_sf); vgmstream = init_vgmstream_fsb_encrypted(temp_sf);
if (!vgmstream) goto end; if (!vgmstream) goto end;

View File

@ -1,7 +1,7 @@
#ifndef _FSB_ENCRYPTED_STREAMFILE_H_ #ifndef _FSB_ENCRYPTED_STREAMFILE_H_
#define _FSB_ENCRYPTED_STREAMFILE_H_ #define _FSB_ENCRYPTED_STREAMFILE_H_
#define FSB_KEY_MAX 0x10000 //0x168 #define FSB_KEY_MAX 0x80 /* known max ~0x33 */
typedef struct { typedef struct {
@ -57,7 +57,7 @@ static STREAMFILE* setup_fsb_streamfile(STREAMFILE* sf, const uint8_t* key, size
size_t io_data_size = sizeof(fsb_decryption_data); size_t io_data_size = sizeof(fsb_decryption_data);
/* setup decryption with key (external) */ /* setup decryption with key (external) */
if (!key_size || key_size > FSB_KEY_MAX) if (!key_size || key_size >= FSB_KEY_MAX)
return NULL; return NULL;
memcpy(io_data.key, key, key_size); memcpy(io_data.key, key, key_size);