KT24-1110_65E-HA-651B/apps/common/music/music_decrypt.c
2024-11-10 18:44:17 +08:00

185 lines
5.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "system/app_core.h"
#include "system/includes.h"
#include "app_config.h"
#include "music/music_decrypt.h"
#include "system/fs/fs.h"
#if (TCFG_DEC_DECRYPT_ENABLE)
#define LOG_TAG_CONST APP_MUSIC
#define LOG_TAG "[APP_MUSIC_CIPHER]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
/*----------------------------------------------------------------------------*/
/**@brief 解密读使能开关
@param u8 ctl
@return 无
@note void cipher_ctl(u8 ctl)
*/
/*----------------------------------------------------------------------------*/
static void cipher_ctl(CIPHER *pcipher, u8 ctl)
{
pcipher->cipher_enable = ctl;
}
/*----------------------------------------------------------------------------*/
/**@brief 解密读文件数据的回调函数,用于底层的物理读
@param void* buf, u32 lba
@return 无
@note void cryptanalysis_buff(void* buf, u32 faddr, u32 len)
*/
/*----------------------------------------------------------------------------*/
#define ALIN_SIZE 4
void cryptanalysis_buff(CIPHER *pcipher, void *buf, u32 faddr, u32 len)
{
u32 i;
u8 j;
u8 head_rem;//
u8 tail_rem;//
u32 len_ali;
u8 *buf_1b_ali;
u8 *cipher_code;
cipher_code = (u8 *)&pcipher->cipher_code;
if (!pcipher->cipher_enable) {
return;
}
/* log_info("----faddr = %d \n",faddr); */
/* put_buf(buf,len); */
/* log_info("buf_addr = %d \n", buf); */
head_rem = ALIN_SIZE - (faddr % ALIN_SIZE);
if (head_rem == ALIN_SIZE) {
head_rem = 0;
}
if (head_rem > len) {
head_rem = len;
}
if (len - head_rem) {
tail_rem = (faddr + len) % ALIN_SIZE;
} else {
tail_rem = 0;
}
/* log_info("head_rem = %d tail_rem = %d \n", head_rem, tail_rem); */
/* log_info("deal_head_buf\n"); */
buf_1b_ali = buf;
j = 3;
for (i = head_rem; i > 0; i--) {
buf_1b_ali[i - 1] ^= cipher_code[j--];
/* log_info("i = %d \n", i - 1); */
/* log_info("buf_1b_ali[i] = %x \n", buf_1b_ali[i - 1]); */
}
/* log_info("\n\n-----------TEST_HEAD-----------------"); */
/* put_buf(buf_1b_ali, head_rem); */
/* log_info("deal_main_buf\n"); */
buf_1b_ali = buf;
buf_1b_ali = (u8 *)(buf_1b_ali + head_rem);
len_ali = len - head_rem - tail_rem;
/* log_info("len_ali = %d \n", len_ali); */
/* log_info("buf_1b_ali = %d \n", buf_1b_ali); */
for (i = 0; i < (len_ali / 4); i++) {
buf_1b_ali[0 + i * 4] ^= cipher_code[0];
buf_1b_ali[1 + i * 4] ^= cipher_code[1];
buf_1b_ali[2 + i * 4] ^= cipher_code[2];
buf_1b_ali[3 + i * 4] ^= cipher_code[3];
}
/* log_info("\n\n-----------TEST_MAIN-----------------"); */
/* put_buf(buf_1b_ali, len_ali); */
/* log_info("deal_tail_buf\n"); */
buf_1b_ali = buf;
buf_1b_ali += len - tail_rem;
j = 0;
for (i = 0 ; i < tail_rem; i++) {
buf_1b_ali[i] ^= cipher_code[j++];
}
/* log_info("\n\n-----------TEST_TAIL-----------------"); */
/* put_buf(buf_1b_ali, tail_rem); */
/* log_info("\n\n-----------TEST-----------------"); */
/* put_buf(buf,len); */
}
/*----------------------------------------------------------------------------*/
/**@brief 解密判断
@param void *file当前解码文件的句柄
@return 无
@note void cipher_check_decode_file(void *file)
*/
/*----------------------------------------------------------------------------*/
void cipher_check_decode_file(CIPHER *pcipher, void *file)
{
int rlen;
u8 name[128];
memset(name, 0, sizeof(name));
rlen = fget_name(file, name, sizeof(name));
/* log_info("rlen:%d \n", rlen); */
/* put_buf(name, sizeof(name)); */
u8 *ext_name = strrchr(name, '.');
if (ext_name == NULL) {
// 可能是83结构文件名
int name_len = strlen(name);
if (name_len > 3) {
rlen = name_len - 4;
goto __check_ext;
}
}
while (rlen--) {
if ((name[rlen] >= 'a') && (name[rlen] <= 'z')) {
name[rlen] = name[rlen] - 'a' + 'A';
}
if (name[rlen] != '.') {
continue;
}
__check_ext:
/* log_info("file exname : %s \n", &name[rlen+1]); */
/* log_info("rlen:%d \n", rlen); */
/* put_buf(name, sizeof(name)); */
if (((name[rlen + 1] == 'S') && (name[rlen + 2] == 'M') && (name[rlen + 3] == 'P')) // assci
|| ((name[rlen + 2] == 'S') && (name[rlen + 4] == 'M') && (name[rlen + 6] == 'P')) // unicode
) {
log_info("\n----It's a SMP FILE---\n");
cipher_ctl(pcipher, 1);
}
return;
}
cipher_ctl(pcipher, 0);
}
/*----------------------------------------------------------------------------*/
/**@brief 解密读初始化
@param 无
@return 无
@note void cipher_init(u32 key)
*/
/*----------------------------------------------------------------------------*/
void cipher_init(CIPHER *pcipher, u32 key)
{
pcipher->cipher_code = key;
cipher_ctl(pcipher, 0);
}
/*----------------------------------------------------------------------------*/
/**@brief 解密读初关闭
@param 无
@return 无
@note void cipher_close(void)
*/
/*----------------------------------------------------------------------------*/
void cipher_close(CIPHER *pcipher)
{
cipher_ctl(pcipher, 0);
}
#endif