blob: 507aafe93f2153ef240e2f11f06d77060c0c2061 [file] [log] [blame]
Hariprasad Shenai324429d2016-08-17 12:33:05 +05301/*
2 * This file is part of the Chelsio T6 Crypto driver for Linux.
3 *
4 * Copyright (c) 2003-2016 Chelsio Communications, Inc. All rights reserved.
5 *
6 * This software is available to you under a choice of one of two
7 * licenses. You may choose to be licensed under the terms of the GNU
8 * General Public License (GPL) Version 2, available from the file
9 * COPYING in the main directory of this source tree, or the
10 * OpenIB.org BSD license below:
11 *
12 * Redistribution and use in source and binary forms, with or
13 * without modification, are permitted provided that the following
14 * conditions are met:
15 *
16 * - Redistributions of source code must retain the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer.
19 *
20 * - Redistributions in binary form must reproduce the above
21 * copyright notice, this list of conditions and the following
22 * disclaimer in the documentation and/or other materials
23 * provided with the distribution.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 * SOFTWARE.
33 *
34 */
35
36#ifndef __CHCR_ALGO_H__
37#define __CHCR_ALGO_H__
38
39/* Crypto key context */
40#define KEY_CONTEXT_CTX_LEN_S 24
41#define KEY_CONTEXT_CTX_LEN_M 0xff
42#define KEY_CONTEXT_CTX_LEN_V(x) ((x) << KEY_CONTEXT_CTX_LEN_S)
43#define KEY_CONTEXT_CTX_LEN_G(x) \
44 (((x) >> KEY_CONTEXT_CTX_LEN_S) & KEY_CONTEXT_CTX_LEN_M)
45
46#define KEY_CONTEXT_DUAL_CK_S 12
47#define KEY_CONTEXT_DUAL_CK_M 0x1
48#define KEY_CONTEXT_DUAL_CK_V(x) ((x) << KEY_CONTEXT_DUAL_CK_S)
49#define KEY_CONTEXT_DUAL_CK_G(x) \
50(((x) >> KEY_CONTEXT_DUAL_CK_S) & KEY_CONTEXT_DUAL_CK_M)
51#define KEY_CONTEXT_DUAL_CK_F KEY_CONTEXT_DUAL_CK_V(1U)
52
53#define KEY_CONTEXT_SALT_PRESENT_S 10
54#define KEY_CONTEXT_SALT_PRESENT_M 0x1
55#define KEY_CONTEXT_SALT_PRESENT_V(x) ((x) << KEY_CONTEXT_SALT_PRESENT_S)
56#define KEY_CONTEXT_SALT_PRESENT_G(x) \
57 (((x) >> KEY_CONTEXT_SALT_PRESENT_S) & \
58 KEY_CONTEXT_SALT_PRESENT_M)
59#define KEY_CONTEXT_SALT_PRESENT_F KEY_CONTEXT_SALT_PRESENT_V(1U)
60
61#define KEY_CONTEXT_VALID_S 0
62#define KEY_CONTEXT_VALID_M 0x1
63#define KEY_CONTEXT_VALID_V(x) ((x) << KEY_CONTEXT_VALID_S)
64#define KEY_CONTEXT_VALID_G(x) \
65 (((x) >> KEY_CONTEXT_VALID_S) & \
66 KEY_CONTEXT_VALID_M)
67#define KEY_CONTEXT_VALID_F KEY_CONTEXT_VALID_V(1U)
68
69#define KEY_CONTEXT_CK_SIZE_S 6
70#define KEY_CONTEXT_CK_SIZE_M 0xf
71#define KEY_CONTEXT_CK_SIZE_V(x) ((x) << KEY_CONTEXT_CK_SIZE_S)
72#define KEY_CONTEXT_CK_SIZE_G(x) \
73 (((x) >> KEY_CONTEXT_CK_SIZE_S) & KEY_CONTEXT_CK_SIZE_M)
74
75#define KEY_CONTEXT_MK_SIZE_S 2
76#define KEY_CONTEXT_MK_SIZE_M 0xf
77#define KEY_CONTEXT_MK_SIZE_V(x) ((x) << KEY_CONTEXT_MK_SIZE_S)
78#define KEY_CONTEXT_MK_SIZE_G(x) \
79 (((x) >> KEY_CONTEXT_MK_SIZE_S) & KEY_CONTEXT_MK_SIZE_M)
80
81#define KEY_CONTEXT_OPAD_PRESENT_S 11
82#define KEY_CONTEXT_OPAD_PRESENT_M 0x1
83#define KEY_CONTEXT_OPAD_PRESENT_V(x) ((x) << KEY_CONTEXT_OPAD_PRESENT_S)
84#define KEY_CONTEXT_OPAD_PRESENT_G(x) \
85 (((x) >> KEY_CONTEXT_OPAD_PRESENT_S) & \
86 KEY_CONTEXT_OPAD_PRESENT_M)
87#define KEY_CONTEXT_OPAD_PRESENT_F KEY_CONTEXT_OPAD_PRESENT_V(1U)
88
89#define CHCR_HASH_MAX_DIGEST_SIZE 64
90#define CHCR_MAX_SHA_DIGEST_SIZE 64
91
92#define IPSEC_TRUNCATED_ICV_SIZE 12
93#define TLS_TRUNCATED_HMAC_SIZE 10
94#define CBCMAC_DIGEST_SIZE 16
95#define MAX_HASH_NAME 20
96
97#define SHA1_INIT_STATE_5X4B 5
98#define SHA256_INIT_STATE_8X4B 8
99#define SHA512_INIT_STATE_8X8B 8
100#define SHA1_INIT_STATE SHA1_INIT_STATE_5X4B
101#define SHA224_INIT_STATE SHA256_INIT_STATE_8X4B
102#define SHA256_INIT_STATE SHA256_INIT_STATE_8X4B
103#define SHA384_INIT_STATE SHA512_INIT_STATE_8X8B
104#define SHA512_INIT_STATE SHA512_INIT_STATE_8X8B
105
106#define DUMMY_BYTES 16
107
108#define IPAD_DATA 0x36363636
109#define OPAD_DATA 0x5c5c5c5c
110
Harsh Jain358961d2016-11-29 19:00:36 +0530111#define TRANSHDR_SIZE(kctx_len)\
112 (sizeof(struct chcr_wr) +\
113 kctx_len)
114#define CIPHER_TRANSHDR_SIZE(kctx_len, sge_pairs) \
115 (TRANSHDR_SIZE((kctx_len)) + (sge_pairs) +\
Harsh Jain335bcc42018-05-24 17:26:38 +0530116 sizeof(struct cpl_rx_phys_dsgl) + AES_BLOCK_SIZE)
Harsh Jain358961d2016-11-29 19:00:36 +0530117#define HASH_TRANSHDR_SIZE(kctx_len)\
118 (TRANSHDR_SIZE(kctx_len) + DUMMY_BYTES)
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530119
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530120
Harsh Jain358961d2016-11-29 19:00:36 +0530121#define FILL_SEC_CPL_OP_IVINSR(id, len, ofst) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530122 htonl( \
123 CPL_TX_SEC_PDU_OPCODE_V(CPL_TX_SEC_PDU) | \
124 CPL_TX_SEC_PDU_RXCHID_V((id)) | \
125 CPL_TX_SEC_PDU_ACKFOLLOWS_V(0) | \
126 CPL_TX_SEC_PDU_ULPTXLPBK_V(1) | \
127 CPL_TX_SEC_PDU_CPLLEN_V((len)) | \
Harsh Jain358961d2016-11-29 19:00:36 +0530128 CPL_TX_SEC_PDU_PLACEHOLDER_V(0) | \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530129 CPL_TX_SEC_PDU_IVINSRTOFST_V((ofst)))
130
131#define FILL_SEC_CPL_CIPHERSTOP_HI(a_start, a_stop, c_start, c_stop_hi) \
132 htonl( \
133 CPL_TX_SEC_PDU_AADSTART_V((a_start)) | \
134 CPL_TX_SEC_PDU_AADSTOP_V((a_stop)) | \
135 CPL_TX_SEC_PDU_CIPHERSTART_V((c_start)) | \
136 CPL_TX_SEC_PDU_CIPHERSTOP_HI_V((c_stop_hi)))
137
138#define FILL_SEC_CPL_AUTHINSERT(c_stop_lo, a_start, a_stop, a_inst) \
139 htonl( \
140 CPL_TX_SEC_PDU_CIPHERSTOP_LO_V((c_stop_lo)) | \
141 CPL_TX_SEC_PDU_AUTHSTART_V((a_start)) | \
142 CPL_TX_SEC_PDU_AUTHSTOP_V((a_stop)) | \
143 CPL_TX_SEC_PDU_AUTHINSERT_V((a_inst)))
144
Harsh Jain358961d2016-11-29 19:00:36 +0530145#define FILL_SEC_CPL_SCMD0_SEQNO(ctrl, seq, cmode, amode, opad, size) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530146 htonl( \
147 SCMD_SEQ_NO_CTRL_V(0) | \
148 SCMD_STATUS_PRESENT_V(0) | \
149 SCMD_PROTO_VERSION_V(CHCR_SCMD_PROTO_VERSION_GENERIC) | \
150 SCMD_ENC_DEC_CTRL_V((ctrl)) | \
151 SCMD_CIPH_AUTH_SEQ_CTRL_V((seq)) | \
152 SCMD_CIPH_MODE_V((cmode)) | \
153 SCMD_AUTH_MODE_V((amode)) | \
154 SCMD_HMAC_CTRL_V((opad)) | \
155 SCMD_IV_SIZE_V((size)) | \
Harsh Jain358961d2016-11-29 19:00:36 +0530156 SCMD_NUM_IVS_V(0))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530157
158#define FILL_SEC_CPL_IVGEN_HDRLEN(last, more, ctx_in, mac, ivdrop, len) htonl( \
159 SCMD_ENB_DBGID_V(0) | \
160 SCMD_IV_GEN_CTRL_V(0) | \
161 SCMD_LAST_FRAG_V((last)) | \
162 SCMD_MORE_FRAGS_V((more)) | \
163 SCMD_TLS_COMPPDU_V(0) | \
164 SCMD_KEY_CTX_INLINE_V((ctx_in)) | \
165 SCMD_TLS_FRAG_ENABLE_V(0) | \
166 SCMD_MAC_ONLY_V((mac)) | \
167 SCMD_AADIVDROP_V((ivdrop)) | \
168 SCMD_HDR_LEN_V((len)))
169
170#define FILL_KEY_CTX_HDR(ck_size, mk_size, d_ck, opad, ctx_len) \
171 htonl(KEY_CONTEXT_VALID_V(1) | \
172 KEY_CONTEXT_CK_SIZE_V((ck_size)) | \
173 KEY_CONTEXT_MK_SIZE_V(mk_size) | \
174 KEY_CONTEXT_DUAL_CK_V((d_ck)) | \
175 KEY_CONTEXT_OPAD_PRESENT_V((opad)) | \
176 KEY_CONTEXT_SALT_PRESENT_V(1) | \
177 KEY_CONTEXT_CTX_LEN_V((ctx_len)))
178
Atul Gupta639d28a2018-03-31 21:41:56 +0530179#define FILL_KEY_CRX_HDR(ck_size, mk_size, d_ck, opad, ctx_len) \
180 htonl(TLS_KEYCTX_RXMK_SIZE_V(mk_size) | \
181 TLS_KEYCTX_RXCK_SIZE_V(ck_size) | \
182 TLS_KEYCTX_RX_VALID_V(1) | \
183 TLS_KEYCTX_RX_SEQCTR_V(3) | \
184 TLS_KEYCTX_RXAUTH_MODE_V(4) | \
185 TLS_KEYCTX_RXCIPH_MODE_V(2) | \
186 TLS_KEYCTX_RXFLIT_CNT_V((ctx_len)))
187
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530188#define FILL_WR_OP_CCTX_SIZE \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530189 htonl( \
190 FW_CRYPTO_LOOKASIDE_WR_OPCODE_V( \
191 FW_CRYPTO_LOOKASIDE_WR) | \
192 FW_CRYPTO_LOOKASIDE_WR_COMPL_V(0) | \
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530193 FW_CRYPTO_LOOKASIDE_WR_IMM_LEN_V((0)) | \
194 FW_CRYPTO_LOOKASIDE_WR_CCTX_LOC_V(0) | \
195 FW_CRYPTO_LOOKASIDE_WR_CCTX_SIZE_V(0))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530196
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530197#define FILL_WR_RX_Q_ID(cid, qid, lcb, fid) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530198 htonl( \
199 FW_CRYPTO_LOOKASIDE_WR_RX_CHID_V((cid)) | \
200 FW_CRYPTO_LOOKASIDE_WR_RX_Q_ID_V((qid)) | \
Harsh Jain2512a622017-06-15 12:43:39 +0530201 FW_CRYPTO_LOOKASIDE_WR_LCB_V((lcb)) | \
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530202 FW_CRYPTO_LOOKASIDE_WR_IV_V((IV_NOP)) | \
Harsh Jain8a134492017-01-27 16:09:05 +0530203 FW_CRYPTO_LOOKASIDE_WR_FQIDX_V(fid))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530204
Harsh Jain8a134492017-01-27 16:09:05 +0530205#define FILL_ULPTX_CMD_DEST(cid, qid) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530206 htonl(ULPTX_CMD_V(ULP_TX_PKT) | \
207 ULP_TXPKT_DEST_V(0) | \
208 ULP_TXPKT_DATAMODIFY_V(0) | \
209 ULP_TXPKT_CHANNELID_V((cid)) | \
210 ULP_TXPKT_RO_V(1) | \
Harsh Jain8a134492017-01-27 16:09:05 +0530211 ULP_TXPKT_FID_V(qid))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530212
213#define KEYCTX_ALIGN_PAD(bs) ({unsigned int _bs = (bs);\
214 _bs == SHA1_DIGEST_SIZE ? 12 : 0; })
215
216#define FILL_PLD_SIZE_HASH_SIZE(payload_sgl_len, sgl_lengths, total_frags) \
217 htonl(FW_CRYPTO_LOOKASIDE_WR_PLD_SIZE_V(payload_sgl_len ? \
218 sgl_lengths[total_frags] : 0) |\
219 FW_CRYPTO_LOOKASIDE_WR_HASH_SIZE_V(0))
220
221#define FILL_LEN_PKD(calc_tx_flits_ofld, skb) \
222 htonl(FW_CRYPTO_LOOKASIDE_WR_LEN16_V(DIV_ROUND_UP((\
223 calc_tx_flits_ofld(skb) * 8), 16)))
224
225#define FILL_CMD_MORE(immdatalen) htonl(ULPTX_CMD_V(ULP_TX_SC_IMM) |\
Harsh Jain2f47d582017-10-08 13:37:23 +0530226 ULP_TX_SC_MORE_V((immdatalen)))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530227#define MAX_NK 8
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530228#define MAX_DSGL_ENT 32
Harsh Jain2f47d582017-10-08 13:37:23 +0530229#define MIN_AUTH_SG 1 /* IV */
230#define MIN_GCM_SG 1 /* IV */
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530231#define MIN_DIGEST_SG 1 /*Partial Buffer*/
Harsh Jain1f479e42018-12-11 16:21:37 +0530232#define MIN_CCM_SG 1 /*IV+B0*/
Harsh Jain5110e652018-03-06 10:37:52 +0530233#define CIP_SPACE_LEFT(len) \
234 ((SGE_MAX_WR_LEN - CIP_WR_MIN_LEN - (len)))
235#define HASH_SPACE_LEFT(len) \
236 ((SGE_MAX_WR_LEN - HASH_WR_MIN_LEN - (len)))
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530237
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530238struct algo_param {
239 unsigned int auth_mode;
240 unsigned int mk_size;
241 unsigned int result_size;
242};
243
244struct hash_wr_param {
Harsh Jain5110e652018-03-06 10:37:52 +0530245 struct algo_param alg_prm;
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530246 unsigned int opad_needed;
247 unsigned int more;
248 unsigned int last;
Harsh Jain5110e652018-03-06 10:37:52 +0530249 unsigned int kctx_len;
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530250 unsigned int sg_len;
251 unsigned int bfr_len;
Harsh Jain5110e652018-03-06 10:37:52 +0530252 unsigned int hash_size;
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530253 u64 scmd1;
254};
255
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530256struct cipher_wr_param {
Ard Biesheuvel7cea6d32019-11-09 18:09:38 +0100257 struct skcipher_request *req;
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530258 char *iv;
259 int bytes;
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530260 unsigned short qid;
261};
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530262enum {
263 AES_KEYLENGTH_128BIT = 128,
264 AES_KEYLENGTH_192BIT = 192,
265 AES_KEYLENGTH_256BIT = 256
266};
267
268enum {
269 KEYLENGTH_3BYTES = 3,
270 KEYLENGTH_4BYTES = 4,
271 KEYLENGTH_6BYTES = 6,
272 KEYLENGTH_8BYTES = 8
273};
274
275enum {
276 NUMBER_OF_ROUNDS_10 = 10,
277 NUMBER_OF_ROUNDS_12 = 12,
278 NUMBER_OF_ROUNDS_14 = 14,
279};
280
281/*
282 * CCM defines values of 4, 6, 8, 10, 12, 14, and 16 octets,
283 * where they indicate the size of the integrity check value (ICV)
284 */
285enum {
Harsh Jain2debd332016-11-29 19:00:43 +0530286 ICV_4 = 4,
287 ICV_6 = 6,
288 ICV_8 = 8,
289 ICV_10 = 10,
290 ICV_12 = 12,
291 ICV_13 = 13,
292 ICV_14 = 14,
293 ICV_15 = 15,
294 ICV_16 = 16
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530295};
296
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530297struct phys_sge_pairs {
298 __be16 len[8];
299 __be64 addr[8];
300};
301
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530302
Hans de Goede6e4655e2019-09-01 22:35:29 +0200303static const u32 chcr_sha1_init[SHA1_DIGEST_SIZE / 4] = {
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530304 SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
305};
306
Hans de Goede6e4655e2019-09-01 22:35:29 +0200307static const u32 chcr_sha224_init[SHA256_DIGEST_SIZE / 4] = {
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530308 SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
309 SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
310};
311
Hans de Goede6e4655e2019-09-01 22:35:29 +0200312static const u32 chcr_sha256_init[SHA256_DIGEST_SIZE / 4] = {
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530313 SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
314 SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
315};
316
Hans de Goede6e4655e2019-09-01 22:35:29 +0200317static const u64 chcr_sha384_init[SHA512_DIGEST_SIZE / 8] = {
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530318 SHA384_H0, SHA384_H1, SHA384_H2, SHA384_H3,
319 SHA384_H4, SHA384_H5, SHA384_H6, SHA384_H7,
320};
321
Hans de Goede6e4655e2019-09-01 22:35:29 +0200322static const u64 chcr_sha512_init[SHA512_DIGEST_SIZE / 8] = {
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530323 SHA512_H0, SHA512_H1, SHA512_H2, SHA512_H3,
324 SHA512_H4, SHA512_H5, SHA512_H6, SHA512_H7,
325};
326
327static inline void copy_hash_init_values(char *key, int digestsize)
328{
329 u8 i;
330 __be32 *dkey = (__be32 *)key;
331 u64 *ldkey = (u64 *)key;
Hans de Goede6e4655e2019-09-01 22:35:29 +0200332 __be64 *sha384 = (__be64 *)chcr_sha384_init;
333 __be64 *sha512 = (__be64 *)chcr_sha512_init;
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530334
335 switch (digestsize) {
336 case SHA1_DIGEST_SIZE:
337 for (i = 0; i < SHA1_INIT_STATE; i++)
Hans de Goede6e4655e2019-09-01 22:35:29 +0200338 dkey[i] = cpu_to_be32(chcr_sha1_init[i]);
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530339 break;
340 case SHA224_DIGEST_SIZE:
341 for (i = 0; i < SHA224_INIT_STATE; i++)
Hans de Goede6e4655e2019-09-01 22:35:29 +0200342 dkey[i] = cpu_to_be32(chcr_sha224_init[i]);
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530343 break;
344 case SHA256_DIGEST_SIZE:
345 for (i = 0; i < SHA256_INIT_STATE; i++)
Hans de Goede6e4655e2019-09-01 22:35:29 +0200346 dkey[i] = cpu_to_be32(chcr_sha256_init[i]);
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530347 break;
348 case SHA384_DIGEST_SIZE:
349 for (i = 0; i < SHA384_INIT_STATE; i++)
350 ldkey[i] = be64_to_cpu(sha384[i]);
351 break;
352 case SHA512_DIGEST_SIZE:
353 for (i = 0; i < SHA512_INIT_STATE; i++)
354 ldkey[i] = be64_to_cpu(sha512[i]);
355 break;
356 }
357}
358
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530359/* Number of len fields(8) * size of one addr field */
360#define PHYSDSGL_MAX_LEN_SIZE 16
361
362static inline u16 get_space_for_phys_dsgl(unsigned int sgl_entr)
363{
364 /* len field size + addr field size */
365 return ((sgl_entr >> 3) + ((sgl_entr % 8) ?
366 1 : 0)) * PHYSDSGL_MAX_LEN_SIZE +
367 (sgl_entr << 3) + ((sgl_entr % 2 ? 1 : 0) << 3);
368}
369
370/* The AES s-transform matrix (s-box). */
371static const u8 aes_sbox[256] = {
372 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215,
373 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175,
374 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165,
375 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7,
376 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90,
377 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32,
378 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170,
379 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81,
380 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243,
381 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100,
382 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184,
383 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194,
384 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78,
385 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166,
386 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102,
387 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248,
388 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
389 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84,
390 187, 22
391};
392
Harsh Jain39f91a32016-11-29 19:00:35 +0530393static inline u32 aes_ks_subword(const u32 w)
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530394{
395 u8 bytes[4];
396
397 *(u32 *)(&bytes[0]) = w;
398 bytes[0] = aes_sbox[bytes[0]];
399 bytes[1] = aes_sbox[bytes[1]];
400 bytes[2] = aes_sbox[bytes[2]];
401 bytes[3] = aes_sbox[bytes[3]];
402 return *(u32 *)(&bytes[0]);
403}
404
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530405#endif /* __CHCR_ALGO_H__ */