162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AMCC SoC PPC4xx Crypto Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2008 Applied Micro Circuits Corporation.
662306a36Sopenharmony_ci * All rights reserved. James Hsiao <jhsiao@amcc.com>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * This file defines the security context
962306a36Sopenharmony_ci * associate format.
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef __CRYPTO4XX_SA_H__
1362306a36Sopenharmony_ci#define __CRYPTO4XX_SA_H__
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define AES_IV_SIZE				16
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/*
1862306a36Sopenharmony_ci * Contents of Dynamic Security Association (SA) with all possible fields
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_ciunion dynamic_sa_contents {
2162306a36Sopenharmony_ci	struct {
2262306a36Sopenharmony_ci		u32 arc4_state_ptr:1;
2362306a36Sopenharmony_ci		u32 arc4_ij_ptr:1;
2462306a36Sopenharmony_ci		u32 state_ptr:1;
2562306a36Sopenharmony_ci		u32 iv3:1;
2662306a36Sopenharmony_ci		u32 iv2:1;
2762306a36Sopenharmony_ci		u32 iv1:1;
2862306a36Sopenharmony_ci		u32 iv0:1;
2962306a36Sopenharmony_ci		u32 seq_num_mask3:1;
3062306a36Sopenharmony_ci		u32 seq_num_mask2:1;
3162306a36Sopenharmony_ci		u32 seq_num_mask1:1;
3262306a36Sopenharmony_ci		u32 seq_num_mask0:1;
3362306a36Sopenharmony_ci		u32 seq_num1:1;
3462306a36Sopenharmony_ci		u32 seq_num0:1;
3562306a36Sopenharmony_ci		u32 spi:1;
3662306a36Sopenharmony_ci		u32 outer_size:5;
3762306a36Sopenharmony_ci		u32 inner_size:5;
3862306a36Sopenharmony_ci		u32 key_size:4;
3962306a36Sopenharmony_ci		u32 cmd_size:4;
4062306a36Sopenharmony_ci	} bf;
4162306a36Sopenharmony_ci	u32 w;
4262306a36Sopenharmony_ci} __attribute__((packed));
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define DIR_OUTBOUND				0
4562306a36Sopenharmony_ci#define DIR_INBOUND				1
4662306a36Sopenharmony_ci#define SA_OP_GROUP_BASIC			0
4762306a36Sopenharmony_ci#define SA_OPCODE_ENCRYPT			0
4862306a36Sopenharmony_ci#define SA_OPCODE_DECRYPT			0
4962306a36Sopenharmony_ci#define SA_OPCODE_ENCRYPT_HASH			1
5062306a36Sopenharmony_ci#define SA_OPCODE_HASH_DECRYPT			1
5162306a36Sopenharmony_ci#define SA_OPCODE_HASH				3
5262306a36Sopenharmony_ci#define SA_CIPHER_ALG_DES			0
5362306a36Sopenharmony_ci#define SA_CIPHER_ALG_3DES			1
5462306a36Sopenharmony_ci#define SA_CIPHER_ALG_ARC4			2
5562306a36Sopenharmony_ci#define SA_CIPHER_ALG_AES			3
5662306a36Sopenharmony_ci#define SA_CIPHER_ALG_KASUMI			4
5762306a36Sopenharmony_ci#define SA_CIPHER_ALG_NULL			15
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define SA_HASH_ALG_MD5				0
6062306a36Sopenharmony_ci#define SA_HASH_ALG_SHA1			1
6162306a36Sopenharmony_ci#define SA_HASH_ALG_GHASH			12
6262306a36Sopenharmony_ci#define SA_HASH_ALG_CBC_MAC			14
6362306a36Sopenharmony_ci#define SA_HASH_ALG_NULL			15
6462306a36Sopenharmony_ci#define SA_HASH_ALG_SHA1_DIGEST_SIZE		20
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#define SA_LOAD_HASH_FROM_SA			0
6762306a36Sopenharmony_ci#define SA_LOAD_HASH_FROM_STATE			2
6862306a36Sopenharmony_ci#define SA_NOT_LOAD_HASH			3
6962306a36Sopenharmony_ci#define SA_LOAD_IV_FROM_SA			0
7062306a36Sopenharmony_ci#define SA_LOAD_IV_FROM_INPUT			1
7162306a36Sopenharmony_ci#define SA_LOAD_IV_FROM_STATE			2
7262306a36Sopenharmony_ci#define SA_LOAD_IV_GEN_IV			3
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define SA_PAD_TYPE_CONSTANT			2
7562306a36Sopenharmony_ci#define SA_PAD_TYPE_ZERO			3
7662306a36Sopenharmony_ci#define SA_PAD_TYPE_TLS				5
7762306a36Sopenharmony_ci#define SA_PAD_TYPE_DTLS			5
7862306a36Sopenharmony_ci#define SA_NOT_SAVE_HASH			0
7962306a36Sopenharmony_ci#define SA_SAVE_HASH				1
8062306a36Sopenharmony_ci#define SA_NOT_SAVE_IV				0
8162306a36Sopenharmony_ci#define SA_SAVE_IV				1
8262306a36Sopenharmony_ci#define SA_HEADER_PROC				1
8362306a36Sopenharmony_ci#define SA_NO_HEADER_PROC			0
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ciunion sa_command_0 {
8662306a36Sopenharmony_ci	struct {
8762306a36Sopenharmony_ci		u32 scatter:1;
8862306a36Sopenharmony_ci		u32 gather:1;
8962306a36Sopenharmony_ci		u32 save_hash_state:1;
9062306a36Sopenharmony_ci		u32 save_iv:1;
9162306a36Sopenharmony_ci		u32 load_hash_state:2;
9262306a36Sopenharmony_ci		u32 load_iv:2;
9362306a36Sopenharmony_ci		u32 digest_len:4;
9462306a36Sopenharmony_ci		u32 hdr_proc:1;
9562306a36Sopenharmony_ci		u32 extend_pad:1;
9662306a36Sopenharmony_ci		u32 stream_cipher_pad:1;
9762306a36Sopenharmony_ci		u32 rsv:1;
9862306a36Sopenharmony_ci		u32 hash_alg:4;
9962306a36Sopenharmony_ci		u32 cipher_alg:4;
10062306a36Sopenharmony_ci		u32 pad_type:2;
10162306a36Sopenharmony_ci		u32 op_group:2;
10262306a36Sopenharmony_ci		u32 dir:1;
10362306a36Sopenharmony_ci		u32 opcode:3;
10462306a36Sopenharmony_ci	} bf;
10562306a36Sopenharmony_ci	u32 w;
10662306a36Sopenharmony_ci} __attribute__((packed));
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#define CRYPTO_MODE_ECB				0
10962306a36Sopenharmony_ci#define CRYPTO_MODE_CBC				1
11062306a36Sopenharmony_ci#define CRYPTO_MODE_OFB				2
11162306a36Sopenharmony_ci#define CRYPTO_MODE_CFB				3
11262306a36Sopenharmony_ci#define CRYPTO_MODE_CTR				4
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_NO_FB		0
11562306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_64BIT_OFB		0
11662306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_8BIT_CFB		1
11762306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_1BIT_CFB		2
11862306a36Sopenharmony_ci#define CRYPTO_FEEDBACK_MODE_128BIT_CFB		3
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci#define SA_AES_KEY_LEN_128			2
12162306a36Sopenharmony_ci#define SA_AES_KEY_LEN_192			3
12262306a36Sopenharmony_ci#define SA_AES_KEY_LEN_256			4
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci#define SA_REV2					1
12562306a36Sopenharmony_ci/*
12662306a36Sopenharmony_ci * The follow defines bits sa_command_1
12762306a36Sopenharmony_ci * In Basic hash mode  this bit define simple hash or hmac.
12862306a36Sopenharmony_ci * In IPsec mode, this bit define muting control.
12962306a36Sopenharmony_ci */
13062306a36Sopenharmony_ci#define SA_HASH_MODE_HASH			0
13162306a36Sopenharmony_ci#define SA_HASH_MODE_HMAC			1
13262306a36Sopenharmony_ci#define SA_MC_ENABLE				0
13362306a36Sopenharmony_ci#define SA_MC_DISABLE				1
13462306a36Sopenharmony_ci#define SA_NOT_COPY_HDR				0
13562306a36Sopenharmony_ci#define SA_COPY_HDR				1
13662306a36Sopenharmony_ci#define SA_NOT_COPY_PAD				0
13762306a36Sopenharmony_ci#define SA_COPY_PAD				1
13862306a36Sopenharmony_ci#define SA_NOT_COPY_PAYLOAD			0
13962306a36Sopenharmony_ci#define SA_COPY_PAYLOAD				1
14062306a36Sopenharmony_ci#define SA_EXTENDED_SN_OFF			0
14162306a36Sopenharmony_ci#define SA_EXTENDED_SN_ON			1
14262306a36Sopenharmony_ci#define SA_SEQ_MASK_OFF				0
14362306a36Sopenharmony_ci#define SA_SEQ_MASK_ON				1
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ciunion sa_command_1 {
14662306a36Sopenharmony_ci	struct {
14762306a36Sopenharmony_ci		u32 crypto_mode31:1;
14862306a36Sopenharmony_ci		u32 save_arc4_state:1;
14962306a36Sopenharmony_ci		u32 arc4_stateful:1;
15062306a36Sopenharmony_ci		u32 key_len:5;
15162306a36Sopenharmony_ci		u32 hash_crypto_offset:8;
15262306a36Sopenharmony_ci		u32 sa_rev:2;
15362306a36Sopenharmony_ci		u32 byte_offset:1;
15462306a36Sopenharmony_ci		u32 hmac_muting:1;
15562306a36Sopenharmony_ci		u32 feedback_mode:2;
15662306a36Sopenharmony_ci		u32 crypto_mode9_8:2;
15762306a36Sopenharmony_ci		u32 extended_seq_num:1;
15862306a36Sopenharmony_ci		u32 seq_num_mask:1;
15962306a36Sopenharmony_ci		u32 mutable_bit_proc:1;
16062306a36Sopenharmony_ci		u32 ip_version:1;
16162306a36Sopenharmony_ci		u32 copy_pad:1;
16262306a36Sopenharmony_ci		u32 copy_payload:1;
16362306a36Sopenharmony_ci		u32 copy_hdr:1;
16462306a36Sopenharmony_ci		u32 rsv1:1;
16562306a36Sopenharmony_ci	} bf;
16662306a36Sopenharmony_ci	u32 w;
16762306a36Sopenharmony_ci} __attribute__((packed));
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistruct dynamic_sa_ctl {
17062306a36Sopenharmony_ci	union dynamic_sa_contents sa_contents;
17162306a36Sopenharmony_ci	union sa_command_0 sa_command_0;
17262306a36Sopenharmony_ci	union sa_command_1 sa_command_1;
17362306a36Sopenharmony_ci} __attribute__((packed));
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci/*
17662306a36Sopenharmony_ci * State Record for Security Association (SA)
17762306a36Sopenharmony_ci */
17862306a36Sopenharmony_cistruct  sa_state_record {
17962306a36Sopenharmony_ci	__le32 save_iv[4];
18062306a36Sopenharmony_ci	__le32 save_hash_byte_cnt[2];
18162306a36Sopenharmony_ci	union {
18262306a36Sopenharmony_ci		u32 save_digest[16]; /* for MD5/SHA */
18362306a36Sopenharmony_ci		__le32 save_digest_le32[16]; /* GHASH / CBC */
18462306a36Sopenharmony_ci	};
18562306a36Sopenharmony_ci} __attribute__((packed));
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/*
18862306a36Sopenharmony_ci * Security Association (SA) for AES128
18962306a36Sopenharmony_ci *
19062306a36Sopenharmony_ci */
19162306a36Sopenharmony_cistruct dynamic_sa_aes128 {
19262306a36Sopenharmony_ci	struct dynamic_sa_ctl	ctrl;
19362306a36Sopenharmony_ci	__le32 key[4];
19462306a36Sopenharmony_ci	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
19562306a36Sopenharmony_ci	u32 state_ptr;
19662306a36Sopenharmony_ci	u32 reserved;
19762306a36Sopenharmony_ci} __attribute__((packed));
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci#define SA_AES128_LEN		(sizeof(struct dynamic_sa_aes128)/4)
20062306a36Sopenharmony_ci#define SA_AES128_CONTENTS	0x3e000042
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci/*
20362306a36Sopenharmony_ci * Security Association (SA) for AES192
20462306a36Sopenharmony_ci */
20562306a36Sopenharmony_cistruct dynamic_sa_aes192 {
20662306a36Sopenharmony_ci	struct dynamic_sa_ctl ctrl;
20762306a36Sopenharmony_ci	__le32 key[6];
20862306a36Sopenharmony_ci	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
20962306a36Sopenharmony_ci	u32 state_ptr;
21062306a36Sopenharmony_ci	u32 reserved;
21162306a36Sopenharmony_ci} __attribute__((packed));
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci#define SA_AES192_LEN		(sizeof(struct dynamic_sa_aes192)/4)
21462306a36Sopenharmony_ci#define SA_AES192_CONTENTS	0x3e000062
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/*
21762306a36Sopenharmony_ci * Security Association (SA) for AES256
21862306a36Sopenharmony_ci */
21962306a36Sopenharmony_cistruct dynamic_sa_aes256 {
22062306a36Sopenharmony_ci	struct dynamic_sa_ctl ctrl;
22162306a36Sopenharmony_ci	__le32 key[8];
22262306a36Sopenharmony_ci	__le32 iv[4]; /* for CBC, OFC, and CFB mode */
22362306a36Sopenharmony_ci	u32 state_ptr;
22462306a36Sopenharmony_ci	u32 reserved;
22562306a36Sopenharmony_ci} __attribute__((packed));
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci#define SA_AES256_LEN		(sizeof(struct dynamic_sa_aes256)/4)
22862306a36Sopenharmony_ci#define SA_AES256_CONTENTS	0x3e000082
22962306a36Sopenharmony_ci#define SA_AES_CONTENTS		0x3e000002
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci/*
23262306a36Sopenharmony_ci * Security Association (SA) for AES128 CCM
23362306a36Sopenharmony_ci */
23462306a36Sopenharmony_cistruct dynamic_sa_aes128_ccm {
23562306a36Sopenharmony_ci	struct dynamic_sa_ctl ctrl;
23662306a36Sopenharmony_ci	__le32 key[4];
23762306a36Sopenharmony_ci	__le32 iv[4];
23862306a36Sopenharmony_ci	u32 state_ptr;
23962306a36Sopenharmony_ci	u32 reserved;
24062306a36Sopenharmony_ci} __packed;
24162306a36Sopenharmony_ci#define SA_AES128_CCM_LEN	(sizeof(struct dynamic_sa_aes128_ccm)/4)
24262306a36Sopenharmony_ci#define SA_AES128_CCM_CONTENTS	0x3e000042
24362306a36Sopenharmony_ci#define SA_AES_CCM_CONTENTS	0x3e000002
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci/*
24662306a36Sopenharmony_ci * Security Association (SA) for AES128_GCM
24762306a36Sopenharmony_ci */
24862306a36Sopenharmony_cistruct dynamic_sa_aes128_gcm {
24962306a36Sopenharmony_ci	struct dynamic_sa_ctl ctrl;
25062306a36Sopenharmony_ci	__le32 key[4];
25162306a36Sopenharmony_ci	__le32 inner_digest[4];
25262306a36Sopenharmony_ci	__le32 iv[4];
25362306a36Sopenharmony_ci	u32 state_ptr;
25462306a36Sopenharmony_ci	u32 reserved;
25562306a36Sopenharmony_ci} __packed;
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci#define SA_AES128_GCM_LEN	(sizeof(struct dynamic_sa_aes128_gcm)/4)
25862306a36Sopenharmony_ci#define SA_AES128_GCM_CONTENTS	0x3e000442
25962306a36Sopenharmony_ci#define SA_AES_GCM_CONTENTS	0x3e000402
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci/*
26262306a36Sopenharmony_ci * Security Association (SA) for HASH160: HMAC-SHA1
26362306a36Sopenharmony_ci */
26462306a36Sopenharmony_cistruct dynamic_sa_hash160 {
26562306a36Sopenharmony_ci	struct dynamic_sa_ctl ctrl;
26662306a36Sopenharmony_ci	__le32 inner_digest[5];
26762306a36Sopenharmony_ci	__le32 outer_digest[5];
26862306a36Sopenharmony_ci	u32 state_ptr;
26962306a36Sopenharmony_ci	u32 reserved;
27062306a36Sopenharmony_ci} __attribute__((packed));
27162306a36Sopenharmony_ci#define SA_HASH160_LEN		(sizeof(struct dynamic_sa_hash160)/4)
27262306a36Sopenharmony_ci#define SA_HASH160_CONTENTS     0x2000a502
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_cistatic inline u32
27562306a36Sopenharmony_ciget_dynamic_sa_offset_state_ptr_field(struct dynamic_sa_ctl *cts)
27662306a36Sopenharmony_ci{
27762306a36Sopenharmony_ci	u32 offset;
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	offset = cts->sa_contents.bf.key_size
28062306a36Sopenharmony_ci		+ cts->sa_contents.bf.inner_size
28162306a36Sopenharmony_ci		+ cts->sa_contents.bf.outer_size
28262306a36Sopenharmony_ci		+ cts->sa_contents.bf.spi
28362306a36Sopenharmony_ci		+ cts->sa_contents.bf.seq_num0
28462306a36Sopenharmony_ci		+ cts->sa_contents.bf.seq_num1
28562306a36Sopenharmony_ci		+ cts->sa_contents.bf.seq_num_mask0
28662306a36Sopenharmony_ci		+ cts->sa_contents.bf.seq_num_mask1
28762306a36Sopenharmony_ci		+ cts->sa_contents.bf.seq_num_mask2
28862306a36Sopenharmony_ci		+ cts->sa_contents.bf.seq_num_mask3
28962306a36Sopenharmony_ci		+ cts->sa_contents.bf.iv0
29062306a36Sopenharmony_ci		+ cts->sa_contents.bf.iv1
29162306a36Sopenharmony_ci		+ cts->sa_contents.bf.iv2
29262306a36Sopenharmony_ci		+ cts->sa_contents.bf.iv3;
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	return sizeof(struct dynamic_sa_ctl) + offset * 4;
29562306a36Sopenharmony_ci}
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_cistatic inline __le32 *get_dynamic_sa_key_field(struct dynamic_sa_ctl *cts)
29862306a36Sopenharmony_ci{
29962306a36Sopenharmony_ci	return (__le32 *) ((unsigned long)cts + sizeof(struct dynamic_sa_ctl));
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_cistatic inline __le32 *get_dynamic_sa_inner_digest(struct dynamic_sa_ctl *cts)
30362306a36Sopenharmony_ci{
30462306a36Sopenharmony_ci	return (__le32 *) ((unsigned long)cts +
30562306a36Sopenharmony_ci		sizeof(struct dynamic_sa_ctl) +
30662306a36Sopenharmony_ci		cts->sa_contents.bf.key_size * 4);
30762306a36Sopenharmony_ci}
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci#endif
310