📄 key.c
字号:
/****************************************************************************
*
* ALi
*
* File: key.c
*
* Description:
*
* History:
* Date Author Version Comment
* ==== ====== ======= =======
*
*
****************************************************************************/
#include "ucas.h" // Strut of Provaider's
#include "keydata.h" // Define Caid's and Strut of Him Max 7
#define MEMCPY(a,b,c) ali_memcpy(a,b,c)
#define MEMCPY_I(a,b,c) ali_memcpy(b,a,c)
#define MEMCMP(a,b,c) ali_memcmp(a,b,c)
#define MEMSET(a,b,c) ali_memset(a,b,c)
#define MEMMOVE(a,b,c) ali_memmove(a,b,c)
#define STRCPY(a,b) ali_strcpy(a,b)
#define STRCMP(a,b) ali_strcmp(a,b)
#define STRLEN(a) ali_strlen(a)
#define ITOA(a,b) ali_itoa(a,b)
#define ATOI(a) ali_atoi(a)
#define ATOI16(a) ali_atoi16(a)
#define RAND(max_val) ali_rand(max_val)
unsigned char g_pcw[16];
#if 1
NAGRA2KEYINFOR EvNagra2KeyInfor_static[MAX_NAGRA2_KEY]=
{
{
0x4101,
{
0xD9,0x1F,0xB4,0x82,0xF5,0x4C,0x45,0x35,0x62,0x1D,0x84,0x5F,0x7E,0xC4,0xAB,0x4D,
0xC9,0x30,0x9D,0xED,0x26,0xB5,0x40,0x30,0x84,0x8E,0xB6,0x39,0x68,0x97,0x75,0x29,
0xFE,0x8F,0xF1,0x86,0x13,0x27,0x61,0x71,0xE5,0x7B,0xDA,0x8A,0x47,0xAC,0x99,0x37,
0x03,0xCC,0xE2,0xA1,0xCB,0x07,0x19,0x98,0xEC,0xCB,0x32,0x7E,0xF6,0x3C,0xCE,0xA7
},
{
0xD7 ,0x4A ,0x18 ,0x9F ,0xB7 ,0xB6 ,0x55 ,0xA7 ,0x73 ,0xA7 ,0x69 ,0x6D ,0x02 ,0x1D ,0x44 ,0x85,
// 0x8C,0x8D,0x68,0x0F,0x45,0x02,0xAB,0x84,0xE3,0x68,0xBA,0x74,0x20,0x26,0xAE,0x0B, /*2006-05-15, added by DDF*/
0x08 ,0x78 ,0xC0 ,0x7E ,0x6F ,0x76 ,0x23 ,0x13 ,0x57 ,0xA2 ,0xBE ,0xF8 ,0x7D ,0x6B ,0x6F ,0xE5 //Add by EDEN 20060527 TEST OK
// 0x3E,0xAC,0xB6,0x2C,0x71,0xE7,0x6E,0xBD,0xBA,0x5C,0x28,0x25,0xFF,0x33,0x55,0xB9 /*add by DDF 200605-25 08 78 C0 7E 6F 76 23 13 57 A2 BE F8 7D 6B 6F E5 */
},
"TVBco",
},
{
0x4901,
{
0xF3,0x51,0x83,0xAA,0x9B,0x3C,0xF4,0x14,0x7D,0xA9,0x20,0x1E,0x16,0xFB,0x44,0x85,
0x73,0x66,0xC1,0x5C,0x03,0x5E,0xFB,0x87,0xCB,0x62,0x11,0x28,0x23,0x62,0x4F,0x50,
0x11,0xF5,0x56,0x93,0x5E,0x4F,0x98,0x7A,0x7A,0x89,0x74,0x8F,0x3B,0x9D,0x48,0xCC,
0xB1,0xAD,0xCD,0x2F,0xEF,0xF9,0xF4,0xD4,0x45,0x2C,0xFB,0x52,0x1D,0x49,0x61,0x86
},
{
//0x68 ,0x06 ,0xED ,0x53 ,0x18 ,0xD3 ,0xCC ,0x9D ,0xDC ,0x63 ,0x85 ,0x60 ,0x2D ,0x02 ,0xA2 ,0x9B , /*更新于2006-05-19新的也可以*/
0x0F ,0x69 ,0x12 ,0x43 ,0x4C ,0x3F ,0xDF ,0xC8 ,0x58 ,0x1B ,0x9E ,0xD4 ,0x5F ,0xF1 ,0x71 ,0x53,/*对应 旧的的也可以*/
// 0x9D,0x5C,0xB5,0x43,0x85,0x12,0x4E,0x9F,0xD6,0x39,0x09,0x71,0xE0,0x02,0x83,0x08,/*2006-04-20*/
0xF2 ,0xAB ,0x55 ,0x83 ,0x75 ,0xEC ,0x2A ,0x51 ,0xB0 ,0x4F ,0x9E ,0x8B ,0x6F ,0x07 ,0x6A ,0x7C
},
"AB SAT",
},
{
0x7101,
{
0xA1,0x08,0x6D,0x68,0x25,0xFE,0xA2,0x55,0xAE,0x50,0x8D,0x6D,0x2C,0xBA,0x9B,0xBA,
0x8f,0x32,0xE2,0x7E,0xCC,0xF8,0xEE,0xD2,0xE3,0xD9,0x70,0x83,0xEC,0x56,0xB9,0xB9,
0xA0,0xC3,0xAC,0x7C,0xCC,0x9A,0x1B,0xB6,0x09,0xB9,0xA4,0xAB,0x05,0xA0,0x58,0x2B,
0x78,0xD4,0xB4,0x26,0x81,0x05,0x94,0xAA,0xCB,0x9C,0x85,0xF7,0x1F,0x9B,0x64,0xA3
},
{
0x0A,0xA3,0x12,0x42,0x62,0x5E,0x2C,0x2C,0x5A,0x86,0x00,0xD1,0xF9,0xE9,0x3B,0x33 ,
0xBA,0xDF,0xE5,0x63,0x9F,0x6A,0x8B,0xA9,0xE9,0x1B,0x93,0x10,0x70,0x8C,0xB3,0x1D
},
"D+",
}
};
/*The following is called by b_nagra.c , it is used to nagra2 decrypt*/
void Nagra2FindRightKey(int ProviderIdent ,unsigned char *ECMKEYx, unsigned char IDEEA86or96,unsigned char*opkeyx)
{
unsigned char count=0;
unsigned char IDEEA_Index=0;
if(IDEEA86or96==0x86)IDEEA_Index=0;
else if(IDEEA86or96==0x96)IDEEA_Index=1;
else IDEEA_Index=0;
for(count=0;count<MAX_NAGRA2_KEY;count++)
{
if(EvNagra2KeyInfor[count].ProviderIdent==ProviderIdent)
{
//libc_printf("ProviderIdent=%04x,,%04x,%d\n",ProviderIdent,EvNagra2KeyInfor[count].ProviderIdent,IDEEA86or96);
memcpy(ECMKEYx,EvNagra2KeyInfor[count].InitEcmKeyx,64);
memcpy(opkeyx,EvNagra2KeyInfor[count].InitOpKeyx[IDEEA_Index],16);
// libc_printf("HHHHHHHHHHHHHHHHHHHHHHHH\n");
break;
}
}
return;
}
void EV_Update_NAGRA2_IDAAE_Key(int ProviderIdent, unsigned char IDEEA86or96, unsigned char *key, unsigned char len)
{
unsigned char count=0;
unsigned char IDEEA_Index=0;
if(IDEEA86or96==0x86)IDEEA_Index=0;
else if(IDEEA86or96==0x96)IDEEA_Index=1;
else IDEEA_Index=0;
for(count=0;count<MAX_NAGRA2_KEY;count++)
{
if(EvNagra2KeyInfor[count].ProviderIdent==ProviderIdent)
{
if((key[0]==key[1])&&(key[2]==key[1])&&(key[3]==key[1]))break;/*Skip the rubish data..*/
memcpy(EvNagra2KeyInfor[count].InitOpKeyx[IDEEA_Index],key,16);
break;
}
}
}
int ucas_nag_updata_key(int ident,unsigned char*key0,unsigned char*key1)/**sNagraProviderStatic sNagraProvider*/
{
int ii,jj,flagKeyChanged=0;
static int imm=0;
int id=0,count=0,CurIdent=0;
StartUpdateKEYARR:
#if 1
for(ii=0;ii<sNagraProviderNum;ii++)
{
id=((sNagraProvider[ii].abPID[0])<<8)+sNagraProvider[ii].abPID[1];
if(id==(0xFEFF&ident))
{
#if 0
int i=0;
printf("key000\n\n");
for (i=0;i<8;i++)
printf("0x%0x,",key0[i]);
printf("\n\n");
#endif
#if 1
if( MEMCMP(sNagraProvider[ii].abKey00,key0,8)||
MEMCMP(sNagraProvider[ii].abKey01,key1,8)){
flagKeyChanged=1;
imm++;
if(imm>=6)imm=6;
;
memcpy(sNagraProvider[ii].abKey00,key0,8);
memcpy(sNagraProvider[ii].abKey01,key1,8);
}
break;
#endif
}
}
#endif
if((flagKeyChanged)&&(imm<4))//here store key to flash
{
Test_store_data();
}
return 0;
}
int ShenZhou_GetSpecifyKeyCode(int CA_SystemID,int Ident, unsigned char KeyIndex, unsigned char *RightKey)
{
int count=0,Index=0;
int CurIdent=0,NextIdent=0;
int imd=0;
#ifndef NULL
#define NULL (void *)0
#define SECA_KEY_LEN 8
#endif
CA_SystemID=CA_SystemID&0xFF00;
switch(CA_SystemID)
{
case 0x0100:/*Check the right CA system*/
if(sSecaProvider==NULL)
{
return;
}
for(count=0; count<SecaProviderNum; count++)
{
CurIdent =(sSecaProvider[count].PrvID[0]<<16)|(sSecaProvider[count].PrvID[1]<<8)|sSecaProvider[count].PrvID[2];
NextIdent=CurIdent/0xFF;
//printf("Find Ident is 0x%04x\n",CurIdent);
if(CurIdent==Ident)/*Check the right Ident*/
{
//printf("Find the right one====\n");
switch(KeyIndex)
{/*Check the right key Index*/
case 0x0C:
memcpy(RightKey,sSecaProvider[count].key0C,8);
memcpy(RightKey+8,sSecaProvider[count].key0C,8);
break;
case 0x0D:
memcpy(RightKey,sSecaProvider[count].key0D,8);
memcpy(RightKey+8,sSecaProvider[count].key0D,8);
break;
case 0x0E:
memcpy(RightKey,sSecaProvider[count].key0E,8);
memcpy(RightKey+8,sSecaProvider[count].key0E,8);
break;
default:
memcpy(RightKey,sSecaProvider[count].key0C,8);
memcpy(RightKey+8,sSecaProvider[count].key0C,8);
break;
}
break;
}
}
break;
case 0x0500:
if(sViaccessProvider==NULL)
{
return;
}
for(count=0; count<via_channel_num; count++)
{
if((sViaccessProvider[count].ident[0]==sViaccessProvider[count].ident[1])&&
(sViaccessProvider[count].ident[2]==0xFF))
{
break;
}
CurIdent =(sViaccessProvider[count].ident[0]<<16)|(sViaccessProvider[count].ident[1]<<8)|sViaccessProvider[count].ident[2];
if(CurIdent==Ident)/*Check the right Ident*/
{
switch(KeyIndex)
{/*Check the right key Index*/
case 0x08:
memcpy(RightKey,sViaccessProvider[count].key08,8);
break;
case 0x09:
memcpy(RightKey,sViaccessProvider[count].key09,8);
break;
case 0x0A:
memcpy(RightKey,sViaccessProvider[count].key0a,8);
break;
case 0x0B:
memcpy(RightKey,sViaccessProvider[count].key0b,8);
break;
case 0x0C:
memcpy(RightKey,sViaccessProvider[count].key0c,8);
break;
case 0x0D:
memcpy(RightKey,sViaccessProvider[count].key0d,8);
break;
case 0x0E:
memcpy(RightKey,sViaccessProvider[count].key0e,8);
break;
case 0x0F:
memcpy(RightKey,sViaccessProvider[count].key0f,8);
break;
default:
memcpy(RightKey,sViaccessProvider[count].key08,8);
break;
}
}
}
break;
case 0x1800:
if(sNagraProvider==NULL)
{
return;
}
for(count=0; count<sNagraProviderNum; count++)
{
if(Ident==0x4f01)
Ident=0x4e01;
CurIdent =(sNagraProvider[count].abPID[0]<<8)|(sNagraProvider[count].abPID[1]);
// printf("CurIdentCurIdent==%04x\n",CurIdent);
if(CurIdent==Ident)/*Check the right Ident*/
{
switch(KeyIndex)
{/*Check the right key Index*/
case 0x00:
memcpy(RightKey,sNagraProvider[count].abKey00,8);
break;
case 0x01:
memcpy(RightKey,sNagraProvider[count].abKey01,8);
break;
default:
memcpy(RightKey,sNagraProvider[count].abKey00,8);
break;
}
break;
}
}
break;
default:
;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -