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