基于机智云物联网平台MCU模式基础教程及远程OTA

对着背影说爱祢 提交于 2021-01-26 19:42:31


编写背景:
       用户如果将开发了的产品发布上线销售,后期需要更新固件和程序,就需要用到远程OTA固件升级,就能对已发布的产品进行远程升级。

材料准备:
       1.机智云4G模组GC211,此模组采用中移模组ML302,需烧录机智云GAgent固件,可在机智云淘宝店铺购买或者联系商务获取,此模组支持网络,移动,联通,电信4G网络,可前往机智云官方和淘宝店铺购买。https://shop159680395.taobao.com/



       2.秉火【F103开发板-指南者】




正文:
云端部署
创建新产品,可根据自己需求选择。



添加如下数据点,可根据自己需求
 


生成STM32F103代码下载备用



       简述STM32 启动
ARM7/ARM9 内核的控制器在复位后,CPU 会从存储空间的绝对地址0x000000 取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC =0x000000)同时中断向量表的位置并不是固定的。然而,Cortex-M3 内核启动有3 种情况:
1、通过boot 引脚设置可以将中断向量表定位于SRAM 区,即起始地址为0x2000000,同时复位后PC 指针位于0x2000000 处;
2、通过boot 引脚设置可以将中断向量表定位于FLASH 区,即起始地址为0x8000000,同时复位后PC 指针位于0x8000000 处;
3、通过boot 引脚设置可以将中断向量表定位于内置Bootloader 区;
Cortex-M3 内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断
入口向量地址,这样在Cortex-M3 内核复位后,会自动从起始地址的下一个32 位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9 内核,Cortex-M3 内核则是固定了中断向量表的位置而起始地址是可变化的。
总结一下STM32 的启动文件和启动过程。首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。
然后在复位中断服务程序中跳转C/C++标准实时库的main 函数,完成用户堆栈等的初始化后,跳转.c 文件中的main 函数开始执行C 程序。假设STM32被设置为从内部FLASH 启动(这也是最常见的一种情况),中断向量表起始地位为0x8000000,则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004 处。当STM32 遇到复位信号后,则从0x80000004 处取出复位中断服务入口地址,继而执行复位中断服务程序,然后跳转main函数,最后进入mian 函数。

分析下OTA 需求,我们将建立两个工程,分别是Bootloader 还有APP,我们将Bootloader下载到FLASH 空间0x8000000 地址处,那么STM32 启动后会首先执行我们的Bootloader 程序,然后就可以按照我们意愿实现OTA 了。

       FLASH 区间划分
       根据需求,我们将STM32F103VET6 这个芯片Flash 空间划分出4 个区域:Bootloader、FLAG、APP、APP_BAK。四个区间作用描述如下:
   Bootloader:存储Bootloader 固件,MCU 上电后首先运行该固件。
   FLAG:存储有关升级的相关标志位,Bootloader 和APP 都需要操作该区域。
              升级标志位(2B)
固件大小(4B)
MD5加密数据(16B)
   APP:存储用户程序固件。
   APPBAK:临时存储云端下发的新固件,升级固件的一个过渡存储区。
STM32F103VET6分区方案如下图所示:



BOOTLOADER分区部分
Bootloader程序流程
Bootloader 的主要职能是在有升级任务的时候将 APPBAK 分区里面的固件拷贝到 APP 区域。当然,这期间需要做很多的工作,比如升级失败的容错等等。具体的流程可以参考图示。需要注意的是,在校验 MD5 正确后开始搬运固件数据期间,MCU 出现故障(包括突然断电),MCU 应发生复位操作(FLAG 区域数据未破坏),复位后重新开始执行 Bootloader,从而避免 MCU 刷成板砖。



Bootloader程序配置
为了方便构架,此处我采用cubemx构建项目,生成keil工程。
创建STM32F103VE项目



配置外部时钟



配置时钟72M



配置debug为serisl wire



配置串口4为BootLoader的日志打印口。



生成keil代码添加驱动flash.c,gagent_md5.c和app.c以及对应的组,如何添加此处不过多介绍(基础的软件操作),只提供文件路径。

 

 

 

 







驱动文件的编写以及函数介绍我此处不过多介绍,可以在福建进行下载源文件,也可以在文章末尾复制代码。代码只讲重点部分。
Main.c添加头文件#include "app.h"


 

主函数添加APP_Process();

 


根据自己分区大小设置区域,我的是18K,2k,54k,54k



Bootloader编译设置
按照 Bootloader 流程编写好代码,需要我们对 KEIL 工程做相应配置,需要注意的是编译的 Bootloader 固件大小不超过最大可允许的 18KB。Keil 编译器需要设置如下:


 

Flash 烧写地址设置有效

 

设置ST-LINK按块擦除 FLASH 区间和烧写程序



 

编译烧录程序,到此BootLoader编写烧录完成。



APP程序分区部分
固件接收流程
做好 BOOTLOADER 工作后,我们开始写 APP 分区的代码。APP 分区固件的编写要注意硬件版本号和软件版本号,软件版号作为升级迭代很重要的标志。需要注意的是,中断向量地址偏移的定义,这个地方需要我们尤其注意,我在开发过程中在这个地方排查了好长时间。STM32 标准库默认中断向量地址偏移为0x0,但是我们APP 实际的偏移是0x5000。如果不修改,APP 也可以正常加载运行,但是不会相应中断。所以,我们需要根据实际APP 下载的起始地址,对中断向量地址偏移做定义。



CUBEMX部署
解压云端生成的代码,由于生成的代码是STM32F103c8的,我们需要通过CUBEMX转换成STM32F103VET6的代码来适应我们的秉火开发板,创建一个新的cubeMX项目,导入自动代码的CUBEMX工程.



目录保存在解压代码所在的路径。



修改时钟树为72M,注意需要同BootLoader时钟。



根据项目需求以及我们自己创建的数据点,我们需要控制RGB灯,蜂鸣器,DHT11,在此处我们需要对引脚进行初始化。


配置RGB灯,采用定时器输出PWM控制。



有源蜂鸣器,和默认代码按键2冲突,修改按键2的GPIO为PB15



配置温湿度传感器DHT11

 



为每个单独的文件生成.C.H文件,方便调用头文件



生成KEIL的代码



到此我们就完成了项目的构建。
编译器设置
       因为硬件FLASH 空间限定,我们需要对APP 的固件大小做严格的限制。本方案,
