ctf_process.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "ctf_process.h"
  2. #include "encrypt.h"
  3. #include "string.h"
  4. FLASH_EraseInitTypeDef EEPROM_AreaEraseInitStruct;
  5. uint8_t MAC_ID[12];
  6. uint8_t Check_Code[12];
  7. TrueOrFalse_Flag_Struct_t IsCtfFlag = FALSE;
  8. //默认密钥,占用8bytes
  9. const uint8_t Secret_Key_Default[8] = "!@#$%^&*";
  10. //擦除数据
  11. void EEPROM_Flash_Erase(void)
  12. {
  13. uint32_t PageError;
  14. EEPROM_AreaEraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  15. EEPROM_AreaEraseInitStruct.PageAddress = FLASH_ADDRESS_CHECKCODE;
  16. EEPROM_AreaEraseInitStruct.NbPages = 1;
  17. HAL_FLASH_Unlock();
  18. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
  19. HAL_FLASHEx_Erase(&EEPROM_AreaEraseInitStruct, &PageError);
  20. HAL_FLASH_Lock();
  21. HAL_Delay(100);
  22. }
  23. //指定地址写入指定长度数据类型为32bit数据
  24. static void FLASH_Write(uint32_t FlashAddress, uint32_t* Data, uint16_t DataLength)
  25. {
  26. uint32_t i = 0;
  27. HAL_FLASH_Unlock();
  28. for (i = 0; (i < DataLength) && (FlashAddress <= ((FLASH_ADDRESS_CHECKCODE + 0x3FF) - 4)); i++)
  29. {
  30. if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FlashAddress, *(uint32_t*)(Data + i)) == HAL_OK)
  31. {
  32. FlashAddress += 4;
  33. }
  34. else
  35. {
  36. // Error occurred while writing data in Flash memory
  37. HAL_FLASH_Lock();
  38. return;
  39. }
  40. }
  41. HAL_FLASH_Lock();
  42. return;
  43. }
  44. //读取认证信息
  45. TrueOrFalse_Flag_Struct_t Read_Ctf_Info(void)
  46. {
  47. uint32_t Temp;
  48. uint8_t i;
  49. //读取MACID
  50. Temp = *(__IO uint32_t*)(0x1FFFF7E8);
  51. for(i=0; i<4; i++)
  52. {
  53. MAC_ID[i] = Temp >> (8 * i);
  54. }
  55. Temp = *(__IO uint32_t*)(0x1FFFF7EC);
  56. for(i=0; i<4; i++)
  57. {
  58. MAC_ID[ 4 + i] = Temp >> (8 * i);
  59. }
  60. Temp = *(__IO uint32_t*)(0x1FFFF7F0);
  61. for(i=0; i<4; i++)
  62. {
  63. MAC_ID[ 8 + i] = Temp >> (8 * i);
  64. }
  65. //读取授权码
  66. Temp = *(__IO uint32_t*)(FLASH_ADDRESS_CHECKCODE);
  67. for(i=0; i<4; i++)
  68. {
  69. Check_Code[i] = Temp >> (8 * i);
  70. }
  71. Temp = *(__IO uint32_t*)(FLASH_ADDRESS_CHECKCODE + 4);
  72. for(i=0; i<4; i++)
  73. {
  74. Check_Code[ 4 + i] = Temp >> (8 * i);
  75. }
  76. Temp = *(__IO uint32_t*)(FLASH_ADDRESS_CHECKCODE + 8);
  77. for(i=0; i<4; i++)
  78. {
  79. Check_Code[ 8 + i] = Temp >> (8 * i);
  80. }
  81. //计算授权码
  82. unsigned char OutputCode[12];
  83. CheckCodeCal((unsigned char*)MAC_ID, (unsigned char*)Secret_Key_Default, OutputCode);
  84. //比较结果
  85. if(strncmp((char*)OutputCode, (char*)Check_Code, 12) == 0)
  86. {
  87. return TRUE;
  88. }
  89. else
  90. {
  91. return FALSE;
  92. }
  93. }
  94. //认证信息计算和存储
  95. void Ctf_CalAndSave(void)
  96. {
  97. uint32_t DataBuf[3];
  98. uint8_t i;
  99. CheckCodeCal((unsigned char*)MAC_ID, (unsigned char*)Secret_Key_Default, Check_Code);
  100. for(i=0; i<3; i++)
  101. {
  102. DataBuf[i] = (Check_Code[4 * i + 3] << 24) + (Check_Code[4 * i + 2] << 16) + (Check_Code[4 * i + 1] << 8) + (Check_Code[4 * i]);
  103. }
  104. EEPROM_Flash_Erase();
  105. FLASH_Write(FLASH_ADDRESS_CHECKCODE, DataBuf, 12);
  106. }