/****************************************************************************** | File Name : Dcm_App.c | Description: ��Ϸ�����崦�� *****************************************************************************/ /****************************************************************************** * 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)); } }