blob: 1871500309e21d20d410ea338b6e524e4666f75b [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
Atul Gupta639d28a2018-03-31 21:41:56 +053089#define TLS_KEYCTX_RXFLIT_CNT_S 24
90#define TLS_KEYCTX_RXFLIT_CNT_V(x) ((x) << TLS_KEYCTX_RXFLIT_CNT_S)
91
92#define TLS_KEYCTX_RXPROT_VER_S 20
93#define TLS_KEYCTX_RXPROT_VER_M 0xf
94#define TLS_KEYCTX_RXPROT_VER_V(x) ((x) << TLS_KEYCTX_RXPROT_VER_S)
95
96#define TLS_KEYCTX_RXCIPH_MODE_S 16
97#define TLS_KEYCTX_RXCIPH_MODE_M 0xf
98#define TLS_KEYCTX_RXCIPH_MODE_V(x) ((x) << TLS_KEYCTX_RXCIPH_MODE_S)
99
100#define TLS_KEYCTX_RXAUTH_MODE_S 12
101#define TLS_KEYCTX_RXAUTH_MODE_M 0xf
102#define TLS_KEYCTX_RXAUTH_MODE_V(x) ((x) << TLS_KEYCTX_RXAUTH_MODE_S)
103
104#define TLS_KEYCTX_RXCIAU_CTRL_S 11
105#define TLS_KEYCTX_RXCIAU_CTRL_V(x) ((x) << TLS_KEYCTX_RXCIAU_CTRL_S)
106
107#define TLS_KEYCTX_RX_SEQCTR_S 9
108#define TLS_KEYCTX_RX_SEQCTR_M 0x3
109#define TLS_KEYCTX_RX_SEQCTR_V(x) ((x) << TLS_KEYCTX_RX_SEQCTR_S)
110
111#define TLS_KEYCTX_RX_VALID_S 8
112#define TLS_KEYCTX_RX_VALID_V(x) ((x) << TLS_KEYCTX_RX_VALID_S)
113
114#define TLS_KEYCTX_RXCK_SIZE_S 3
115#define TLS_KEYCTX_RXCK_SIZE_M 0x7
116#define TLS_KEYCTX_RXCK_SIZE_V(x) ((x) << TLS_KEYCTX_RXCK_SIZE_S)
117
118#define TLS_KEYCTX_RXMK_SIZE_S 0
119#define TLS_KEYCTX_RXMK_SIZE_M 0x7
120#define TLS_KEYCTX_RXMK_SIZE_V(x) ((x) << TLS_KEYCTX_RXMK_SIZE_S)
121
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530122#define CHCR_HASH_MAX_DIGEST_SIZE 64
123#define CHCR_MAX_SHA_DIGEST_SIZE 64
124
125#define IPSEC_TRUNCATED_ICV_SIZE 12
126#define TLS_TRUNCATED_HMAC_SIZE 10
127#define CBCMAC_DIGEST_SIZE 16
128#define MAX_HASH_NAME 20
129
130#define SHA1_INIT_STATE_5X4B 5
131#define SHA256_INIT_STATE_8X4B 8
132#define SHA512_INIT_STATE_8X8B 8
133#define SHA1_INIT_STATE SHA1_INIT_STATE_5X4B
134#define SHA224_INIT_STATE SHA256_INIT_STATE_8X4B
135#define SHA256_INIT_STATE SHA256_INIT_STATE_8X4B
136#define SHA384_INIT_STATE SHA512_INIT_STATE_8X8B
137#define SHA512_INIT_STATE SHA512_INIT_STATE_8X8B
138
139#define DUMMY_BYTES 16
140
141#define IPAD_DATA 0x36363636
142#define OPAD_DATA 0x5c5c5c5c
143
Harsh Jain358961d2016-11-29 19:00:36 +0530144#define TRANSHDR_SIZE(kctx_len)\
145 (sizeof(struct chcr_wr) +\
146 kctx_len)
147#define CIPHER_TRANSHDR_SIZE(kctx_len, sge_pairs) \
148 (TRANSHDR_SIZE((kctx_len)) + (sge_pairs) +\
Harsh Jain335bcc42018-05-24 17:26:38 +0530149 sizeof(struct cpl_rx_phys_dsgl) + AES_BLOCK_SIZE)
Harsh Jain358961d2016-11-29 19:00:36 +0530150#define HASH_TRANSHDR_SIZE(kctx_len)\
151 (TRANSHDR_SIZE(kctx_len) + DUMMY_BYTES)
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530152
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530153
Harsh Jain358961d2016-11-29 19:00:36 +0530154#define FILL_SEC_CPL_OP_IVINSR(id, len, ofst) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530155 htonl( \
156 CPL_TX_SEC_PDU_OPCODE_V(CPL_TX_SEC_PDU) | \
157 CPL_TX_SEC_PDU_RXCHID_V((id)) | \
158 CPL_TX_SEC_PDU_ACKFOLLOWS_V(0) | \
159 CPL_TX_SEC_PDU_ULPTXLPBK_V(1) | \
160 CPL_TX_SEC_PDU_CPLLEN_V((len)) | \
Harsh Jain358961d2016-11-29 19:00:36 +0530161 CPL_TX_SEC_PDU_PLACEHOLDER_V(0) | \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530162 CPL_TX_SEC_PDU_IVINSRTOFST_V((ofst)))
163
164#define FILL_SEC_CPL_CIPHERSTOP_HI(a_start, a_stop, c_start, c_stop_hi) \
165 htonl( \
166 CPL_TX_SEC_PDU_AADSTART_V((a_start)) | \
167 CPL_TX_SEC_PDU_AADSTOP_V((a_stop)) | \
168 CPL_TX_SEC_PDU_CIPHERSTART_V((c_start)) | \
169 CPL_TX_SEC_PDU_CIPHERSTOP_HI_V((c_stop_hi)))
170
171#define FILL_SEC_CPL_AUTHINSERT(c_stop_lo, a_start, a_stop, a_inst) \
172 htonl( \
173 CPL_TX_SEC_PDU_CIPHERSTOP_LO_V((c_stop_lo)) | \
174 CPL_TX_SEC_PDU_AUTHSTART_V((a_start)) | \
175 CPL_TX_SEC_PDU_AUTHSTOP_V((a_stop)) | \
176 CPL_TX_SEC_PDU_AUTHINSERT_V((a_inst)))
177
Harsh Jain358961d2016-11-29 19:00:36 +0530178#define FILL_SEC_CPL_SCMD0_SEQNO(ctrl, seq, cmode, amode, opad, size) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530179 htonl( \
180 SCMD_SEQ_NO_CTRL_V(0) | \
181 SCMD_STATUS_PRESENT_V(0) | \
182 SCMD_PROTO_VERSION_V(CHCR_SCMD_PROTO_VERSION_GENERIC) | \
183 SCMD_ENC_DEC_CTRL_V((ctrl)) | \
184 SCMD_CIPH_AUTH_SEQ_CTRL_V((seq)) | \
185 SCMD_CIPH_MODE_V((cmode)) | \
186 SCMD_AUTH_MODE_V((amode)) | \
187 SCMD_HMAC_CTRL_V((opad)) | \
188 SCMD_IV_SIZE_V((size)) | \
Harsh Jain358961d2016-11-29 19:00:36 +0530189 SCMD_NUM_IVS_V(0))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530190
191#define FILL_SEC_CPL_IVGEN_HDRLEN(last, more, ctx_in, mac, ivdrop, len) htonl( \
192 SCMD_ENB_DBGID_V(0) | \
193 SCMD_IV_GEN_CTRL_V(0) | \
194 SCMD_LAST_FRAG_V((last)) | \
195 SCMD_MORE_FRAGS_V((more)) | \
196 SCMD_TLS_COMPPDU_V(0) | \
197 SCMD_KEY_CTX_INLINE_V((ctx_in)) | \
198 SCMD_TLS_FRAG_ENABLE_V(0) | \
199 SCMD_MAC_ONLY_V((mac)) | \
200 SCMD_AADIVDROP_V((ivdrop)) | \
201 SCMD_HDR_LEN_V((len)))
202
203#define FILL_KEY_CTX_HDR(ck_size, mk_size, d_ck, opad, ctx_len) \
204 htonl(KEY_CONTEXT_VALID_V(1) | \
205 KEY_CONTEXT_CK_SIZE_V((ck_size)) | \
206 KEY_CONTEXT_MK_SIZE_V(mk_size) | \
207 KEY_CONTEXT_DUAL_CK_V((d_ck)) | \
208 KEY_CONTEXT_OPAD_PRESENT_V((opad)) | \
209 KEY_CONTEXT_SALT_PRESENT_V(1) | \
210 KEY_CONTEXT_CTX_LEN_V((ctx_len)))
211
Atul Gupta639d28a2018-03-31 21:41:56 +0530212#define FILL_KEY_CRX_HDR(ck_size, mk_size, d_ck, opad, ctx_len) \
213 htonl(TLS_KEYCTX_RXMK_SIZE_V(mk_size) | \
214 TLS_KEYCTX_RXCK_SIZE_V(ck_size) | \
215 TLS_KEYCTX_RX_VALID_V(1) | \
216 TLS_KEYCTX_RX_SEQCTR_V(3) | \
217 TLS_KEYCTX_RXAUTH_MODE_V(4) | \
218 TLS_KEYCTX_RXCIPH_MODE_V(2) | \
219 TLS_KEYCTX_RXFLIT_CNT_V((ctx_len)))
220
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530221#define FILL_WR_OP_CCTX_SIZE \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530222 htonl( \
223 FW_CRYPTO_LOOKASIDE_WR_OPCODE_V( \
224 FW_CRYPTO_LOOKASIDE_WR) | \
225 FW_CRYPTO_LOOKASIDE_WR_COMPL_V(0) | \
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530226 FW_CRYPTO_LOOKASIDE_WR_IMM_LEN_V((0)) | \
227 FW_CRYPTO_LOOKASIDE_WR_CCTX_LOC_V(0) | \
228 FW_CRYPTO_LOOKASIDE_WR_CCTX_SIZE_V(0))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530229
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530230#define FILL_WR_RX_Q_ID(cid, qid, lcb, fid) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530231 htonl( \
232 FW_CRYPTO_LOOKASIDE_WR_RX_CHID_V((cid)) | \
233 FW_CRYPTO_LOOKASIDE_WR_RX_Q_ID_V((qid)) | \
Harsh Jain2512a622017-06-15 12:43:39 +0530234 FW_CRYPTO_LOOKASIDE_WR_LCB_V((lcb)) | \
Yeshaswi M R Gowda570265b2017-10-08 13:37:18 +0530235 FW_CRYPTO_LOOKASIDE_WR_IV_V((IV_NOP)) | \
Harsh Jain8a134492017-01-27 16:09:05 +0530236 FW_CRYPTO_LOOKASIDE_WR_FQIDX_V(fid))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530237
Harsh Jain8a134492017-01-27 16:09:05 +0530238#define FILL_ULPTX_CMD_DEST(cid, qid) \
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530239 htonl(ULPTX_CMD_V(ULP_TX_PKT) | \
240 ULP_TXPKT_DEST_V(0) | \
241 ULP_TXPKT_DATAMODIFY_V(0) | \
242 ULP_TXPKT_CHANNELID_V((cid)) | \
243 ULP_TXPKT_RO_V(1) | \
Harsh Jain8a134492017-01-27 16:09:05 +0530244 ULP_TXPKT_FID_V(qid))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530245
246#define KEYCTX_ALIGN_PAD(bs) ({unsigned int _bs = (bs);\
247 _bs == SHA1_DIGEST_SIZE ? 12 : 0; })
248
249#define FILL_PLD_SIZE_HASH_SIZE(payload_sgl_len, sgl_lengths, total_frags) \
250 htonl(FW_CRYPTO_LOOKASIDE_WR_PLD_SIZE_V(payload_sgl_len ? \
251 sgl_lengths[total_frags] : 0) |\
252 FW_CRYPTO_LOOKASIDE_WR_HASH_SIZE_V(0))
253
254#define FILL_LEN_PKD(calc_tx_flits_ofld, skb) \
255 htonl(FW_CRYPTO_LOOKASIDE_WR_LEN16_V(DIV_ROUND_UP((\
256 calc_tx_flits_ofld(skb) * 8), 16)))
257
258#define FILL_CMD_MORE(immdatalen) htonl(ULPTX_CMD_V(ULP_TX_SC_IMM) |\
Harsh Jain2f47d582017-10-08 13:37:23 +0530259 ULP_TX_SC_MORE_V((immdatalen)))
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530260#define MAX_NK 8
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530261#define MAX_DSGL_ENT 32
Harsh Jain2f47d582017-10-08 13:37:23 +0530262#define MIN_AUTH_SG 1 /* IV */
263#define MIN_GCM_SG 1 /* IV */
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530264#define MIN_DIGEST_SG 1 /*Partial Buffer*/
Harsh Jain2f47d582017-10-08 13:37:23 +0530265#define MIN_CCM_SG 2 /*IV+B0*/
Harsh Jain5110e652018-03-06 10:37:52 +0530266#define CIP_SPACE_LEFT(len) \
267 ((SGE_MAX_WR_LEN - CIP_WR_MIN_LEN - (len)))
268#define HASH_SPACE_LEFT(len) \
269 ((SGE_MAX_WR_LEN - HASH_WR_MIN_LEN - (len)))
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530270
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530271struct algo_param {
272 unsigned int auth_mode;
273 unsigned int mk_size;
274 unsigned int result_size;
275};
276
277struct hash_wr_param {
Harsh Jain5110e652018-03-06 10:37:52 +0530278 struct algo_param alg_prm;
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530279 unsigned int opad_needed;
280 unsigned int more;
281 unsigned int last;
Harsh Jain5110e652018-03-06 10:37:52 +0530282 unsigned int kctx_len;
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530283 unsigned int sg_len;
284 unsigned int bfr_len;
Harsh Jain5110e652018-03-06 10:37:52 +0530285 unsigned int hash_size;
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530286 u64 scmd1;
287};
288
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530289struct cipher_wr_param {
290 struct ablkcipher_request *req;
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530291 char *iv;
292 int bytes;
Harsh Jainb8fd1f42017-06-15 12:43:43 +0530293 unsigned short qid;
294};
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530295enum {
296 AES_KEYLENGTH_128BIT = 128,
297 AES_KEYLENGTH_192BIT = 192,
298 AES_KEYLENGTH_256BIT = 256
299};
300
301enum {
302 KEYLENGTH_3BYTES = 3,
303 KEYLENGTH_4BYTES = 4,
304 KEYLENGTH_6BYTES = 6,
305 KEYLENGTH_8BYTES = 8
306};
307
308enum {
309 NUMBER_OF_ROUNDS_10 = 10,
310 NUMBER_OF_ROUNDS_12 = 12,
311 NUMBER_OF_ROUNDS_14 = 14,
312};
313
314/*
315 * CCM defines values of 4, 6, 8, 10, 12, 14, and 16 octets,
316 * where they indicate the size of the integrity check value (ICV)
317 */
318enum {
Harsh Jain2debd332016-11-29 19:00:43 +0530319 ICV_4 = 4,
320 ICV_6 = 6,
321 ICV_8 = 8,
322 ICV_10 = 10,
323 ICV_12 = 12,
324 ICV_13 = 13,
325 ICV_14 = 14,
326 ICV_15 = 15,
327 ICV_16 = 16
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530328};
329
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530330struct phys_sge_pairs {
331 __be16 len[8];
332 __be64 addr[8];
333};
334
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530335
336static const u32 sha1_init[SHA1_DIGEST_SIZE / 4] = {
337 SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
338};
339
340static const u32 sha224_init[SHA256_DIGEST_SIZE / 4] = {
341 SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
342 SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
343};
344
345static const u32 sha256_init[SHA256_DIGEST_SIZE / 4] = {
346 SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
347 SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
348};
349
350static const u64 sha384_init[SHA512_DIGEST_SIZE / 8] = {
351 SHA384_H0, SHA384_H1, SHA384_H2, SHA384_H3,
352 SHA384_H4, SHA384_H5, SHA384_H6, SHA384_H7,
353};
354
355static const u64 sha512_init[SHA512_DIGEST_SIZE / 8] = {
356 SHA512_H0, SHA512_H1, SHA512_H2, SHA512_H3,
357 SHA512_H4, SHA512_H5, SHA512_H6, SHA512_H7,
358};
359
360static inline void copy_hash_init_values(char *key, int digestsize)
361{
362 u8 i;
363 __be32 *dkey = (__be32 *)key;
364 u64 *ldkey = (u64 *)key;
365 __be64 *sha384 = (__be64 *)sha384_init;
366 __be64 *sha512 = (__be64 *)sha512_init;
367
368 switch (digestsize) {
369 case SHA1_DIGEST_SIZE:
370 for (i = 0; i < SHA1_INIT_STATE; i++)
371 dkey[i] = cpu_to_be32(sha1_init[i]);
372 break;
373 case SHA224_DIGEST_SIZE:
374 for (i = 0; i < SHA224_INIT_STATE; i++)
375 dkey[i] = cpu_to_be32(sha224_init[i]);
376 break;
377 case SHA256_DIGEST_SIZE:
378 for (i = 0; i < SHA256_INIT_STATE; i++)
379 dkey[i] = cpu_to_be32(sha256_init[i]);
380 break;
381 case SHA384_DIGEST_SIZE:
382 for (i = 0; i < SHA384_INIT_STATE; i++)
383 ldkey[i] = be64_to_cpu(sha384[i]);
384 break;
385 case SHA512_DIGEST_SIZE:
386 for (i = 0; i < SHA512_INIT_STATE; i++)
387 ldkey[i] = be64_to_cpu(sha512[i]);
388 break;
389 }
390}
391
392static const u8 sgl_lengths[20] = {
393 0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15
394};
395
396/* Number of len fields(8) * size of one addr field */
397#define PHYSDSGL_MAX_LEN_SIZE 16
398
399static inline u16 get_space_for_phys_dsgl(unsigned int sgl_entr)
400{
401 /* len field size + addr field size */
402 return ((sgl_entr >> 3) + ((sgl_entr % 8) ?
403 1 : 0)) * PHYSDSGL_MAX_LEN_SIZE +
404 (sgl_entr << 3) + ((sgl_entr % 2 ? 1 : 0) << 3);
405}
406
407/* The AES s-transform matrix (s-box). */
408static const u8 aes_sbox[256] = {
409 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215,
410 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175,
411 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165,
412 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7,
413 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90,
414 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32,
415 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170,
416 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81,
417 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243,
418 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100,
419 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184,
420 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194,
421 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78,
422 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166,
423 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102,
424 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248,
425 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
426 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84,
427 187, 22
428};
429
Harsh Jain39f91a32016-11-29 19:00:35 +0530430static inline u32 aes_ks_subword(const u32 w)
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530431{
432 u8 bytes[4];
433
434 *(u32 *)(&bytes[0]) = w;
435 bytes[0] = aes_sbox[bytes[0]];
436 bytes[1] = aes_sbox[bytes[1]];
437 bytes[2] = aes_sbox[bytes[2]];
438 bytes[3] = aes_sbox[bytes[3]];
439 return *(u32 *)(&bytes[0]);
440}
441
Hariprasad Shenai324429d2016-08-17 12:33:05 +0530442#endif /* __CHCR_ALGO_H__ */