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