针对秉火开发板 我们可允许的最大固件为54KB。需要升级的新固件同样最大可支持54KB。
1、设置FLASH 固件下载地址



2、配置中断向量偏移地址设置



3.重新构建工程,添加相关头文件。



4.添加flash.h,flash.h, gagent_md5.c, gagent_md5.h, app.c文件到项目



5. 在mian.c里面添加一下头文件



在main.c里面添加如下代码



       6.在gizwits_protocol.h里面添加如下代码

  1. /************************************
  2. * OTA
  3. ************************************/
  4. #define PIECE_MAX_LEN  256
  5.  
  6. #define FILE_MD5_MAX_LEN  32
  7. //#define SSL_MAX_LEN (FILE_MD5_MAX_LEN/2)
  8.  
  9. #define UPDATE_IS_HEX_FORMAT    0 // Piece Send Format 0,nohex; 1,hex
  10.  
  11. typedef enum
  12. {
  13.     HEX = 0,
  14.  
  15.     BIN,
  16.  
  17. } otaDataType;
  18.  
  19. __packed typedef struct
  20.  
  21. {
  22.     uint16_t                       piecenum;
  23.  
  24.     uint16_t                       piececount;
  25.  
  26.     uint8_t                                piececontent[PIECE_MAX_LEN];
  27.  
  28. } updataPieceData_TypeDef;
  29.  
  30. typedef struct
  31. {
  32.     uint16_t rom_statue;
  33.  
  34.     uint32_t rom_size;
  35.  
  36.     uint8_t  ssl_data[SSL_MAX_LEN];
  37.  
  38. } updateParamSave_t;
  39.  
  40. typedef struct
  41. {
  42.     uint8_t otaBusyModeFlag;
  43.  
  44.     uint32_t updateFileSize;       //Rom Size
  45.  
  46.     MD5_CTX ctx;
  47.  
  48.     updateParamSave_t update_param;//Save Update Param
  49.  
  50. } mcuOTA_t;
  51. int8_t Pro_W2D_UpdateDataHandle(uint8_t *inData , uint32_t dateLen , otaDataType formatType);
  52.  
  53. int8_t Pro_D2W_UpdateReady(uint8_t *md5Data , uint16_t md5Len);
  54.  
  55. int8_t Pro_W2D_UpdateCmdHandle(uint8_t *inData,uint32_t dataLen);
  56.  
  57. void Pro_D2W_UpdateSuspend(void);
  58. void Pro_D2W_Ask_Module_Reboot(void);
复制代码


 




7. 在gizwits_protocol.c里面添加相应的代码,此处不一一例举,只截图详细,详细代码请看附件代码(注意修改gizwitsHandle函数,此处不做截图)。



       8.在gizwits_prduct.h修改这个参数可改变版本号,当前版本需要大于上一个版本。



       9.将代码下载到对应的地址,前面已配置好地址。后面需要生成bin文件才能进行推送(机智云最新版本的升级界面支持hex),在配置里面修改生成bin文件。

 




       10.在产品的OTA界面进行固件升级,升级配置如下,手动推送需要主动更新,静默推送自动更新,其余按照要求配置即可。



       到此本教程结束,如有疑问联系机智云技术支持,15120205205(QQ,微信,电话同号)

