162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * AMCC SoC PPC4xx Crypto Driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2008 Applied Micro Circuits Corporation. 662306a36Sopenharmony_ci * All rights reserved. James Hsiao <jhsiao@amcc.com> 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * This file defines the security context 962306a36Sopenharmony_ci * associate format. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifndef __CRYPTO4XX_SA_H__ 1362306a36Sopenharmony_ci#define __CRYPTO4XX_SA_H__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define AES_IV_SIZE 16 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* 1862306a36Sopenharmony_ci * Contents of Dynamic Security Association (SA) with all possible fields 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_ciunion dynamic_sa_contents { 2162306a36Sopenharmony_ci struct { 2262306a36Sopenharmony_ci u32 arc4_state_ptr:1; 2362306a36Sopenharmony_ci u32 arc4_ij_ptr:1; 2462306a36Sopenharmony_ci u32 state_ptr:1; 2562306a36Sopenharmony_ci u32 iv3:1; 2662306a36Sopenharmony_ci u32 iv2:1; 2762306a36Sopenharmony_ci u32 iv1:1; 2862306a36Sopenharmony_ci u32 iv0:1; 2962306a36Sopenharmony_ci u32 seq_num_mask3:1; 3062306a36Sopenharmony_ci u32 seq_num_mask2:1; 3162306a36Sopenharmony_ci u32 seq_num_mask1:1; 3262306a36Sopenharmony_ci u32 seq_num_mask0:1; 3362306a36Sopenharmony_ci u32 seq_num1:1; 3462306a36Sopenharmony_ci u32 seq_num0:1; 3562306a36Sopenharmony_ci u32 spi:1; 3662306a36Sopenharmony_ci u32 outer_size:5; 3762306a36Sopenharmony_ci u32 inner_size:5; 3862306a36Sopenharmony_ci u32 key_size:4; 3962306a36Sopenharmony_ci u32 cmd_size:4; 4062306a36Sopenharmony_ci } bf; 4162306a36Sopenharmony_ci u32 w; 4262306a36Sopenharmony_ci} __attribute__((packed)); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define DIR_OUTBOUND 0 4562306a36Sopenharmony_ci#define DIR_INBOUND 1 4662306a36Sopenharmony_ci#define SA_OP_GROUP_BASIC 0 4762306a36Sopenharmony_ci#define SA_OPCODE_ENCRYPT 0 4862306a36Sopenharmony_ci#define SA_OPCODE_DECRYPT 0 4962306a36Sopenharmony_ci#define SA_OPCODE_ENCRYPT_HASH 1 5062306a36Sopenharmony_ci#define SA_OPCODE_HASH_DECRYPT 1 5162306a36Sopenharmony_ci#define SA_OPCODE_HASH 3 5262306a36Sopenharmony_ci#define SA_CIPHER_ALG_DES 0 5362306a36Sopenharmony_ci#define SA_CIPHER_ALG_3DES 1 5462306a36Sopenharmony_ci#define SA_CIPHER_ALG_ARC4 2 5562306a36Sopenharmony_ci#define SA_CIPHER_ALG_AES 3 5662306a36Sopenharmony_ci#define SA_CIPHER_ALG_KASUMI 4 5762306a36Sopenharmony_ci#define SA_CIPHER_ALG_NULL 15 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define SA_HASH_ALG_MD5 0 6062306a36Sopenharmony_ci#define SA_HASH_ALG_SHA1 1 6162306a36Sopenharmony_ci#define SA_HASH_ALG_GHASH 12 6262306a36Sopenharmony_ci#define SA_HASH_ALG_CBC_MAC 14 6362306a36Sopenharmony_ci#define SA_HASH_ALG_NULL 15 6462306a36Sopenharmony_ci#define SA_HASH_ALG_SHA1_DIGEST_SIZE 20 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define SA_LOAD_HASH_FROM_SA 0 6762306a36Sopenharmony_ci#define SA_LOAD_HASH_FROM_STATE 2 6862306a36Sopenharmony_ci#define SA_NOT_LOAD_HASH 3 6962306a36Sopenharmony_ci#define SA_LOAD_IV_FROM_SA 0 7062306a36Sopenharmony_ci#define SA_LOAD_IV_FROM_INPUT 1 7162306a36Sopenharmony_ci#define SA_LOAD_IV_FROM_STATE 2 7262306a36Sopenharmony_ci#define SA_LOAD_IV_GEN_IV 3 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define SA_PAD_TYPE_CONSTANT 2 7562306a36Sopenharmony_ci#define SA_PAD_TYPE_ZERO 3 7662306a36Sopenharmony_ci#define SA_PAD_TYPE_TLS 5 7762306a36Sopenharmony_ci#define SA_PAD_TYPE_DTLS 5 7862306a36Sopenharmony_ci#define SA_NOT_SAVE_HASH 0 7962306a36Sopenharmony_ci#define SA_SAVE_HASH 1 8062306a36Sopenharmony_ci#define SA_NOT_SAVE_IV 0 8162306a36Sopenharmony_ci#define SA_SAVE_IV 1 8262306a36Sopenharmony_ci#define SA_HEADER_PROC 1 8362306a36Sopenharmony_ci#define SA_NO_HEADER_PROC 0 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ciunion sa_command_0 { 8662306a36Sopenharmony_ci struct { 8762306a36Sopenharmony_ci u32 scatter:1; 8862306a36Sopenharmony_ci u32 gather:1; 8962306a36Sopenharmony_ci u32 save_hash_state:1; 9062306a36Sopenharmony_ci u32 save_iv:1; 9162306a36Sopenharmony_ci u32 load_hash_state:2; 9262306a36Sopenharmony_ci u32 load_iv:2; 9362306a36Sopenharmony_ci u32 digest_len:4; 9462306a36Sopenharmony_ci u32 hdr_proc:1; 9562306a36Sopenharmony_ci u32 extend_pad:1; 9662306a36Sopenharmony_ci u32 stream_cipher_pad:1; 9762306a36Sopenharmony_ci u32 rsv:1; 9862306a36Sopenharmony_ci u32 hash_alg:4; 9962306a36Sopenharmony_ci u32 cipher_alg:4; 10062306a36Sopenharmony_ci u32 pad_type:2; 10162306a36Sopenharmony_ci u32 op_group:2; 10262306a36Sopenharmony_ci u32 dir:1; 10362306a36Sopenharmony_ci u32 opcode:3; 10462306a36Sopenharmony_ci } bf; 10562306a36Sopenharmony_ci u32 w; 10662306a36Sopenharmony_ci} __attribute__((packed)); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define CRYPTO_MODE_ECB 0 10962306a36Sopenharmony_ci#define CRYPTO_MODE_CBC 1 11062306a36Sopenharmony_ci#define CRYPTO_MODE_OFB 2 11162306a36Sopenharmony_ci#define CRYPTO_MODE_CFB 3 11262306a36Sopenharmony_ci#define CRYPTO_MODE_CTR 4 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_NO_FB 0 11562306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_64BIT_OFB 0 11662306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_8BIT_CFB 1 11762306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_1BIT_CFB 2 11862306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_128BIT_CFB 3 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci#define SA_AES_KEY_LEN_128 2 12162306a36Sopenharmony_ci#define SA_AES_KEY_LEN_192 3 12262306a36Sopenharmony_ci#define SA_AES_KEY_LEN_256 4 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define SA_REV2 1 12562306a36Sopenharmony_ci/* 12662306a36Sopenharmony_ci * The follow defines bits sa_command_1 12762306a36Sopenharmony_ci * In Basic hash mode this bit define simple hash or hmac. 12862306a36Sopenharmony_ci * In IPsec mode, this bit define muting control. 12962306a36Sopenharmony_ci */ 13062306a36Sopenharmony_ci#define SA_HASH_MODE_HASH 0 13162306a36Sopenharmony_ci#define SA_HASH_MODE_HMAC 1 13262306a36Sopenharmony_ci#define SA_MC_ENABLE 0 13362306a36Sopenharmony_ci#define SA_MC_DISABLE 1 13462306a36Sopenharmony_ci#define SA_NOT_COPY_HDR 0 13562306a36Sopenharmony_ci#define SA_COPY_HDR 1 13662306a36Sopenharmony_ci#define SA_NOT_COPY_PAD 0 13762306a36Sopenharmony_ci#define SA_COPY_PAD 1 13862306a36Sopenharmony_ci#define SA_NOT_COPY_PAYLOAD 0 13962306a36Sopenharmony_ci#define SA_COPY_PAYLOAD 1 14062306a36Sopenharmony_ci#define SA_EXTENDED_SN_OFF 0 14162306a36Sopenharmony_ci#define SA_EXTENDED_SN_ON 1 14262306a36Sopenharmony_ci#define SA_SEQ_MASK_OFF 0 14362306a36Sopenharmony_ci#define SA_SEQ_MASK_ON 1 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ciunion sa_command_1 { 14662306a36Sopenharmony_ci struct { 14762306a36Sopenharmony_ci u32 crypto_mode31:1; 14862306a36Sopenharmony_ci u32 save_arc4_state:1; 14962306a36Sopenharmony_ci u32 arc4_stateful:1; 15062306a36Sopenharmony_ci u32 key_len:5; 15162306a36Sopenharmony_ci u32 hash_crypto_offset:8; 15262306a36Sopenharmony_ci u32 sa_rev:2; 15362306a36Sopenharmony_ci u32 byte_offset:1; 15462306a36Sopenharmony_ci u32 hmac_muting:1; 15562306a36Sopenharmony_ci u32 feedback_mode:2; 15662306a36Sopenharmony_ci u32 crypto_mode9_8:2; 15762306a36Sopenharmony_ci u32 extended_seq_num:1; 15862306a36Sopenharmony_ci u32 seq_num_mask:1; 15962306a36Sopenharmony_ci u32 mutable_bit_proc:1; 16062306a36Sopenharmony_ci u32 ip_version:1; 16162306a36Sopenharmony_ci u32 copy_pad:1; 16262306a36Sopenharmony_ci u32 copy_payload:1; 16362306a36Sopenharmony_ci u32 copy_hdr:1; 16462306a36Sopenharmony_ci u32 rsv1:1; 16562306a36Sopenharmony_ci } bf; 16662306a36Sopenharmony_ci u32 w; 16762306a36Sopenharmony_ci} __attribute__((packed)); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistruct dynamic_sa_ctl { 17062306a36Sopenharmony_ci union dynamic_sa_contents sa_contents; 17162306a36Sopenharmony_ci union sa_command_0 sa_command_0; 17262306a36Sopenharmony_ci union sa_command_1 sa_command_1; 17362306a36Sopenharmony_ci} __attribute__((packed)); 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci/* 17662306a36Sopenharmony_ci * State Record for Security Association (SA) 17762306a36Sopenharmony_ci */ 17862306a36Sopenharmony_cistruct sa_state_record { 17962306a36Sopenharmony_ci __le32 save_iv[4]; 18062306a36Sopenharmony_ci __le32 save_hash_byte_cnt[2]; 18162306a36Sopenharmony_ci union { 18262306a36Sopenharmony_ci u32 save_digest[16]; /* for MD5/SHA */ 18362306a36Sopenharmony_ci __le32 save_digest_le32[16]; /* GHASH / CBC */ 18462306a36Sopenharmony_ci }; 18562306a36Sopenharmony_ci} __attribute__((packed)); 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* 18862306a36Sopenharmony_ci * Security Association (SA) for AES128 18962306a36Sopenharmony_ci * 19062306a36Sopenharmony_ci */ 19162306a36Sopenharmony_cistruct dynamic_sa_aes128 { 19262306a36Sopenharmony_ci struct dynamic_sa_ctl ctrl; 19362306a36Sopenharmony_ci __le32 key[4]; 19462306a36Sopenharmony_ci __le32 iv[4]; /* for CBC, OFC, and CFB mode */ 19562306a36Sopenharmony_ci u32 state_ptr; 19662306a36Sopenharmony_ci u32 reserved; 19762306a36Sopenharmony_ci} __attribute__((packed)); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci#define SA_AES128_LEN (sizeof(struct dynamic_sa_aes128)/4) 20062306a36Sopenharmony_ci#define SA_AES128_CONTENTS 0x3e000042 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/* 20362306a36Sopenharmony_ci * Security Association (SA) for AES192 20462306a36Sopenharmony_ci */ 20562306a36Sopenharmony_cistruct dynamic_sa_aes192 { 20662306a36Sopenharmony_ci struct dynamic_sa_ctl ctrl; 20762306a36Sopenharmony_ci __le32 key[6]; 20862306a36Sopenharmony_ci __le32 iv[4]; /* for CBC, OFC, and CFB mode */ 20962306a36Sopenharmony_ci u32 state_ptr; 21062306a36Sopenharmony_ci u32 reserved; 21162306a36Sopenharmony_ci} __attribute__((packed)); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci#define SA_AES192_LEN (sizeof(struct dynamic_sa_aes192)/4) 21462306a36Sopenharmony_ci#define SA_AES192_CONTENTS 0x3e000062 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci/* 21762306a36Sopenharmony_ci * Security Association (SA) for AES256 21862306a36Sopenharmony_ci */ 21962306a36Sopenharmony_cistruct dynamic_sa_aes256 { 22062306a36Sopenharmony_ci struct dynamic_sa_ctl ctrl; 22162306a36Sopenharmony_ci __le32 key[8]; 22262306a36Sopenharmony_ci __le32 iv[4]; /* for CBC, OFC, and CFB mode */ 22362306a36Sopenharmony_ci u32 state_ptr; 22462306a36Sopenharmony_ci u32 reserved; 22562306a36Sopenharmony_ci} __attribute__((packed)); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#define SA_AES256_LEN (sizeof(struct dynamic_sa_aes256)/4) 22862306a36Sopenharmony_ci#define SA_AES256_CONTENTS 0x3e000082 22962306a36Sopenharmony_ci#define SA_AES_CONTENTS 0x3e000002 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci/* 23262306a36Sopenharmony_ci * Security Association (SA) for AES128 CCM 23362306a36Sopenharmony_ci */ 23462306a36Sopenharmony_cistruct dynamic_sa_aes128_ccm { 23562306a36Sopenharmony_ci struct dynamic_sa_ctl ctrl; 23662306a36Sopenharmony_ci __le32 key[4]; 23762306a36Sopenharmony_ci __le32 iv[4]; 23862306a36Sopenharmony_ci u32 state_ptr; 23962306a36Sopenharmony_ci u32 reserved; 24062306a36Sopenharmony_ci} __packed; 24162306a36Sopenharmony_ci#define SA_AES128_CCM_LEN (sizeof(struct dynamic_sa_aes128_ccm)/4) 24262306a36Sopenharmony_ci#define SA_AES128_CCM_CONTENTS 0x3e000042 24362306a36Sopenharmony_ci#define SA_AES_CCM_CONTENTS 0x3e000002 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci/* 24662306a36Sopenharmony_ci * Security Association (SA) for AES128_GCM 24762306a36Sopenharmony_ci */ 24862306a36Sopenharmony_cistruct dynamic_sa_aes128_gcm { 24962306a36Sopenharmony_ci struct dynamic_sa_ctl ctrl; 25062306a36Sopenharmony_ci __le32 key[4]; 25162306a36Sopenharmony_ci __le32 inner_digest[4]; 25262306a36Sopenharmony_ci __le32 iv[4]; 25362306a36Sopenharmony_ci u32 state_ptr; 25462306a36Sopenharmony_ci u32 reserved; 25562306a36Sopenharmony_ci} __packed; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci#define SA_AES128_GCM_LEN (sizeof(struct dynamic_sa_aes128_gcm)/4) 25862306a36Sopenharmony_ci#define SA_AES128_GCM_CONTENTS 0x3e000442 25962306a36Sopenharmony_ci#define SA_AES_GCM_CONTENTS 0x3e000402 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci/* 26262306a36Sopenharmony_ci * Security Association (SA) for HASH160: HMAC-SHA1 26362306a36Sopenharmony_ci */ 26462306a36Sopenharmony_cistruct dynamic_sa_hash160 { 26562306a36Sopenharmony_ci struct dynamic_sa_ctl ctrl; 26662306a36Sopenharmony_ci __le32 inner_digest[5]; 26762306a36Sopenharmony_ci __le32 outer_digest[5]; 26862306a36Sopenharmony_ci u32 state_ptr; 26962306a36Sopenharmony_ci u32 reserved; 27062306a36Sopenharmony_ci} __attribute__((packed)); 27162306a36Sopenharmony_ci#define SA_HASH160_LEN (sizeof(struct dynamic_sa_hash160)/4) 27262306a36Sopenharmony_ci#define SA_HASH160_CONTENTS 0x2000a502 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic inline u32 27562306a36Sopenharmony_ciget_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci u32 offset; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci offset = cts->sa_contents.bf.key_size 28062306a36Sopenharmony_ci + cts->sa_contents.bf.inner_size 28162306a36Sopenharmony_ci + cts->sa_contents.bf.outer_size 28262306a36Sopenharmony_ci + cts->sa_contents.bf.spi 28362306a36Sopenharmony_ci + cts->sa_contents.bf.seq_num0 28462306a36Sopenharmony_ci + cts->sa_contents.bf.seq_num1 28562306a36Sopenharmony_ci + cts->sa_contents.bf.seq_num_mask0 28662306a36Sopenharmony_ci + cts->sa_contents.bf.seq_num_mask1 28762306a36Sopenharmony_ci + cts->sa_contents.bf.seq_num_mask2 28862306a36Sopenharmony_ci + cts->sa_contents.bf.seq_num_mask3 28962306a36Sopenharmony_ci + cts->sa_contents.bf.iv0 29062306a36Sopenharmony_ci + cts->sa_contents.bf.iv1 29162306a36Sopenharmony_ci + cts->sa_contents.bf.iv2 29262306a36Sopenharmony_ci + cts->sa_contents.bf.iv3; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci return sizeof(struct dynamic_sa_ctl) + offset * 4; 29562306a36Sopenharmony_ci} 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_cistatic inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts) 29862306a36Sopenharmony_ci{ 29962306a36Sopenharmony_ci return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl)); 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci return (__le32 *) ((unsigned long)cts + 30562306a36Sopenharmony_ci sizeof(struct dynamic_sa_ctl) + 30662306a36Sopenharmony_ci cts->sa_contents.bf.key_size * 4); 30762306a36Sopenharmony_ci} 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci#endif 310