⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cas_cch.c

📁 EMU_FTAbox_ref441328_code_source ali m3327
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
*
*  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 + -