1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*73f04d3dSAditya Srivastava /* 3049359d6SJames Hsiao * AMCC SoC PPC4xx Crypto Driver 4049359d6SJames Hsiao * 5049359d6SJames Hsiao * Copyright (c) 2008 Applied Micro Circuits Corporation. 6049359d6SJames Hsiao * All rights reserved. James Hsiao <jhsiao@amcc.com> 7049359d6SJames Hsiao * 8049359d6SJames Hsiao * This file defines the security context 925985edcSLucas De Marchi * associate format. 10049359d6SJames Hsiao */ 11049359d6SJames Hsiao 12049359d6SJames Hsiao #ifndef __CRYPTO4XX_SA_H__ 13049359d6SJames Hsiao #define __CRYPTO4XX_SA_H__ 14049359d6SJames Hsiao 15049359d6SJames Hsiao #define AES_IV_SIZE 16 16049359d6SJames Hsiao 17*73f04d3dSAditya Srivastava /* 18049359d6SJames Hsiao * Contents of Dynamic Security Association (SA) with all possible fields 19049359d6SJames Hsiao */ 20049359d6SJames Hsiao union dynamic_sa_contents { 21049359d6SJames Hsiao struct { 22049359d6SJames Hsiao u32 arc4_state_ptr:1; 23049359d6SJames Hsiao u32 arc4_ij_ptr:1; 24049359d6SJames Hsiao u32 state_ptr:1; 25049359d6SJames Hsiao u32 iv3:1; 26049359d6SJames Hsiao u32 iv2:1; 27049359d6SJames Hsiao u32 iv1:1; 28049359d6SJames Hsiao u32 iv0:1; 29049359d6SJames Hsiao u32 seq_num_mask3:1; 30049359d6SJames Hsiao u32 seq_num_mask2:1; 31049359d6SJames Hsiao u32 seq_num_mask1:1; 32049359d6SJames Hsiao u32 seq_num_mask0:1; 33049359d6SJames Hsiao u32 seq_num1:1; 34049359d6SJames Hsiao u32 seq_num0:1; 35049359d6SJames Hsiao u32 spi:1; 36049359d6SJames Hsiao u32 outer_size:5; 37049359d6SJames Hsiao u32 inner_size:5; 38049359d6SJames Hsiao u32 key_size:4; 39049359d6SJames Hsiao u32 cmd_size:4; 40049359d6SJames Hsiao } bf; 41049359d6SJames Hsiao u32 w; 42049359d6SJames Hsiao } __attribute__((packed)); 43049359d6SJames Hsiao 44049359d6SJames Hsiao #define DIR_OUTBOUND 0 45049359d6SJames Hsiao #define DIR_INBOUND 1 46049359d6SJames Hsiao #define SA_OP_GROUP_BASIC 0 47049359d6SJames Hsiao #define SA_OPCODE_ENCRYPT 0 48049359d6SJames Hsiao #define SA_OPCODE_DECRYPT 0 49a0aae821SChristian Lamparter #define SA_OPCODE_ENCRYPT_HASH 1 50a0aae821SChristian Lamparter #define SA_OPCODE_HASH_DECRYPT 1 51049359d6SJames Hsiao #define SA_OPCODE_HASH 3 52049359d6SJames Hsiao #define SA_CIPHER_ALG_DES 0 53049359d6SJames Hsiao #define SA_CIPHER_ALG_3DES 1 54049359d6SJames Hsiao #define SA_CIPHER_ALG_ARC4 2 55049359d6SJames Hsiao #define SA_CIPHER_ALG_AES 3 56049359d6SJames Hsiao #define SA_CIPHER_ALG_KASUMI 4 57049359d6SJames Hsiao #define SA_CIPHER_ALG_NULL 15 58049359d6SJames Hsiao 59049359d6SJames Hsiao #define SA_HASH_ALG_MD5 0 60049359d6SJames Hsiao #define SA_HASH_ALG_SHA1 1 61a0aae821SChristian Lamparter #define SA_HASH_ALG_GHASH 12 62a0aae821SChristian Lamparter #define SA_HASH_ALG_CBC_MAC 14 63049359d6SJames Hsiao #define SA_HASH_ALG_NULL 15 64049359d6SJames Hsiao #define SA_HASH_ALG_SHA1_DIGEST_SIZE 20 65049359d6SJames Hsiao 66049359d6SJames Hsiao #define SA_LOAD_HASH_FROM_SA 0 67049359d6SJames Hsiao #define SA_LOAD_HASH_FROM_STATE 2 68049359d6SJames Hsiao #define SA_NOT_LOAD_HASH 3 69049359d6SJames Hsiao #define SA_LOAD_IV_FROM_SA 0 70049359d6SJames Hsiao #define SA_LOAD_IV_FROM_INPUT 1 71049359d6SJames Hsiao #define SA_LOAD_IV_FROM_STATE 2 72049359d6SJames Hsiao #define SA_LOAD_IV_GEN_IV 3 73049359d6SJames Hsiao 74049359d6SJames Hsiao #define SA_PAD_TYPE_CONSTANT 2 75049359d6SJames Hsiao #define SA_PAD_TYPE_ZERO 3 76049359d6SJames Hsiao #define SA_PAD_TYPE_TLS 5 77049359d6SJames Hsiao #define SA_PAD_TYPE_DTLS 5 78049359d6SJames Hsiao #define SA_NOT_SAVE_HASH 0 79049359d6SJames Hsiao #define SA_SAVE_HASH 1 80049359d6SJames Hsiao #define SA_NOT_SAVE_IV 0 81049359d6SJames Hsiao #define SA_SAVE_IV 1 82049359d6SJames Hsiao #define SA_HEADER_PROC 1 83049359d6SJames Hsiao #define SA_NO_HEADER_PROC 0 84049359d6SJames Hsiao 85049359d6SJames Hsiao union sa_command_0 { 86049359d6SJames Hsiao struct { 87049359d6SJames Hsiao u32 scatter:1; 88049359d6SJames Hsiao u32 gather:1; 89049359d6SJames Hsiao u32 save_hash_state:1; 90049359d6SJames Hsiao u32 save_iv:1; 91049359d6SJames Hsiao u32 load_hash_state:2; 92049359d6SJames Hsiao u32 load_iv:2; 93049359d6SJames Hsiao u32 digest_len:4; 94049359d6SJames Hsiao u32 hdr_proc:1; 95049359d6SJames Hsiao u32 extend_pad:1; 96049359d6SJames Hsiao u32 stream_cipher_pad:1; 97049359d6SJames Hsiao u32 rsv:1; 98049359d6SJames Hsiao u32 hash_alg:4; 99049359d6SJames Hsiao u32 cipher_alg:4; 100049359d6SJames Hsiao u32 pad_type:2; 101049359d6SJames Hsiao u32 op_group:2; 102049359d6SJames Hsiao u32 dir:1; 103049359d6SJames Hsiao u32 opcode:3; 104049359d6SJames Hsiao } bf; 105049359d6SJames Hsiao u32 w; 106049359d6SJames Hsiao } __attribute__((packed)); 107049359d6SJames Hsiao 108049359d6SJames Hsiao #define CRYPTO_MODE_ECB 0 109049359d6SJames Hsiao #define CRYPTO_MODE_CBC 1 110f2a13e7cSChristian Lamparter #define CRYPTO_MODE_OFB 2 111f2a13e7cSChristian Lamparter #define CRYPTO_MODE_CFB 3 112f2a13e7cSChristian Lamparter #define CRYPTO_MODE_CTR 4 113049359d6SJames Hsiao 114049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_NO_FB 0 115049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_64BIT_OFB 0 116049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_8BIT_CFB 1 117049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_1BIT_CFB 2 118049359d6SJames Hsiao #define CRYPTO_FEEDBACK_MODE_128BIT_CFB 3 119049359d6SJames Hsiao 120049359d6SJames Hsiao #define SA_AES_KEY_LEN_128 2 121049359d6SJames Hsiao #define SA_AES_KEY_LEN_192 3 122049359d6SJames Hsiao #define SA_AES_KEY_LEN_256 4 123049359d6SJames Hsiao 124049359d6SJames Hsiao #define SA_REV2 1 125*73f04d3dSAditya Srivastava /* 126049359d6SJames Hsiao * The follow defines bits sa_command_1 127049359d6SJames Hsiao * In Basic hash mode this bit define simple hash or hmac. 128049359d6SJames Hsiao * In IPsec mode, this bit define muting control. 129049359d6SJames Hsiao */ 130049359d6SJames Hsiao #define SA_HASH_MODE_HASH 0 131049359d6SJames Hsiao #define SA_HASH_MODE_HMAC 1 132049359d6SJames Hsiao #define SA_MC_ENABLE 0 133049359d6SJames Hsiao #define SA_MC_DISABLE 1 134049359d6SJames Hsiao #define SA_NOT_COPY_HDR 0 135049359d6SJames Hsiao #define SA_COPY_HDR 1 136049359d6SJames Hsiao #define SA_NOT_COPY_PAD 0 137049359d6SJames Hsiao #define SA_COPY_PAD 1 138049359d6SJames Hsiao #define SA_NOT_COPY_PAYLOAD 0 139049359d6SJames Hsiao #define SA_COPY_PAYLOAD 1 140049359d6SJames Hsiao #define SA_EXTENDED_SN_OFF 0 141049359d6SJames Hsiao #define SA_EXTENDED_SN_ON 1 142049359d6SJames Hsiao #define SA_SEQ_MASK_OFF 0 143049359d6SJames Hsiao #define SA_SEQ_MASK_ON 1 144049359d6SJames Hsiao 145049359d6SJames Hsiao union sa_command_1 { 146049359d6SJames Hsiao struct { 147049359d6SJames Hsiao u32 crypto_mode31:1; 148049359d6SJames Hsiao u32 save_arc4_state:1; 149049359d6SJames Hsiao u32 arc4_stateful:1; 150049359d6SJames Hsiao u32 key_len:5; 151049359d6SJames Hsiao u32 hash_crypto_offset:8; 152049359d6SJames Hsiao u32 sa_rev:2; 153049359d6SJames Hsiao u32 byte_offset:1; 154049359d6SJames Hsiao u32 hmac_muting:1; 155049359d6SJames Hsiao u32 feedback_mode:2; 156049359d6SJames Hsiao u32 crypto_mode9_8:2; 157049359d6SJames Hsiao u32 extended_seq_num:1; 158049359d6SJames Hsiao u32 seq_num_mask:1; 159049359d6SJames Hsiao u32 mutable_bit_proc:1; 160049359d6SJames Hsiao u32 ip_version:1; 161049359d6SJames Hsiao u32 copy_pad:1; 162049359d6SJames Hsiao u32 copy_payload:1; 163049359d6SJames Hsiao u32 copy_hdr:1; 164049359d6SJames Hsiao u32 rsv1:1; 165049359d6SJames Hsiao } bf; 166049359d6SJames Hsiao u32 w; 167049359d6SJames Hsiao } __attribute__((packed)); 168049359d6SJames Hsiao 169049359d6SJames Hsiao struct dynamic_sa_ctl { 170453e3090SChristian Lamparter union dynamic_sa_contents sa_contents; 171049359d6SJames Hsiao union sa_command_0 sa_command_0; 172049359d6SJames Hsiao union sa_command_1 sa_command_1; 173049359d6SJames Hsiao } __attribute__((packed)); 174049359d6SJames Hsiao 175*73f04d3dSAditya Srivastava /* 176049359d6SJames Hsiao * State Record for Security Association (SA) 177049359d6SJames Hsiao */ 178049359d6SJames Hsiao struct sa_state_record { 1794865b122SChristian Lamparter __le32 save_iv[4]; 1804865b122SChristian Lamparter __le32 save_hash_byte_cnt[2]; 1814865b122SChristian Lamparter union { 1824865b122SChristian Lamparter u32 save_digest[16]; /* for MD5/SHA */ 1834865b122SChristian Lamparter __le32 save_digest_le32[16]; /* GHASH / CBC */ 1844865b122SChristian Lamparter }; 185049359d6SJames Hsiao } __attribute__((packed)); 186049359d6SJames Hsiao 187*73f04d3dSAditya Srivastava /* 188049359d6SJames Hsiao * Security Association (SA) for AES128 189049359d6SJames Hsiao * 190049359d6SJames Hsiao */ 191049359d6SJames Hsiao struct dynamic_sa_aes128 { 192049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 1934865b122SChristian Lamparter __le32 key[4]; 1944865b122SChristian Lamparter __le32 iv[4]; /* for CBC, OFC, and CFB mode */ 195049359d6SJames Hsiao u32 state_ptr; 196049359d6SJames Hsiao u32 reserved; 197049359d6SJames Hsiao } __attribute__((packed)); 198049359d6SJames Hsiao 199049359d6SJames Hsiao #define SA_AES128_LEN (sizeof(struct dynamic_sa_aes128)/4) 200049359d6SJames Hsiao #define SA_AES128_CONTENTS 0x3e000042 201049359d6SJames Hsiao 202049359d6SJames Hsiao /* 203049359d6SJames Hsiao * Security Association (SA) for AES192 204049359d6SJames Hsiao */ 205049359d6SJames Hsiao struct dynamic_sa_aes192 { 206049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 2074865b122SChristian Lamparter __le32 key[6]; 2084865b122SChristian Lamparter __le32 iv[4]; /* for CBC, OFC, and CFB mode */ 209049359d6SJames Hsiao u32 state_ptr; 210049359d6SJames Hsiao u32 reserved; 211049359d6SJames Hsiao } __attribute__((packed)); 212049359d6SJames Hsiao 213049359d6SJames Hsiao #define SA_AES192_LEN (sizeof(struct dynamic_sa_aes192)/4) 214049359d6SJames Hsiao #define SA_AES192_CONTENTS 0x3e000062 215049359d6SJames Hsiao 216*73f04d3dSAditya Srivastava /* 217049359d6SJames Hsiao * Security Association (SA) for AES256 218049359d6SJames Hsiao */ 219049359d6SJames Hsiao struct dynamic_sa_aes256 { 220049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 2214865b122SChristian Lamparter __le32 key[8]; 2224865b122SChristian Lamparter __le32 iv[4]; /* for CBC, OFC, and CFB mode */ 223049359d6SJames Hsiao u32 state_ptr; 224049359d6SJames Hsiao u32 reserved; 225049359d6SJames Hsiao } __attribute__((packed)); 226049359d6SJames Hsiao 227049359d6SJames Hsiao #define SA_AES256_LEN (sizeof(struct dynamic_sa_aes256)/4) 228049359d6SJames Hsiao #define SA_AES256_CONTENTS 0x3e000082 229049359d6SJames Hsiao #define SA_AES_CONTENTS 0x3e000002 230049359d6SJames Hsiao 231*73f04d3dSAditya Srivastava /* 232a0aae821SChristian Lamparter * Security Association (SA) for AES128 CCM 233a0aae821SChristian Lamparter */ 234a0aae821SChristian Lamparter struct dynamic_sa_aes128_ccm { 235a0aae821SChristian Lamparter struct dynamic_sa_ctl ctrl; 236a0aae821SChristian Lamparter __le32 key[4]; 237a0aae821SChristian Lamparter __le32 iv[4]; 238a0aae821SChristian Lamparter u32 state_ptr; 239a0aae821SChristian Lamparter u32 reserved; 240a0aae821SChristian Lamparter } __packed; 241a0aae821SChristian Lamparter #define SA_AES128_CCM_LEN (sizeof(struct dynamic_sa_aes128_ccm)/4) 242a0aae821SChristian Lamparter #define SA_AES128_CCM_CONTENTS 0x3e000042 243a0aae821SChristian Lamparter #define SA_AES_CCM_CONTENTS 0x3e000002 244a0aae821SChristian Lamparter 245*73f04d3dSAditya Srivastava /* 246a0aae821SChristian Lamparter * Security Association (SA) for AES128_GCM 247a0aae821SChristian Lamparter */ 248a0aae821SChristian Lamparter struct dynamic_sa_aes128_gcm { 249a0aae821SChristian Lamparter struct dynamic_sa_ctl ctrl; 250a0aae821SChristian Lamparter __le32 key[4]; 251a0aae821SChristian Lamparter __le32 inner_digest[4]; 252a0aae821SChristian Lamparter __le32 iv[4]; 253a0aae821SChristian Lamparter u32 state_ptr; 254a0aae821SChristian Lamparter u32 reserved; 255a0aae821SChristian Lamparter } __packed; 256a0aae821SChristian Lamparter 257a0aae821SChristian Lamparter #define SA_AES128_GCM_LEN (sizeof(struct dynamic_sa_aes128_gcm)/4) 258a0aae821SChristian Lamparter #define SA_AES128_GCM_CONTENTS 0x3e000442 259a0aae821SChristian Lamparter #define SA_AES_GCM_CONTENTS 0x3e000402 260a0aae821SChristian Lamparter 261*73f04d3dSAditya Srivastava /* 262049359d6SJames Hsiao * Security Association (SA) for HASH160: HMAC-SHA1 263049359d6SJames Hsiao */ 264049359d6SJames Hsiao struct dynamic_sa_hash160 { 265049359d6SJames Hsiao struct dynamic_sa_ctl ctrl; 2664865b122SChristian Lamparter __le32 inner_digest[5]; 2674865b122SChristian Lamparter __le32 outer_digest[5]; 268049359d6SJames Hsiao u32 state_ptr; 269049359d6SJames Hsiao u32 reserved; 270049359d6SJames Hsiao } __attribute__((packed)); 271049359d6SJames Hsiao #define SA_HASH160_LEN (sizeof(struct dynamic_sa_hash160)/4) 272049359d6SJames Hsiao #define SA_HASH160_CONTENTS 0x2000a502 273049359d6SJames Hsiao 274249c8d98SChristian Lamparter static inline u32 get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl * cts)275249c8d98SChristian Lamparterget_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts) 276249c8d98SChristian Lamparter { 277249c8d98SChristian Lamparter u32 offset; 278249c8d98SChristian Lamparter 279249c8d98SChristian Lamparter offset = cts->sa_contents.bf.key_size 280249c8d98SChristian Lamparter + cts->sa_contents.bf.inner_size 281249c8d98SChristian Lamparter + cts->sa_contents.bf.outer_size 282249c8d98SChristian Lamparter + cts->sa_contents.bf.spi 283249c8d98SChristian Lamparter + cts->sa_contents.bf.seq_num0 284249c8d98SChristian Lamparter + cts->sa_contents.bf.seq_num1 285249c8d98SChristian Lamparter + cts->sa_contents.bf.seq_num_mask0 286249c8d98SChristian Lamparter + cts->sa_contents.bf.seq_num_mask1 287249c8d98SChristian Lamparter + cts->sa_contents.bf.seq_num_mask2 288249c8d98SChristian Lamparter + cts->sa_contents.bf.seq_num_mask3 289249c8d98SChristian Lamparter + cts->sa_contents.bf.iv0 290249c8d98SChristian Lamparter + cts->sa_contents.bf.iv1 291249c8d98SChristian Lamparter + cts->sa_contents.bf.iv2 292249c8d98SChristian Lamparter + cts->sa_contents.bf.iv3; 293249c8d98SChristian Lamparter 294249c8d98SChristian Lamparter return sizeof(struct dynamic_sa_ctl) + offset * 4; 295249c8d98SChristian Lamparter } 296249c8d98SChristian Lamparter get_dynamic_sa_key_field(struct dynamic_sa_ctl * cts)2974865b122SChristian Lamparterstatic inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts) 298249c8d98SChristian Lamparter { 2994865b122SChristian Lamparter return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl)); 300249c8d98SChristian Lamparter } 301249c8d98SChristian Lamparter get_dynamic_sa_inner_digest(struct dynamic_sa_ctl * cts)302a0aae821SChristian Lamparterstatic inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts) 303a0aae821SChristian Lamparter { 304a0aae821SChristian Lamparter return (__le32 *) ((unsigned long)cts + 305a0aae821SChristian Lamparter sizeof(struct dynamic_sa_ctl) + 306a0aae821SChristian Lamparter cts->sa_contents.bf.key_size * 4); 307a0aae821SChristian Lamparter } 308a0aae821SChristian Lamparter 309049359d6SJames Hsiao #endif 310