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