📄 cas_key.c
字号:
/****************************************************************************
*
* 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 + -