113 lines
3.6 KiB
C
113 lines
3.6 KiB
C
|
/******************************************************************************
|
|||
|
| File Name : Dcm_App.c
|
|||
|
| Description: <EFBFBD><EFBFBD><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 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));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|