FLASH驱动编写
Flash.c
1
  1.    #include "flash.h"
  2. 2.    #include <stdio.h>
  3.  
  4. 3.    #include <string.h>
  5.  
  6. 4.    volatile uint32_t flashWriteOffset = SYS_APP_BAK_SAVE_ADDR_BASE;
  7.  
  8. 5.    volatile uint32_t flashReadOffset = SYS_APP_BAK_SAVE_ADDR_BASE;
  9.  
  10. 6.    /* Exported types ------------------------------------------------------------*/
  11.  
  12. 7.    /** @defgroup FLASH_Exported_Types FLASH Exported Types
  13.  
  14. 8.      * @{
  15. 9.      */
  16. 10.  /* MCU OTA */
  17. 11.  void flash_erase_page(uint8_t flashPage , uint32_t addr_base)
  18.  
  19. 12.  {
  20. 13.      HAL_FLASH_Unlock();
  21. 14.      FLASH_EraseInitTypeDef f;
  22.  
  23. 15.      f.TypeErase = FLASH_TYPEERASE_PAGES;
  24.  
  25. 16.      f.PageAddress = flashPage + (addr_base - SYS_Bootloader_SAVE_ADDR_BASE)/FLASH_PAGE_SIZE;
  26.  
  27. 17.      f.NbPages = 1;
  28.  
  29. 18.     
  30. 19.      uint32_t PageError = 0;
  31.  
  32. 20.      HAL_FLASHEx_Erase(&f, &PageError);
  33.  
  34. 21.      HAL_FLASH_Lock();
  35. 22.  }
  36. 23.  void flash_erase(uint32_t size , uint32_t addr_base)
  37.  
  38. 24.  {
  39. 25.      uint32_t flashPageSum;
  40.  
  41. 26.        uint32_t i;
  42. 27.      /*如果小于2048做处理*/
  43. 28.      if(size < FLASH_PAGE_SIZE)
  44.  
  45. 29.          size = FLASH_PAGE_SIZE;                                                                               //
  46.  
  47. 30.      /* 计算需要擦写的Flash页 */
  48. 31.      if((size % FLASH_PAGE_SIZE) == 0)
  49.  
  50. 32.      {
  51. 33.          flashPageSum = size / FLASH_PAGE_SIZE;                        //小于一页擦除一页
  52.  
  53. 34.      }
  54. 35.      else
  55. 36.      {
  56. 37.          flashPageSum = (size / FLASH_PAGE_SIZE) + 1; //大于一页擦除n+1页
  57.  
  58. 38.      }
  59. 39.      for(i = 0;i<flashPageSum;i++)
  60.  
  61. 40.      {
  62. 41.               flash_erase_page(i,addr_base);                                                      //基址累加擦除flash
  63. 42.      }
  64. 43.  }
  65. 44.   
  66. 45.  void writeFlash(uint64_t * buf_to_save , uint16_t len , uint32_t wFlashAddr)
  67.  
  68. 46.  {
  69. 47.      uint16_t count=0;
  70.  
  71. 48.      if(wFlashAddr >= 0x08020000)
  72.  
  73. 49.      {
  74. 50.  #ifdef DEBUG
  75. 51.          printf("Waring:Flash Write Addr Error\r\n");
  76.  
  77. 52.  #endif
  78. 53.          flashWriteOffset = SYS_APP_BAK_SAVE_ADDR_BASE;
  79.  
  80. 54.          return;
  81.  
  82. 55.      }
  83. 56.      HAL_FLASH_Unlock();
  84. 57.   
  85. 58.        while(count < len)
  86. 59.        {
  87. 60.                      HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,(wFlashAddr + count*8),buf_to_save[count]); //вflashһٶַ֘дɫѫؖè16λé
  88.  
  89. 61.                      count ++;     
  90.  
  91. 62.        }
  92. 63.        HAL_FLASH_Lock();
  93. 64.  }
  94. 65.   
  95. 66.  void readFlash(uint64_t * buf_to_get,uint16_t len , uint32_t readFlashAddr)
  96.  
  97. 67.  {
  98. 68.      uint16_t count=0;
  99. 69.      while(count<len)
  100. 70.      {
  101. 71.        buf_to_get[count]=*(uint64_t *)(readFlashAddr + count*8);
  102.  
  103. 72.        count++;
  104. 73.      }
  105. 74.  }
  106. 75.  /*写Flash,控制写长度,Flash地址偏移*/
  107. 76.  void wFlashData(uint8_t * buf_to_save , uint16_t len , uint32_t wFlashAddr)
  108.  
  109. 77.  {
  110. 78.      uint8_t WriteFlashTempBuf[PIECE_MAX_LEN];//写Flash临时缓冲区
  111.  
  112. 79.      uint16_t WriteFlashTempLen = 0;//写Flash长度
  113.  
  114. 80.      uint8_t rem;
  115. 81.      memset(WriteFlashTempBuf,0xEE,sizeof(WriteFlashTempBuf));//写Flash临时缓冲区首先全部填充0xEE
  116.  
  117. 82.      memcpy(WriteFlashTempBuf,buf_to_save,len);//临时缓冲区
  118.  
  119. 83.      WriteFlashTempLen = len;
  120.  
  121. 84.      if(len%8 != 0)
  122.  
  123. 85.      {
  124. 86.        rem = len%8;
  125. 87.        WriteFlashTempLen = len +8 - rem;
  126. 88.      }
  127. 89.      writeFlash((uint64_t *)&WriteFlashTempBuf ,  WriteFlashTempLen/8 , wFlashAddr);
  128.  
  129. 90.  }
  130. 91.  void rFlashData(uint8_t * buf_to_get , uint16_t len , uint32_t rFlashAddr)
  131.  
  132. 92.  {
  133. 93.      uint8_t ReadFlashTempBuf[PIECE_MAX_LEN];//读Flash临时缓冲区
  134.  
  135. 94.      uint16_t ReadFlashTempLen = 0;//读Flash长度
  136.  
  137. 95.      uint8_t rem;
  138.  
  139. 96.      if(len%8 == 0)
  140.  
  141. 97.      {
  142. 98.          ReadFlashTempLen = len;
  143.  
  144. 99.          readFlash((uint64_t *)&ReadFlashTempBuf,ReadFlashTempLen/8 , rFlashAddr);
  145.  
  146. 100.            memcpy(buf_to_get,ReadFlashTempBuf,len);
  147.  
  148. 101.        }
  149. 102.        else
  150. 103.        {
  151. 104.             rem = len%8;
  152. 105.            ReadFlashTempLen = len + 8 - rem;
  153.  
  154. 106.            readFlash((uint64_t *)&ReadFlashTempBuf,ReadFlashTempLen/8 , rFlashAddr);
  155.  
  156. 107.            memcpy(buf_to_get,ReadFlashTempBuf,len);
  157.  
  158. 108.        }
  159. 109.    }
  160. 110.    /***IAP****/
  161. 111.    typedef  void (*iapfun)(void);
  162.  
  163. 112.    iapfun jump2app;
  164.  
  165. 113.    uint16_t iapbuf[1024];   
  166.  
  167. 114.     
  168. 115.    #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  169.  
  170. 116.    #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  171.  
  172. 117.    #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
  173.  
  174. 118.     
  175. 119.     
  176. 120.    /*#define iar
  177. 121.    #ifdef iar
  178. 122.    //设置栈顶地址
  179. 123.    //addr:栈顶地址
  180. 124.     
  181. 125.    void MSR_MSP(uint32_t addr)
  182.  
  183. 126.    {
  184. 127.      asm("MSR MSP, r0 ");
  185.  
  186. 128.      asm("BX r14");
  187.  
  188. 129.    }
  189. 130.    #else
  190. 131.    __asm void MSR_MSP(uint32_t addr)
  191.  
  192. 132.    {
  193. 133.        MSR MSP, r0                 //set Main Stack value
  194.  
  195. 134.        BX r14
  196.  
  197. 135.    }
  198. 136.    #endif
  199. 137.    */
  200. 138.    __asm void MSR_MSP(uint32_t addr)
  201.  
  202. 139.    {
  203. 140.        MSR MSP, r0                 //set Main Stack value
  204.  
  205. 141.        BX r14
  206. 142.    }
  207. 143.     
  208. 144.     
  209. 145.    void iap_load_app(uint32_t appxaddr)
  210.  
  211. 146.    {
  212. 147.      if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)
  213. 148.      {
  214. 149.    #ifdef DEBUG
  215. 150.             printf("Stack Success!\r\n");
  216. 151.    #endif
  217. 152.             jump2app=(iapfun)*(vu32*)(appxaddr+4);
  218. 153.             MSR_MSP(*(vu32*)appxaddr);
  219. 154.             /* Relocate vector table */
  220. 155.          SCB->VTOR = (uint32_t)(appxaddr - SYS_Bootloader_SAVE_ADDR_BASE);
  221.  
  222. 156.             jump2app();
  223. 157.      }
  224. 158.      else
  225. 159.      {
  226. 160.    #ifdef DEBUG
  227. 161.             printf("Stack Failed!\r\n");
  228. 162.    #endif
  229. 163.      }
  230. 164.    }
复制代码

 

