128 lines
3.6 KiB
C
128 lines
3.6 KiB
C
|
/******************************************************************************
|
|||
|
| File Name : Dcm_App.c
|
|||
|
| Description: <EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>崦<EFBFBD><EFBFBD>
|
|||
|
*****************************************************************************/
|
|||
|
|
|||
|
/******************************************************************************
|
|||
|
* Description: : Include File Section
|
|||
|
******************************************************************************/
|
|||
|
#include "Dcm_Key.h"
|
|||
|
|
|||
|
/******************************************************************************
|
|||
|
* Description: : Global Variable Definition Section
|
|||
|
******************************************************************************/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/******************************************************************************
|
|||
|
* Description: : Static Variable Definition Section
|
|||
|
******************************************************************************/
|
|||
|
|
|||
|
|
|||
|
/******************************************************************************
|
|||
|
* Description: : Write User Function Code
|
|||
|
*****************************************************************************/
|
|||
|
static const uint8 xorArray[4] = {0xAA,0x50,0x43,0x52};
|
|||
|
|
|||
|
uint32 GetSeed(void)
|
|||
|
{
|
|||
|
return (GetTimerCnt());
|
|||
|
//return(0x0016CDB0); test
|
|||
|
}
|
|||
|
|
|||
|
uint32 encypt(uint32 seed)
|
|||
|
{
|
|||
|
uint8 i,data[8];
|
|||
|
uint32 seed_temp;
|
|||
|
seed_temp = seed;//(uint32)(data[0])<<24 | (uint32)(data[1])<<16 | (uint32)(data[2])<<8 | (uint32)(data[3]);
|
|||
|
if(seed_temp != 0)
|
|||
|
{
|
|||
|
for(i=0;i<35;i++)
|
|||
|
{
|
|||
|
if(seed_temp & 0x80000000)
|
|||
|
{
|
|||
|
if(seed_temp & 0x00000002)
|
|||
|
{
|
|||
|
seed_temp = ((seed_temp << 1)&0xFFFFFFFF);
|
|||
|
seed_temp = (seed_temp^0xDFAF30B5)&0xFFFFFFFF;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
seed_temp = (seed_temp << 1)&0xFFFFFFFF;
|
|||
|
seed_temp = seed_temp^0x6F21EAAE;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
seed_temp = (seed_temp << 1)&0xFFFFFFFF;
|
|||
|
}
|
|||
|
}
|
|||
|
// data[0] = seed_temp>>24;
|
|||
|
// data[1] = seed_temp>>16;
|
|||
|
// data[2] = seed_temp>>8;
|
|||
|
// data[3] = seed_temp;
|
|||
|
// TransmitCAN_Message(0x701,8,data);
|
|||
|
return seed_temp;
|
|||
|
}
|
|||
|
|
|||
|
uint32 SecurityLevel_1(uint32 Seed)
|
|||
|
{
|
|||
|
return encypt(Seed);
|
|||
|
}
|
|||
|
|
|||
|
uint32 SecurityLevel_3(uint32 Seed)
|
|||
|
{
|
|||
|
SeedSec_t cal,key,seed;
|
|||
|
seed.word = Seed;
|
|||
|
cal.byte[0] = ((seed.byte[0]&0xF8)>>3)^xorArray[0];
|
|||
|
cal.byte[1] = ((seed.byte[1]&0xF8)>>3)^xorArray[1];
|
|||
|
cal.byte[2] = ((seed.byte[2]&0xF8)>>3)^xorArray[2];
|
|||
|
cal.byte[3] = ((seed.byte[3]&0xF8)>>3)^xorArray[3];
|
|||
|
|
|||
|
key.byte[0] = ((cal.byte[3]&0x07)<<5)|(( cal.byte[0]&0xF8)>>3);
|
|||
|
key.byte[1] = ((cal.byte[0]&0x07)<<5)|(cal.byte[2]&0x1F);
|
|||
|
key.byte[2] = (cal.byte[1]&0xF8)|((cal.byte[3]&0xE0)>>5);
|
|||
|
key.byte[3] = (cal.byte[2]&0xF8)|( cal.byte[1]&0x07);
|
|||
|
|
|||
|
return( key.word );
|
|||
|
}
|
|||
|
|
|||
|
uint32 SecurityLevel_11(uint32 Seed)
|
|||
|
{
|
|||
|
SeedSec_t cal,key,seed,key_test;
|
|||
|
seed.word = Seed;
|
|||
|
cal.byte[0] = seed.byte[0]^xorArray[0];
|
|||
|
cal.byte[1] = seed.byte[1]^xorArray[1];
|
|||
|
cal.byte[2] = seed.byte[2]^xorArray[2];
|
|||
|
cal.byte[3] = seed.byte[3]^xorArray[3];
|
|||
|
#if 0
|
|||
|
key.byte[0] = ((cal.byte[2]&0x03)<<6)|(( cal.byte[3]&0xFC)>>2);
|
|||
|
key.byte[1] = ((cal.byte[3]&0x03)<<6)|(cal.byte[0]&0x3F);
|
|||
|
key.byte[2] = (cal.byte[0]&0xFC)|((cal.byte[1]&0xC0)>>6);
|
|||
|
key.byte[3] = (cal.byte[1]&0xFC)|( cal.byte[2]&0x03);
|
|||
|
#else
|
|||
|
key.byte[3] = ((cal.byte[1]&0x03)<<6)|(( cal.byte[0]&0xFC)>>2);
|
|||
|
key.byte[2] = ((cal.byte[0]&0x03)<<6)|(cal.byte[3]&0x3F);
|
|||
|
key.byte[1] = (cal.byte[3]&0xFC)|((cal.byte[2]&0xC0)>>6);
|
|||
|
key.byte[0] = (cal.byte[2]&0xFC)|( cal.byte[1]&0x03);
|
|||
|
#endif
|
|||
|
return( key.word );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
uint32 GENERIC_ALGORITHM(uint32 wSeed, uint8 SecurityLevel)
|
|||
|
{
|
|||
|
if(0x01==SecurityLevel){
|
|||
|
return(SecurityLevel_1(wSeed));
|
|||
|
}
|
|||
|
else if(0x03==SecurityLevel){
|
|||
|
return(SecurityLevel_3(wSeed));
|
|||
|
}
|
|||
|
else if(0x11==SecurityLevel){
|
|||
|
return(SecurityLevel_11(wSeed));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|