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