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

📄 cas_key.c

📁 EMU_FTAbox_ref441328_code_source ali m3327
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
*
*  ALi 
*
*  File: cas_key.c
*
*  Description: 
*             
*  History:
*      Date        		Author         	Version   	Comment
*      ====        	      ======         	=======   	=======
*  		
*
****************************************************************************/


#include <sys_config.h> //Type of Sys Tuner Board Flash Eeprom
 
#include <types.h> // UINT16 UINT32 NULL INT8 INT16 INT32
#include <osal/osal.h> // Osal Func
#include <api/libc/printf.h> // Lib C for printf
#include <api/libc/string.h> // Lib C for printf

#include <hld/sto/sto.h> // Storage Drive and Device
#include <hld/sto/sto_dev.h> // Storage Drive and Device
#include <api/libchunk/chunk.h> // NO_CRC 0x4E4355243

#include "cas.h" // Debug Cas
#include "cas_key.h" // Define CA_STS Nagra ID Len IRD Caid and KeyBin

#if 0
int assemble4BytesToInt(unsigned char inBytes [4]){
	return inBytes[0] << 24 |inBytes[1] << 16 |inBytes[2] << 8 |inBytes[3] ;
}
int assemble3BytesToInt(unsigned char inBytes [3]){
	return inBytes[0] << 16 |inBytes[1] << 8 |inBytes[2] & 0XFFFFFF;
}
int assemble2BytesToInt(unsigned char inBytes [2]){
	return inBytes[0] << 8 |inBytes[1] & 0XFFFF;
}