flash.h
1.
  1.    #ifndef _FLASH_
  2. 2.    #define _FLASH_
  3. 3.    #include "stm32f1xx_hal.h"
  4.  
  5. 4.    //#define DEBUG
  6. 5.    //#define PROTOCOL_DEBUG
  7. 6.    typedef uint32_t  u32;
  8.  
  9. 7.    typedef uint16_t u16;
  10.  
  11. 8.    typedef uint8_t  u8;
  12.  
  13. 9.    typedef __IO uint32_t  vu32;
  14.  
  15. 10.  typedef __IO uint16_t vu16;
  16.  
  17. 11.  typedef __IO uint8_t  vu8;
  18.  
  19. 12.  /* BootLoader Flash首地址 */
  20. 13.  #define SYS_Bootloader_SAVE_ADDR_BASE       0x08000000//Bootloader首地址//支持Bootloader大小18KB
  21.  
  22. 14.  /* 升级参数存储 */
  23. 15.  #define UPDATE_PARAM_SAVE_ADDR_BASE         0x08004800
  24.  
  25. 16.  #define UPDATE_PARAM_MAX_SIZE               (2*1024)//支持参数大小2KB
  26.  
  27. 17.  /* APP Flash首地址 */
  28. 18.  #define SYS_APP_SAVE_ADDR_BASE              0x08005000
  29.  
  30. 19.  #define APP_DATA_MAX_SIZE                   (54*1024)//支持APP大小54KB
  31.  
  32. 20.  /* APP BAK Flash首地址 */
  33. 21.  #define SYS_APP_BAK_SAVE_ADDR_BASE          0x08012800
  34.  
  35. 22.  #define APP_BAK_DATA_MAX_SIZE               (54*1024)//支持APP_BAK大小54KB
  36.  
  37. 23.  /* 升级参数 */
  38. 24.  #define PIECE_MAX 256
  39.  
  40. 25.  #define SSL_MAX_LEN 16
  41.  
  42. 26.  typedef struct
  43.  
  44. 27.  {
  45. 28.      uint16_t rom_statue;
  46.  
  47. 29.      uint32_t rom_size;
  48.  
  49. 30.      uint8_t  ssl_data[SSL_MAX_LEN];
  50.  
  51. 31.  }update_param_def;
  52. 32.  /* FLASH页大小 */
  53. 33.  //#define FLASH_PAGE_SIZE           0x400   //1KB
  54.  
  55. 34.  /* 大数据分片大小 */
  56. 35.  //#define BIGDATA_PIECE_MAX 200 //支持的最大数据分片即大数据最大传输单元,200B
  57.  
  58. 36.  #define PIECE_MAX_LEN  256
  59.  
  60. 37.  void save_param_to_flash(uint16_t * buf_to_save,uint16_t len );
  61.  
  62. 38.  void read_param_from_flash(uint16_t * buf_to_get,uint16_t len);
  63.  
  64. 39.  void set_flash_flag_to_updata(uint16_t crc_code);
  65.  
  66. 40.  void rFlashData(uint8_t * buf_to_get , uint16_t len , uint32_t rFlashAddr);
  67.  
  68. 41.  void wFlashData(uint8_t * buf_to_save , uint16_t len , uint32_t wFlashAddr);
  69.  
  70. 42.  void iap_load_app(uint32_t appxaddr);
  71.  
  72. 43.  void flash_erase(uint32_t size , uint32_t addr_base);
  73.  
  74. 44.  #endif
复制代码

 

