#include "ctf_process.h" #include "encrypt.h" #include "string.h" FLASH_EraseInitTypeDef EEPROM_AreaEraseInitStruct; uint8_t MAC_ID[12]; uint8_t Check_Code[12]; TrueOrFalse_Flag_Struct_t IsCtfFlag = FALSE; //默认密钥,占用8bytes const uint8_t Secret_Key_Default[8] = "!@#$%^&*"; //擦除数据 void EEPROM_Flash_Erase(void) { uint32_t PageError; EEPROM_AreaEraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EEPROM_AreaEraseInitStruct.PageAddress = FLASH_ADDRESS_CHECKCODE; EEPROM_AreaEraseInitStruct.NbPages = 1; HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); HAL_FLASHEx_Erase(&EEPROM_AreaEraseInitStruct, &PageError); HAL_FLASH_Lock(); HAL_Delay(100); } //指定地址写入指定长度数据类型为32bit数据 static void FLASH_Write(uint32_t FlashAddress, uint32_t* Data, uint16_t DataLength) { uint32_t i = 0; HAL_FLASH_Unlock(); for (i = 0; (i < DataLength) && (FlashAddress <= ((FLASH_ADDRESS_CHECKCODE + 0x3FF) - 4)); i++) { if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FlashAddress, *(uint32_t*)(Data + i)) == HAL_OK) { FlashAddress += 4; } else { // Error occurred while writing data in Flash memory HAL_FLASH_Lock(); return; } } HAL_FLASH_Lock(); return; } //读取认证信息 TrueOrFalse_Flag_Struct_t Read_Ctf_Info(void) { uint32_t Temp; uint8_t i; //读取MACID Temp = *(__IO uint32_t*)(0x1FFFF7E8); for(i=0; i<4; i++) { MAC_ID[i] = Temp >> (8 * i); } Temp = *(__IO uint32_t*)(0x1FFFF7EC); for(i=0; i<4; i++) { MAC_ID[ 4 + i] = Temp >> (8 * i); } Temp = *(__IO uint32_t*)(0x1FFFF7F0); for(i=0; i<4; i++) { MAC_ID[ 8 + i] = Temp >> (8 * i); } //读取授权码 Temp = *(__IO uint32_t*)(FLASH_ADDRESS_CHECKCODE); for(i=0; i<4; i++) { Check_Code[i] = Temp >> (8 * i); } Temp = *(__IO uint32_t*)(FLASH_ADDRESS_CHECKCODE + 4); for(i=0; i<4; i++) { Check_Code[ 4 + i] = Temp >> (8 * i); } Temp = *(__IO uint32_t*)(FLASH_ADDRESS_CHECKCODE + 8); for(i=0; i<4; i++) { Check_Code[ 8 + i] = Temp >> (8 * i); } //计算授权码 unsigned char OutputCode[12]; CheckCodeCal((unsigned char*)MAC_ID, (unsigned char*)Secret_Key_Default, OutputCode); //比较结果 if(strncmp((char*)OutputCode, (char*)Check_Code, 12) == 0) { return TRUE; } else { return FALSE; } } //认证信息计算和存储 void Ctf_CalAndSave(void) { uint32_t DataBuf[3]; uint8_t i; CheckCodeCal((unsigned char*)MAC_ID, (unsigned char*)Secret_Key_Default, Check_Code); for(i=0; i<3; i++) { DataBuf[i] = (Check_Code[4 * i + 3] << 24) + (Check_Code[4 * i + 2] << 16) + (Check_Code[4 * i + 1] << 8) + (Check_Code[4 * i]); } EEPROM_Flash_Erase(); FLASH_Write(FLASH_ADDRESS_CHECKCODE, DataBuf, 12); }