cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

chcr_algo.h (13402B)


      1/*
      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
    111#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) +\
    116	 sizeof(struct cpl_rx_phys_dsgl) + AES_BLOCK_SIZE)
    117#define HASH_TRANSHDR_SIZE(kctx_len)\
    118	(TRANSHDR_SIZE(kctx_len) + DUMMY_BYTES)
    119
    120
    121#define FILL_SEC_CPL_OP_IVINSR(id, len, ofst)      \
    122	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)) | \
    128	       CPL_TX_SEC_PDU_PLACEHOLDER_V(0) | \
    129	       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
    145#define  FILL_SEC_CPL_SCMD0_SEQNO(ctrl, seq, cmode, amode, opad, size)  \
    146		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)) | \
    156		SCMD_NUM_IVS_V(0))
    157
    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
    179#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
    188#define FILL_WR_OP_CCTX_SIZE \
    189		htonl( \
    190			FW_CRYPTO_LOOKASIDE_WR_OPCODE_V( \
    191			FW_CRYPTO_LOOKASIDE_WR) | \
    192			FW_CRYPTO_LOOKASIDE_WR_COMPL_V(0) | \
    193			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))
    196
    197#define FILL_WR_RX_Q_ID(cid, qid, lcb, fid) \
    198		htonl( \
    199			FW_CRYPTO_LOOKASIDE_WR_RX_CHID_V((cid)) | \
    200			FW_CRYPTO_LOOKASIDE_WR_RX_Q_ID_V((qid)) | \
    201			FW_CRYPTO_LOOKASIDE_WR_LCB_V((lcb)) | \
    202			FW_CRYPTO_LOOKASIDE_WR_IV_V((IV_NOP)) | \
    203			FW_CRYPTO_LOOKASIDE_WR_FQIDX_V(fid))
    204
    205#define FILL_ULPTX_CMD_DEST(cid, qid) \
    206	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) | \
    211	      ULP_TXPKT_FID_V(qid))
    212
    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) |\
    226					ULP_TX_SC_MORE_V((immdatalen)))
    227#define MAX_NK 8
    228#define MAX_DSGL_ENT			32
    229#define MIN_AUTH_SG			1 /* IV */
    230#define MIN_GCM_SG			1 /* IV */
    231#define MIN_DIGEST_SG			1 /*Partial Buffer*/
    232#define MIN_CCM_SG			1 /*IV+B0*/
    233#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)))
    237
    238struct algo_param {
    239	unsigned int auth_mode;
    240	unsigned int mk_size;
    241	unsigned int result_size;
    242};
    243
    244struct hash_wr_param {
    245	struct algo_param alg_prm;
    246	unsigned int opad_needed;
    247	unsigned int more;
    248	unsigned int last;
    249	unsigned int kctx_len;
    250	unsigned int sg_len;
    251	unsigned int bfr_len;
    252	unsigned int hash_size;
    253	u64 scmd1;
    254};
    255
    256struct cipher_wr_param {
    257	struct skcipher_request *req;
    258	char *iv;
    259	int bytes;
    260	unsigned short qid;
    261};
    262enum {
    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 {
    286	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
    295};
    296
    297struct phys_sge_pairs {
    298	__be16 len[8];
    299	__be64 addr[8];
    300};
    301
    302
    303static const u32 chcr_sha1_init[SHA1_DIGEST_SIZE / 4] = {
    304		SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4,
    305};
    306
    307static const u32 chcr_sha224_init[SHA256_DIGEST_SIZE / 4] = {
    308		SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
    309		SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7,
    310};
    311
    312static const u32 chcr_sha256_init[SHA256_DIGEST_SIZE / 4] = {
    313		SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
    314		SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7,
    315};
    316
    317static const u64 chcr_sha384_init[SHA512_DIGEST_SIZE / 8] = {
    318		SHA384_H0, SHA384_H1, SHA384_H2, SHA384_H3,
    319		SHA384_H4, SHA384_H5, SHA384_H6, SHA384_H7,
    320};
    321
    322static const u64 chcr_sha512_init[SHA512_DIGEST_SIZE / 8] = {
    323		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;
    332	__be64 *sha384 = (__be64 *)chcr_sha384_init;
    333	__be64 *sha512 = (__be64 *)chcr_sha512_init;
    334
    335	switch (digestsize) {
    336	case SHA1_DIGEST_SIZE:
    337		for (i = 0; i < SHA1_INIT_STATE; i++)
    338			dkey[i] = cpu_to_be32(chcr_sha1_init[i]);
    339		break;
    340	case SHA224_DIGEST_SIZE:
    341		for (i = 0; i < SHA224_INIT_STATE; i++)
    342			dkey[i] = cpu_to_be32(chcr_sha224_init[i]);
    343		break;
    344	case SHA256_DIGEST_SIZE:
    345		for (i = 0; i < SHA256_INIT_STATE; i++)
    346			dkey[i] = cpu_to_be32(chcr_sha256_init[i]);
    347		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
    359/* 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
    393static inline u32 aes_ks_subword(const u32 w)
    394{
    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
    405#endif /* __CHCR_ALGO_H__ */