APP驱动编写
app.c
1.
  1.    /**
  2. 2.      ****************************************************
  3.  
  4. 3.      * @file           : main.c
  5.  
  6. 4.      * @brief          : Main program body
  7.  
  8. 5.      ****************************************************
  9. 6.      * @attention
  10. 7.      *
  11. 8.      * <h2><center>© Copyright (c) 2019 STMicroelectronics.
  12.  
  13. 9.      * All rights reserved.</center></h2>
  14.  
  15. 10.    *
  16. 11.    * This software component is licensed by ST under BSD 3-Clause license,
  17.  
  18. 12.    * the "License"; You may not use this file except in compliance with the
  19.  
  20. 13.    * License. You may obtain a copy of the License at:
  21.  
  22. 14.    *                        opensource.org/licenses/BSD-3-Clause
  23.  
  24. 15.    *
  25. 16.    ****************************************************
  26.  
  27. 17.    */
  28. 18.  /* Includes ------------------------------------------------------------------*/
  29.  
  30. 19.  #include "app.h"
  31.  
  32. 20.  #include "../Src/md5/gagent_md5.h"
  33.  
  34. 21.  #include "../Hal/flash.h"
  35.  
  36. 22.  #include "usart.h"
  37.  
  38. 23.   
  39. 24.  /*Global Variable*/
  40. 25.  /**
  41. 26.    * @brief  Main program.
  42.  
  43. 27.    * @param  None
  44.  
  45. 28.    * @retval None
  46.  
  47. 29.    */
  48. 30.  update_param_def update_param;
  49.  
  50. 31.  uint8_t md5_calc[SSL_MAX_LEN];
  51.  
  52. 32.  MD5_CTX ctx;
  53. 33.  void mcu_restart()
  54. 34.  {
  55. 35.      //__set_FAULTMASK(1);
  56.  
  57. 36.      NVIC_SystemReset();
  58.  
  59. 37.  }
  60. 38.  int8_t ROM_MD5_Check(uint32_t sys_size , uint32_t FlashAddr , uint8_t *ssl)
  61.  
  62. 39.  {
  63. 40.      uint8_t update_data_tmp[PIECE_MAX];
  64.  
  65. 41.      uint32_t load_loop = 0;
  66.  
  67. 42.      uint32_t remaind_data_len = sys_size;
  68.  
  69. 43.      uint32_t valid_data_len = 0;
  70.  
  71. 44.     
  72. 45.      GAgent_MD5Init(&ctx);
  73.  
  74. 46.      if(0 == sys_size%PIECE_MAX)
  75.  
  76. 47.      {
  77. 48.          load_loop = sys_size / PIECE_MAX;
  78.  
  79. 49.      }
  80. 50.      else
  81. 51.      {
  82. 52.          load_loop = sys_size / PIECE_MAX + 1;
  83.  
  84. 53.      }
  85. 54.  #ifdef DEBUG
  86. 55.      printf("Check New Sys ...loop = %d\r\n",load_loop);
  87.  
  88. 56.  #endif
  89. 57.      for(uint32_t i = 0;i<load_loop;i++)
  90.  
  91. 58.      {
  92. 59.          if(remaind_data_len > PIECE_MAX)
  93.  
  94. 60.          {
  95.  
  96. 61.              valid_data_len = PIECE_MAX;
  97.  
  98. 62.          }
  99.  
  100. 63.          else
  101.  
  102. 64.          {
  103.  
  104. 65.              valid_data_len = remaind_data_len;
  105.  
  106. 66.          }
  107.  
  108. 67.          memset(update_data_tmp,0,PIECE_MAX);
  109.  
  110. 68.          rFlashData(update_data_tmp, valid_data_len, FlashAddr + i*PIECE_MAX);
  111.  
  112. 69.          GAgent_MD5Update(&ctx, update_data_tmp, valid_data_len);
  113.  
  114. 70.          remaind_data_len = remaind_data_len - valid_data_len;
  115.  
  116. 71.  #ifdef DEBUG
  117. 72.          printf("*");
  118.  
  119. 73.  #endif
  120. 74.      }
  121. 75.  #ifdef DEBUG
  122. 76.      printf("\r\n");
  123. 77.  #endif
  124. 78.      GAgent_MD5Final(&ctx, md5_calc);
  125.  
  126. 79.  #ifdef DEBUG
  127. 80.      printf("MD5 Calculate Success \r\n ");
  128.  
  129. 81.  #endif
  130. 82.      if(memcmp(ssl, md5_calc, SSL_MAX_LEN) != 0)
  131.  
  132. 83.      {
  133. 84.  #ifdef DEBUG
  134. 85.          printf("Md5_Cacl Check Faild ,MCU OTA Faild\r\n ");
  135.  
  136. 86.  #endif
  137. 87.  #ifdef PROTOCOL_DEBUG
  138.  
  139. 88.          printf("MD5: ");
  140.  
  141. 89.          for(uint16_t i=0; i<SSL_MAX_LEN; i++)
  142.  
  143. 90.          {
  144.  
  145. 91.              printf("%02x ", md5_calc[i]);
  146.  
  147. 92.          }
  148.  
  149. 93.          printf("\r\n");
  150.  
  151. 94.  #endif
  152. 95.          return -1;
  153.  
  154. 96.      }
  155. 97.      else
  156. 98.      {
  157. 99.  #ifdef DEBUG
  158. 100.            printf("MD5 Check Success ,MCU OTA Success\r\n ");
  159.  
  160. 101.    #endif
  161. 102.            return 0;
  162.  
  163. 103.        }
  164. 104.    }
  165. 105.    uint8_t update_new_system(uint32_t sys_size)
  166.  
  167. 106.    {
  168. 107.        uint8_t update_data_tmp[PIECE_MAX];
  169.  
  170. 108.        uint32_t load_loop = 0;
  171.  
  172. 109.        uint32_t remaind_data_len = sys_size;
  173.  
  174. 110.        uint32_t valid_data_len = 0;
  175.  
  176. 111.     
  177. 112.        if(0 == sys_size%PIECE_MAX)
  178.  
  179. 113.        {
  180. 114.            load_loop = sys_size / PIECE_MAX;
  181.  
  182. 115.        }
  183. 116.        else
  184. 117.        {
  185. 118.            load_loop = sys_size / PIECE_MAX + 1;
  186.  
  187. 119.        }
  188. 120.    #ifdef DEBUG
  189. 121.        printf("Copy New Sys ...loop = %d\r\n",load_loop);
  190.  
  191. 122.    #endif
  192. 123.     
  193. 124.        flash_erase(update_param.rom_size , SYS_APP_SAVE_ADDR_BASE);
  194.  
  195. 125.    #ifdef DEBUG
  196. 126.        printf("Copy New Sys\r\n");
  197.  
  198. 127.    #endif
  199. 128.        for(uint32_t i = 0;i<load_loop;i++)
  200.  
  201. 129.        {
  202. 130.            if(remaind_data_len > PIECE_MAX)
  203.  
  204. 131.            {
  205.  
  206. 132.                valid_data_len = PIECE_MAX;
  207.  
  208. 133.            }
  209.  
  210. 134.            else
  211.  
  212. 135.            {
  213.  
  214. 136.                valid_data_len = remaind_data_len;
  215.  
  216. 137.            }
  217.  
  218. 138.            memset(update_data_tmp,0,PIECE_MAX);
  219.  
  220. 139.            rFlashData(update_data_tmp, valid_data_len, SYS_APP_BAK_SAVE_ADDR_BASE + i*PIECE_MAX);
  221.  
  222. 140.            
  223.  
  224. 141.            wFlashData(update_data_tmp , valid_data_len , SYS_APP_SAVE_ADDR_BASE + i*PIECE_MAX);
  225.  
  226. 142.            remaind_data_len = remaind_data_len - valid_data_len;
  227.  
  228. 143.    #ifdef DEBUG
  229. 144.            printf(".");
  230.  
  231. 145.    #endif
  232. 146.        }
  233. 147.    #ifdef DEBUG
  234. 148.        printf("\r\n");
  235.  
  236. 149.        printf("Copy Success , Wait to Check... \r\n");
  237.  
  238. 150.    #endif
  239. 151.     
  240. 152.        if(0 == ROM_MD5_Check(update_param.rom_size , SYS_APP_SAVE_ADDR_BASE , update_param.ssl_data))
  241.  
  242. 153.        {
  243. 154.    #ifdef DEBUG
  244. 155.            printf("New ROM Check Success , Wait to Load New Systerm \r\n");
  245.  
  246. 156.    #endif
  247. 157.            flash_erase(sizeof(update_param_def), UPDATE_PARAM_SAVE_ADDR_BASE);
  248.  
  249. 158.            mcu_restart();
  250.  
  251. 159.        }
  252. 160.        else
  253. 161.        {
  254. 162.    #ifdef DEBUG
  255. 163.            printf("New ROM Check Faild , Update Faild , MCU Try To Update Again ,MCU Restart... \r\n");
  256.  
  257. 164.    #endif
  258. 165.            mcu_restart();
  259.  
  260. 166.        }
  261. 167.     
  262. 168.        return 0;
  263.  
  264. 169.    }
  265. 170.    void APP_Process(void)
  266.  
  267. 171.    {
  268. 172.      memset((uint8_t *)&update_param, 0 , sizeof(update_param_def));
  269.  
  270. 173.      rFlashData((uint8_t *)&update_param, sizeof(update_param_def), UPDATE_PARAM_SAVE_ADDR_BASE);
  271.  
  272. 174.        if(0xEEEE == update_param.rom_statue)
  273.  
  274. 175.        {
  275. 176.    #ifdef DEBUG
  276. 177.            printf("Update Task ,Sys Will Load New Sys..Wait For A Moment \r\n");
  277.  
  278. 178.            printf("Update Size [%d] \r\n",update_param.rom_size);
  279.  
  280. 179.    #endif
  281. 180.            if(0 == ROM_MD5_Check(update_param.rom_size , SYS_APP_BAK_SAVE_ADDR_BASE , update_param.ssl_data))
  282.  
  283. 181.            {
  284.  
  285. 182.                update_new_system(update_param.rom_size);
  286.  
  287. 183.            }
  288.  
  289. 184.            else
  290.  
  291. 185.            {
  292.  
  293. 186.    #ifdef DEBUG
  294. 187.                printf("Check Faild , Go to Old Systerm\r\n");
  295.  
  296. 188.    #endif
  297. 189.                flash_erase(sizeof(update_param_def), UPDATE_PARAM_SAVE_ADDR_BASE);
  298.  
  299. 190.                if(((*(vu32*)(SYS_APP_SAVE_ADDR_BASE + 4)) & 0xFF000000) == 0x08000000)
  300.  
  301. 191.                {
  302.  
  303. 192.    #ifdef DEBUG
  304. 193.                    printf("Sys Will Load APP.....\r\n");
  305.  
  306. 194.    #endif
  307. 195.                    iap_load_app(SYS_APP_SAVE_ADDR_BASE);
  308.  
  309. 196.                }
  310.  
  311. 197.                else
  312.  
  313. 198.                {
  314.  
  315. 199.    #ifdef DEBUG
  316. 200.                    printf("Start APP Failed!\r\n");
  317.  
  318. 201.    #endif
  319. 202.                }
  320.  
  321. 203.            }
  322.  
  323. 204.            
  324.  
  325. 205.        }
  326. 206.        else
  327. 207.        {
  328. 208.    #ifdef DEBUG
  329. 209.             printf("No Update Task , Go To APP ....%04X\r\n",update_param.rom_statue);
  330.  
  331. 210.    #endif
  332. 211.             if(((*(vu32*)(SYS_APP_SAVE_ADDR_BASE + 4)) & 0xFF000000) == 0x08000000)
  333.  
  334. 212.             {
  335. 213.    #ifdef DEBUG
  336. 214.                printf("Sys Will Load APP.....\r\n");
  337.  
  338. 215.    #endif
  339. 216.                    iap_load_app(SYS_APP_SAVE_ADDR_BASE);
  340. 217.             }
  341. 218.             else
  342. 219.             {
  343. 220.    #ifdef DEBUG
  344. 221.                    printf("Start APP Failed!\r\n");
  345.  
  346. 222.                  
  347. 223.    #endif
  348. 224.                  
  349. 225.             }
  350. 226.        }
  351. 227.    }
