182 lines
3.6 KiB
C
182 lines
3.6 KiB
C
#include "keywd.h"
|
|
#include "MD5.h"
|
|
#include "Flash.h"
|
|
|
|
|
|
extern const u16 CRC16_Table[256];
|
|
/*****************************************************************************
|
|
* Function : create_keywd
|
|
* Description : none
|
|
* Input : u8* keyid
|
|
* Output : None
|
|
* Return :
|
|
* Others :
|
|
* Record
|
|
* 1.Date : 20170314
|
|
* Author : barry
|
|
* Modification: Created function
|
|
|
|
*****************************************************************************/
|
|
bool create_keywd(u8* keyid)
|
|
{
|
|
u8 un_id[12];
|
|
u8 md5_id[16];
|
|
u16 crc = 0;
|
|
u8 index = 0;
|
|
|
|
if (!read_unique_id(un_id))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
MD5_code(un_id, md5_id, sizeof(un_id));
|
|
|
|
for (u16 i = 0; i < KEY_LEN; i++)
|
|
{
|
|
keyid[i] = rand()%255;
|
|
}
|
|
|
|
for (u32 i = 0; i < KEY_LEN; i++)
|
|
{
|
|
if ((i % 32) == 0)
|
|
{
|
|
keyid[i] = md5_id[index++];
|
|
|
|
if (index >= 16)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
crc = GetCRC16(keyid, KEY_LEN -2);
|
|
|
|
keyid[KEY_LEN -2] = (u8)(crc %256);
|
|
keyid[KEY_LEN -1] = (u8)(crc /256);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Function : set_key_word
|
|
* Description : none
|
|
* Input : void
|
|
* Output : None
|
|
* Return :
|
|
* Others :
|
|
* Record
|
|
* 1.Date : 20170314
|
|
* Author : barry
|
|
* Modification: Created function
|
|
|
|
*****************************************************************************/
|
|
bool set_key_word(void)
|
|
{
|
|
u8 keyid[KEY_LEN];
|
|
|
|
for (u32 i = 0; i < KEY_LEN; i++)
|
|
{
|
|
if (*((u8*)(FLASH_KEY_ADDRESS + i)) != 0xFF)
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
if ( create_keywd(keyid))
|
|
{
|
|
if (STM32_FlashPageErase(FLASH_KEY_ADDRESS) == FLH_SUCCESS)
|
|
{
|
|
if (STM32_FlashWrite( FLASH_KEY_ADDRESS, keyid, KEY_LEN) == FLH_SUCCESS)
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* Function : check_passwd
|
|
* Description : none
|
|
* Input : void
|
|
* Output : None
|
|
* Return :
|
|
* Others :
|
|
* Record
|
|
* 1.Date : 20170314
|
|
* Author : barry
|
|
* Modification: Created function
|
|
|
|
*****************************************************************************/
|
|
bool check_passwd(void)
|
|
{
|
|
u8 unid[12];
|
|
|
|
u8 MD5_ID[16];
|
|
u8 passwd[16];
|
|
|
|
u8 temp;
|
|
|
|
u8 index = 0;
|
|
|
|
u16 crc16 = 0xFFFF;
|
|
u16 crc_read = 0;
|
|
bool new_flash_area = TRUE;
|
|
|
|
if ( read_unique_id(unid))
|
|
{
|
|
MD5_code(unid, MD5_ID, sizeof(unid));
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
for (u16 i = 0; i < KEY_LEN -2; i++)
|
|
{
|
|
temp = *((u8*)(FLASH_KEY_ADDRESS + i));
|
|
|
|
if (temp != 0xFF)
|
|
{
|
|
new_flash_area = FALSE;
|
|
}
|
|
|
|
crc16 = (crc16 >> 8 ) ^ CRC16_Table[(crc16 ^ temp) & 0xFF];
|
|
|
|
if ( (i % 32) == 0)
|
|
{
|
|
if (index < sizeof(passwd))
|
|
{
|
|
passwd[index++] = temp;
|
|
}
|
|
}
|
|
}
|
|
crc16 ^= 0xFFFF;
|
|
|
|
crc_read = *((u8*)(FLASH_KEY_ADDRESS + KEY_LEN - 2)) + *((u8*)(FLASH_KEY_ADDRESS + KEY_LEN - 1))*256;
|
|
|
|
if (new_flash_area == TRUE)
|
|
{
|
|
return set_key_word();
|
|
}
|
|
else
|
|
{
|
|
if (crc_read == crc16)
|
|
{
|
|
if (cmp_datas(passwd, MD5_ID, 16))
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|