/****************************************************************************** | 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 SecurityLevel_1(uint32 Seed) { SeedSec_t cal,key,seed; 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[3]&0x0F)<<4)|( cal.byte[3]&0xF0); key.byte[1] = ((cal.byte[1]&0x0F)<<4)|((cal.byte[0]&0xF0)>>4); key.byte[2] = (cal.byte[1]&0xF0)|((cal.byte[2]&0xF0)>>4); key.byte[3] = ((cal.byte[0]&0x0F)<<4)|( cal.byte[2]&0x0F); #else key.byte[3] = ((cal.byte[0]&0x0F)<<4)|( cal.byte[0]&0xF0); key.byte[2] = ((cal.byte[2]&0x0F)<<4)|((cal.byte[3]&0xF0)>>4); key.byte[1] = (cal.byte[2]&0xF0)|((cal.byte[1]&0xF0)>>4); key.byte[0] = ((cal.byte[3]&0x0F)<<4)|( cal.byte[1]&0x0F); #endif return( key.word ); } 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)); } }