复制代码

 

app.h
1.
  1.    /**
  2. 2.      ****************************************************
  3. 3.      * File Name          : gpio.h
  4.  
  5. 4.      * Description        : This file contains all the functions prototypes for
  6.  
  7. 5.      *                      the gpio  
  8.  
  9. 6.      ****************************************************
  10.  
  11. 7.      ** This notice applies to any and all portions of this file
  12.  
  13. 8.      * that are not between comment pairs USER CODE BEGIN and
  14.  
  15. 9.      * USER CODE END. Other portions of this file, whether
  16.  
  17. 10.    * inserted by the user or by software development tools
  18.  
  19. 11.    * are owned by their respective copyright owners.
  20.  
  21. 12.    *
  22. 13.    * COPYRIGHT(c) 2019 STMicroelectronics
  23.  
  24. 14.    *
  25. 15.    * Redistribution and use in source and binary forms, with or without modification,
  26.  
  27. 16.    * are permitted provided that the following conditions are met:
  28.  
  29. 17.    *   1. Redistributions of source code must retain the above copyright notice,
  30.  
  31. 18.    *      this list of conditions and the following disclaimer.
  32.  
  33. 19.    *   2. Redistributions in binary form must reproduce the above copyright notice,
  34.  
  35. 20.    *      this list of conditions and the following disclaimer in the documentation
  36.  
  37. 21.    *      and/or other materials provided with the distribution.
  38.  
  39. 22.    *   3. Neither the name of STMicroelectronics nor the names of its contributors
  40.  
  41. 23.    *      may be used to endorse or promote products derived from this software
  42.  
  43. 24.    *      without specific prior written permission.
  44.  
  45. 25.    *
  46. 26.    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  47.  
  48. 27.    * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  49.  
  50. 28.    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  51.  
  52. 29.    * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  53.  
  54. 30.    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  55.  
  56. 31.    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  57.  
  58. 32.    * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  59.  
  60. 33.    * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  61.  
  62. 34.    * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  63.  
  64. 35.    * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  65.  
  66. 36.    *
  67. 37.    ****************************************************
  68.  
  69. 38.    */
  70. 39.   
  71. 40.  /* Define to prevent recursive inclusion -------------------------------------*/
  72.  
  73. 41.  #ifndef __app_H
  74. 42.  #define __app_H
  75. 43.  #ifdef __cplusplus
  76. 44.   extern "C" {
  77.  
  78. 45.  #endif
  79. 46.   
  80. 47.  /* Includes ------------------------------------------------------------------*/
  81.  
  82. 48.  #include "main.h"
  83.  
  84. 49.  #include <stdio.h>
  85.  
  86. 50.  #include <string.h>
  87.  
  88. 51.   
  89. 52.   
  90. 53.  void APP_Process(void);  
  91.  
  92. 54.   
  93. 55.  #ifdef __cplusplus
  94. 56.  }
  95. 57.  #endif
  96. 58.  #endif /*__ pinoutConfig_H */
  97.  
  98. 59.   
  99. 60.  /**
  100. 61.    * @}
  101. 62.    */
  102. 63.   
  103. 64.  /**
  104. 65.    * @}
  105. 66.    */
  106. 67.   
  107. 68.  /**************** (C) COPYRIGHT STMicroelectronics ****END OF FILE***/
复制代码


 

gagent_md5驱动编写
gagent_md5.c
1.
  1.    #include <string.h>
  2.  
  3. 2.    #include "gagent_md5.h"
  4.  
  5. 3.    unsigned char PADDING[] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  6.  
  7. 4.          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  8.  
  9. 5.          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  10.  
  11. 6.          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  12.  
  13. 7.    void GAgent_MD5Init(MD5_CTX *context)
  14.  
  15. 8.    {
  16. 9.        context->count[0] = 0;
  17. 10.      context->count[1] = 0;
  18. 11.      context->state[0] = 0x67452301;
  19. 12.      context->state[1] = 0xEFCDAB89;
  20. 13.      context->state[2] = 0x98BADCFE;
  21. 14.      context->state[3] = 0x10325476;
  22. 15.  }
  23. 16.  void GAgent_MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen)
  24.  
  25. 17.  {
  26. 18.      unsigned int i = 0, index = 0, partlen = 0;
  27. 19.      index = (context->count[0] >> 3) & 0x3F;
  28.  
  29. 20.      partlen = 64 - index;
  30. 21.      context->count[0] += inputlen << 3;
  31. 22.      if (context->count[0] < (inputlen << 3))
  32.  
  33. 23.        context->count[1]++;
  34. 24.      context->count[1] += inputlen >> 29;
  35.  
  36. 25.      if (inputlen >= partlen)
  37. 26.      {
  38. 27.        memcpy(&context->buffer[index], input, partlen);
  39.  
  40. 28.        GAgent_MD5Transform(context->state, context->buffer);
  41.  
  42. 29.        for (i = partlen; i + 64 <= inputlen; i += 64)
  43.  
  44. 30.               GAgent_MD5Transform(context->state, &input[i]);
  45.  
  46. 31.        index = 0;
  47. 32.      }
  48. 33.      else
  49. 34.      {
  50. 35.        i = 0;
  51. 36.      }
  52. 37.      memcpy(&context->buffer[index], &input[i], inputlen - i);
  53.  
  54. 38.  }
  55. 39.  void GAgent_MD5Final(MD5_CTX *context, unsigned char digest[16])
  56.  
  57. 40.  {
  58. 41.      unsigned int index = 0, padlen = 0;
  59. 42.      unsigned char bits[8];
  60. 43.      index = (context->count[0] >> 3) & 0x3F;
  61.  
  62. 44.      padlen = (index < 56) ? (56 - index) : (120 - index);
  63.  
  64. 45.      GAgent_MD5Encode(bits, context->count, 8);
  65.  
  66. 46.      GAgent_MD5Update(context, PADDING, padlen);
  67. 47.      GAgent_MD5Update(context, bits, 8);
  68. 48.      GAgent_MD5Encode(digest, context->state, 16);
  69.  
  70. 49.  }
  71. 50.  void GAgent_MD5Encode(unsigned char *output, unsigned int *input, unsigned int len)
  72.  
  73. 51.  {
  74. 52.      unsigned int i = 0, j = 0;
  75. 53.      while (j < len)
  76. 54.      {
  77. 55.        output[j] = input[i] & 0xFF;
  78. 56.        output[j + 1] = (input[i] >> 8) & 0xFF;
  79.  
  80. 57.        output[j + 2] = (input[i] >> 16) & 0xFF;
  81.  
  82. 58.        output[j + 3] = (input[i] >> 24) & 0xFF;
  83.  
  84. 59.        i++;
  85. 60.        j += 4;
  86. 61.      }
  87. 62.  }
  88. 63.  void GAgent_MD5Decode(unsigned int *output, unsigned char *input, unsigned int len)
  89.  
  90. 64.  {
  91. 65.      unsigned int i = 0, j = 0;
  92. 66.      while (j < len)
  93. 67.      {
  94. 68.        output[i] = (input[j]) |
  95. 69.                      (input[j + 1] << 8) |
  96. 70.                      (input[j + 2] << 16) |
  97. 71.                      (input[j + 3] << 24);
  98. 72.        i++;
  99. 73.        j += 4;
  100. 74.      }
  101. 75.  }
  102. 76.  void GAgent_MD5Transform(unsigned int state[4], unsigned char block[64])
  103.  
  104. 77.  {
  105. 78.      unsigned int a = state[0];
  106. 79.      unsigned int b = state[1];
  107. 80.      unsigned int c = state[2];
  108. 81.      unsigned int d = state[3];
  109. 82.      unsigned int x[64];
  110. 83.      GAgent_MD5Decode(x, block, 64);
  111. 84.      FF(a, b, c, d, x[0], 7, 0xd76aa478); /* 1 */
  112. 85.      FF(d, a, b, c, x[1], 12, 0xe8c7b756); /* 2 */
  113.  
  114. 86.      FF(c, d, a, b, x[2], 17, 0x242070db); /* 3 */
  115.  
  116. 87.      FF(b, c, d, a, x[3], 22, 0xc1bdceee); /* 4 */
  117.  
  118. 88.      FF(a, b, c, d, x[4], 7, 0xf57c0faf); /* 5 */
  119. 89.      FF(d, a, b, c, x[5], 12, 0x4787c62a); /* 6 */
  120.  
  121. 90.      FF(c, d, a, b, x[6], 17, 0xa8304613); /* 7 */
  122.  
  123. 91.      FF(b, c, d, a, x[7], 22, 0xfd469501); /* 8 */
  124.  
  125. 92.      FF(a, b, c, d, x[8], 7, 0x698098d8); /* 9 */
  126. 93.      FF(d, a, b, c, x[9], 12, 0x8b44f7af); /* 10 */
  127.  
  128. 94.      FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */
  129.  
  130. 95.      FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */
  131.  
  132. 96.      FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */
  133.  
  134. 97.      FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */
  135.  
  136. 98.      FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */
  137.  
  138. 99.      FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */
  139.  
  140. 100.     
  141. 101.      /* Round 2 */
  142. 102.      GG(a, b, c, d, x[1], 5, 0xf61e2562); /* 17 */
  143. 103.      GG(d, a, b, c, x[6], 9, 0xc040b340); /* 18 */
  144. 104.      GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */
  145.  
  146. 105.      GG(b, c, d, a, x[0], 20, 0xe9b6c7aa); /* 20 */
  147. 106.      GG(a, b, c, d, x[5], 5, 0xd62f105d); /* 21 */
  148. 107.      GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */
  149. 108.      GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */
  150.  
  151. 109.      GG(b, c, d, a, x[4], 20, 0xe7d3fbc8); /* 24 */
  152. 110.      GG(a, b, c, d, x[9], 5, 0x21e1cde6); /* 25 */
  153. 111.      GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */
  154. 112.      GG(c, d, a, b, x[3], 14, 0xf4d50d87); /* 27 */
  155. 113.      GG(b, c, d, a, x[8], 20, 0x455a14ed); /* 28 */
  156. 114.      GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */
  157. 115.      GG(d, a, b, c, x[2], 9, 0xfcefa3f8); /* 30 */
  158. 116.      GG(c, d, a, b, x[7], 14, 0x676f02d9); /* 31 */
  159. 117.      GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */
  160.  
  161. 118.     
  162. 119.      /* Round 3 */
  163. 120.      HH(a, b, c, d, x[5], 4, 0xfffa3942); /* 33 */
  164. 121.      HH(d, a, b, c, x[8], 11, 0x8771f681); /* 34 */
  165. 122.      HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */
  166.  
  167. 123.      HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */
  168.  
  169. 124.      HH(a, b, c, d, x[1], 4, 0xa4beea44); /* 37 */
  170. 125.      HH(d, a, b, c, x[4], 11, 0x4bdecfa9); /* 38 */
  171. 126.      HH(c, d, a, b, x[7], 16, 0xf6bb4b60); /* 39 */
  172. 127.      HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */
  173.  
  174. 128.      HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */
  175. 129.      HH(d, a, b, c, x[0], 11, 0xeaa127fa); /* 42 */
  176. 130.      HH(c, d, a, b, x[3], 16, 0xd4ef3085); /* 43 */
  177. 131.      HH(b, c, d, a, x[6], 23, 0x4881d05); /* 44 */
  178. 132.      HH(a, b, c, d, x[9], 4, 0xd9d4d039); /* 45 */
  179. 133.      HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */
  180.  
  181. 134.      HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */
  182.  
  183. 135.      HH(b, c, d, a, x[2], 23, 0xc4ac5665); /* 48 */
  184. 136.     
  185. 137.      /* Round 4 */
  186. 138.      II(a, b, c, d, x[0], 6, 0xf4292244); /* 49 */
  187. 139.      II(d, a, b, c, x[7], 10, 0x432aff97); /* 50 */
  188. 140.      II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */
  189.  
  190. 141.      II(b, c, d, a, x[5], 21, 0xfc93a039); /* 52 */
  191. 142.      II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */
  192. 143.      II(d, a, b, c, x[3], 10, 0x8f0ccc92); /* 54 */
  193. 144.      II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */
  194.  
  195. 145.      II(b, c, d, a, x[1], 21, 0x85845dd1); /* 56 */
  196. 146.      II(a, b, c, d, x[8], 6, 0x6fa87e4f); /* 57 */
  197. 147.      II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */
  198.  
  199. 148.      II(c, d, a, b, x[6], 15, 0xa3014314); /* 59 */
  200. 149.      II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */
  201.  
  202. 150.      II(a, b, c, d, x[4], 6, 0xf7537e82); /* 61 */
  203. 151.      II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */
  204.  
  205. 152.      II(c, d, a, b, x[2], 15, 0x2ad7d2bb); /* 63 */
  206. 153.      II(b, c, d, a, x[9], 21, 0xeb86d391); /* 64 */
  207. 154.      state[0] += a;
  208. 155.      state[1] += b;
  209. 156.      state[2] += c;
  210. 157.      state[3] += d;
  211. 158.    }
复制代码

 

gagent_md5.h
1.  
  1.   #ifndef _GAGENT_MD5_H
  2.  
  3. 2.    #define _GAGENT_MD5_H
  4.  
  5. 3.     
  6. 4.    typedef struct
  7. 5.    {
  8. 6.        unsigned int count[2];
  9. 7.        unsigned int state[4];
  10. 8.        unsigned char buffer[64];
  11. 9.    } MD5_CTX;
  12. 10.  #define F(x,y,z) ((x & y) | (~x & z))
  13.  
  14. 11.  #define G(x,y,z) ((x & z) | (y & ~z))
  15.  
  16. 12.  #define H(x,y,z) (x^y^z)
  17. 13.  #define I(x,y,z) (y ^ (x | ~z))
  18.  
  19. 14.  #define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))
  20.  
  21. 15.  #define FF(a,b,c,d,x,s,ac) \
  22.  
  23. 16.  { \
  24. 17.      a += F(b,c,d) + x + ac; \
  25. 18.      a = ROTATE_LEFT(a,s); \
  26. 19.      a += b; \
  27. 20.  }
  28. 21.  #define GG(a,b,c,d,x,s,ac) \
  29.  
  30. 22.  { \
  31. 23.      a += G(b,c,d) + x + ac; \
  32. 24.      a = ROTATE_LEFT(a,s); \
  33. 25.      a += b; \
  34. 26.  }
  35. 27.  #define HH(a,b,c,d,x,s,ac) \
  36.  
  37. 28.  { \
  38. 29.      a += H(b,c,d) + x + ac; \
  39. 30.      a = ROTATE_LEFT(a,s); \
  40. 31.      a += b; \
  41. 32.  }
  42. 33.  #define II(a,b,c,d,x,s,ac) \
  43.  
  44. 34.  { \
  45. 35.      a += I(b,c,d) + x + ac; \
  46. 36.      a = ROTATE_LEFT(a,s); \
  47. 37.      a += b; \
  48. 38.  }
  49. 39.  void GAgent_MD5Init(MD5_CTX *context);
  50.  
  51. 40.  void GAgent_MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen);
  52.  
  53. 41.  void GAgent_MD5Final(MD5_CTX *context, unsigned char digest[16]);
  54.  
  55. 42.  void GAgent_MD5Transform(unsigned int state[4], unsigned char block[64]);
  56.  
  57. 43.  void GAgent_MD5Encode(unsigned char *output, unsigned int *input, unsigned int len);
  58.  
  59. 44.  void GAgent_MD5Decode(unsigned int *output, unsigned char *input, unsigned int len);
  60.  
  61. 45.  #endif
复制代码
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!