sm4.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /*
  2. * Copyright (C) 2017-2020 Alibaba Group Holding Limited
  3. */
  4. /******************************************************************************
  5. * @file drv/sm4.h
  6. * @brief Header File for SM4 Driver
  7. * @version V2.0
  8. * @date 9. DEC 2020
  9. * @model SM4
  10. ******************************************************************************/
  11. #ifndef _DRV_SM4_H_
  12. #define _DRV_SM4_H_
  13. #include <stdint.h>
  14. #include "common.h"
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. #define SM4_KEY_LEN_BYTES_32 32
  19. #define SM4_KEY_LEN_BYTES_24 24
  20. #define SM4_KEY_LEN_BYTES_16 16
  21. typedef enum {
  22. SM4_KEY_LEN_BITS_128 = 0, /*128 Data bits*/
  23. SM4_KEY_LEN_BITS_256 /*256 Data bits*/
  24. } csi_sm4_key_bits_t;
  25. typedef struct {
  26. uint32_t busy : 1; ///< Calculate busy flag
  27. uint32_t error : 1; ///< Calculate error flag
  28. } csi_sm4_state_t;
  29. typedef struct {
  30. uint32_t key_len_byte;
  31. uint8_t key[32]; ///< Data block being processed
  32. uint32_t sca;
  33. } csi_sm4_context_t;
  34. /**
  35. \brief SM4 Ctrl Block
  36. */
  37. typedef struct {
  38. csi_sm4_state_t state;
  39. csi_sm4_context_t context;
  40. csi_dev_t dev;
  41. void * priv;
  42. uint32_t is_kdf;
  43. } csi_sm4_t;
  44. // Function documentation
  45. /**
  46. \brief Initialize sm4 Interface. Initializes the resources needed for the sm4 interface
  47. \param[in] sm4 operate handle
  48. \param[in] idx device id
  49. \return error code \ref uint32_t
  50. */
  51. csi_error_t csi_sm4_init(csi_sm4_t *sm4, uint32_t idx);
  52. /**
  53. \brief De-initialize sm4 Interface. stops operation and releases the software resources used by the interface
  54. \param[in] sm4 handle to operate
  55. \return None
  56. */
  57. void csi_sm4_uninit(csi_sm4_t *sm4);
  58. /**
  59. \brief Set encrypt key
  60. \param[in] sm4 handle to operate
  61. \param[in] key Pointer to the key buf
  62. \return error code \ref uint32_t
  63. */
  64. csi_error_t csi_sm4_set_encrypt_key(csi_sm4_t *sm4, uint8_t *key, csi_sm4_key_bits_t key_len);
  65. /**
  66. \brief Set decrypt key
  67. \param[in] sm4 handle to operate
  68. \param[in] key Pointer to the key buf
  69. \return error code \ref uint32_t
  70. */
  71. csi_error_t csi_sm4_set_decrypt_key(csi_sm4_t *sm4, uint8_t *key, csi_sm4_key_bits_t key_len);
  72. /**
  73. \brief sm4 ecb encrypt
  74. \param[in] sm4 handle to operate
  75. \param[in] in Pointer to the Source data
  76. \param[out] out Pointer to the Result data
  77. \param[in] size the Source data size
  78. \return error code \ref uint32_t
  79. */
  80. csi_error_t csi_sm4_ecb_encrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  81. uint32_t size);
  82. /**
  83. \brief sm4 ecb decrypt
  84. \param[in] sm4 handle to operate
  85. \param[in] in Pointer to the Source data
  86. \param[out] out Pointer to the Result data
  87. \param[in] size the Source data size
  88. \return error code \ref uint32_t
  89. */
  90. csi_error_t csi_sm4_ecb_decrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  91. uint32_t size);
  92. /**
  93. \brief sm4 cbc encrypt
  94. \param[in] sm4 handle to operate
  95. \param[in] in Pointer to the Source data
  96. \param[out] out Pointer to the Result data
  97. \param[in] size the Source data size
  98. \param[in] iv init vector
  99. \return error code \ref uint32_t
  100. */
  101. csi_error_t csi_sm4_cbc_encrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  102. uint32_t size, uint8_t *iv);
  103. /**
  104. \brief sm4 cbc decrypt
  105. \param[in] sm4 handle to operate
  106. \param[in] in Pointer to the Source data
  107. \param[out] out Pointer to the Result data
  108. \param[in] size the Source data size
  109. \param[in] iv init vector
  110. \return error code \ref uint32_t
  111. */
  112. csi_error_t csi_sm4_cbc_decrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  113. uint32_t size, uint8_t *iv);
  114. /**
  115. \brief sm4 cfb1 encrypt
  116. \param[in] sm4 handle to operate
  117. \param[in] in Pointer to the Source data
  118. \param[out] out Pointer to the Result data
  119. \param[in] size the Source data size
  120. \param[in] iv init vector
  121. \return error code \ref uint32_t
  122. */
  123. csi_error_t csi_sm4_cfb1_encrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  124. uint32_t size, uint8_t *iv);
  125. /**
  126. \brief sm4 cfb1 decrypt
  127. \param[in] sm4 handle to operate
  128. \param[in] in Pointer to the Source data
  129. \param[out] out Pointer to the Result data
  130. \param[in] size the Source data size
  131. \param[in] iv init vector
  132. \return error code \ref uint32_t
  133. */
  134. csi_error_t csi_sm4_cfb1_decrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  135. uint32_t size, uint8_t *iv);
  136. /**
  137. \brief sm4 cfb8 encrypt
  138. \param[in] sm4 handle to operate
  139. \param[in] in Pointer to the Source data
  140. \param[out] out Pointer to the Result data
  141. \param[in] size the Source data size
  142. \param[in] iv init vector
  143. \return error code \ref uint32_t
  144. */
  145. csi_error_t csi_sm4_cfb8_encrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  146. uint32_t size, uint8_t *iv);
  147. /**
  148. \brief sm4 cfb8 decrypt
  149. \param[in] sm4 handle to operate
  150. \param[in] in Pointer to the Source data
  151. \param[out] out Pointer to the Result data
  152. \param[in] size the Source data size
  153. \param[in] iv init vector
  154. \return error code \ref uint32_t
  155. */
  156. csi_error_t csi_sm4_cfb8_decrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  157. uint32_t size, uint8_t *iv);
  158. /**
  159. \brief sm4 cfb128 decrypt
  160. \param[in] sm4 handle to operate
  161. \param[in] in Pointer to the Source data
  162. \param[out] out Pointer to the Result data
  163. \param[in] size the Source data size
  164. \param[in] iv init vector
  165. \param[out] num the number of the 128-bit block we have used
  166. \return error code \ref uint32_t
  167. */
  168. csi_error_t csi_sm4_cfb128_decrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  169. uint32_t size, uint8_t *iv, uint32_t *num);
  170. /**
  171. \brief sm4 cfb128 encrypt
  172. \param[in] sm4 handle to operate
  173. \param[in] in Pointer to the Source data
  174. \param[out] out Pointer to the Result data
  175. \param[in] size the Source data size
  176. \param[in] iv init vector
  177. \param[out] num the number of the 128-bit block we have used
  178. \return error code \ref uint32_t
  179. */
  180. csi_error_t csi_sm4_cfb128_encrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  181. uint32_t size, uint8_t *iv, uint32_t *num);
  182. /**
  183. \brief sm4 ofb encrypt
  184. \param[in] sm4 handle to operate
  185. \param[in] in Pointer to the Source data
  186. \param[out] out Pointer to the Result data
  187. \param[in] size the Source data size
  188. \param[in] iv init vector
  189. \param[out] num the number of the 128-bit block we have used
  190. \return error code \ref uint32_t
  191. */
  192. csi_error_t csi_sm4_ofb_encrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  193. uint32_t size, uint8_t *iv, uint32_t *num);
  194. /**
  195. \brief sm4 ofb encrypt
  196. \param[in] sm4 handle to operate
  197. \param[in] in Pointer to the Source data
  198. \param[out] out Pointer to the Result data
  199. \param[in] size the Source data size
  200. \param[in] iv init vector
  201. \param[out] num the number of the 128-bit block we have used
  202. \return error code \ref uint32_t
  203. */
  204. csi_error_t csi_sm4_ofb_decrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  205. uint32_t size, uint8_t *iv, uint32_t *num);
  206. /**
  207. \brief sm4 ctr encrypt
  208. \param[in] sm4 handle to operate
  209. \param[in] in Pointer to the Source data
  210. \param[out] out Pointer to the Result data
  211. \param[in] size the Source data size
  212. \param[in] nonce_counter counter
  213. \return error code \ref uint32_t
  214. */
  215. csi_error_t csi_sm4_ctr_encrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  216. uint32_t size, uint8_t nonce_counter[16]);
  217. /**
  218. \brief sm4 ctr encrypt
  219. \param[in] sm4 handle to operate
  220. \param[in] in Pointer to the Source data
  221. \param[out] out Pointer to the Result data
  222. \param[in] size the Source data size
  223. \param[in] nonce_counter counter
  224. \return error code \ref uint32_t
  225. */
  226. csi_error_t csi_sm4_ctr_decrypt(csi_sm4_t *sm4, uint8_t *in, uint8_t *out,
  227. uint32_t size, uint8_t nonce_counter[16]);
  228. /**
  229. \brief Enable SM4 power manage
  230. \param[in] sm4 Handle to operate
  231. \return Error code \ref csi_error_t
  232. */
  233. csi_error_t csi_sm4_enable_pm(csi_sm4_t *sm4);
  234. /**
  235. \brief Disable SM4 power manage
  236. \param[in] sm4 Handle to operate
  237. \return None
  238. */
  239. void csi_sm4_disable_pm(csi_sm4_t *sm4);
  240. #ifdef __cplusplus
  241. extern "C" {
  242. #endif
  243. #endif // _DRV_SM4_H_