void key_parser(UINT8 *buf_emu)
{
	int i;
	int data,data1,data2;
	struct KEY_BIN keyfile;
	MEMCPY(&keyfile,buf_emu,0x1000);

	CAS_DEBUG_PRINTF("Seca providers\r\n");
	for (i=0;i<S_PROV_NUM;i++){
		data= assemble2BytesToInt(keyfile.seca.sec_ID[i]);
		CAS_DEBUG_PRINTF ("ID:%d\t%4.4X \r\n",i+1,data);
	}

	CAS_DEBUG_PRINTF("\r\nSeca PPUA's\r\n");
	for (i=0;i<S_PROV_NUM;i++){
		data= assemble4BytesToInt(keyfile.seca.sec_PPUA[i]);
		CAS_DEBUG_PRINTF ("ID:%d\t%8.8X \r\n",i+1,data);
	}
	CAS_DEBUG_PRINTF ("-------------------------------------------");
	CAS_DEBUG_PRINTF("\r\nViacces Providers\r\n");
	for (i=0;i<VIA_PROV_NUM;i++){
		data= assemble3BytesToInt(keyfile.viacces.via_ID[i]);
		CAS_DEBUG_PRINTF ("ID:%d\t%6.6X \r\n",i+1,data);
	}

	CAS_DEBUG_PRINTF("\r\nViacces PPUA's\r\n");
	for (i=0;i<VIA_PROV_NUM;i++){
		data= assemble4BytesToInt(keyfile.viacces.via_PPUA[i]);
		CAS_DEBUG_PRINTF ("ID:%d\t%8.8X \r\n",i+1,data);
	}

	CAS_DEBUG_PRINTF("\r\nViacces UA's\r\n");
	for (i=0;i<VIA_PROV_NUM;i++){
		data= assemble4BytesToInt(keyfile.viacces.via_UA[i]);
		data1= keyfile.viacces.via_UA[i][4];
		CAS_DEBUG_PRINTF ("ID:%d\t%8.8X%2.2X \r\n",i+1,data,data1);
	}

	CAS_DEBUG_PRINTF ("-------------------------------------------");
	CAS_DEBUG_PRINTF("\r\nNagravision Providers\r\n");
	for (i=0;i<NGR_ID_NUM;i++){
		data= assemble2BytesToInt(keyfile.nagra.nag_ID[i]);
		CAS_DEBUG_PRINTF ("ID:%d\t%4.4X \r\n",i+1,data);
	}

	CAS_DEBUG_PRINTF ("-------------------------------------------");
	
	CAS_DEBUG_PRINTF("\r\nIrdeto PG\r\n");
	for (i=0;i<IRD_PROV_NUM;i++){
		data= assemble3BytesToInt(keyfile.irdeto.ird_PGID[i]);
		CAS_DEBUG_PRINTF ("ID:%d\t%6.6X \r\n",i+1,data);
	}

	CAS_DEBUG_PRINTF("\r\nIrdeto HexSerial's\r\n");
	for (i=0;i<IRD_PROV_NUM;i++){
		data= assemble3BytesToInt(keyfile.irdeto.ird_HSNS[i]);
		CAS_DEBUG_PRINTF ("ID:%d\t%6.6X \r\n",i+1,data);
	}

	CAS_DEBUG_PRINTF("\r\nIrdeto HexMasterKeys's\r\n");
	for (i=0;i<IRD_PROV_NUM;i++){
		data= assemble4BytesToInt(keyfile.irdeto.ird_HMKS[i]);
		data1= assemble4BytesToInt(keyfile.irdeto.ird_HMKS[i]+4);
		data2= assemble2BytesToInt(keyfile.irdeto.ird_HMKS[i]+4+4);
		CAS_DEBUG_PRINTF ("ID:%d\t%8.8X%8.8X%4.4X \r\n",i+1,data,data1,data2);
	}

	CAS_DEBUG_PRINTF("\r\nIrdeto PlainKeys's\r\n");
	for (i=0;i<IRD_PROV_NUM;i++){
		data= assemble4BytesToInt(keyfile.irdeto.ird_PMKS[i]);
		data1= assemble4BytesToInt(keyfile.irdeto.ird_PMKS[i]+4);
		CAS_DEBUG_PRINTF ("ID:%d\t%8.8X%8.8X \r\n",i+1,data,data1);
	}
	CAS_DEBUG_PRINTF ("-------------------------------------------\r\n");

	CAS_DEBUG_PRINTF("\r\nInternal Flags\r\n");
	CAS_DEBUG_PRINTF ("Update Flag           :%2.2X \r\n",keyfile.update_flag);
	CAS_DEBUG_PRINTF ("Signature Update Flag :%2.2X \r\n",keyfile.sig_update);
	CAS_DEBUG_PRINTF ("KeyIdx (and other)    :%8.8X%4.4X \r\n",assemble4BytesToInt(keyfile.key_idx),assemble2BytesToInt(keyfile.key_idx+4));
	CAS_DEBUG_PRINTF ("Send to card          :%2.2X \r\n",keyfile.send_to_card);
	CAS_DEBUG_PRINTF ("Result                :%2.2X \r\n",keyfile.result);
	CAS_DEBUG_PRINTF ("CaSYS                 :%2.2X \r\n",keyfile.ca_sys);
	CAS_DEBUG_PRINTF ("Ident                 :%4.4X \r\n",assemble2BytesToInt(keyfile.ident));
	CAS_DEBUG_PRINTF ("KeyIndex              :%2.2X \r\n",keyfile.keyidx);

	CAS_DEBUG_PRINTF ("-------------------------------------------\r\n");

	CAS_DEBUG_PRINTF("\r\nOpKeys\r\n");
	for (i=0;i<OPKEY_NUM;i++){
		if  (keyfile.opkeys[i].key_CASYS == SECA)
			CAS_DEBUG_PRINTF ("SECA     %4.4X   " , assemble2BytesToInt(keyfile.seca.sec_ID[keyfile.opkeys[i].key_PROVID-1]));
		if  (keyfile.opkeys[i].key_CASYS == VIAC)
			CAS_DEBUG_PRINTF ("VIAC     %6.6X " , assemble3BytesToInt(keyfile.viacces.via_ID[keyfile.opkeys[i].key_PROVID-1]));
		if  (keyfile.opkeys[i].key_CASYS == NAGRA)
			CAS_DEBUG_PRINTF ("NAGRA    %4.4X   ", assemble2BytesToInt(keyfile.nagra.nag_ID[keyfile.opkeys[i].key_PROVID-1]));
		if  (keyfile.opkeys[i].key_CASYS == IRDETO)
			CAS_DEBUG_PRINTF ("IRDETO          ");
		if  (keyfile.opkeys[i].key_CASYS == CONAX)
			CAS_DEBUG_PRINTF ("CONAX           ");
		if  (keyfile.opkeys[i].key_CASYS == CRYPTO)	//no CRYPTO keys
			CAS_DEBUG_PRINTF ("CRYPTO          ");
		if  (keyfile.opkeys[i].key_CASYS == SKYCRYPT)	//no SKYCRYPT keys
			CAS_DEBUG_PRINTF ("SKYCRYPT        ");
		if  (keyfile.opkeys[i].key_CASYS != 0)
		{		
			CAS_DEBUG_PRINTF ("prov %2.2d ",keyfile.opkeys[i].key_PROVID);
			CAS_DEBUG_PRINTF ("Key %2.2X",keyfile.opkeys[i].key_KEYID );
			data= assemble4BytesToInt(keyfile.opkeys[i].opkey);
			data1= assemble4BytesToInt(keyfile.opkeys[i].opkey+4);
			CAS_DEBUG_PRINTF (" %8.8X%8.8X\r\n",data,data1);
		}
	}

	CAS_DEBUG_PRINTF ("-------------------------------------------\r\n");
	CAS_DEBUG_PRINTF("\r\nConax Section\r\n");

	CAS_DEBUG_PRINTF ("Conax1 KeyIdx         :%2.2X \r\n",keyfile.keyidxConax1);
	CAS_DEBUG_PRINTF ("Conax2 KeyIdx         :%2.2X \r\n",keyfile.keyidxConax1);
	CAS_DEBUG_PRINTF ("\r\nConax1 Expo\r\n");
	for (i=0;i<0x40;i++){
		CAS_DEBUG_PRINTF ("%2.2X",keyfile.conax_expo[0][i]);
	}
	CAS_DEBUG_PRINTF ("\r\nConax2 Expo\r\n");
	for (i=0;i<0x40;i++){
		CAS_DEBUG_PRINTF ("%2.2X",keyfile.conax_expo[1][i]);
	}
	CAS_DEBUG_PRINTF ("\r\nConax1 Modu\r\n");
	for (i=0;i<0x40;i++){
		CAS_DEBUG_PRINTF("%2.2X",keyfile.conax_modu[0][i]);
	}
	CAS_DEBUG_PRINTF ("\r\nConax2 Modu\r\n");
	for (i=0;i<0x40;i++){
		CAS_DEBUG_PRINTF ("%2.2X",keyfile.conax_modu[1][i]);
	}
	CAS_DEBUG_PRINTF ("\r\n");
	CAS_DEBUG_PRINTF ("-------------------------------------------\r\n");

	CAS_DEBUG_PRINTF ("KeyIdx2               :%2.2X \r\n",keyfile.keyidx2);
	CAS_DEBUG_PRINTF ("KeyIdx3               :%2.2X \r\n",keyfile.keyidx3);
	CAS_DEBUG_PRINTF ("\r\n");
}
#endif

