Commit | Line | Data |
---|---|---|
9d12ba86 RR |
1 | /* |
2 | * Copyright 2016 Broadcom | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License, version 2, as | |
6 | * published by the Free Software Foundation (the "GPL"). | |
7 | * | |
8 | * This program is distributed in the hope that it will be useful, but | |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
11 | * General Public License version 2 (GPLv2) for more details. | |
12 | * | |
13 | * You should have received a copy of the GNU General Public License | |
14 | * version 2 (GPLv2) along with this source code. | |
15 | */ | |
16 | ||
17 | /* | |
18 | * This file contains SPU message definitions specific to SPU2. | |
19 | */ | |
20 | ||
21 | #ifndef _SPU2_H | |
22 | #define _SPU2_H | |
23 | ||
24 | enum spu2_cipher_type { | |
25 | SPU2_CIPHER_TYPE_NONE = 0x0, | |
26 | SPU2_CIPHER_TYPE_AES128 = 0x1, | |
27 | SPU2_CIPHER_TYPE_AES192 = 0x2, | |
28 | SPU2_CIPHER_TYPE_AES256 = 0x3, | |
29 | SPU2_CIPHER_TYPE_DES = 0x4, | |
30 | SPU2_CIPHER_TYPE_3DES = 0x5, | |
31 | SPU2_CIPHER_TYPE_LAST | |
32 | }; | |
33 | ||
34 | enum spu2_cipher_mode { | |
35 | SPU2_CIPHER_MODE_ECB = 0x0, | |
36 | SPU2_CIPHER_MODE_CBC = 0x1, | |
37 | SPU2_CIPHER_MODE_CTR = 0x2, | |
38 | SPU2_CIPHER_MODE_CFB = 0x3, | |
39 | SPU2_CIPHER_MODE_OFB = 0x4, | |
40 | SPU2_CIPHER_MODE_XTS = 0x5, | |
41 | SPU2_CIPHER_MODE_CCM = 0x6, | |
42 | SPU2_CIPHER_MODE_GCM = 0x7, | |
43 | SPU2_CIPHER_MODE_LAST | |
44 | }; | |
45 | ||
46 | enum spu2_hash_type { | |
47 | SPU2_HASH_TYPE_NONE = 0x0, | |
48 | SPU2_HASH_TYPE_AES128 = 0x1, | |
49 | SPU2_HASH_TYPE_AES192 = 0x2, | |
50 | SPU2_HASH_TYPE_AES256 = 0x3, | |
51 | SPU2_HASH_TYPE_MD5 = 0x6, | |
52 | SPU2_HASH_TYPE_SHA1 = 0x7, | |
53 | SPU2_HASH_TYPE_SHA224 = 0x8, | |
54 | SPU2_HASH_TYPE_SHA256 = 0x9, | |
55 | SPU2_HASH_TYPE_SHA384 = 0xa, | |
56 | SPU2_HASH_TYPE_SHA512 = 0xb, | |
57 | SPU2_HASH_TYPE_SHA512_224 = 0xc, | |
58 | SPU2_HASH_TYPE_SHA512_256 = 0xd, | |
59 | SPU2_HASH_TYPE_SHA3_224 = 0xe, | |
60 | SPU2_HASH_TYPE_SHA3_256 = 0xf, | |
61 | SPU2_HASH_TYPE_SHA3_384 = 0x10, | |
62 | SPU2_HASH_TYPE_SHA3_512 = 0x11, | |
63 | SPU2_HASH_TYPE_LAST | |
64 | }; | |
65 | ||
66 | enum spu2_hash_mode { | |
67 | SPU2_HASH_MODE_CMAC = 0x0, | |
68 | SPU2_HASH_MODE_CBC_MAC = 0x1, | |
69 | SPU2_HASH_MODE_XCBC_MAC = 0x2, | |
70 | SPU2_HASH_MODE_HMAC = 0x3, | |
71 | SPU2_HASH_MODE_RABIN = 0x4, | |
72 | SPU2_HASH_MODE_CCM = 0x5, | |
73 | SPU2_HASH_MODE_GCM = 0x6, | |
74 | SPU2_HASH_MODE_RESERVED = 0x7, | |
75 | SPU2_HASH_MODE_LAST | |
76 | }; | |
77 | ||
78 | enum spu2_ret_md_opts { | |
79 | SPU2_RET_NO_MD = 0, /* return no metadata */ | |
80 | SPU2_RET_FMD_OMD = 1, /* return both FMD and OMD */ | |
81 | SPU2_RET_FMD_ONLY = 2, /* return only FMD */ | |
82 | SPU2_RET_FMD_OMD_IV = 3, /* return FMD and OMD with just IVs */ | |
83 | }; | |
84 | ||
85 | /* Fixed Metadata format */ | |
86 | struct SPU2_FMD { | |
87 | u64 ctrl0; | |
88 | u64 ctrl1; | |
89 | u64 ctrl2; | |
90 | u64 ctrl3; | |
91 | }; | |
92 | ||
93 | #define FMD_SIZE sizeof(struct SPU2_FMD) | |
94 | ||
95 | /* Fixed part of request message header length in bytes. Just FMD. */ | |
96 | #define SPU2_REQ_FIXED_LEN FMD_SIZE | |
97 | #define SPU2_HEADER_ALLOC_LEN (SPU_REQ_FIXED_LEN + \ | |
98 | 2 * MAX_KEY_SIZE + 2 * MAX_IV_SIZE) | |
99 | ||
100 | /* FMD ctrl0 field masks */ | |
101 | #define SPU2_CIPH_ENCRYPT_EN 0x1 /* 0: decrypt, 1: encrypt */ | |
102 | #define SPU2_CIPH_TYPE 0xF0 /* one of spu2_cipher_type */ | |
103 | #define SPU2_CIPH_TYPE_SHIFT 4 | |
104 | #define SPU2_CIPH_MODE 0xF00 /* one of spu2_cipher_mode */ | |
105 | #define SPU2_CIPH_MODE_SHIFT 8 | |
106 | #define SPU2_CFB_MASK 0x7000 /* cipher feedback mask */ | |
107 | #define SPU2_CFB_MASK_SHIFT 12 | |
108 | #define SPU2_PROTO_SEL 0xF00000 /* MACsec, IPsec, TLS... */ | |
109 | #define SPU2_PROTO_SEL_SHIFT 20 | |
110 | #define SPU2_HASH_FIRST 0x1000000 /* 1: hash input is input pkt | |
111 | * data | |
112 | */ | |
113 | #define SPU2_CHK_TAG 0x2000000 /* 1: check digest provided */ | |
114 | #define SPU2_HASH_TYPE 0x1F0000000 /* one of spu2_hash_type */ | |
115 | #define SPU2_HASH_TYPE_SHIFT 28 | |
116 | #define SPU2_HASH_MODE 0xF000000000 /* one of spu2_hash_mode */ | |
117 | #define SPU2_HASH_MODE_SHIFT 36 | |
118 | #define SPU2_CIPH_PAD_EN 0x100000000000 /* 1: Add pad to end of payload for | |
119 | * enc | |
120 | */ | |
121 | #define SPU2_CIPH_PAD 0xFF000000000000 /* cipher pad value */ | |
122 | #define SPU2_CIPH_PAD_SHIFT 48 | |
123 | ||
124 | /* FMD ctrl1 field masks */ | |
125 | #define SPU2_TAG_LOC 0x1 /* 1: end of payload, 0: undef */ | |
126 | #define SPU2_HAS_FR_DATA 0x2 /* 1: msg has frame data */ | |
127 | #define SPU2_HAS_AAD1 0x4 /* 1: msg has AAD1 field */ | |
128 | #define SPU2_HAS_NAAD 0x8 /* 1: msg has NAAD field */ | |
129 | #define SPU2_HAS_AAD2 0x10 /* 1: msg has AAD2 field */ | |
130 | #define SPU2_HAS_ESN 0x20 /* 1: msg has ESN field */ | |
131 | #define SPU2_HASH_KEY_LEN 0xFF00 /* len of hash key in bytes. | |
132 | * HMAC only. | |
133 | */ | |
134 | #define SPU2_HASH_KEY_LEN_SHIFT 8 | |
135 | #define SPU2_CIPH_KEY_LEN 0xFF00000 /* len of cipher key in bytes */ | |
136 | #define SPU2_CIPH_KEY_LEN_SHIFT 20 | |
137 | #define SPU2_GENIV 0x10000000 /* 1: hw generates IV */ | |
138 | #define SPU2_HASH_IV 0x20000000 /* 1: IV incl in hash */ | |
139 | #define SPU2_RET_IV 0x40000000 /* 1: return IV in output msg | |
140 | * b4 payload | |
141 | */ | |
142 | #define SPU2_RET_IV_LEN 0xF00000000 /* length in bytes of IV returned. | |
143 | * 0 = 16 bytes | |
144 | */ | |
145 | #define SPU2_RET_IV_LEN_SHIFT 32 | |
146 | #define SPU2_IV_OFFSET 0xF000000000 /* gen IV offset */ | |
147 | #define SPU2_IV_OFFSET_SHIFT 36 | |
148 | #define SPU2_IV_LEN 0x1F0000000000 /* length of input IV in bytes */ | |
149 | #define SPU2_IV_LEN_SHIFT 40 | |
150 | #define SPU2_HASH_TAG_LEN 0x7F000000000000 /* hash tag length in bytes */ | |
151 | #define SPU2_HASH_TAG_LEN_SHIFT 48 | |
152 | #define SPU2_RETURN_MD 0x300000000000000 /* return metadata */ | |
153 | #define SPU2_RETURN_MD_SHIFT 56 | |
154 | #define SPU2_RETURN_FD 0x400000000000000 | |
155 | #define SPU2_RETURN_AAD1 0x800000000000000 | |
156 | #define SPU2_RETURN_NAAD 0x1000000000000000 | |
157 | #define SPU2_RETURN_AAD2 0x2000000000000000 | |
158 | #define SPU2_RETURN_PAY 0x4000000000000000 /* return payload */ | |
159 | ||
160 | /* FMD ctrl2 field masks */ | |
161 | #define SPU2_AAD1_OFFSET 0xFFF /* byte offset of AAD1 field */ | |
162 | #define SPU2_AAD1_LEN 0xFF000 /* length of AAD1 in bytes */ | |
163 | #define SPU2_AAD1_LEN_SHIFT 12 | |
164 | #define SPU2_AAD2_OFFSET 0xFFF00000 /* byte offset of AAD2 field */ | |
165 | #define SPU2_AAD2_OFFSET_SHIFT 20 | |
166 | #define SPU2_PL_OFFSET 0xFFFFFFFF00000000 /* payload offset from AAD2 */ | |
167 | #define SPU2_PL_OFFSET_SHIFT 32 | |
168 | ||
169 | /* FMD ctrl3 field masks */ | |
170 | #define SPU2_PL_LEN 0xFFFFFFFF /* payload length in bytes */ | |
171 | #define SPU2_TLS_LEN 0xFFFF00000000 /* TLS encrypt: cipher len | |
172 | * TLS decrypt: compressed len | |
173 | */ | |
174 | #define SPU2_TLS_LEN_SHIFT 32 | |
175 | ||
176 | /* | |
177 | * Max value that can be represented in the Payload Length field of the | |
178 | * ctrl3 word of FMD. | |
179 | */ | |
180 | #define SPU2_MAX_PAYLOAD SPU2_PL_LEN | |
181 | ||
182 | /* Error values returned in STATUS field of response messages */ | |
183 | #define SPU2_INVALID_ICV 1 | |
184 | ||
185 | void spu2_dump_msg_hdr(u8 *buf, unsigned int buf_len); | |
186 | u32 spu2_ctx_max_payload(enum spu_cipher_alg cipher_alg, | |
187 | enum spu_cipher_mode cipher_mode, | |
188 | unsigned int blocksize); | |
189 | u32 spu2_payload_length(u8 *spu_hdr); | |
190 | u16 spu2_response_hdr_len(u16 auth_key_len, u16 enc_key_len, bool is_hash); | |
191 | u16 spu2_hash_pad_len(enum hash_alg hash_alg, enum hash_mode hash_mode, | |
192 | u32 chunksize, u16 hash_block_size); | |
193 | u32 spu2_gcm_ccm_pad_len(enum spu_cipher_mode cipher_mode, | |
194 | unsigned int data_size); | |
195 | u32 spu2_assoc_resp_len(enum spu_cipher_mode cipher_mode, | |
196 | unsigned int assoc_len, unsigned int iv_len, | |
197 | bool is_encrypt); | |
198 | u8 spu2_aead_ivlen(enum spu_cipher_mode cipher_mode, | |
199 | u16 iv_len); | |
200 | enum hash_type spu2_hash_type(u32 src_sent); | |
201 | u32 spu2_digest_size(u32 alg_digest_size, enum hash_alg alg, | |
202 | enum hash_type htype); | |
203 | u32 spu2_create_request(u8 *spu_hdr, | |
204 | struct spu_request_opts *req_opts, | |
205 | struct spu_cipher_parms *cipher_parms, | |
206 | struct spu_hash_parms *hash_parms, | |
207 | struct spu_aead_parms *aead_parms, | |
208 | unsigned int data_size); | |
209 | u16 spu2_cipher_req_init(u8 *spu_hdr, struct spu_cipher_parms *cipher_parms); | |
210 | void spu2_cipher_req_finish(u8 *spu_hdr, | |
211 | u16 spu_req_hdr_len, | |
212 | unsigned int is_inbound, | |
213 | struct spu_cipher_parms *cipher_parms, | |
214 | bool update_key, | |
215 | unsigned int data_size); | |
216 | void spu2_request_pad(u8 *pad_start, u32 gcm_padding, u32 hash_pad_len, | |
217 | enum hash_alg auth_alg, enum hash_mode auth_mode, | |
218 | unsigned int total_sent, u32 status_padding); | |
219 | u8 spu2_xts_tweak_in_payload(void); | |
220 | u8 spu2_tx_status_len(void); | |
221 | u8 spu2_rx_status_len(void); | |
222 | int spu2_status_process(u8 *statp); | |
223 | void spu2_ccm_update_iv(unsigned int digestsize, | |
224 | struct spu_cipher_parms *cipher_parms, | |
225 | unsigned int assoclen, unsigned int chunksize, | |
226 | bool is_encrypt, bool is_esp); | |
227 | u32 spu2_wordalign_padlen(u32 data_size); | |
228 | #endif |