Files
2025-12-15 16:07:49 +08:00

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;
}
}