#define KEY_TABLE_CHUNK_ID	0x08f70100
#define KEY_TABLE_SECTOR_LENTH	0x10000
#define DEFAULTDATA_TABLE_CHUNK_ID	0x03FC0100
#define  PATCH_KEY_CHUNK_ID  	0x08f70100 
#define DEFAULTDATA_TABLE_SECTOR_LENTH 0x10000
INT32 default_data_write(UINT8 *write_buffer, UINT32 write_size)
{
	extern OSAL_ID sto_wr_sema;
	INT32 ret;
	struct sto_device *sto_flash_dev;
	UINT32 param;

	UINT32 key_table_addr;
	UINT32 chunk_id = DEFAULTDATA_TABLE_CHUNK_ID;
	CHUNK_HEADER chuck_hdr;
	UINT8 *buffer = NULL;

	if((write_buffer == NULL) || (write_size <= 0) || (write_size > DEFAULTDATA_TABLE_SECTOR_LENTH))
	{
		CAS_ERROR_PRINTF("MEM_Write: invalid parameter\n");
		return !SUCCESS;
	}
	
	/* get table info base addr by using chunk */
	if(get_chunk_header(chunk_id, &chuck_hdr) == 0)
	{
		CAS_ERROR_PRINTF("MEM_Write: get keytable base addr failed!\n");
		return !SUCCESS;
	}

	key_table_addr = (UINT32)chunk_goto(&chunk_id, 0xFFFFFFFF, 1) + CHUNK_HEADER_SIZE ;
	key_table_addr -= SYS_FLASH_BASE_ADDR;	// key_table address in flash
	
	sto_flash_dev = (struct sto_device *)dev_get_by_type(NULL, HLD_DEV_TYPE_STO);
	if(sto_flash_dev == NULL)
	{
		CAS_ERROR_PRINTF("MEM_Write: dev_get_by_name failed!\n");
		return !SUCCESS;
	}
	if (sto_open(sto_flash_dev) != SUCCESS)
	{
		CAS_ERROR_PRINTF("MEM_Write: sto_open failed!\n");
		return !SUCCESS;
	}

	buffer = osal_memory_allocate(0x10000);
	if(!buffer)
		return !SUCCESS;
	sto_io_control(sto_flash_dev,STO_DRIVER_SECTOR_BUFFER,buffer);
	sto_io_control(sto_flash_dev, STO_DRIVER_SET_FLAG, STO_FLAG_AUTO_ERASE | STO_FLAG_SAVE_REST);
	//param = key_table_addr << 10;
	//param |= KEY_TABLE_SECTOR_LENTH >> 10;
	//ret = sto_io_control(sto_flash_dev, STO_DRIVER_SECTOR_ERASE, param);
	//if(ret != SUCCESS)
	//{
	//	CAS_ERROR_PRINTF("MEM_Write: Erase failed!\n");
	//	return !SUCCESS;
	//}

#if 1	//not USE_FLASH_COMMON || M3327_2M 
	/*sto_wr_sema is defined and used by database which reads and writes flash frequently*/
//	while(osal_semaphore_capture(sto_wr_sema, 1000) != SUCCESS)
//		CAS_ERROR_PRINTF("MEM_Write: sto_wr_sema capture timeout\n");
	ret = sto_lseek(sto_flash_dev, key_table_addr, STO_LSEEK_SET);
	if ((UINT32) ret != key_table_addr)
	{
		osal_semaphore_release(sto_wr_sema);
		CAS_ERROR_PRINTF("MEM_Write: seek base failed!\n");
		sto_io_control(sto_flash_dev,STO_FLAG_SAVE_REST,NULL);
		sto_io_control(sto_flash_dev, STO_DRIVER_SET_FLAG, 0);
		if(buffer)
			osal_memory_free(buffer);
		return !SUCCESS;
	}
	ret = sto_write(sto_flash_dev, write_buffer, write_size);
	if((UINT32) ret != write_size)
	{
		osal_semaphore_release(sto_wr_sema);
		CAS_ERROR_PRINTF("MEM_Write: here is not blank at:%x!\n", write_buffer);
		sto_io_control(sto_flash_dev,STO_FLAG_SAVE_REST,NULL);
		sto_io_control(sto_flash_dev, STO_DRIVER_SET_FLAG, 0);
		if(buffer)
			osal_memory_free(buffer);
		return !SUCCESS;
	}
	sto_io_control(sto_flash_dev,STO_FLAG_SAVE_REST,NULL);
	sto_io_control(sto_flash_dev, STO_DRIVER_SET_FLAG, 0);
	if(buffer)
		osal_memory_free(buffer);
//	osal_semaphore_release(sto_wr_sema);
	return SUCCESS;
#else
	ret = sto_modify(sto_flash_dev, key_table_addr, write_buffer, write_size);
	if((UINT32) ret != write_size)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -