lib_aes.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *文件名:
  4. *作 者: AE
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述:
  8. *备 注: 适用于 ES8P508芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #include "lib_aes.h"
  12. /***************************************************************
  13. 函数名:AES_Init
  14. 描 述:AES功能初始化函数
  15. 输入值:AES_InitStruct 初始化结构体
  16. 输出值:无
  17. 返回值:无
  18. ***************************************************************/
  19. void AES_Init(AES_InitStruType * AES_InitStruct)
  20. {
  21. AES_Reset();
  22. AES->CON.ENCRYPT = AES_InitStruct->MODE;
  23. return;
  24. }
  25. /***************************************************************
  26. 函数名:AES_WriteKey
  27. 描 述:AES写入密钥函数
  28. 输入值:AES_KEY 待写入密钥
  29. 输出值:无
  30. 返回值:无
  31. ***************************************************************/
  32. void AES_WriteKey(uint32_t *AES_KEY)
  33. {
  34. uint32_t *address = AES_KEY;
  35. AES->KEY3.AES_KEY3 = *address;
  36. address ++;
  37. AES->KEY2.AES_KEY2 = *address;
  38. address ++;
  39. AES->KEY1.AES_KEY1 = *address;
  40. address ++;
  41. AES->KEY0.AES_KEY0 = *address;
  42. }
  43. /***************************************************************
  44. 函数名:AES_ReadKey
  45. 描 述:AES读出密钥函数
  46. 输入值:无
  47. 输出值:AES_DATA读出密钥存放位置
  48. 返回值:无
  49. ***************************************************************/
  50. void AES_ReadKey(uint32_t * AES_KEY)
  51. {
  52. uint32_t *address = AES_KEY;
  53. *address = AES->KEY3.AES_KEY3;
  54. address ++;
  55. *address = AES->KEY2.AES_KEY2;
  56. address ++;
  57. *address = AES->KEY1.AES_KEY1;
  58. address ++;
  59. *address = AES->KEY0.AES_KEY0;
  60. return;
  61. }
  62. /***************************************************************
  63. 函数名:AES_WriteData
  64. 描 述:AES写入数据函数
  65. 输入值:AES_DATA 待写入数据
  66. 输出值:无
  67. 返回值:无
  68. ***************************************************************/
  69. void AES_WriteData(uint32_t *AES_DATA)
  70. {
  71. uint32_t *address = AES_DATA;
  72. AES->DATA3.AES_DATA3 = *address;
  73. address ++;
  74. AES->DATA2.AES_DATA2 = *address;
  75. address ++;
  76. AES->DATA1.AES_DATA1 = *address;
  77. address ++;
  78. AES->DATA0.AES_DATA0 = *address;
  79. }
  80. /***************************************************************
  81. 函数名:AES_WriteData
  82. 描 述:AES读出数据函数
  83. 输入值:无
  84. 输出值:AES_DATA读出数据存放位置
  85. 返回值:无
  86. ***************************************************************/
  87. void AES_ReadData(uint32_t * AES_DATA)
  88. {
  89. uint32_t *address = AES_DATA;
  90. *address = AES->DATA3.AES_DATA3;
  91. address ++;
  92. *address = AES->DATA2.AES_DATA2;
  93. address ++;
  94. *address = AES->DATA1.AES_DATA1;
  95. address ++;
  96. *address = AES->DATA0.AES_DATA0;
  97. return;
  98. }
  99. /***************************************************************
  100. 函数名:AES_ITConfig
  101. 描 述:AES中断使能
  102. 输入值:AES_IE
  103. NewState Enable/Disable
  104. 输出值:无
  105. 返回值:无
  106. ***************************************************************/
  107. void AES_ITConfig(AES_TYPE_IT AES_IE, TYPE_FUNCEN NewState)
  108. {
  109. uint32_t Word = AES->CON.Word&0xffffff8e;
  110. if(AES->CON.GO_DONE == 1)
  111. {
  112. return;
  113. }
  114. if (NewState == ENABLE)
  115. Word |= (uint32_t)AES_IE;
  116. else
  117. Word &= ~(uint32_t)AES_IE;
  118. AES->CON.Word = Word;
  119. return;
  120. }
  121. /***************************************************************
  122. 函数名:AES_GetFlagStatus
  123. 描 述:AES获得特定中断标志函数
  124. 输入值:IFName
  125. AES_IF_IF 加解密完成中断
  126. 输出值:无
  127. 返回值:中断标志与否
  128. ***************************************************************/
  129. FlagStatus AES_GetFlagStatus(AES_TYPE_IF IFName)
  130. {
  131. if(AES->CON.Word & IFName) {
  132. return SET;
  133. }
  134. return RESET;
  135. }
  136. /***************************************************************
  137. 函数名:AES_ClearITPendingBit
  138. 描 述:AES清除特定中断标志函数
  139. 输入值:IFName
  140. AES_IF_DONE 加解密完成中断
  141. 输出值:无
  142. 返回值:无
  143. ***************************************************************/
  144. void AES_ClearITPendingBit(void)
  145. {
  146. /* 考虑到IF与GO_DONE在同一个word中,对IF赋值可能会存在一些问题
  147. * 例如GO_DONE是1时,取值,随后GO_DONE变成0,而赋值会以原来的1再对其进行赋值
  148. * 该部分需要进行测试
  149. */
  150. if(AES->CON.GO_DONE == SET)
  151. {
  152. return;
  153. }
  154. AES->CON.IF = SET;
  155. return;
  156. }
  157. /***************************************************************
  158. 函数名:AES_GetDoneStatus
  159. 描 述:AES获得是否加/解密完成
  160. 输入值:无
  161. 输出值:无
  162. 返回值:AES_DONE_NO 加密未完成
  163. AES_DONE_YES 未加密或者加密已经完成
  164. ***************************************************************/
  165. AES_TYPE_DONE AES_GetDoneStatus(void)
  166. {
  167. if(AES->CON.GO_DONE == 1)
  168. {
  169. return AES_DONE_NO;
  170. }
  171. return AES_DONE_YES;
  172. }
  173. /***************************************************************
  174. 函数名:AES_Reset
  175. 描 述:AES复位
  176. 输入值:无
  177. 输出值:无
  178. 返回值:无
  179. ***************************************************************/
  180. void AES_Reset(void)
  181. {
  182. AES->DATA0.Word = 0x00000000;
  183. AES->DATA1.Word = 0x00000000;
  184. AES->DATA2.Word = 0x00000000;
  185. AES->DATA3.Word = 0x00000000;
  186. AES->KEY0.Word = 0x00000000;
  187. AES->KEY1.Word = 0x00000000;
  188. AES->KEY2.Word = 0x00000000;
  189. AES->KEY3.Word = 0x00000000;
  190. AES->CON.Word = 0x00000000;
  191. }