0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #ifndef __CHCR_ALGO_H__
0037 #define __CHCR_ALGO_H__
0038
0039
0040 #define KEY_CONTEXT_CTX_LEN_S 24
0041 #define KEY_CONTEXT_CTX_LEN_M 0xff
0042 #define KEY_CONTEXT_CTX_LEN_V(x) ((x) << KEY_CONTEXT_CTX_LEN_S)
0043 #define KEY_CONTEXT_CTX_LEN_G(x) \
0044 (((x) >> KEY_CONTEXT_CTX_LEN_S) & KEY_CONTEXT_CTX_LEN_M)
0045
0046 #define KEY_CONTEXT_DUAL_CK_S 12
0047 #define KEY_CONTEXT_DUAL_CK_M 0x1
0048 #define KEY_CONTEXT_DUAL_CK_V(x) ((x) << KEY_CONTEXT_DUAL_CK_S)
0049 #define KEY_CONTEXT_DUAL_CK_G(x) \
0050 (((x) >> KEY_CONTEXT_DUAL_CK_S) & KEY_CONTEXT_DUAL_CK_M)
0051 #define KEY_CONTEXT_DUAL_CK_F KEY_CONTEXT_DUAL_CK_V(1U)
0052
0053 #define KEY_CONTEXT_SALT_PRESENT_S 10
0054 #define KEY_CONTEXT_SALT_PRESENT_M 0x1
0055 #define KEY_CONTEXT_SALT_PRESENT_V(x) ((x) << KEY_CONTEXT_SALT_PRESENT_S)
0056 #define KEY_CONTEXT_SALT_PRESENT_G(x) \
0057 (((x) >> KEY_CONTEXT_SALT_PRESENT_S) & \
0058 KEY_CONTEXT_SALT_PRESENT_M)
0059 #define KEY_CONTEXT_SALT_PRESENT_F KEY_CONTEXT_SALT_PRESENT_V(1U)
0060
0061 #define KEY_CONTEXT_VALID_S 0
0062 #define KEY_CONTEXT_VALID_M 0x1
0063 #define KEY_CONTEXT_VALID_V(x) ((x) << KEY_CONTEXT_VALID_S)
0064 #define KEY_CONTEXT_VALID_G(x) \
0065 (((x) >> KEY_CONTEXT_VALID_S) & \
0066 KEY_CONTEXT_VALID_M)
0067 #define KEY_CONTEXT_VALID_F KEY_CONTEXT_VALID_V(1U)
0068
0069 #define KEY_CONTEXT_CK_SIZE_S 6
0070 #define KEY_CONTEXT_CK_SIZE_M 0xf
0071 #define KEY_CONTEXT_CK_SIZE_V(x) ((x) << KEY_CONTEXT_CK_SIZE_S)
0072 #define KEY_CONTEXT_CK_SIZE_G(x) \
0073 (((x) >> KEY_CONTEXT_CK_SIZE_S) & KEY_CONTEXT_CK_SIZE_M)
0074
0075 #define KEY_CONTEXT_MK_SIZE_S 2
0076 #define KEY_CONTEXT_MK_SIZE_M 0xf
0077 #define KEY_CONTEXT_MK_SIZE_V(x) ((x) << KEY_CONTEXT_MK_SIZE_S)
0078 #define KEY_CONTEXT_MK_SIZE_G(x) \
0079 (((x) >> KEY_CONTEXT_MK_SIZE_S) & KEY_CONTEXT_MK_SIZE_M)
0080
0081 #define KEY_CONTEXT_OPAD_PRESENT_S 11
0082 #define KEY_CONTEXT_OPAD_PRESENT_M 0x1
0083 #define KEY_CONTEXT_OPAD_PRESENT_V(x) ((x) << KEY_CONTEXT_OPAD_PRESENT_S)
0084 #define KEY_CONTEXT_OPAD_PRESENT_G(x) \
0085 (((x) >> KEY_CONTEXT_OPAD_PRESENT_S) & \
0086 KEY_CONTEXT_OPAD_PRESENT_M)
0087 #define KEY_CONTEXT_OPAD_PRESENT_F KEY_CONTEXT_OPAD_PRESENT_V(1U)
0088
0089 #define CHCR_HASH_MAX_DIGEST_SIZE 64
0090 #define CHCR_MAX_SHA_DIGEST_SIZE 64
0091
0092 #define IPSEC_TRUNCATED_ICV_SIZE 12
0093 #define TLS_TRUNCATED_HMAC_SIZE 10
0094 #define CBCMAC_DIGEST_SIZE 16
0095 #define MAX_HASH_NAME 20
0096
0097 #define SHA1_INIT_STATE_5X4B 5
0098 #define SHA256_INIT_STATE_8X4B 8
0099 #define SHA512_INIT_STATE_8X8B 8
0100 #define SHA1_INIT_STATE SHA1_INIT_STATE_5X4B
0101 #define SHA224_INIT_STATE SHA256_INIT_STATE_8X4B
0102 #define SHA256_INIT_STATE SHA256_INIT_STATE_8X4B
0103 #define SHA384_INIT_STATE SHA512_INIT_STATE_8X8B
0104 #define SHA512_INIT_STATE SHA512_INIT_STATE_8X8B
0105
0106 #define DUMMY_BYTES 16
0107
0108 #define IPAD_DATA 0x36363636
0109 #define OPAD_DATA 0x5c5c5c5c
0110
0111 #define TRANSHDR_SIZE(kctx_len)\
0112 (sizeof(struct chcr_wr) +\
0113 kctx_len)
0114 #define CIPHER_TRANSHDR_SIZE(kctx_len, sge_pairs) \
0115 (TRANSHDR_SIZE((kctx_len)) + (sge_pairs) +\
0116 sizeof(struct cpl_rx_phys_dsgl) + AES_BLOCK_SIZE)
0117 #define HASH_TRANSHDR_SIZE(kctx_len)\
0118 (TRANSHDR_SIZE(kctx_len) + DUMMY_BYTES)
0119
0120
0121 #define FILL_SEC_CPL_OP_IVINSR(id, len, ofst) \
0122 htonl( \
0123 CPL_TX_SEC_PDU_OPCODE_V(CPL_TX_SEC_PDU) | \
0124 CPL_TX_SEC_PDU_RXCHID_V((id)) | \
0125 CPL_TX_SEC_PDU_ACKFOLLOWS_V(0) | \
0126 CPL_TX_SEC_PDU_ULPTXLPBK_V(1) | \
0127 CPL_TX_SEC_PDU_CPLLEN_V((len)) | \
0128 CPL_TX_SEC_PDU_PLACEHOLDER_V(0) | \
0129 CPL_TX_SEC_PDU_IVINSRTOFST_V((ofst)))
0130
0131 #define FILL_SEC_CPL_CIPHERSTOP_HI(a_start, a_stop, c_start, c_stop_hi) \
0132 htonl( \
0133 CPL_TX_SEC_PDU_AADSTART_V((a_start)) | \
0134 CPL_TX_SEC_PDU_AADSTOP_V((a_stop)) | \
0135 CPL_TX_SEC_PDU_CIPHERSTART_V((c_start)) | \
0136 CPL_TX_SEC_PDU_CIPHERSTOP_HI_V((c_stop_hi)))
0137
0138 #define FILL_SEC_CPL_AUTHINSERT(c_stop_lo, a_start, a_stop, a_inst) \
0139 htonl( \
0140 CPL_TX_SEC_PDU_CIPHERSTOP_LO_V((c_stop_lo)) | \
0141 CPL_TX_SEC_PDU_AUTHSTART_V((a_start)) | \
0142 CPL_TX_SEC_PDU_AUTHSTOP_V((a_stop)) | \
0143 CPL_TX_SEC_PDU_AUTHINSERT_V((a_inst)))
0144
0145 #define FILL_SEC_CPL_SCMD0_SEQNO(ctrl, seq, cmode, amode, opad, size) \
0146 htonl( \
0147 SCMD_SEQ_NO_CTRL_V(0) | \
0148 SCMD_STATUS_PRESENT_V(0) | \
0149 SCMD_PROTO_VERSION_V(CHCR_SCMD_PROTO_VERSION_GENERIC) | \
0150 SCMD_ENC_DEC_CTRL_V((ctrl)) | \
0151 SCMD_CIPH_AUTH_SEQ_CTRL_V((seq)) | \
0152 SCMD_CIPH_MODE_V((cmode)) | \
0153 SCMD_AUTH_MODE_V((amode)) | \
0154 SCMD_HMAC_CTRL_V((opad)) | \
0155 SCMD_IV_SIZE_V((size)) | \
0156 SCMD_NUM_IVS_V(0))
0157
0158 #define FILL_SEC_CPL_IVGEN_HDRLEN(last, more, ctx_in, mac, ivdrop, len) htonl( \
0159 SCMD_ENB_DBGID_V(0) | \
0160 SCMD_IV_GEN_CTRL_V(0) | \
0161 SCMD_LAST_FRAG_V((last)) | \
0162 SCMD_MORE_FRAGS_V((more)) | \
0163 SCMD_TLS_COMPPDU_V(0) | \
0164 SCMD_KEY_CTX_INLINE_V((ctx_in)) | \
0165 SCMD_TLS_FRAG_ENABLE_V(0) | \
0166 SCMD_MAC_ONLY_V((mac)) | \
0167 SCMD_AADIVDROP_V((ivdrop)) | \
0168 SCMD_HDR_LEN_V((len)))
0169
0170 #define FILL_KEY_CTX_HDR(ck_size, mk_size, d_ck, opad, ctx_len) \
0171 htonl(KEY_CONTEXT_VALID_V(1) | \
0172 KEY_CONTEXT_CK_SIZE_V((ck_size)) | \
0173 KEY_CONTEXT_MK_SIZE_V(mk_size) | \
0174 KEY_CONTEXT_DUAL_CK_V((d_ck)) | \
0175 KEY_CONTEXT_OPAD_PRESENT_V((opad)) | \
0176 KEY_CONTEXT_SALT_PRESENT_V(1) | \
0177 KEY_CONTEXT_CTX_LEN_V((ctx_len)))
0178
0179 #define FILL_KEY_CRX_HDR(ck_size, mk_size, d_ck, opad, ctx_len) \
0180 htonl(TLS_KEYCTX_RXMK_SIZE_V(mk_size) | \
0181 TLS_KEYCTX_RXCK_SIZE_V(ck_size) | \
0182 TLS_KEYCTX_RX_VALID_V(1) | \
0183 TLS_KEYCTX_RX_SEQCTR_V(3) | \
0184 TLS_KEYCTX_RXAUTH_MODE_V(4) | \
0185 TLS_KEYCTX_RXCIPH_MODE_V(2) | \
0186 TLS_KEYCTX_RXFLIT_CNT_V((ctx_len)))
0187
0188 #define FILL_WR_OP_CCTX_SIZE \
0189 htonl( \
0190 FW_CRYPTO_LOOKASIDE_WR_OPCODE_V( \
0191 FW_CRYPTO_LOOKASIDE_WR) | \
0192 FW_CRYPTO_LOOKASIDE_WR_COMPL_V(0) | \
0193 FW_CRYPTO_LOOKASIDE_WR_IMM_LEN_V((0)) | \
0194 FW_CRYPTO_LOOKASIDE_WR_CCTX_LOC_V(0) | \
0195 FW_CRYPTO_LOOKASIDE_WR_CCTX_SIZE_V(0))
0196
0197 #define FILL_WR_RX_Q_ID(cid, qid, lcb, fid) \
0198 htonl( \
0199 FW_CRYPTO_LOOKASIDE_WR_RX_CHID_V((cid)) | \
0200 FW_CRYPTO_LOOKASIDE_WR_RX_Q_ID_V((qid)) | \
0201 FW_CRYPTO_LOOKASIDE_WR_LCB_V((lcb)) | \
0202 FW_CRYPTO_LOOKASIDE_WR_IV_V((IV_NOP)) | \
0203 FW_CRYPTO_LOOKASIDE_WR_FQIDX_V(fid))
0204
0205 #define FILL_ULPTX_CMD_DEST(cid, qid) \
0206 htonl(ULPTX_CMD_V(ULP_TX_PKT) | \
0207 ULP_TXPKT_DEST_V(0) | \
0208 ULP_TXPKT_DATAMODIFY_V(0) | \
0209 ULP_TXPKT_CHANNELID_V((cid)) | \
0210 ULP_TXPKT_RO_V(1) | \
0211 ULP_TXPKT_FID_V(qid))
0212
0213 #define KEYCTX_ALIGN_PAD(bs) ({unsigned int _bs = (bs);\
0214 _bs == SHA1_DIGEST_SIZE ? 12 : 0; })
0215
0216 #define FILL_PLD_SIZE_HASH_SIZE(payload_sgl_len, sgl_lengths, total_frags) \
0217 htonl(FW_CRYPTO_LOOKASIDE_WR_PLD_SIZE_V(payload_sgl_len ? \
0218 sgl_lengths[total_frags] : 0) |\
0219 FW_CRYPTO_LOOKASIDE_WR_HASH_SIZE_V(0))
0220
0221 #define FILL_LEN_PKD(calc_tx_flits_ofld, skb) \
0222 htonl(FW_CRYPTO_LOOKASIDE_WR_LEN16_V(DIV_ROUND_UP((\
0223 calc_tx_flits_ofld(skb) * 8), 16)))
0224
0225 #define FILL_CMD_MORE(immdatalen) htonl(ULPTX_CMD_V(ULP_TX_SC_IMM) |\
0226 ULP_TX_SC_MORE_V((immdatalen)))
0227 #define MAX_NK 8
0228 #define MAX_DSGL_ENT 32
0229 #define MIN_AUTH_SG 1
0230 #define MIN_GCM_SG 1
0231 #define MIN_DIGEST_SG 1
0232 #define MIN_CCM_SG 1
0233 #define CIP_SPACE_LEFT(len) \
0234 ((SGE_MAX_WR_LEN - CIP_WR_MIN_LEN - (len)))
0235 #define HASH_SPACE_LEFT(len) \
0236 ((SGE_MAX_WR_LEN - HASH_WR_MIN_LEN - (len)))
0237
0238 struct algo_param {
0239 unsigned int auth_mode;
0240 unsigned int mk_size;
0241 unsigned int result_size;
0242 };
0243
0244 struct hash_wr_param {
0245 struct algo_param alg_prm;
0246 unsigned int opad_needed;
0247 unsigned int more;
0248 unsigned int last;
0249 unsigned int kctx_len;
0250 unsigned int sg_len;
0251 unsigned int bfr_len;
0252 unsigned int hash_size;
0253 u64 scmd1;
0254 };
0255
0256 struct cipher_wr_param {
0257 struct skcipher_request *req;
0258 char *iv;
0259 int bytes;
0260 unsigned short qid;
0261 };
0262 enum {
0263 AES_KEYLENGTH_128BIT = 128,
0264 AES_KEYLENGTH_192BIT = 192,
0265 AES_KEYLENGTH_256BIT = 256
0266 };
0267
0268 enum {
0269 KEYLENGTH_3BYTES = 3,
0270 KEYLENGTH_4BYTES = 4,
0271 KEYLENGTH_6BYTES = 6,
0272 KEYLENGTH_8BYTES = 8
0273 };
0274
0275 enum {
0276 NUMBER_OF_ROUNDS_10 = 10,
0277 NUMBER_OF_ROUNDS_12 = 12,
0278 NUMBER_OF_ROUNDS_14 = 14,
0279 };
0280
0281
0282
0283
0284
0285 enum {
0286 ICV_4 = 4,
0287 ICV_6 = 6,
0288 ICV_8 = 8,
0289 ICV_10 = 10,
0290 ICV_12 = 12,
0291 ICV_13 = 13,
0292 ICV_14 = 14,
0293 ICV_15 = 15,
0294 ICV_16 = 16
0295 };
0296
0297 struct phys_sge_pairs {
0298 __be16 len[8];
0299 __be64 addr[8];
0300 };
0301
0302
0303 static const u32 chcr_sha1_init[SHA1_DIGEST_SIZE / 4] = {
0304 SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
0305 };
0306
0307 static const u32 chcr_sha224_init[SHA256_DIGEST_SIZE / 4] = {
0308 SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
0309 SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
0310 };
0311
0312 static const u32 chcr_sha256_init[SHA256_DIGEST_SIZE / 4] = {
0313 SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
0314 SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
0315 };
0316
0317 static const u64 chcr_sha384_init[SHA512_DIGEST_SIZE / 8] = {
0318 SHA384_H0, SHA384_H1, SHA384_H2, SHA384_H3,
0319 SHA384_H4, SHA384_H5, SHA384_H6, SHA384_H7,
0320 };
0321
0322 static const u64 chcr_sha512_init[SHA512_DIGEST_SIZE / 8] = {
0323 SHA512_H0, SHA512_H1, SHA512_H2, SHA512_H3,
0324 SHA512_H4, SHA512_H5, SHA512_H6, SHA512_H7,
0325 };
0326
0327 static inline void copy_hash_init_values(char *key, int digestsize)
0328 {
0329 u8 i;
0330 __be32 *dkey = (__be32 *)key;
0331 u64 *ldkey = (u64 *)key;
0332 __be64 *sha384 = (__be64 *)chcr_sha384_init;
0333 __be64 *sha512 = (__be64 *)chcr_sha512_init;
0334
0335 switch (digestsize) {
0336 case SHA1_DIGEST_SIZE:
0337 for (i = 0; i < SHA1_INIT_STATE; i++)
0338 dkey[i] = cpu_to_be32(chcr_sha1_init[i]);
0339 break;
0340 case SHA224_DIGEST_SIZE:
0341 for (i = 0; i < SHA224_INIT_STATE; i++)
0342 dkey[i] = cpu_to_be32(chcr_sha224_init[i]);
0343 break;
0344 case SHA256_DIGEST_SIZE:
0345 for (i = 0; i < SHA256_INIT_STATE; i++)
0346 dkey[i] = cpu_to_be32(chcr_sha256_init[i]);
0347 break;
0348 case SHA384_DIGEST_SIZE:
0349 for (i = 0; i < SHA384_INIT_STATE; i++)
0350 ldkey[i] = be64_to_cpu(sha384[i]);
0351 break;
0352 case SHA512_DIGEST_SIZE:
0353 for (i = 0; i < SHA512_INIT_STATE; i++)
0354 ldkey[i] = be64_to_cpu(sha512[i]);
0355 break;
0356 }
0357 }
0358
0359
0360 #define PHYSDSGL_MAX_LEN_SIZE 16
0361
0362 static inline u16 get_space_for_phys_dsgl(unsigned int sgl_entr)
0363 {
0364
0365 return ((sgl_entr >> 3) + ((sgl_entr % 8) ?
0366 1 : 0)) * PHYSDSGL_MAX_LEN_SIZE +
0367 (sgl_entr << 3) + ((sgl_entr % 2 ? 1 : 0) << 3);
0368 }
0369
0370
0371 static const u8 aes_sbox[256] = {
0372 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215,
0373 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175,
0374 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165,
0375 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7,
0376 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90,
0377 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32,
0378 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170,
0379 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81,
0380 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243,
0381 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100,
0382 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184,
0383 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194,
0384 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78,
0385 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166,
0386 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102,
0387 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248,
0388 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
0389 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84,
0390 187, 22
0391 };
0392
0393 static inline u32 aes_ks_subword(const u32 w)
0394 {
0395 u8 bytes[4];
0396
0397 *(u32 *)(&bytes[0]) = w;
0398 bytes[0] = aes_sbox[bytes[0]];
0399 bytes[1] = aes_sbox[bytes[1]];
0400 bytes[2] = aes_sbox[bytes[2]];
0401 bytes[3] = aes_sbox[bytes[3]];
0402 return *(u32 *)(&bytes[0]);
0403 }
0404
0405 #endif