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

crypto4xx_sa.h (7299B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * AMCC SoC PPC4xx Crypto Driver
      4 *
      5 * Copyright (c) 2008 Applied Micro Circuits Corporation.
      6 * All rights reserved. James Hsiao <jhsiao@amcc.com>
      7 *
      8 * This file defines the security context
      9 * associate format.
     10 */
     11
     12#ifndef __CRYPTO4XX_SA_H__
     13#define __CRYPTO4XX_SA_H__
     14
     15#define AES_IV_SIZE				16
     16
     17/*
     18 * Contents of Dynamic Security Association (SA) with all possible fields
     19 */
     20union dynamic_sa_contents {
     21	struct {
     22		u32 arc4_state_ptr:1;
     23		u32 arc4_ij_ptr:1;
     24		u32 state_ptr:1;
     25		u32 iv3:1;
     26		u32 iv2:1;
     27		u32 iv1:1;
     28		u32 iv0:1;
     29		u32 seq_num_mask3:1;
     30		u32 seq_num_mask2:1;
     31		u32 seq_num_mask1:1;
     32		u32 seq_num_mask0:1;
     33		u32 seq_num1:1;
     34		u32 seq_num0:1;
     35		u32 spi:1;
     36		u32 outer_size:5;
     37		u32 inner_size:5;
     38		u32 key_size:4;
     39		u32 cmd_size:4;
     40	} bf;
     41	u32 w;
     42} __attribute__((packed));
     43
     44#define DIR_OUTBOUND				0
     45#define DIR_INBOUND				1
     46#define SA_OP_GROUP_BASIC			0
     47#define SA_OPCODE_ENCRYPT			0
     48#define SA_OPCODE_DECRYPT			0
     49#define SA_OPCODE_ENCRYPT_HASH			1
     50#define SA_OPCODE_HASH_DECRYPT			1
     51#define SA_OPCODE_HASH				3
     52#define SA_CIPHER_ALG_DES			0
     53#define SA_CIPHER_ALG_3DES			1
     54#define SA_CIPHER_ALG_ARC4			2
     55#define SA_CIPHER_ALG_AES			3
     56#define SA_CIPHER_ALG_KASUMI			4
     57#define SA_CIPHER_ALG_NULL			15
     58
     59#define SA_HASH_ALG_MD5				0
     60#define SA_HASH_ALG_SHA1			1
     61#define SA_HASH_ALG_GHASH			12
     62#define SA_HASH_ALG_CBC_MAC			14
     63#define SA_HASH_ALG_NULL			15
     64#define SA_HASH_ALG_SHA1_DIGEST_SIZE		20
     65
     66#define SA_LOAD_HASH_FROM_SA			0
     67#define SA_LOAD_HASH_FROM_STATE			2
     68#define SA_NOT_LOAD_HASH			3
     69#define SA_LOAD_IV_FROM_SA			0
     70#define SA_LOAD_IV_FROM_INPUT			1
     71#define SA_LOAD_IV_FROM_STATE			2
     72#define SA_LOAD_IV_GEN_IV			3
     73
     74#define SA_PAD_TYPE_CONSTANT			2
     75#define SA_PAD_TYPE_ZERO			3
     76#define SA_PAD_TYPE_TLS				5
     77#define SA_PAD_TYPE_DTLS			5
     78#define SA_NOT_SAVE_HASH			0
     79#define SA_SAVE_HASH				1
     80#define SA_NOT_SAVE_IV				0
     81#define SA_SAVE_IV				1
     82#define SA_HEADER_PROC				1
     83#define SA_NO_HEADER_PROC			0
     84
     85union sa_command_0 {
     86	struct {
     87		u32 scatter:1;
     88		u32 gather:1;
     89		u32 save_hash_state:1;
     90		u32 save_iv:1;
     91		u32 load_hash_state:2;
     92		u32 load_iv:2;
     93		u32 digest_len:4;
     94		u32 hdr_proc:1;
     95		u32 extend_pad:1;
     96		u32 stream_cipher_pad:1;
     97		u32 rsv:1;
     98		u32 hash_alg:4;
     99		u32 cipher_alg:4;
    100		u32 pad_type:2;
    101		u32 op_group:2;
    102		u32 dir:1;
    103		u32 opcode:3;
    104	} bf;
    105	u32 w;
    106} __attribute__((packed));
    107
    108#define CRYPTO_MODE_ECB				0
    109#define CRYPTO_MODE_CBC				1
    110#define CRYPTO_MODE_OFB				2
    111#define CRYPTO_MODE_CFB				3
    112#define CRYPTO_MODE_CTR				4
    113
    114#define CRYPTO_FEEDBACK_MODE_NO_FB		0
    115#define CRYPTO_FEEDBACK_MODE_64BIT_OFB		0
    116#define CRYPTO_FEEDBACK_MODE_8BIT_CFB		1
    117#define CRYPTO_FEEDBACK_MODE_1BIT_CFB		2
    118#define CRYPTO_FEEDBACK_MODE_128BIT_CFB		3
    119
    120#define SA_AES_KEY_LEN_128			2
    121#define SA_AES_KEY_LEN_192			3
    122#define SA_AES_KEY_LEN_256			4
    123
    124#define SA_REV2					1
    125/*
    126 * The follow defines bits sa_command_1
    127 * In Basic hash mode  this bit define simple hash or hmac.
    128 * In IPsec mode, this bit define muting control.
    129 */
    130#define SA_HASH_MODE_HASH			0
    131#define SA_HASH_MODE_HMAC			1
    132#define SA_MC_ENABLE				0
    133#define SA_MC_DISABLE				1
    134#define SA_NOT_COPY_HDR				0
    135#define SA_COPY_HDR				1
    136#define SA_NOT_COPY_PAD				0
    137#define SA_COPY_PAD				1
    138#define SA_NOT_COPY_PAYLOAD			0
    139#define SA_COPY_PAYLOAD				1
    140#define SA_EXTENDED_SN_OFF			0
    141#define SA_EXTENDED_SN_ON			1
    142#define SA_SEQ_MASK_OFF				0
    143#define SA_SEQ_MASK_ON				1
    144
    145union sa_command_1 {
    146	struct {
    147		u32 crypto_mode31:1;
    148		u32 save_arc4_state:1;
    149		u32 arc4_stateful:1;
    150		u32 key_len:5;
    151		u32 hash_crypto_offset:8;
    152		u32 sa_rev:2;
    153		u32 byte_offset:1;
    154		u32 hmac_muting:1;
    155		u32 feedback_mode:2;
    156		u32 crypto_mode9_8:2;
    157		u32 extended_seq_num:1;
    158		u32 seq_num_mask:1;
    159		u32 mutable_bit_proc:1;
    160		u32 ip_version:1;
    161		u32 copy_pad:1;
    162		u32 copy_payload:1;
    163		u32 copy_hdr:1;
    164		u32 rsv1:1;
    165	} bf;
    166	u32 w;
    167} __attribute__((packed));
    168
    169struct dynamic_sa_ctl {
    170	union dynamic_sa_contents sa_contents;
    171	union sa_command_0 sa_command_0;
    172	union sa_command_1 sa_command_1;
    173} __attribute__((packed));
    174
    175/*
    176 * State Record for Security Association (SA)
    177 */
    178struct  sa_state_record {
    179	__le32 save_iv[4];
    180	__le32 save_hash_byte_cnt[2];
    181	union {
    182		u32 save_digest[16]; /* for MD5/SHA */
    183		__le32 save_digest_le32[16]; /* GHASH / CBC */
    184	};
    185} __attribute__((packed));
    186
    187/*
    188 * Security Association (SA) for AES128
    189 *
    190 */
    191struct dynamic_sa_aes128 {
    192	struct dynamic_sa_ctl	ctrl;
    193	__le32 key[4];
    194	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
    195	u32 state_ptr;
    196	u32 reserved;
    197} __attribute__((packed));
    198
    199#define SA_AES128_LEN		(sizeof(struct dynamic_sa_aes128)/4)
    200#define SA_AES128_CONTENTS	0x3e000042
    201
    202/*
    203 * Security Association (SA) for AES192
    204 */
    205struct dynamic_sa_aes192 {
    206	struct dynamic_sa_ctl ctrl;
    207	__le32 key[6];
    208	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
    209	u32 state_ptr;
    210	u32 reserved;
    211} __attribute__((packed));
    212
    213#define SA_AES192_LEN		(sizeof(struct dynamic_sa_aes192)/4)
    214#define SA_AES192_CONTENTS	0x3e000062
    215
    216/*
    217 * Security Association (SA) for AES256
    218 */
    219struct dynamic_sa_aes256 {
    220	struct dynamic_sa_ctl ctrl;
    221	__le32 key[8];
    222	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
    223	u32 state_ptr;
    224	u32 reserved;
    225} __attribute__((packed));
    226
    227#define SA_AES256_LEN		(sizeof(struct dynamic_sa_aes256)/4)
    228#define SA_AES256_CONTENTS	0x3e000082
    229#define SA_AES_CONTENTS		0x3e000002
    230
    231/*
    232 * Security Association (SA) for AES128 CCM
    233 */
    234struct dynamic_sa_aes128_ccm {
    235	struct dynamic_sa_ctl ctrl;
    236	__le32 key[4];
    237	__le32 iv[4];
    238	u32 state_ptr;
    239	u32 reserved;
    240} __packed;
    241#define SA_AES128_CCM_LEN	(sizeof(struct dynamic_sa_aes128_ccm)/4)
    242#define SA_AES128_CCM_CONTENTS	0x3e000042
    243#define SA_AES_CCM_CONTENTS	0x3e000002
    244
    245/*
    246 * Security Association (SA) for AES128_GCM
    247 */
    248struct dynamic_sa_aes128_gcm {
    249	struct dynamic_sa_ctl ctrl;
    250	__le32 key[4];
    251	__le32 inner_digest[4];
    252	__le32 iv[4];
    253	u32 state_ptr;
    254	u32 reserved;
    255} __packed;
    256
    257#define SA_AES128_GCM_LEN	(sizeof(struct dynamic_sa_aes128_gcm)/4)
    258#define SA_AES128_GCM_CONTENTS	0x3e000442
    259#define SA_AES_GCM_CONTENTS	0x3e000402
    260
    261/*
    262 * Security Association (SA) for HASH160: HMAC-SHA1
    263 */
    264struct dynamic_sa_hash160 {
    265	struct dynamic_sa_ctl ctrl;
    266	__le32 inner_digest[5];
    267	__le32 outer_digest[5];
    268	u32 state_ptr;
    269	u32 reserved;
    270} __attribute__((packed));
    271#define SA_HASH160_LEN		(sizeof(struct dynamic_sa_hash160)/4)
    272#define SA_HASH160_CONTENTS     0x2000a502
    273
    274static inline u32
    275get_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
    276{
    277	u32 offset;
    278
    279	offset = cts->sa_contents.bf.key_size
    280		+ cts->sa_contents.bf.inner_size
    281		+ cts->sa_contents.bf.outer_size
    282		+ cts->sa_contents.bf.spi
    283		+ cts->sa_contents.bf.seq_num0
    284		+ cts->sa_contents.bf.seq_num1
    285		+ cts->sa_contents.bf.seq_num_mask0
    286		+ cts->sa_contents.bf.seq_num_mask1
    287		+ cts->sa_contents.bf.seq_num_mask2
    288		+ cts->sa_contents.bf.seq_num_mask3
    289		+ cts->sa_contents.bf.iv0
    290		+ cts->sa_contents.bf.iv1
    291		+ cts->sa_contents.bf.iv2
    292		+ cts->sa_contents.bf.iv3;
    293
    294	return sizeof(struct dynamic_sa_ctl) + offset * 4;
    295}
    296
    297static inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
    298{
    299	return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
    300}
    301
    302static inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
    303{
    304	return (__le32 *) ((unsigned long)cts +
    305		sizeof(struct dynamic_sa_ctl) +
    306		cts->sa_contents.bf.key_size * 4);
    307}
    308
    309#endif