110 lines
3.6 KiB
C
Raw Permalink Normal View History

2023-05-05 11:53:54 +08:00
/******************************************************************************
| File Name : Dcm_App.c
2024-01-20 18:49:43 +08:00
| Description:
2023-05-05 11:53:54 +08:00
*****************************************************************************/
/******************************************************************************
* Description: : Include File Section
******************************************************************************/
#include "Dcm_Key.h"
2024-01-20 18:49:43 +08:00
#include "Dcm_extern.h"
2023-05-05 11:53:54 +08:00
/******************************************************************************
* Description: : Global Variable Definition Section
******************************************************************************/
/******************************************************************************
* Description: : Static Variable Definition Section
******************************************************************************/
/******************************************************************************
* Description: : Write User Function Code
*****************************************************************************/
static const uint8 xorArray[4] = {0xAA,0x50,0x43,0x52};
2023-12-18 23:54:30 +08:00
static const uint8 CFxorArray[4] = {0x4D,0x53,0x57,0x51};
2023-05-05 11:53:54 +08:00
uint32 GetSeed(void)
{
return (GetTimerCnt());
//return(0x0016CDB0); test
}
2024-01-20 18:49:43 +08:00
uint8 testdata1[8] = {0,0,0,0,1,2,3,4};
2023-05-05 11:53:54 +08:00
uint32 SecurityLevel_1(uint32 Seed)
{
SeedSec_t cal,key,seed;
seed.word = Seed;
2024-01-20 18:49:43 +08:00
cal.byte[0] = seed.byte[3]^CFxorArray[0];
cal.byte[1] = seed.byte[2]^CFxorArray[1];
cal.byte[2] = seed.byte[1]^CFxorArray[2];
cal.byte[3] = seed.byte[0]^CFxorArray[3];
2023-05-05 11:53:54 +08:00
2023-12-18 23:54:30 +08:00
key.byte[3] = ((cal.byte[2]&0xF0)<<4)|(cal.byte[3]&0xF0);
key.byte[2] = ((cal.byte[3]&0x2F)<<2)|(cal.byte[1]&0x03);
key.byte[1] = ((cal.byte[1]&0xFC)>>2)|(cal.byte[0]&0xC0);
key.byte[0] = ((cal.byte[0]&0x0F)<<4)|(cal.byte[2]&0x0F);
2024-01-20 18:49:43 +08:00
testdata1[0] = key.byte[0];
testdata1[1] = key.byte[1];
testdata1[2] = key.byte[2];
testdata1[3] = key.byte[3];
//TransmitCAN_Message(0x333,8,testdata1);//TODO
2023-05-05 11:53:54 +08:00
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));
}
}