📄 cas_cch.c
字号:
/****************************************************************************
*
* ALi
*
* File: cas_cch.c
*
* Description:
* this file was build by cch 2006-11-16
* this file should compatible to the PC editor "CasEditor 1.0"
* don't change this file by yourself, by CCH otherwise
*
* History:
* Date Author Version Comment
* ==== ====== ======= =======
* 1. 2006-11-16
*
****************************************************************************/
#include "Cas_cch.h" // Cas Type Cas Bool Cas_false Cas_Null Cas_Byte OSD Operation in CAS Sys
#define CAS_CCH_DEBUG
#define CCH_PRINTF libc_printf
const cas_key_db init_cas_key_db[]= {
/********************************************************************************
seca
*********************************************************************************/
{0x0100, SECA_KEY8, 0x0C, 0x00000F, {0xEB,0x09,0x33,0xE8,0x41,0x84,0x8A,0x4E,}},
};
/* provider of end_key_db is version of key db */
/* if version is updated, then reset key db automatically */
const cas_key_db end_key_db = {0xFFFF, MAX_KEY_TYPE, 0x00, 0x000000 /* <- key db version */, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}};
const unsigned char max_key_size[MAX_KEY_TYPE] = {8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 64};
void memcpy(void *target, void *source, unsigned long size)
{
/* fix me */
ali_memcpy(target, source, size);
}
int memcmp(void *s1, void *s2, unsigned long size)
{
/* fix me */
return ali_memcmp(s1, s2, size);
}
void memset(void *target, unsigned char data, unsigned long size)
{
/* fix me */
ali_memset(target, data, size);
}
static unsigned long cas_computeCRC32(unsigned char *data, unsigned long size)
{
/* fix me */
MG_Setup_CRC_Table();
return MG_Table_Driven_CRC(0xFFFFFFFF,data, size);
}
int cas_strlen(char *source){
/* fix me */
return ali_strlen(source);
}
void *cas_malloc(unsigned long size)
{
/* fix me */
return (void*)malloc(size);
}
void cas_free(void *ptr)
{
/* fix me */
if(ptr != CAS_NULL)
free(ptr);
}
void cas_print(char* str)
{
/* fix me */
libc_printf( str );
//soc_printf( str );
}
extern UINT8 UIMXboxSaveList();
void cas_write_data_to_flash()
{
/* fix me */
cas_print("cas_write_data_to_flash :: Write key code to flash\r\n");
if(UIMXboxSaveList()!=SUCCESS){
cas_print("cas_write_data_to_flash :: Write key code to flash error\r\n");
}
}
void cas_print_buf(unsigned char* buf, int len)
{
int i;
char str[16];
for ( i = 0; i < len; i++ ) {
sprintf(str, "%02X ", buf[i] );
cas_print( str );
}
cas_print( "\r\n" );
}
int cas_get_init_key_size(void)
{
return (sizeof( init_cas_key_db ) / sizeof( cas_key_db ));
}
/* you can display some msg, if this function is called */
void cas_send_msg(unsigned long msg, unsigned long param1, unsigned long param2, unsigned long param3)
{
char str[128];
switch(msg)
{
case CAS_SC_INSERTED:
sprintf(str, "smart card[%d] cas_id %x inserted\n", param1, param2);
cas_print(str);
if (param2 == 0)
{
sprintf(str, "invalid smart card[%d] inserted\n", param1);
cas_print(str);
}
break;
case CAS_SC_EXTRACTED:
sprintf(str, "smart card [%d] extracted\n", param1);
cas_print(str);
break;
case CAS_SC_INIT_OK:
sprintf(str, "smart card [%d] cas_id %x initialized\n", param1, param2);
cas_print(str);
break;
case CAS_SC_NO_ACCESS:
cas_print("no access with this smart card\n");
break;
case CAS_SC_RESTART:
/* fix me */
cas_print("you should restart ecm/emm\n");
break;
case CAS_TPS_UPDATE_START:
/* fix me */
cas_print("you should check emm in hotbord 10873 tp\n");
break;
case CAS_TPS_UPDATE_END:
/* fix me */
cas_print("you should restart current channel's Video/Audio and ecm/emm \n");
break;
default:
break;
}
}
/////////////////////////////////////////////
////////////////////////////////////////////
//don't change below code,,, but by cch anyway
//////////////////////////////////////////////
static cas_edit_cas_db *g_CASEditDB[MAX_CAS_COUNT];
static unsigned char g_nCASEditCount = 0;
static CAS_BOOL ConvertCASEditDBToPatchLib(unsigned char *pData, unsigned long nPatchLibSize, unsigned long uUndateKeyFlag);
static CAS_BOOL UpdateCASEditDBFromPatchLib(unsigned char *pData, unsigned long nPatchLibSize);
void cas_write_flash(unsigned char *key_db, unsigned long key_db_size)
{
/* fix me */
/* write key database to flash memory */
/* normal key_db_size is 0x10000 */
cas_print("\r\n--------cas_write_flash\r\n");
if(UpdateCASEditDBFromPatchLib(key_db, key_db_size)){
cas_write_data_to_flash();
}
}
void cas_read_flash(unsigned char *key_db, unsigned long key_db_size)
{
static unsigned long uUndateKeyFlag = 1;//this flag is used to ensure to update the keys to the patch lib every "cas_read_flash"
/* fix me */
/* read key database from flash memory */
/* normal key_db_size is 0x10000 */
cas_print("\r\ncas_read_flash\r\n");
ConvertCASEditDBToPatchLib(key_db, key_db_size, uUndateKeyFlag++);
}
static void ReleaseCASEditDB()
{
cas_edit_cas_db *pTempCAS;
cas_edit_provider_db *pTempProvider;
cas_edit_key_db *pTempKey;
int i,j,k;
#ifdef CAS_CCH_DEBUG
cas_print("ReleaseCASEditDB :: Started\r\n");
#endif
for(i=0 ; i<g_nCASEditCount ; i++){
pTempCAS = g_CASEditDB[i];
for(j=0 ; j<pTempCAS->provider_count ; j++){
pTempProvider = pTempCAS->pCasEditProviderDb[j];
for(k=0 ; k<pTempProvider->key_count ; k++){
pTempKey = pTempProvider->pCasEditKeyDb[k];
cas_free(pTempKey);
}
cas_free(pTempProvider);
}
cas_free(pTempCAS);
}
g_nCASEditCount = 0;
#ifdef CAS_CCH_DEBUG
cas_print("ReleaseCASEditDB :: Ended\r\n");
#endif
}
unsigned long int ComputeCASDataLengthToSendFromFlash(unsigned char *pFlash, unsigned long int nMaxFlashDataSizeForPatch)
{
CAS_BYTE *pHeader = pFlash;
unsigned long int dataLength = 0;
int w,ww;
CAS_BYTE *pCrc32;
unsigned long int crc32Data, crc32Compute;
if(memcmp((void*)pFlash, (void*)"caskey001", 9) == 0)
{
//byte 10 : 版本号整数部分
CAS_BYTE bVersionBefore;
//byte 11 : 版本号小数部分
CAS_BYTE bVersionAfter;
memcpy((void*)&bVersionBefore, (pFlash+9), 1);
memcpy((void*)&bVersionAfter, (pFlash+10), 1);
//byte 12-16
//保留
pFlash += 16;//file header
dataLength = 0;
for(w=0 ; w<4; w++){//文件长度
dataLength |= (pFlash[0] << (4-w-1)*8);
pFlash ++;
}
if(dataLength > nMaxFlashDataSizeForPatch){//文件不符合
return 0;
}
pCrc32 = pHeader + dataLength - 4;
crc32Data = 0;
for(ww=0 ; ww<4; ww++){//crc32
crc32Data |= (pCrc32[0] << (4-ww-1)*8);
pCrc32 ++;
}
crc32Compute = cas_computeCRC32(pHeader, dataLength - 4);
if(crc32Data != crc32Compute){//crc32 不相等
return 0;
}
}
else{
return 0;
}
return dataLength;
}
CAS_BOOL RearrangeCASEditDBFromFlash(unsigned char *pFlash, unsigned long int nMaxFlashDataSizeForPatch)
{
CAS_BYTE *pHeader = pFlash;
unsigned long int dataLength = 0;
int w,ww;
CAS_BYTE *pCrc32;
unsigned long int crc32Data, crc32Compute;
cas_edit_cas_db *pTempCAS;
cas_edit_provider_db *pTempProvider;
cas_edit_key_db *pTempKey;
#ifdef CAS_CCH_DEBUG
unsigned long int memory_alloced = 0;
#endif
#ifdef CAS_CCH_DEBUG
cas_print("RearrangeCASEditDBFromFlash :: started\r\n");
#endif
//clear current data
ReleaseCASEditDB();
if(memcmp((void*)pFlash, (void*)"caskey001", 9) == 0)
{
//byte 10 : 版本号整数部分
CAS_BYTE bVersionBefore;
//byte 11 : 版本号小数部分
CAS_BYTE bVersionAfter;
memcpy((void*)&bVersionBefore, (pFlash+9), 1);
memcpy((void*)&bVersionAfter, (pFlash+10), 1);
//byte 12-16
//保留
pFlash += 16;//file header
dataLength = 0;
for(w=0 ; w<4; w++){//文件长度
dataLength |= (pFlash[0] << (4-w-1)*8);
pFlash ++;
}
#ifdef CAS_CCH_DEBUG
{
char tempStr[100];
sprintf(tempStr, "RearrangeCASEditDBFromFlash :: dataLength = 0x%x\r\n",dataLength);
cas_print(tempStr);
}
#endif
if(dataLength > nMaxFlashDataSizeForPatch){//文件不符合
#ifdef CAS_CCH_DEBUG
cas_print("RearrangeCASEditDBFromFlash::Unknown patch file format <length check>!\r\n");
libc_printf("dataLength=%x nMaxFlashDataSizeForPatch=%x \n",dataLength,nMaxFlashDataSizeForPatch);
#endif
return CAS_FALSE;
}
pCrc32 = pHeader + dataLength - 4;
crc32Data = 0;
for(ww=0 ; ww<4; ww++){//crc32
crc32Data |= (pCrc32[0] << (4-ww-1)*8);
pCrc32 ++;
}
crc32Compute = cas_computeCRC32(pHeader, dataLength - 4);
if(crc32Data != crc32Compute){//crc32 不相等
#ifdef CAS_CCH_DEBUG
cas_print("RearrangeCASEditDBFromFlash::Unknown patch file format <crc32>!\r\n");
{
libc_printf( "crc32Data = 0x%x crc32Compute = 0x%x !\r\n",crc32Data,crc32Compute);
}
#endif
return CAS_FALSE;
}
//convert data
{
int i,j,k,mm,nn;
CAS_BYTE nNameLength;
g_nCASEditCount = pFlash[0];//CAS 数量
#ifdef CAS_CCH_DEBUG
{
char tempStr[100];
sprintf(tempStr, "g_nCASEditCount = %d\r\n",g_nCASEditCount);
cas_print(tempStr);
}
#endif
pFlash ++;
for( i=0 ; i<g_nCASEditCount && i<MAX_CAS_COUNT ; i++){
nNameLength = pFlash[0];//cas 名称长度 一个字节
pFlash ++;
g_CASEditDB[i] = (cas_edit_cas_db*)cas_malloc(sizeof(cas_edit_cas_db));
#ifdef CAS_CCH_DEBUG
memory_alloced += sizeof(cas_edit_cas_db);
#endif
pTempCAS = g_CASEditDB[i];
if(pTempCAS == CAS_NULL){
#ifdef CAS_CCH_DEBUG
cas_print("cas_cass -- > allock memory error\r\n");
#endif
//clear current data
ReleaseCASEditDB();
return CAS_FALSE;
}
memset(pTempCAS, 0 , sizeof(cas_edit_cas_db));
pTempCAS->key_type = pFlash[0];//cas 对应key类型 一个字节
pFlash ++;
for(mm = 0 ; mm<nNameLength; mm++){//如果cas 名称有定义 加上字节数
pTempCAS->cas_name[mm] = pFlash[0];
pFlash ++;
}
pTempCAS->cas_name[MAX_CAS_TYPE_NAME_LENGTH-1] = 0;
for(nn=0 ; nn<MAX_CAS_ID_LENGTH ; nn++){//CAS ID
pTempCAS->ca_id |= (pFlash[0]<<(MAX_CAS_ID_LENGTH-nn-1)*8);
pFlash ++;
}
pTempCAS->key_size = pFlash[0];//cas 对应下面 key的长度 8/16/.... 一个字节
pFlash ++;
pTempCAS->provider_count = pFlash[0];//CAS 对应的 provider 数量,一个字节
pFlash ++;
// cas_print("cas name[%d] = %s key_size = %d key_type = %d cas_id = %x p_count = %d\r\n",i+1, pTempCAS->cas_name,
// pTempCAS->key_size, pTempCAS->key_type,pTempCAS->ca_id, pTempCAS->provider_count);
for(j=0 ; j<pTempCAS->provider_count && j<MAX_PROVIDER_COUNT_IN_ONE_CAS ; j++){
nNameLength = pFlash[0];//provider 名称长度 一个字节
pFlash ++;
pTempCAS->pCasEditProviderDb[j] = (cas_edit_provider_db*)cas_malloc(sizeof(cas_edit_provider_db));
#ifdef CAS_CCH_DEBUG
memory_alloced += sizeof(cas_edit_provider_db);
#endif
pTempProvider = pTempCAS->pCasEditProviderDb[j];
if(pTempProvider == CAS_NULL){
#ifdef CAS_CCH_DEBUG
cas_print("cas_providers -- > allock memory error\r\n");
#endif
//clear current data
ReleaseCASEditDB();
return CAS_FALSE;
}
memset(pTempProvider, 0 , sizeof(cas_edit_provider_db));
for(mm = 0 ; mm<nNameLength ; mm++){//如果provider 名称有定义 加上字节数
pTempProvider->provider_name[mm] = pFlash[0];
pFlash ++;
}
pTempProvider->provider_name[MAX_PROVIDER_NAME_LENGTH-1] = 0;
for(nn=0 ; nn<MAX_PROVIDER_ID_LENGTH ; nn++){//provider ID
pTempProvider->provider_id |= (pFlash[0]<<(MAX_PROVIDER_ID_LENGTH-nn-1)*8);
pFlash ++;
}
pTempProvider->key_count = pFlash[0];//provider 对应的 key 数量,一个字节
pFlash ++;
// cas_print("provider name[%d] = %s nNameLength = %d provider_id = %x key_count = %d\r\n",j+1, pTempProvider->provider_name, nNameLength,
// pTempProvider->provider_id, pTempProvider->key_count);
for( k=0; k<pTempProvider->key_count && k<MAX_KEY_COUNT_IN_ONE_PROVIDER ; k++){
pTempProvider->pCasEditKeyDb[k] = (cas_edit_key_db*)cas_malloc(sizeof(cas_edit_key_db));
#ifdef CAS_CCH_DEBUG
memory_alloced += sizeof(cas_edit_key_db);
#endif
pTempKey = pTempProvider->pCasEditKeyDb[k];
if(pTempKey == CAS_NULL){
#ifdef CAS_CCH_DEBUG
cas_print("cas_keys -- > allock memory error\r\n");
#endif
//clear current data
ReleaseCASEditDB();
return CAS_FALSE;
}
memset(pTempKey, 0 , sizeof(cas_edit_key_db));
pTempKey->key_id = pFlash[0];//key ID 一个字节
pFlash ++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -