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