mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-12-24 12:24:50 +01:00
87 lines
2.1 KiB
C
87 lines
2.1 KiB
C
#include "meta.h"
|
|
#include "../coding/coding.h"
|
|
#include "ogg_vorbis_streamfile.h"
|
|
|
|
//todo fuse ogg encryptions and use generic names
|
|
|
|
|
|
static const uint8_t tpf_key[] = {
|
|
0x0a,0x2b,0x36,0x6f,0x0b,0x0a,0x2b,0x36,0x6f,0x0B
|
|
};
|
|
|
|
static void load_key(ogg_vorbis_io_config_data* cfg, const uint8_t* key, size_t size) {
|
|
cfg->is_encrypted = 1;
|
|
cfg->key_len = size;
|
|
memcpy(cfg->key, key, size);
|
|
}
|
|
|
|
/* parser for various encrypted games */
|
|
VGMSTREAM* init_vgmstream_encrypted(STREAMFILE* sf) {
|
|
VGMSTREAM* vgmstream = NULL;
|
|
STREAMFILE* temp_sf = NULL;
|
|
ogg_vorbis_io_config_data cfg = {0};
|
|
uint32_t id;
|
|
|
|
|
|
/* checks */
|
|
id = read_u32be(0x00, sf);
|
|
|
|
if (check_extensions(sf,"ogg,logg")) {
|
|
/* The Pirate's Fate (PC) */
|
|
if (id == 0x454C513C) { /* "OggS" xored */
|
|
load_key(&cfg, tpf_key, sizeof(tpf_key));
|
|
}
|
|
else {
|
|
goto fail;
|
|
}
|
|
|
|
temp_sf = setup_ogg_vorbis_streamfile(sf, cfg);
|
|
if (!temp_sf) goto fail;
|
|
#ifdef VGM_USE_VORBIS
|
|
vgmstream = init_vgmstream_ogg_vorbis(temp_sf);
|
|
#endif
|
|
close_streamfile(temp_sf);
|
|
return vgmstream;
|
|
}
|
|
|
|
if (check_extensions(sf,"mp3")) {
|
|
/* The Pirate's Fate (PC) */
|
|
if ((id & 0xFFFFFF00) == 0x436F0500) { /* "ID3\0" xored */
|
|
load_key(&cfg, tpf_key, sizeof(tpf_key));
|
|
}
|
|
else {
|
|
goto fail;
|
|
}
|
|
|
|
temp_sf = setup_ogg_vorbis_streamfile(sf, cfg);
|
|
if (!temp_sf) goto fail;
|
|
|
|
#ifdef VGM_USE_FFMPEG //TODO: allow MP3 without FFmpeg
|
|
vgmstream = init_vgmstream_ffmpeg(temp_sf);
|
|
#endif
|
|
close_streamfile(temp_sf);
|
|
return vgmstream;
|
|
}
|
|
|
|
if (check_extensions(sf,"wav,lwav")) {
|
|
/* The Pirate's Fate (PC) */
|
|
if (id == 0x58627029) { /* "RIFF" xored */
|
|
load_key(&cfg, tpf_key, sizeof(tpf_key));
|
|
}
|
|
else {
|
|
goto fail;
|
|
}
|
|
|
|
temp_sf = setup_ogg_vorbis_streamfile(sf, cfg);
|
|
if (!temp_sf) goto fail;
|
|
|
|
vgmstream = init_vgmstream_riff(temp_sf);
|
|
close_streamfile(temp_sf);
|
|
return vgmstream;
|
|
}
|
|
|
|
|
|
fail:
|
|
return NULL;
|
|
}
|