/usr/bin/avos:AOS parse cipher()
From ArchosDocs
Description
Parse the CIPH block, load the 0x10022 key and set some callbacks for reading/seeking in the encrypted .aos file.
References To
The Code
char AOS_aes_key[?];
int AOS_parse_cipher(int fd) {
int unk_234; // -0x234
char buffer[28]; // -0x22C
void *ptr; // -0x01C
int read; // -0x018
char *data_10022; // -0x014
int pos; // -0x010
pos = (uint32_t)ftell64(fd);
read = fread(fd, &buffer, 28);
if(read != 28)
return 247; // failure
if(*(uint32_t *)&buffer[0] != 0x43495048) { // CIPH
AOS_file_read_ptr = &fread; // int fread(int fd, char *buffer, int size)
AOS_file_seek_ptr = &fseek64; // int64_t fseek64(int fd, offset, whence);
fseek64(fd, pos, SEEK_SET);
return 0; // success
}
ptr = &buffer[8];
if((*ptr == 0xBF959) {
AOS_file_read_ptr = &AOS_rsa_file_read;
AOS_file_seek_ptr = &AOS_rsa_file_seek;
dword_FF01FC = 0;
dword_FF0200 = 0;
dword_FE9F88 = 1;
memcpy(AOS_ciph_data_0, ptr+4, 16);
memcpy(AOS_ciph_data_1, ptr+4, 16);
data_10022 = AOS_load_10022();
if(data_10022 == 0)
return 249; // failure
if(aes_set_key(AOS_aes_key, &data_10022[2],
(uint16_t)(data_10022[0] | ((data_10022+1) << 8))) != 0) {
return 250; // failure
return 0; // success
}
AOS_file_read_ptr = &fread; // int fread(int fd, char *buffer, int size)
AOS_file_seek_ptr = &fseek64; // int64_t fseek64(int fd, offset, whence);
return 0;
}

