drv_crypto.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. /*
  2. * Copyright (c) 2019 Winner Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-07-10 Ernest 1st version
  9. * 2020-10-14 Dozingfiretruck Porting for stm32wbxx
  10. * 2020-11-26 thread-liu add hash
  11. * 2020-11-26 thread-liu add cryp
  12. * 2020-12-11 WKJay fix build problem
  13. */
  14. #include <rtthread.h>
  15. #include <rtdevice.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "drv_crypto.h"
  19. #include "board.h"
  20. #include "drv_config.h"
  21. struct stm32_hwcrypto_device
  22. {
  23. struct rt_hwcrypto_device dev;
  24. struct rt_mutex mutex;
  25. };
  26. #if defined(BSP_USING_CRC)
  27. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32MP1)
  28. static struct hwcrypto_crc_cfg crc_backup_cfg;
  29. static int reverse_bit(rt_uint32_t n)
  30. {
  31. n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
  32. n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc);
  33. n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0);
  34. n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
  35. n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
  36. return n;
  37. }
  38. #endif /* defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) */
  39. static rt_uint32_t _crc_update(struct hwcrypto_crc *ctx, const rt_uint8_t *in, rt_size_t length)
  40. {
  41. rt_uint32_t result = 0;
  42. struct stm32_hwcrypto_device *stm32_hw_dev = (struct stm32_hwcrypto_device *)ctx->parent.device->user_data;
  43. #if defined(SOC_SERIES_STM32L4)|| defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32MP1)
  44. CRC_HandleTypeDef *HW_TypeDef = (CRC_HandleTypeDef *)(ctx->parent.contex);
  45. #endif
  46. rt_mutex_take(&stm32_hw_dev->mutex, RT_WAITING_FOREVER);
  47. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32MP1)
  48. if (memcmp(&crc_backup_cfg, &ctx->crc_cfg, sizeof(struct hwcrypto_crc_cfg)) != 0)
  49. {
  50. if (HW_TypeDef->Init.DefaultPolynomialUse == DEFAULT_POLYNOMIAL_DISABLE)
  51. {
  52. HW_TypeDef->Init.GeneratingPolynomial = ctx ->crc_cfg.poly;
  53. }
  54. else
  55. {
  56. HW_TypeDef->Init.GeneratingPolynomial = DEFAULT_CRC32_POLY;
  57. }
  58. switch (ctx ->crc_cfg.flags)
  59. {
  60. case 0:
  61. HW_TypeDef->Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  62. HW_TypeDef->Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  63. break;
  64. case CRC_FLAG_REFIN:
  65. HW_TypeDef->Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;
  66. break;
  67. case CRC_FLAG_REFOUT:
  68. HW_TypeDef->Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
  69. break;
  70. case CRC_FLAG_REFIN|CRC_FLAG_REFOUT:
  71. HW_TypeDef->Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;
  72. HW_TypeDef->Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
  73. break;
  74. default :
  75. goto _exit;
  76. }
  77. HW_TypeDef->Init.CRCLength = ctx ->crc_cfg.width;
  78. if (HW_TypeDef->Init.DefaultInitValueUse == DEFAULT_INIT_VALUE_DISABLE)
  79. {
  80. HW_TypeDef->Init.InitValue = ctx ->crc_cfg.last_val;
  81. }
  82. if (HAL_CRC_Init(HW_TypeDef) != HAL_OK)
  83. {
  84. goto _exit;
  85. }
  86. memcpy(&crc_backup_cfg, &ctx->crc_cfg, sizeof(struct hwcrypto_crc_cfg));
  87. }
  88. if (HAL_CRC_STATE_READY != HAL_CRC_GetState(HW_TypeDef))
  89. {
  90. goto _exit;
  91. }
  92. #else
  93. if (ctx->crc_cfg.flags != 0 || ctx->crc_cfg.last_val != 0xFFFFFFFF || ctx->crc_cfg.xorout != 0 || length % 4 != 0)
  94. {
  95. goto _exit;
  96. }
  97. length /= 4;
  98. #endif /* defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) */
  99. result = HAL_CRC_Accumulate(ctx->parent.contex, (rt_uint32_t *)in, length);
  100. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32MP1)
  101. if (HW_TypeDef->Init.OutputDataInversionMode)
  102. {
  103. ctx ->crc_cfg.last_val = reverse_bit(result);
  104. }
  105. else
  106. {
  107. ctx ->crc_cfg.last_val = result;
  108. }
  109. crc_backup_cfg.last_val = ctx ->crc_cfg.last_val;
  110. result = (result ? result ^ (ctx ->crc_cfg.xorout) : result);
  111. #endif /* defined(SOC_SERIES_STM32L4)|| defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) */
  112. _exit:
  113. rt_mutex_release(&stm32_hw_dev->mutex);
  114. return result;
  115. }
  116. static const struct hwcrypto_crc_ops crc_ops =
  117. {
  118. .update = _crc_update,
  119. };
  120. #endif /* BSP_USING_CRC */
  121. #if defined(BSP_USING_RNG)
  122. static rt_uint32_t _rng_rand(struct hwcrypto_rng *ctx)
  123. {
  124. rt_uint32_t gen_random = 0;
  125. RNG_HandleTypeDef *HW_TypeDef = (RNG_HandleTypeDef *)(ctx->parent.contex);
  126. if (HAL_OK == HAL_RNG_GenerateRandomNumber(HW_TypeDef, &gen_random))
  127. {
  128. return gen_random ;
  129. }
  130. return 0;
  131. }
  132. static const struct hwcrypto_rng_ops rng_ops =
  133. {
  134. .update = _rng_rand,
  135. };
  136. #endif /* BSP_USING_RNG */
  137. #if defined(BSP_USING_HASH)
  138. static rt_err_t _hash_update(struct hwcrypto_hash *ctx, const rt_uint8_t *in, rt_size_t length)
  139. {
  140. rt_uint32_t tickstart = 0;
  141. rt_uint32_t result = RT_EOK;
  142. struct stm32_hwcrypto_device *stm32_hw_dev = (struct stm32_hwcrypto_device *)ctx->parent.device->user_data;
  143. rt_mutex_take(&stm32_hw_dev->mutex, RT_WAITING_FOREVER);
  144. #if defined(SOC_SERIES_STM32MP1)
  145. HASH_HandleTypeDef *HW_TypeDef = (HASH_HandleTypeDef *)(ctx->parent.contex);
  146. /* Start HASH computation using DMA transfer */
  147. switch (ctx->parent.type)
  148. {
  149. case HWCRYPTO_TYPE_SHA224:
  150. result = HAL_HASHEx_SHA224_Start_DMA(HW_TypeDef, (uint8_t *)in, length);
  151. break;
  152. case HWCRYPTO_TYPE_SHA256:
  153. result = HAL_HASHEx_SHA256_Start_DMA(HW_TypeDef, (uint8_t *)in, length);
  154. break;
  155. case HWCRYPTO_TYPE_MD5:
  156. result = HAL_HASH_MD5_Start_DMA(HW_TypeDef, (uint8_t *)in, length);
  157. break;
  158. case HWCRYPTO_TYPE_SHA1:
  159. result = HAL_HASH_SHA1_Start_DMA(HW_TypeDef, (uint8_t *)in, length);
  160. break;
  161. default :
  162. rt_kprintf("not support hash type: %x", ctx->parent.type);
  163. break;
  164. }
  165. if (result != HAL_OK)
  166. {
  167. goto _exit;
  168. }
  169. /* Wait for DMA transfer to complete */
  170. tickstart = rt_tick_get();
  171. while (HAL_HASH_GetState(HW_TypeDef) == HAL_HASH_STATE_BUSY)
  172. {
  173. if (rt_tick_get() - tickstart > 0xFFFF)
  174. {
  175. result = RT_ETIMEOUT;
  176. goto _exit;
  177. }
  178. }
  179. #endif
  180. _exit:
  181. rt_mutex_release(&stm32_hw_dev->mutex);
  182. return result;
  183. }
  184. static rt_err_t _hash_finish(struct hwcrypto_hash *ctx, rt_uint8_t *out, rt_size_t length)
  185. {
  186. rt_uint32_t result = RT_EOK;
  187. struct stm32_hwcrypto_device *stm32_hw_dev = (struct stm32_hwcrypto_device *)ctx->parent.device->user_data;
  188. rt_mutex_take(&stm32_hw_dev->mutex, RT_WAITING_FOREVER);
  189. #if defined(SOC_SERIES_STM32MP1)
  190. HASH_HandleTypeDef *HW_TypeDef = (HASH_HandleTypeDef *)(ctx->parent.contex);
  191. /* Get the computed digest value */
  192. switch (ctx->parent.type)
  193. {
  194. case HWCRYPTO_TYPE_SHA224:
  195. result = HAL_HASHEx_SHA224_Finish(HW_TypeDef, (uint8_t *)out, length);
  196. break;
  197. case HWCRYPTO_TYPE_SHA256:
  198. result = HAL_HASHEx_SHA256_Finish(HW_TypeDef, (uint8_t *)out, length);
  199. break;
  200. case HWCRYPTO_TYPE_MD5:
  201. result = HAL_HASH_MD5_Finish(HW_TypeDef, (uint8_t *)out, length);
  202. break;
  203. case HWCRYPTO_TYPE_SHA1:
  204. result = HAL_HASH_SHA1_Finish(HW_TypeDef, (uint8_t *)out, length);
  205. break;
  206. default :
  207. rt_kprintf("not support hash type: %x", ctx->parent.type);
  208. break;
  209. }
  210. if (result != HAL_OK)
  211. {
  212. goto _exit;
  213. }
  214. #endif
  215. _exit:
  216. rt_mutex_release(&stm32_hw_dev->mutex);
  217. return result;
  218. }
  219. static const struct hwcrypto_hash_ops hash_ops =
  220. {
  221. .update = _hash_update,
  222. .finish = _hash_finish
  223. };
  224. #endif /* BSP_USING_HASH */
  225. #if defined(BSP_USING_CRYP)
  226. static rt_err_t _cryp_crypt(struct hwcrypto_symmetric *ctx,
  227. struct hwcrypto_symmetric_info *info)
  228. {
  229. rt_uint32_t result = RT_EOK;
  230. rt_uint32_t tickstart = 0;
  231. struct stm32_hwcrypto_device *stm32_hw_dev = (struct stm32_hwcrypto_device *)ctx->parent.device->user_data;
  232. rt_mutex_take(&stm32_hw_dev->mutex, RT_WAITING_FOREVER);
  233. #if defined(SOC_SERIES_STM32MP1)
  234. CRYP_HandleTypeDef *HW_TypeDef = (CRYP_HandleTypeDef *)(ctx->parent.contex);
  235. switch (ctx->parent.type)
  236. {
  237. case HWCRYPTO_TYPE_AES_ECB:
  238. HW_TypeDef->Init.Algorithm = CRYP_AES_ECB;
  239. break;
  240. case HWCRYPTO_TYPE_AES_CBC:
  241. HW_TypeDef->Init.Algorithm = CRYP_AES_CBC;
  242. break;
  243. case HWCRYPTO_TYPE_AES_CTR:
  244. HW_TypeDef->Init.Algorithm = CRYP_AES_CTR;
  245. break;
  246. case HWCRYPTO_TYPE_DES_ECB:
  247. HW_TypeDef->Init.Algorithm = CRYP_DES_ECB;
  248. break;
  249. case HWCRYPTO_TYPE_DES_CBC:
  250. HW_TypeDef->Init.Algorithm = CRYP_DES_CBC;
  251. break;
  252. default :
  253. rt_kprintf("not support cryp type: %x", ctx->parent.type);
  254. break;
  255. }
  256. HAL_CRYP_DeInit(HW_TypeDef);
  257. HW_TypeDef->Init.DataType = CRYP_DATATYPE_8B;
  258. HW_TypeDef->Init.DataWidthUnit = CRYP_DATAWIDTHUNIT_BYTE;
  259. HW_TypeDef->Init.KeySize = CRYP_KEYSIZE_128B;
  260. HW_TypeDef->Init.pKey = (uint32_t*)ctx->key;
  261. result = HAL_CRYP_Init(HW_TypeDef);
  262. if (result != HAL_OK)
  263. {
  264. /* Initialization Error */
  265. goto _exit;
  266. }
  267. if (info->mode == HWCRYPTO_MODE_ENCRYPT)
  268. {
  269. result = HAL_CRYP_Encrypt_DMA(HW_TypeDef, (uint32_t *)info->in, info->length, (uint32_t *)info->out);
  270. }
  271. else if (info->mode == HWCRYPTO_MODE_DECRYPT)
  272. {
  273. result = HAL_CRYP_Decrypt_DMA(HW_TypeDef, (uint32_t *)info->in, info->length, (uint32_t *)info->out);
  274. }
  275. else
  276. {
  277. rt_kprintf("error cryp mode : %02x!\n", info->mode);
  278. result = RT_ERROR;
  279. goto _exit;
  280. }
  281. if (result != HAL_OK)
  282. {
  283. goto _exit;
  284. }
  285. tickstart = rt_tick_get();
  286. while (HAL_CRYP_GetState(HW_TypeDef) != HAL_CRYP_STATE_READY)
  287. {
  288. if (rt_tick_get() - tickstart > 0xFFFF)
  289. {
  290. result = RT_ETIMEOUT;
  291. goto _exit;
  292. }
  293. }
  294. #endif
  295. if (result != HAL_OK)
  296. {
  297. goto _exit;
  298. }
  299. _exit:
  300. rt_mutex_release(&stm32_hw_dev->mutex);
  301. return result;
  302. }
  303. static const struct hwcrypto_symmetric_ops cryp_ops =
  304. {
  305. .crypt = _cryp_crypt
  306. };
  307. #endif
  308. static rt_err_t _crypto_create(struct rt_hwcrypto_ctx *ctx)
  309. {
  310. rt_err_t res = RT_EOK;
  311. switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
  312. {
  313. #if defined(BSP_USING_RNG)
  314. case HWCRYPTO_TYPE_RNG:
  315. {
  316. RNG_HandleTypeDef *hrng = rt_calloc(1, sizeof(RNG_HandleTypeDef));
  317. if (RT_NULL == hrng)
  318. {
  319. res = -RT_ERROR;
  320. break;
  321. }
  322. #if defined(SOC_SERIES_STM32MP1)
  323. hrng->Instance = RNG2;
  324. #else
  325. hrng->Instance = RNG;
  326. #endif
  327. HAL_RNG_Init(hrng);
  328. ctx->contex = hrng;
  329. ((struct hwcrypto_rng *)ctx)->ops = &rng_ops;
  330. break;
  331. }
  332. #endif /* BSP_USING_RNG */
  333. #if defined(BSP_USING_CRC)
  334. case HWCRYPTO_TYPE_CRC:
  335. {
  336. CRC_HandleTypeDef *hcrc = rt_calloc(1, sizeof(CRC_HandleTypeDef));
  337. if (RT_NULL == hcrc)
  338. {
  339. res = -RT_ERROR;
  340. break;
  341. }
  342. #if defined(SOC_SERIES_STM32MP1)
  343. hcrc->Instance = CRC2;
  344. #else
  345. hcrc->Instance = CRC;
  346. #endif
  347. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32MP1)
  348. hcrc->Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
  349. hcrc->Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;
  350. hcrc->Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;
  351. hcrc->Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
  352. hcrc->InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  353. #else
  354. if (HAL_CRC_Init(hcrc) != HAL_OK)
  355. {
  356. res = -RT_ERROR;
  357. }
  358. #endif /* defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7) */
  359. ctx->contex = hcrc;
  360. ((struct hwcrypto_crc *)ctx)->ops = &crc_ops;
  361. break;
  362. }
  363. #endif /* BSP_USING_CRC */
  364. #if defined(BSP_USING_HASH)
  365. case HWCRYPTO_TYPE_MD5:
  366. case HWCRYPTO_TYPE_SHA1:
  367. case HWCRYPTO_TYPE_SHA2:
  368. {
  369. HASH_HandleTypeDef *hash = rt_calloc(1, sizeof(HASH_HandleTypeDef));
  370. if (RT_NULL == hash)
  371. {
  372. res = -RT_ERROR;
  373. break;
  374. }
  375. #if defined(SOC_SERIES_STM32MP1)
  376. /* enable dma for hash */
  377. __HAL_RCC_DMA2_CLK_ENABLE();
  378. HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 2, 0);
  379. HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
  380. hash->Init.DataType = HASH_DATATYPE_8B;
  381. if (HAL_HASH_Init(hash) != HAL_OK)
  382. {
  383. res = -RT_ERROR;
  384. }
  385. #endif
  386. ctx->contex = hash;
  387. ((struct hwcrypto_hash *)ctx)->ops = &hash_ops;
  388. break;
  389. }
  390. #endif /* BSP_USING_HASH */
  391. #if defined(BSP_USING_CRYP)
  392. case HWCRYPTO_TYPE_AES:
  393. case HWCRYPTO_TYPE_DES:
  394. case HWCRYPTO_TYPE_3DES:
  395. case HWCRYPTO_TYPE_RC4:
  396. case HWCRYPTO_TYPE_GCM:
  397. {
  398. CRYP_HandleTypeDef *cryp = rt_calloc(1, sizeof(CRYP_HandleTypeDef));
  399. if (RT_NULL == cryp)
  400. {
  401. res = -RT_ERROR;
  402. break;
  403. }
  404. #if defined(SOC_SERIES_STM32MP1)
  405. cryp->Instance = CRYP2;
  406. /* enable dma for cryp */
  407. __HAL_RCC_DMA2_CLK_ENABLE();
  408. HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 2, 0);
  409. HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
  410. HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 2, 0);
  411. HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
  412. if (HAL_CRYP_Init(cryp) != HAL_OK)
  413. {
  414. res = -RT_ERROR;
  415. }
  416. #endif
  417. ctx->contex = cryp;
  418. ((struct hwcrypto_symmetric *)ctx)->ops = &cryp_ops;
  419. break;
  420. }
  421. #endif /* BSP_USING_CRYP */
  422. default:
  423. res = -RT_ERROR;
  424. break;
  425. }
  426. return res;
  427. }
  428. static void _crypto_destroy(struct rt_hwcrypto_ctx *ctx)
  429. {
  430. switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
  431. {
  432. #if defined(BSP_USING_RNG)
  433. case HWCRYPTO_TYPE_RNG:
  434. break;
  435. #endif /* BSP_USING_RNG */
  436. #if defined(BSP_USING_CRC)
  437. case HWCRYPTO_TYPE_CRC:
  438. __HAL_CRC_DR_RESET((CRC_HandleTypeDef *)ctx-> contex);
  439. HAL_CRC_DeInit((CRC_HandleTypeDef *)(ctx->contex));
  440. break;
  441. #endif /* BSP_USING_CRC */
  442. #if defined(BSP_USING_HASH)
  443. case HWCRYPTO_TYPE_MD5:
  444. case HWCRYPTO_TYPE_SHA1:
  445. case HWCRYPTO_TYPE_SHA2:
  446. __HAL_HASH_RESET_HANDLE_STATE((HASH_HandleTypeDef *)(ctx->contex));
  447. HAL_HASH_DeInit((HASH_HandleTypeDef *)(ctx->contex));
  448. break;
  449. #endif /* BSP_USING_HASH */
  450. #if defined(BSP_USING_CRYP)
  451. case HWCRYPTO_TYPE_AES:
  452. case HWCRYPTO_TYPE_DES:
  453. case HWCRYPTO_TYPE_3DES:
  454. case HWCRYPTO_TYPE_RC4:
  455. case HWCRYPTO_TYPE_GCM:
  456. HAL_CRYP_DeInit((CRYP_HandleTypeDef *)(ctx->contex));
  457. break;
  458. #endif /* BSP_USING_CRYP */
  459. default:
  460. break;
  461. }
  462. rt_free(ctx->contex);
  463. }
  464. static rt_err_t _crypto_clone(struct rt_hwcrypto_ctx *des, const struct rt_hwcrypto_ctx *src)
  465. {
  466. rt_err_t res = RT_EOK;
  467. switch (src->type & HWCRYPTO_MAIN_TYPE_MASK)
  468. {
  469. #if defined(BSP_USING_RNG)
  470. case HWCRYPTO_TYPE_RNG:
  471. if (des->contex && src->contex)
  472. {
  473. rt_memcpy(des->contex, src->contex, sizeof(RNG_HandleTypeDef));
  474. }
  475. break;
  476. #endif /* BSP_USING_RNG */
  477. #if defined(BSP_USING_CRC)
  478. case HWCRYPTO_TYPE_CRC:
  479. if (des->contex && src->contex)
  480. {
  481. rt_memcpy(des->contex, src->contex, sizeof(CRC_HandleTypeDef));
  482. }
  483. break;
  484. #endif /* BSP_USING_CRC */
  485. #if defined(BSP_USING_HASH)
  486. case HWCRYPTO_TYPE_MD5:
  487. case HWCRYPTO_TYPE_SHA1:
  488. case HWCRYPTO_TYPE_SHA2:
  489. if (des->contex && src->contex)
  490. {
  491. rt_memcpy(des->contex, src->contex, sizeof(HASH_HandleTypeDef));
  492. }
  493. break;
  494. #endif /* BSP_USING_HASH */
  495. #if defined(BSP_USING_CRYP)
  496. case HWCRYPTO_TYPE_AES:
  497. case HWCRYPTO_TYPE_DES:
  498. case HWCRYPTO_TYPE_3DES:
  499. case HWCRYPTO_TYPE_RC4:
  500. case HWCRYPTO_TYPE_GCM:
  501. if (des->contex && src->contex)
  502. {
  503. rt_memcpy(des->contex, src->contex, sizeof(CRYP_HandleTypeDef));
  504. }
  505. break;
  506. #endif /* BSP_USING_CRYP */
  507. default:
  508. res = -RT_ERROR;
  509. break;
  510. }
  511. return res;
  512. }
  513. static void _crypto_reset(struct rt_hwcrypto_ctx *ctx)
  514. {
  515. switch (ctx->type & HWCRYPTO_MAIN_TYPE_MASK)
  516. {
  517. #if defined(BSP_USING_RNG)
  518. case HWCRYPTO_TYPE_RNG:
  519. break;
  520. #endif /* BSP_USING_RNG */
  521. #if defined(BSP_USING_CRC)
  522. case HWCRYPTO_TYPE_CRC:
  523. __HAL_CRC_DR_RESET((CRC_HandleTypeDef *)ctx-> contex);
  524. break;
  525. #endif /* BSP_USING_CRC */
  526. #if defined(BSP_USING_HASH)
  527. case HWCRYPTO_TYPE_MD5:
  528. case HWCRYPTO_TYPE_SHA1:
  529. case HWCRYPTO_TYPE_SHA2:
  530. __HAL_HASH_RESET_HANDLE_STATE((HASH_HandleTypeDef *)(ctx->contex));
  531. break;
  532. #endif /* BSP_USING_HASH*/
  533. #if defined(BSP_USING_CRYP)
  534. case HWCRYPTO_TYPE_AES:
  535. case HWCRYPTO_TYPE_DES:
  536. case HWCRYPTO_TYPE_3DES:
  537. case HWCRYPTO_TYPE_RC4:
  538. case HWCRYPTO_TYPE_GCM:
  539. break;
  540. #endif /* BSP_USING_CRYP */
  541. default:
  542. break;
  543. }
  544. }
  545. #if defined(HASH2_IN_DMA_INSTANCE)
  546. void HASH2_DMA_IN_IRQHandler(void)
  547. {
  548. extern DMA_HandleTypeDef hdma_hash_in;
  549. /* enter interrupt */
  550. rt_interrupt_enter();
  551. HAL_DMA_IRQHandler(&hdma_hash_in);
  552. /* leave interrupt */
  553. rt_interrupt_leave();
  554. }
  555. #endif
  556. #if defined(CRYP2_IN_DMA_INSTANCE)
  557. void CRYP2_DMA_IN_IRQHandler(void)
  558. {
  559. extern DMA_HandleTypeDef hdma_cryp_in;
  560. /* enter interrupt */
  561. rt_interrupt_enter();
  562. HAL_DMA_IRQHandler(&hdma_cryp_in);
  563. /* leave interrupt */
  564. rt_interrupt_leave();
  565. }
  566. #endif
  567. #if defined (CRYP2_OUT_DMA_INSTANCE)
  568. void CRYP2_DMA_OUT_IRQHandler(void)
  569. {
  570. extern DMA_HandleTypeDef hdma_cryp_out;
  571. /* enter interrupt */
  572. rt_interrupt_enter();
  573. HAL_DMA_IRQHandler(&hdma_cryp_out);
  574. /* leave interrupt */
  575. rt_interrupt_leave();
  576. }
  577. #endif
  578. static const struct rt_hwcrypto_ops _ops =
  579. {
  580. .create = _crypto_create,
  581. .destroy = _crypto_destroy,
  582. .copy = _crypto_clone,
  583. .reset = _crypto_reset,
  584. };
  585. int stm32_hw_crypto_device_init(void)
  586. {
  587. static struct stm32_hwcrypto_device _crypto_dev;
  588. rt_uint32_t cpuid[3] = {0};
  589. _crypto_dev.dev.ops = &_ops;
  590. #if defined(BSP_USING_UDID)
  591. #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  592. cpuid[0] = HAL_GetUIDw0();
  593. cpuid[1] = HAL_GetUIDw1();
  594. #elif defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32MP1)
  595. cpuid[0] = HAL_GetREVID();
  596. cpuid[1] = HAL_GetDEVID();
  597. #endif
  598. #endif /* BSP_USING_UDID */
  599. _crypto_dev.dev.id = 0;
  600. rt_memcpy(&_crypto_dev.dev.id, cpuid, 8);
  601. _crypto_dev.dev.user_data = &_crypto_dev;
  602. if (rt_hwcrypto_register(&_crypto_dev.dev, RT_HWCRYPTO_DEFAULT_NAME) != RT_EOK)
  603. {
  604. return -1;
  605. }
  606. rt_mutex_init(&_crypto_dev.mutex, RT_HWCRYPTO_DEFAULT_NAME, RT_IPC_FLAG_FIFO);
  607. return 0;
  608. }
  609. INIT_DEVICE_EXPORT(stm32_hw_crypto_device_init);