crypto4xx_sa.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * AMCC SoC PPC4xx Crypto Driver
  4. *
  5. * Copyright (c) 2008 Applied Micro Circuits Corporation.
  6. * All rights reserved. James Hsiao <[email protected]>
  7. *
  8. * This file defines the security context
  9. * associate format.
  10. */
  11. #ifndef __CRYPTO4XX_SA_H__
  12. #define __CRYPTO4XX_SA_H__
  13. #define AES_IV_SIZE 16
  14. /*
  15. * Contents of Dynamic Security Association (SA) with all possible fields
  16. */
  17. union dynamic_sa_contents {
  18. struct {
  19. u32 arc4_state_ptr:1;
  20. u32 arc4_ij_ptr:1;
  21. u32 state_ptr:1;
  22. u32 iv3:1;
  23. u32 iv2:1;
  24. u32 iv1:1;
  25. u32 iv0:1;
  26. u32 seq_num_mask3:1;
  27. u32 seq_num_mask2:1;
  28. u32 seq_num_mask1:1;
  29. u32 seq_num_mask0:1;
  30. u32 seq_num1:1;
  31. u32 seq_num0:1;
  32. u32 spi:1;
  33. u32 outer_size:5;
  34. u32 inner_size:5;
  35. u32 key_size:4;
  36. u32 cmd_size:4;
  37. } bf;
  38. u32 w;
  39. } __attribute__((packed));
  40. #define DIR_OUTBOUND 0
  41. #define DIR_INBOUND 1
  42. #define SA_OP_GROUP_BASIC 0
  43. #define SA_OPCODE_ENCRYPT 0
  44. #define SA_OPCODE_DECRYPT 0
  45. #define SA_OPCODE_ENCRYPT_HASH 1
  46. #define SA_OPCODE_HASH_DECRYPT 1
  47. #define SA_OPCODE_HASH 3
  48. #define SA_CIPHER_ALG_DES 0
  49. #define SA_CIPHER_ALG_3DES 1
  50. #define SA_CIPHER_ALG_ARC4 2
  51. #define SA_CIPHER_ALG_AES 3
  52. #define SA_CIPHER_ALG_KASUMI 4
  53. #define SA_CIPHER_ALG_NULL 15
  54. #define SA_HASH_ALG_MD5 0
  55. #define SA_HASH_ALG_SHA1 1
  56. #define SA_HASH_ALG_GHASH 12
  57. #define SA_HASH_ALG_CBC_MAC 14
  58. #define SA_HASH_ALG_NULL 15
  59. #define SA_HASH_ALG_SHA1_DIGEST_SIZE 20
  60. #define SA_LOAD_HASH_FROM_SA 0
  61. #define SA_LOAD_HASH_FROM_STATE 2
  62. #define SA_NOT_LOAD_HASH 3
  63. #define SA_LOAD_IV_FROM_SA 0
  64. #define SA_LOAD_IV_FROM_INPUT 1
  65. #define SA_LOAD_IV_FROM_STATE 2
  66. #define SA_LOAD_IV_GEN_IV 3
  67. #define SA_PAD_TYPE_CONSTANT 2
  68. #define SA_PAD_TYPE_ZERO 3
  69. #define SA_PAD_TYPE_TLS 5
  70. #define SA_PAD_TYPE_DTLS 5
  71. #define SA_NOT_SAVE_HASH 0
  72. #define SA_SAVE_HASH 1
  73. #define SA_NOT_SAVE_IV 0
  74. #define SA_SAVE_IV 1
  75. #define SA_HEADER_PROC 1
  76. #define SA_NO_HEADER_PROC 0
  77. union sa_command_0 {
  78. struct {
  79. u32 scatter:1;
  80. u32 gather:1;
  81. u32 save_hash_state:1;
  82. u32 save_iv:1;
  83. u32 load_hash_state:2;
  84. u32 load_iv:2;
  85. u32 digest_len:4;
  86. u32 hdr_proc:1;
  87. u32 extend_pad:1;
  88. u32 stream_cipher_pad:1;
  89. u32 rsv:1;
  90. u32 hash_alg:4;
  91. u32 cipher_alg:4;
  92. u32 pad_type:2;
  93. u32 op_group:2;
  94. u32 dir:1;
  95. u32 opcode:3;
  96. } bf;
  97. u32 w;
  98. } __attribute__((packed));
  99. #define CRYPTO_MODE_ECB 0
  100. #define CRYPTO_MODE_CBC 1
  101. #define CRYPTO_MODE_OFB 2
  102. #define CRYPTO_MODE_CFB 3
  103. #define CRYPTO_MODE_CTR 4
  104. #define CRYPTO_FEEDBACK_MODE_NO_FB 0
  105. #define CRYPTO_FEEDBACK_MODE_64BIT_OFB 0
  106. #define CRYPTO_FEEDBACK_MODE_8BIT_CFB 1
  107. #define CRYPTO_FEEDBACK_MODE_1BIT_CFB 2
  108. #define CRYPTO_FEEDBACK_MODE_128BIT_CFB 3
  109. #define SA_AES_KEY_LEN_128 2
  110. #define SA_AES_KEY_LEN_192 3
  111. #define SA_AES_KEY_LEN_256 4
  112. #define SA_REV2 1
  113. /*
  114. * The follow defines bits sa_command_1
  115. * In Basic hash mode this bit define simple hash or hmac.
  116. * In IPsec mode, this bit define muting control.
  117. */
  118. #define SA_HASH_MODE_HASH 0
  119. #define SA_HASH_MODE_HMAC 1
  120. #define SA_MC_ENABLE 0
  121. #define SA_MC_DISABLE 1
  122. #define SA_NOT_COPY_HDR 0
  123. #define SA_COPY_HDR 1
  124. #define SA_NOT_COPY_PAD 0
  125. #define SA_COPY_PAD 1
  126. #define SA_NOT_COPY_PAYLOAD 0
  127. #define SA_COPY_PAYLOAD 1
  128. #define SA_EXTENDED_SN_OFF 0
  129. #define SA_EXTENDED_SN_ON 1
  130. #define SA_SEQ_MASK_OFF 0
  131. #define SA_SEQ_MASK_ON 1
  132. union sa_command_1 {
  133. struct {
  134. u32 crypto_mode31:1;
  135. u32 save_arc4_state:1;
  136. u32 arc4_stateful:1;
  137. u32 key_len:5;
  138. u32 hash_crypto_offset:8;
  139. u32 sa_rev:2;
  140. u32 byte_offset:1;
  141. u32 hmac_muting:1;
  142. u32 feedback_mode:2;
  143. u32 crypto_mode9_8:2;
  144. u32 extended_seq_num:1;
  145. u32 seq_num_mask:1;
  146. u32 mutable_bit_proc:1;
  147. u32 ip_version:1;
  148. u32 copy_pad:1;
  149. u32 copy_payload:1;
  150. u32 copy_hdr:1;
  151. u32 rsv1:1;
  152. } bf;
  153. u32 w;
  154. } __attribute__((packed));
  155. struct dynamic_sa_ctl {
  156. union dynamic_sa_contents sa_contents;
  157. union sa_command_0 sa_command_0;
  158. union sa_command_1 sa_command_1;
  159. } __attribute__((packed));
  160. /*
  161. * State Record for Security Association (SA)
  162. */
  163. struct sa_state_record {
  164. __le32 save_iv[4];
  165. __le32 save_hash_byte_cnt[2];
  166. union {
  167. u32 save_digest[16]; /* for MD5/SHA */
  168. __le32 save_digest_le32[16]; /* GHASH / CBC */
  169. };
  170. } __attribute__((packed));
  171. /*
  172. * Security Association (SA) for AES128
  173. *
  174. */
  175. struct dynamic_sa_aes128 {
  176. struct dynamic_sa_ctl ctrl;
  177. __le32 key[4];
  178. __le32 iv[4]; /* for CBC, OFC, and CFB mode */
  179. u32 state_ptr;
  180. u32 reserved;
  181. } __attribute__((packed));
  182. #define SA_AES128_LEN (sizeof(struct dynamic_sa_aes128)/4)
  183. #define SA_AES128_CONTENTS 0x3e000042
  184. /*
  185. * Security Association (SA) for AES192
  186. */
  187. struct dynamic_sa_aes192 {
  188. struct dynamic_sa_ctl ctrl;
  189. __le32 key[6];
  190. __le32 iv[4]; /* for CBC, OFC, and CFB mode */
  191. u32 state_ptr;
  192. u32 reserved;
  193. } __attribute__((packed));
  194. #define SA_AES192_LEN (sizeof(struct dynamic_sa_aes192)/4)
  195. #define SA_AES192_CONTENTS 0x3e000062
  196. /*
  197. * Security Association (SA) for AES256
  198. */
  199. struct dynamic_sa_aes256 {
  200. struct dynamic_sa_ctl ctrl;
  201. __le32 key[8];
  202. __le32 iv[4]; /* for CBC, OFC, and CFB mode */
  203. u32 state_ptr;
  204. u32 reserved;
  205. } __attribute__((packed));
  206. #define SA_AES256_LEN (sizeof(struct dynamic_sa_aes256)/4)
  207. #define SA_AES256_CONTENTS 0x3e000082
  208. #define SA_AES_CONTENTS 0x3e000002
  209. /*
  210. * Security Association (SA) for AES128 CCM
  211. */
  212. struct dynamic_sa_aes128_ccm {
  213. struct dynamic_sa_ctl ctrl;
  214. __le32 key[4];
  215. __le32 iv[4];
  216. u32 state_ptr;
  217. u32 reserved;
  218. } __packed;
  219. #define SA_AES128_CCM_LEN (sizeof(struct dynamic_sa_aes128_ccm)/4)
  220. #define SA_AES128_CCM_CONTENTS 0x3e000042
  221. #define SA_AES_CCM_CONTENTS 0x3e000002
  222. /*
  223. * Security Association (SA) for AES128_GCM
  224. */
  225. struct dynamic_sa_aes128_gcm {
  226. struct dynamic_sa_ctl ctrl;
  227. __le32 key[4];
  228. __le32 inner_digest[4];
  229. __le32 iv[4];
  230. u32 state_ptr;
  231. u32 reserved;
  232. } __packed;
  233. #define SA_AES128_GCM_LEN (sizeof(struct dynamic_sa_aes128_gcm)/4)
  234. #define SA_AES128_GCM_CONTENTS 0x3e000442
  235. #define SA_AES_GCM_CONTENTS 0x3e000402
  236. /*
  237. * Security Association (SA) for HASH160: HMAC-SHA1
  238. */
  239. struct dynamic_sa_hash160 {
  240. struct dynamic_sa_ctl ctrl;
  241. __le32 inner_digest[5];
  242. __le32 outer_digest[5];
  243. u32 state_ptr;
  244. u32 reserved;
  245. } __attribute__((packed));
  246. #define SA_HASH160_LEN (sizeof(struct dynamic_sa_hash160)/4)
  247. #define SA_HASH160_CONTENTS 0x2000a502
  248. static inline u32
  249. get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
  250. {
  251. u32 offset;
  252. offset = cts->sa_contents.bf.key_size
  253. + cts->sa_contents.bf.inner_size
  254. + cts->sa_contents.bf.outer_size
  255. + cts->sa_contents.bf.spi
  256. + cts->sa_contents.bf.seq_num0
  257. + cts->sa_contents.bf.seq_num1
  258. + cts->sa_contents.bf.seq_num_mask0
  259. + cts->sa_contents.bf.seq_num_mask1
  260. + cts->sa_contents.bf.seq_num_mask2
  261. + cts->sa_contents.bf.seq_num_mask3
  262. + cts->sa_contents.bf.iv0
  263. + cts->sa_contents.bf.iv1
  264. + cts->sa_contents.bf.iv2
  265. + cts->sa_contents.bf.iv3;
  266. return sizeof(struct dynamic_sa_ctl) + offset * 4;
  267. }
  268. static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
  269. {
  270. return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
  271. }
  272. static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
  273. {
  274. return (__le32 *) ((unsigned long)cts +
  275. sizeof(struct dynamic_sa_ctl) +
  276. cts->sa_contents.bf.key_size * 4);
  277. }
  278. #endif