0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _SPU2_H
0011 #define _SPU2_H
0012
0013 enum spu2_cipher_type {
0014 SPU2_CIPHER_TYPE_NONE = 0x0,
0015 SPU2_CIPHER_TYPE_AES128 = 0x1,
0016 SPU2_CIPHER_TYPE_AES192 = 0x2,
0017 SPU2_CIPHER_TYPE_AES256 = 0x3,
0018 SPU2_CIPHER_TYPE_DES = 0x4,
0019 SPU2_CIPHER_TYPE_3DES = 0x5,
0020 SPU2_CIPHER_TYPE_LAST
0021 };
0022
0023 enum spu2_cipher_mode {
0024 SPU2_CIPHER_MODE_ECB = 0x0,
0025 SPU2_CIPHER_MODE_CBC = 0x1,
0026 SPU2_CIPHER_MODE_CTR = 0x2,
0027 SPU2_CIPHER_MODE_CFB = 0x3,
0028 SPU2_CIPHER_MODE_OFB = 0x4,
0029 SPU2_CIPHER_MODE_XTS = 0x5,
0030 SPU2_CIPHER_MODE_CCM = 0x6,
0031 SPU2_CIPHER_MODE_GCM = 0x7,
0032 SPU2_CIPHER_MODE_LAST
0033 };
0034
0035 enum spu2_hash_type {
0036 SPU2_HASH_TYPE_NONE = 0x0,
0037 SPU2_HASH_TYPE_AES128 = 0x1,
0038 SPU2_HASH_TYPE_AES192 = 0x2,
0039 SPU2_HASH_TYPE_AES256 = 0x3,
0040 SPU2_HASH_TYPE_MD5 = 0x6,
0041 SPU2_HASH_TYPE_SHA1 = 0x7,
0042 SPU2_HASH_TYPE_SHA224 = 0x8,
0043 SPU2_HASH_TYPE_SHA256 = 0x9,
0044 SPU2_HASH_TYPE_SHA384 = 0xa,
0045 SPU2_HASH_TYPE_SHA512 = 0xb,
0046 SPU2_HASH_TYPE_SHA512_224 = 0xc,
0047 SPU2_HASH_TYPE_SHA512_256 = 0xd,
0048 SPU2_HASH_TYPE_SHA3_224 = 0xe,
0049 SPU2_HASH_TYPE_SHA3_256 = 0xf,
0050 SPU2_HASH_TYPE_SHA3_384 = 0x10,
0051 SPU2_HASH_TYPE_SHA3_512 = 0x11,
0052 SPU2_HASH_TYPE_LAST
0053 };
0054
0055 enum spu2_hash_mode {
0056 SPU2_HASH_MODE_CMAC = 0x0,
0057 SPU2_HASH_MODE_CBC_MAC = 0x1,
0058 SPU2_HASH_MODE_XCBC_MAC = 0x2,
0059 SPU2_HASH_MODE_HMAC = 0x3,
0060 SPU2_HASH_MODE_RABIN = 0x4,
0061 SPU2_HASH_MODE_CCM = 0x5,
0062 SPU2_HASH_MODE_GCM = 0x6,
0063 SPU2_HASH_MODE_RESERVED = 0x7,
0064 SPU2_HASH_MODE_LAST
0065 };
0066
0067 enum spu2_ret_md_opts {
0068 SPU2_RET_NO_MD = 0,
0069 SPU2_RET_FMD_OMD = 1,
0070 SPU2_RET_FMD_ONLY = 2,
0071 SPU2_RET_FMD_OMD_IV = 3,
0072 };
0073
0074
0075 struct SPU2_FMD {
0076 __le64 ctrl0;
0077 __le64 ctrl1;
0078 __le64 ctrl2;
0079 __le64 ctrl3;
0080 };
0081
0082 #define FMD_SIZE sizeof(struct SPU2_FMD)
0083
0084
0085 #define SPU2_REQ_FIXED_LEN FMD_SIZE
0086 #define SPU2_HEADER_ALLOC_LEN (SPU_REQ_FIXED_LEN + \
0087 2 * MAX_KEY_SIZE + 2 * MAX_IV_SIZE)
0088
0089
0090 #define SPU2_CIPH_ENCRYPT_EN 0x1
0091 #define SPU2_CIPH_TYPE 0xF0
0092 #define SPU2_CIPH_TYPE_SHIFT 4
0093 #define SPU2_CIPH_MODE 0xF00
0094 #define SPU2_CIPH_MODE_SHIFT 8
0095 #define SPU2_CFB_MASK 0x7000
0096 #define SPU2_CFB_MASK_SHIFT 12
0097 #define SPU2_PROTO_SEL 0xF00000
0098 #define SPU2_PROTO_SEL_SHIFT 20
0099 #define SPU2_HASH_FIRST 0x1000000
0100
0101
0102 #define SPU2_CHK_TAG 0x2000000
0103 #define SPU2_HASH_TYPE 0x1F0000000
0104 #define SPU2_HASH_TYPE_SHIFT 28
0105 #define SPU2_HASH_MODE 0xF000000000
0106 #define SPU2_HASH_MODE_SHIFT 36
0107 #define SPU2_CIPH_PAD_EN 0x100000000000
0108
0109
0110 #define SPU2_CIPH_PAD 0xFF000000000000
0111 #define SPU2_CIPH_PAD_SHIFT 48
0112
0113
0114 #define SPU2_TAG_LOC 0x1
0115 #define SPU2_HAS_FR_DATA 0x2
0116 #define SPU2_HAS_AAD1 0x4
0117 #define SPU2_HAS_NAAD 0x8
0118 #define SPU2_HAS_AAD2 0x10
0119 #define SPU2_HAS_ESN 0x20
0120 #define SPU2_HASH_KEY_LEN 0xFF00
0121
0122
0123 #define SPU2_HASH_KEY_LEN_SHIFT 8
0124 #define SPU2_CIPH_KEY_LEN 0xFF00000
0125 #define SPU2_CIPH_KEY_LEN_SHIFT 20
0126 #define SPU2_GENIV 0x10000000
0127 #define SPU2_HASH_IV 0x20000000
0128 #define SPU2_RET_IV 0x40000000
0129
0130
0131 #define SPU2_RET_IV_LEN 0xF00000000
0132
0133
0134 #define SPU2_RET_IV_LEN_SHIFT 32
0135 #define SPU2_IV_OFFSET 0xF000000000
0136 #define SPU2_IV_OFFSET_SHIFT 36
0137 #define SPU2_IV_LEN 0x1F0000000000
0138 #define SPU2_IV_LEN_SHIFT 40
0139 #define SPU2_HASH_TAG_LEN 0x7F000000000000
0140 #define SPU2_HASH_TAG_LEN_SHIFT 48
0141 #define SPU2_RETURN_MD 0x300000000000000
0142 #define SPU2_RETURN_MD_SHIFT 56
0143 #define SPU2_RETURN_FD 0x400000000000000
0144 #define SPU2_RETURN_AAD1 0x800000000000000
0145 #define SPU2_RETURN_NAAD 0x1000000000000000
0146 #define SPU2_RETURN_AAD2 0x2000000000000000
0147 #define SPU2_RETURN_PAY 0x4000000000000000
0148
0149
0150 #define SPU2_AAD1_OFFSET 0xFFF
0151 #define SPU2_AAD1_LEN 0xFF000
0152 #define SPU2_AAD1_LEN_SHIFT 12
0153 #define SPU2_AAD2_OFFSET 0xFFF00000
0154 #define SPU2_AAD2_OFFSET_SHIFT 20
0155 #define SPU2_PL_OFFSET 0xFFFFFFFF00000000
0156 #define SPU2_PL_OFFSET_SHIFT 32
0157
0158
0159 #define SPU2_PL_LEN 0xFFFFFFFF
0160 #define SPU2_TLS_LEN 0xFFFF00000000
0161
0162
0163 #define SPU2_TLS_LEN_SHIFT 32
0164
0165
0166
0167
0168
0169 #define SPU2_MAX_PAYLOAD SPU2_PL_LEN
0170
0171
0172 #define SPU2_INVALID_ICV 1
0173
0174 void spu2_dump_msg_hdr(u8 *buf, unsigned int buf_len);
0175 u32 spu2_ctx_max_payload(enum spu_cipher_alg cipher_alg,
0176 enum spu_cipher_mode cipher_mode,
0177 unsigned int blocksize);
0178 u32 spu2_payload_length(u8 *spu_hdr);
0179 u16 spu2_response_hdr_len(u16 auth_key_len, u16 enc_key_len, bool is_hash);
0180 u16 spu2_hash_pad_len(enum hash_alg hash_alg, enum hash_mode hash_mode,
0181 u32 chunksize, u16 hash_block_size);
0182 u32 spu2_gcm_ccm_pad_len(enum spu_cipher_mode cipher_mode,
0183 unsigned int data_size);
0184 u32 spu2_assoc_resp_len(enum spu_cipher_mode cipher_mode,
0185 unsigned int assoc_len, unsigned int iv_len,
0186 bool is_encrypt);
0187 u8 spu2_aead_ivlen(enum spu_cipher_mode cipher_mode,
0188 u16 iv_len);
0189 enum hash_type spu2_hash_type(u32 src_sent);
0190 u32 spu2_digest_size(u32 alg_digest_size, enum hash_alg alg,
0191 enum hash_type htype);
0192 u32 spu2_create_request(u8 *spu_hdr,
0193 struct spu_request_opts *req_opts,
0194 struct spu_cipher_parms *cipher_parms,
0195 struct spu_hash_parms *hash_parms,
0196 struct spu_aead_parms *aead_parms,
0197 unsigned int data_size);
0198 u16 spu2_cipher_req_init(u8 *spu_hdr, struct spu_cipher_parms *cipher_parms);
0199 void spu2_cipher_req_finish(u8 *spu_hdr,
0200 u16 spu_req_hdr_len,
0201 unsigned int is_inbound,
0202 struct spu_cipher_parms *cipher_parms,
0203 unsigned int data_size);
0204 void spu2_request_pad(u8 *pad_start, u32 gcm_padding, u32 hash_pad_len,
0205 enum hash_alg auth_alg, enum hash_mode auth_mode,
0206 unsigned int total_sent, u32 status_padding);
0207 u8 spu2_xts_tweak_in_payload(void);
0208 u8 spu2_tx_status_len(void);
0209 u8 spu2_rx_status_len(void);
0210 int spu2_status_process(u8 *statp);
0211 void spu2_ccm_update_iv(unsigned int digestsize,
0212 struct spu_cipher_parms *cipher_parms,
0213 unsigned int assoclen, unsigned int chunksize,
0214 bool is_encrypt, bool is_esp);
0215 u32 spu2_wordalign_padlen(u32 data_size);
0216 #endif