HWBS/ECU_APP/diagnose/Dcm_Key.c
2023-08-21 16:48:00 +08:00

113 lines
3.6 KiB
C

/******************************************************************************
| 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));
}
}