0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef __CRYPTO4XX_SA_H__
0013 #define __CRYPTO4XX_SA_H__
0014
0015 #define AES_IV_SIZE 16
0016
0017
0018
0019
0020 union dynamic_sa_contents {
0021 struct {
0022 u32 arc4_state_ptr:1;
0023 u32 arc4_ij_ptr:1;
0024 u32 state_ptr:1;
0025 u32 iv3:1;
0026 u32 iv2:1;
0027 u32 iv1:1;
0028 u32 iv0:1;
0029 u32 seq_num_mask3:1;
0030 u32 seq_num_mask2:1;
0031 u32 seq_num_mask1:1;
0032 u32 seq_num_mask0:1;
0033 u32 seq_num1:1;
0034 u32 seq_num0:1;
0035 u32 spi:1;
0036 u32 outer_size:5;
0037 u32 inner_size:5;
0038 u32 key_size:4;
0039 u32 cmd_size:4;
0040 } bf;
0041 u32 w;
0042 } __attribute__((packed));
0043
0044 #define DIR_OUTBOUND 0
0045 #define DIR_INBOUND 1
0046 #define SA_OP_GROUP_BASIC 0
0047 #define SA_OPCODE_ENCRYPT 0
0048 #define SA_OPCODE_DECRYPT 0
0049 #define SA_OPCODE_ENCRYPT_HASH 1
0050 #define SA_OPCODE_HASH_DECRYPT 1
0051 #define SA_OPCODE_HASH 3
0052 #define SA_CIPHER_ALG_DES 0
0053 #define SA_CIPHER_ALG_3DES 1
0054 #define SA_CIPHER_ALG_ARC4 2
0055 #define SA_CIPHER_ALG_AES 3
0056 #define SA_CIPHER_ALG_KASUMI 4
0057 #define SA_CIPHER_ALG_NULL 15
0058
0059 #define SA_HASH_ALG_MD5 0
0060 #define SA_HASH_ALG_SHA1 1
0061 #define SA_HASH_ALG_GHASH 12
0062 #define SA_HASH_ALG_CBC_MAC 14
0063 #define SA_HASH_ALG_NULL 15
0064 #define SA_HASH_ALG_SHA1_DIGEST_SIZE 20
0065
0066 #define SA_LOAD_HASH_FROM_SA 0
0067 #define SA_LOAD_HASH_FROM_STATE 2
0068 #define SA_NOT_LOAD_HASH 3
0069 #define SA_LOAD_IV_FROM_SA 0
0070 #define SA_LOAD_IV_FROM_INPUT 1
0071 #define SA_LOAD_IV_FROM_STATE 2
0072 #define SA_LOAD_IV_GEN_IV 3
0073
0074 #define SA_PAD_TYPE_CONSTANT 2
0075 #define SA_PAD_TYPE_ZERO 3
0076 #define SA_PAD_TYPE_TLS 5
0077 #define SA_PAD_TYPE_DTLS 5
0078 #define SA_NOT_SAVE_HASH 0
0079 #define SA_SAVE_HASH 1
0080 #define SA_NOT_SAVE_IV 0
0081 #define SA_SAVE_IV 1
0082 #define SA_HEADER_PROC 1
0083 #define SA_NO_HEADER_PROC 0
0084
0085 union sa_command_0 {
0086 struct {
0087 u32 scatter:1;
0088 u32 gather:1;
0089 u32 save_hash_state:1;
0090 u32 save_iv:1;
0091 u32 load_hash_state:2;
0092 u32 load_iv:2;
0093 u32 digest_len:4;
0094 u32 hdr_proc:1;
0095 u32 extend_pad:1;
0096 u32 stream_cipher_pad:1;
0097 u32 rsv:1;
0098 u32 hash_alg:4;
0099 u32 cipher_alg:4;
0100 u32 pad_type:2;
0101 u32 op_group:2;
0102 u32 dir:1;
0103 u32 opcode:3;
0104 } bf;
0105 u32 w;
0106 } __attribute__((packed));
0107
0108 #define CRYPTO_MODE_ECB 0
0109 #define CRYPTO_MODE_CBC 1
0110 #define CRYPTO_MODE_OFB 2
0111 #define CRYPTO_MODE_CFB 3
0112 #define CRYPTO_MODE_CTR 4
0113
0114 #define CRYPTO_FEEDBACK_MODE_NO_FB 0
0115 #define CRYPTO_FEEDBACK_MODE_64BIT_OFB 0
0116 #define CRYPTO_FEEDBACK_MODE_8BIT_CFB 1
0117 #define CRYPTO_FEEDBACK_MODE_1BIT_CFB 2
0118 #define CRYPTO_FEEDBACK_MODE_128BIT_CFB 3
0119
0120 #define SA_AES_KEY_LEN_128 2
0121 #define SA_AES_KEY_LEN_192 3
0122 #define SA_AES_KEY_LEN_256 4
0123
0124 #define SA_REV2 1
0125
0126
0127
0128
0129
0130 #define SA_HASH_MODE_HASH 0
0131 #define SA_HASH_MODE_HMAC 1
0132 #define SA_MC_ENABLE 0
0133 #define SA_MC_DISABLE 1
0134 #define SA_NOT_COPY_HDR 0
0135 #define SA_COPY_HDR 1
0136 #define SA_NOT_COPY_PAD 0
0137 #define SA_COPY_PAD 1
0138 #define SA_NOT_COPY_PAYLOAD 0
0139 #define SA_COPY_PAYLOAD 1
0140 #define SA_EXTENDED_SN_OFF 0
0141 #define SA_EXTENDED_SN_ON 1
0142 #define SA_SEQ_MASK_OFF 0
0143 #define SA_SEQ_MASK_ON 1
0144
0145 union sa_command_1 {
0146 struct {
0147 u32 crypto_mode31:1;
0148 u32 save_arc4_state:1;
0149 u32 arc4_stateful:1;
0150 u32 key_len:5;
0151 u32 hash_crypto_offset:8;
0152 u32 sa_rev:2;
0153 u32 byte_offset:1;
0154 u32 hmac_muting:1;
0155 u32 feedback_mode:2;
0156 u32 crypto_mode9_8:2;
0157 u32 extended_seq_num:1;
0158 u32 seq_num_mask:1;
0159 u32 mutable_bit_proc:1;
0160 u32 ip_version:1;
0161 u32 copy_pad:1;
0162 u32 copy_payload:1;
0163 u32 copy_hdr:1;
0164 u32 rsv1:1;
0165 } bf;
0166 u32 w;
0167 } __attribute__((packed));
0168
0169 struct dynamic_sa_ctl {
0170 union dynamic_sa_contents sa_contents;
0171 union sa_command_0 sa_command_0;
0172 union sa_command_1 sa_command_1;
0173 } __attribute__((packed));
0174
0175
0176
0177
0178 struct sa_state_record {
0179 __le32 save_iv[4];
0180 __le32 save_hash_byte_cnt[2];
0181 union {
0182 u32 save_digest[16];
0183 __le32 save_digest_le32[16];
0184 };
0185 } __attribute__((packed));
0186
0187
0188
0189
0190
0191 struct dynamic_sa_aes128 {
0192 struct dynamic_sa_ctl ctrl;
0193 __le32 key[4];
0194 __le32 iv[4];
0195 u32 state_ptr;
0196 u32 reserved;
0197 } __attribute__((packed));
0198
0199 #define SA_AES128_LEN (sizeof(struct dynamic_sa_aes128)/4)
0200 #define SA_AES128_CONTENTS 0x3e000042
0201
0202
0203
0204
0205 struct dynamic_sa_aes192 {
0206 struct dynamic_sa_ctl ctrl;
0207 __le32 key[6];
0208 __le32 iv[4];
0209 u32 state_ptr;
0210 u32 reserved;
0211 } __attribute__((packed));
0212
0213 #define SA_AES192_LEN (sizeof(struct dynamic_sa_aes192)/4)
0214 #define SA_AES192_CONTENTS 0x3e000062
0215
0216
0217
0218
0219 struct dynamic_sa_aes256 {
0220 struct dynamic_sa_ctl ctrl;
0221 __le32 key[8];
0222 __le32 iv[4];
0223 u32 state_ptr;
0224 u32 reserved;
0225 } __attribute__((packed));
0226
0227 #define SA_AES256_LEN (sizeof(struct dynamic_sa_aes256)/4)
0228 #define SA_AES256_CONTENTS 0x3e000082
0229 #define SA_AES_CONTENTS 0x3e000002
0230
0231
0232
0233
0234 struct dynamic_sa_aes128_ccm {
0235 struct dynamic_sa_ctl ctrl;
0236 __le32 key[4];
0237 __le32 iv[4];
0238 u32 state_ptr;
0239 u32 reserved;
0240 } __packed;
0241 #define SA_AES128_CCM_LEN (sizeof(struct dynamic_sa_aes128_ccm)/4)
0242 #define SA_AES128_CCM_CONTENTS 0x3e000042
0243 #define SA_AES_CCM_CONTENTS 0x3e000002
0244
0245
0246
0247
0248 struct dynamic_sa_aes128_gcm {
0249 struct dynamic_sa_ctl ctrl;
0250 __le32 key[4];
0251 __le32 inner_digest[4];
0252 __le32 iv[4];
0253 u32 state_ptr;
0254 u32 reserved;
0255 } __packed;
0256
0257 #define SA_AES128_GCM_LEN (sizeof(struct dynamic_sa_aes128_gcm)/4)
0258 #define SA_AES128_GCM_CONTENTS 0x3e000442
0259 #define SA_AES_GCM_CONTENTS 0x3e000402
0260
0261
0262
0263
0264 struct dynamic_sa_hash160 {
0265 struct dynamic_sa_ctl ctrl;
0266 __le32 inner_digest[5];
0267 __le32 outer_digest[5];
0268 u32 state_ptr;
0269 u32 reserved;
0270 } __attribute__((packed));
0271 #define SA_HASH160_LEN (sizeof(struct dynamic_sa_hash160)/4)
0272 #define SA_HASH160_CONTENTS 0x2000a502
0273
0274 static inline u32
0275 get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
0276 {
0277 u32 offset;
0278
0279 offset = cts->sa_contents.bf.key_size
0280 + cts->sa_contents.bf.inner_size
0281 + cts->sa_contents.bf.outer_size
0282 + cts->sa_contents.bf.spi
0283 + cts->sa_contents.bf.seq_num0
0284 + cts->sa_contents.bf.seq_num1
0285 + cts->sa_contents.bf.seq_num_mask0
0286 + cts->sa_contents.bf.seq_num_mask1
0287 + cts->sa_contents.bf.seq_num_mask2
0288 + cts->sa_contents.bf.seq_num_mask3
0289 + cts->sa_contents.bf.iv0
0290 + cts->sa_contents.bf.iv1
0291 + cts->sa_contents.bf.iv2
0292 + cts->sa_contents.bf.iv3;
0293
0294 return sizeof(struct dynamic_sa_ctl) + offset * 4;
0295 }
0296
0297 static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
0298 {
0299 return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
0300 }
0301
0302 static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
0303 {
0304 return (__le32 *) ((unsigned long)cts +
0305 sizeof(struct dynamic_sa_ctl) +
0306 cts->sa_contents.bf.key_size * 4);
0307 }
0308
0309 #endif