doc: fix list of unsupported features in IPsec guide
[dpdk.git] / drivers / crypto / dpaa2_sec / hw / rta / protocol_cmd.h
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2008-2016 Freescale Semiconductor Inc.
4  * Copyright 2016,2019 NXP
5  *
6  */
7
8 #ifndef __RTA_PROTOCOL_CMD_H__
9 #define __RTA_PROTOCOL_CMD_H__
10
11 extern enum rta_sec_era rta_sec_era;
12
13 static inline int
14 __rta_ssl_proto(uint16_t protoinfo)
15 {
16         switch (protoinfo) {
17         case OP_PCL_TLS_RSA_EXPORT_WITH_RC4_40_MD5:
18         case OP_PCL_TLS_RSA_WITH_RC4_128_MD5:
19         case OP_PCL_TLS_RSA_WITH_RC4_128_SHA:
20         case OP_PCL_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5:
21         case OP_PCL_TLS_DH_anon_WITH_RC4_128_MD5:
22         case OP_PCL_TLS_KRB5_WITH_RC4_128_SHA:
23         case OP_PCL_TLS_KRB5_WITH_RC4_128_MD5:
24         case OP_PCL_TLS_KRB5_EXPORT_WITH_RC4_40_SHA:
25         case OP_PCL_TLS_KRB5_EXPORT_WITH_RC4_40_MD5:
26         case OP_PCL_TLS_PSK_WITH_RC4_128_SHA:
27         case OP_PCL_TLS_DHE_PSK_WITH_RC4_128_SHA:
28         case OP_PCL_TLS_RSA_PSK_WITH_RC4_128_SHA:
29         case OP_PCL_TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
30         case OP_PCL_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
31         case OP_PCL_TLS_ECDH_RSA_WITH_RC4_128_SHA:
32         case OP_PCL_TLS_ECDHE_RSA_WITH_RC4_128_SHA:
33         case OP_PCL_TLS_ECDH_anon_WITH_RC4_128_SHA:
34         case OP_PCL_TLS_ECDHE_PSK_WITH_RC4_128_SHA:
35                 if (rta_sec_era == RTA_SEC_ERA_7)
36                         return -EINVAL;
37                 /* fall through if not Era 7 */
38         case OP_PCL_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA:
39         case OP_PCL_TLS_RSA_WITH_DES_CBC_SHA:
40         case OP_PCL_TLS_RSA_WITH_3DES_EDE_CBC_SHA:
41         case OP_PCL_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA:
42         case OP_PCL_TLS_DH_DSS_WITH_DES_CBC_SHA:
43         case OP_PCL_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
44         case OP_PCL_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA:
45         case OP_PCL_TLS_DH_RSA_WITH_DES_CBC_SHA:
46         case OP_PCL_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
47         case OP_PCL_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA:
48         case OP_PCL_TLS_DHE_DSS_WITH_DES_CBC_SHA:
49         case OP_PCL_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
50         case OP_PCL_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA:
51         case OP_PCL_TLS_DHE_RSA_WITH_DES_CBC_SHA:
52         case OP_PCL_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
53         case OP_PCL_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA:
54         case OP_PCL_TLS_DH_anon_WITH_DES_CBC_SHA:
55         case OP_PCL_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
56         case OP_PCL_TLS_KRB5_WITH_DES_CBC_SHA:
57         case OP_PCL_TLS_KRB5_WITH_3DES_EDE_CBC_SHA:
58         case OP_PCL_TLS_KRB5_WITH_DES_CBC_MD5:
59         case OP_PCL_TLS_KRB5_WITH_3DES_EDE_CBC_MD5:
60         case OP_PCL_TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA:
61         case OP_PCL_TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5:
62         case OP_PCL_TLS_RSA_WITH_AES_128_CBC_SHA:
63         case OP_PCL_TLS_DH_DSS_WITH_AES_128_CBC_SHA:
64         case OP_PCL_TLS_DH_RSA_WITH_AES_128_CBC_SHA:
65         case OP_PCL_TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
66         case OP_PCL_TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
67         case OP_PCL_TLS_DH_anon_WITH_AES_128_CBC_SHA:
68         case OP_PCL_TLS_RSA_WITH_AES_256_CBC_SHA:
69         case OP_PCL_TLS_DH_DSS_WITH_AES_256_CBC_SHA:
70         case OP_PCL_TLS_DH_RSA_WITH_AES_256_CBC_SHA:
71         case OP_PCL_TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
72         case OP_PCL_TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
73         case OP_PCL_TLS_DH_anon_WITH_AES_256_CBC_SHA:
74         case OP_PCL_TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
75         case OP_PCL_TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
76         case OP_PCL_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
77         case OP_PCL_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
78         case OP_PCL_TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
79         case OP_PCL_TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
80         case OP_PCL_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
81         case OP_PCL_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
82         case OP_PCL_TLS_DH_anon_WITH_AES_128_CBC_SHA256:
83         case OP_PCL_TLS_DH_anon_WITH_AES_256_CBC_SHA256:
84         case OP_PCL_TLS_PSK_WITH_3DES_EDE_CBC_SHA:
85         case OP_PCL_TLS_PSK_WITH_AES_128_CBC_SHA:
86         case OP_PCL_TLS_PSK_WITH_AES_256_CBC_SHA:
87         case OP_PCL_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
88         case OP_PCL_TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
89         case OP_PCL_TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
90         case OP_PCL_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
91         case OP_PCL_TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
92         case OP_PCL_TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
93         case OP_PCL_TLS_RSA_WITH_AES_128_GCM_SHA256:
94         case OP_PCL_TLS_RSA_WITH_AES_256_GCM_SHA384:
95         case OP_PCL_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
96         case OP_PCL_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
97         case OP_PCL_TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
98         case OP_PCL_TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
99         case OP_PCL_TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
100         case OP_PCL_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
101         case OP_PCL_TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
102         case OP_PCL_TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
103         case OP_PCL_TLS_DH_anon_WITH_AES_128_GCM_SHA256:
104         case OP_PCL_TLS_DH_anon_WITH_AES_256_GCM_SHA384:
105         case OP_PCL_TLS_PSK_WITH_AES_128_GCM_SHA256:
106         case OP_PCL_TLS_PSK_WITH_AES_256_GCM_SHA384:
107         case OP_PCL_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
108         case OP_PCL_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
109         case OP_PCL_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
110         case OP_PCL_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
111         case OP_PCL_TLS_PSK_WITH_AES_128_CBC_SHA256:
112         case OP_PCL_TLS_PSK_WITH_AES_256_CBC_SHA384:
113         case OP_PCL_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
114         case OP_PCL_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
115         case OP_PCL_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
116         case OP_PCL_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
117         case OP_PCL_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
118         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
119         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
120         case OP_PCL_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
121         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
122         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
123         case OP_PCL_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
124         case OP_PCL_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
125         case OP_PCL_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
126         case OP_PCL_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
127         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
128         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
129         case OP_PCL_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
130         case OP_PCL_TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
131         case OP_PCL_TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
132         case OP_PCL_TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
133         case OP_PCL_TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
134         case OP_PCL_TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
135         case OP_PCL_TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
136         case OP_PCL_TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
137         case OP_PCL_TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
138         case OP_PCL_TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
139         case OP_PCL_TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
140         case OP_PCL_TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
141         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
142         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
143         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
144         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
145         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
146         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
147         case OP_PCL_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
148         case OP_PCL_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
149         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
150         case OP_PCL_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
151         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
152         case OP_PCL_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
153         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
154         case OP_PCL_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
155         case OP_PCL_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
156         case OP_PCL_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
157         case OP_PCL_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
158         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
159         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
160         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
161         case OP_PCL_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
162         case OP_PCL_TLS_RSA_WITH_AES_128_CBC_SHA256:
163         case OP_PCL_TLS_RSA_WITH_AES_256_CBC_SHA256:
164         case OP_PCL_PVT_TLS_3DES_EDE_CBC_MD5:
165         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA160:
166         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA224:
167         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA256:
168         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA384:
169         case OP_PCL_PVT_TLS_3DES_EDE_CBC_SHA512:
170         case OP_PCL_PVT_TLS_AES_128_CBC_SHA160:
171         case OP_PCL_PVT_TLS_AES_128_CBC_SHA224:
172         case OP_PCL_PVT_TLS_AES_128_CBC_SHA256:
173         case OP_PCL_PVT_TLS_AES_128_CBC_SHA384:
174         case OP_PCL_PVT_TLS_AES_128_CBC_SHA512:
175         case OP_PCL_PVT_TLS_AES_192_CBC_SHA160:
176         case OP_PCL_PVT_TLS_AES_192_CBC_SHA224:
177         case OP_PCL_PVT_TLS_AES_192_CBC_SHA256:
178         case OP_PCL_PVT_TLS_AES_192_CBC_SHA512:
179         case OP_PCL_PVT_TLS_AES_256_CBC_SHA160:
180         case OP_PCL_PVT_TLS_AES_256_CBC_SHA224:
181         case OP_PCL_PVT_TLS_AES_256_CBC_SHA384:
182         case OP_PCL_PVT_TLS_AES_256_CBC_SHA512:
183         case OP_PCL_PVT_TLS_AES_256_CBC_SHA256:
184         case OP_PCL_PVT_TLS_AES_192_CBC_SHA384:
185         case OP_PCL_PVT_TLS_MASTER_SECRET_PRF_FE:
186         case OP_PCL_PVT_TLS_MASTER_SECRET_PRF_FF:
187                 return 0;
188         }
189
190         return -EINVAL;
191 }
192
193 static inline int
194 __rta_ike_proto(uint16_t protoinfo)
195 {
196         switch (protoinfo) {
197         case OP_PCL_IKE_HMAC_MD5:
198         case OP_PCL_IKE_HMAC_SHA1:
199         case OP_PCL_IKE_HMAC_AES128_CBC:
200         case OP_PCL_IKE_HMAC_SHA256:
201         case OP_PCL_IKE_HMAC_SHA384:
202         case OP_PCL_IKE_HMAC_SHA512:
203         case OP_PCL_IKE_HMAC_AES128_CMAC:
204                 return 0;
205         }
206
207         return -EINVAL;
208 }
209
210 static inline int
211 __rta_ipsec_proto(uint16_t protoinfo)
212 {
213         uint16_t proto_cls1 = protoinfo & OP_PCL_IPSEC_CIPHER_MASK;
214         uint16_t proto_cls2 = protoinfo & OP_PCL_IPSEC_AUTH_MASK;
215
216         switch (proto_cls1) {
217         case OP_PCL_IPSEC_AES_NULL_WITH_GMAC:
218                 if (rta_sec_era < RTA_SEC_ERA_2)
219                         return -EINVAL;
220                 /* no break */
221         case OP_PCL_IPSEC_AES_CCM8:
222         case OP_PCL_IPSEC_AES_CCM12:
223         case OP_PCL_IPSEC_AES_CCM16:
224         case OP_PCL_IPSEC_AES_GCM8:
225         case OP_PCL_IPSEC_AES_GCM12:
226         case OP_PCL_IPSEC_AES_GCM16:
227                 /* CCM, GCM, GMAC require PROTINFO[7:0] = 0 */
228                 if (proto_cls2 == OP_PCL_IPSEC_HMAC_NULL)
229                         return 0;
230                 return -EINVAL;
231         case OP_PCL_IPSEC_NULL:
232                 if (rta_sec_era < RTA_SEC_ERA_2)
233                         return -EINVAL;
234                 /* no break */
235         case OP_PCL_IPSEC_DES_IV64:
236         case OP_PCL_IPSEC_DES:
237         case OP_PCL_IPSEC_3DES:
238         case OP_PCL_IPSEC_AES_CBC:
239         case OP_PCL_IPSEC_AES_CTR:
240                 break;
241         default:
242                 return -EINVAL;
243         }
244
245         switch (proto_cls2) {
246         case OP_PCL_IPSEC_HMAC_NULL:
247         case OP_PCL_IPSEC_HMAC_MD5_96:
248         case OP_PCL_IPSEC_HMAC_SHA1_96:
249         case OP_PCL_IPSEC_AES_XCBC_MAC_96:
250         case OP_PCL_IPSEC_HMAC_MD5_128:
251         case OP_PCL_IPSEC_HMAC_SHA1_160:
252         case OP_PCL_IPSEC_AES_CMAC_96:
253         case OP_PCL_IPSEC_HMAC_SHA2_256_128:
254         case OP_PCL_IPSEC_HMAC_SHA2_384_192:
255         case OP_PCL_IPSEC_HMAC_SHA2_512_256:
256                 return 0;
257         }
258
259         return -EINVAL;
260 }
261
262 static inline int
263 __rta_srtp_proto(uint16_t protoinfo)
264 {
265         uint16_t proto_cls1 = protoinfo & OP_PCL_SRTP_CIPHER_MASK;
266         uint16_t proto_cls2 = protoinfo & OP_PCL_SRTP_AUTH_MASK;
267
268         switch (proto_cls1) {
269         case OP_PCL_SRTP_AES_CTR:
270                 switch (proto_cls2) {
271                 case OP_PCL_SRTP_HMAC_SHA1_160:
272                         return 0;
273                 }
274                 /* no break */
275         }
276
277         return -EINVAL;
278 }
279
280 static inline int
281 __rta_macsec_proto(uint16_t protoinfo)
282 {
283         switch (protoinfo) {
284         case OP_PCL_MACSEC:
285                 return 0;
286         }
287
288         return -EINVAL;
289 }
290
291 static inline int
292 __rta_wifi_proto(uint16_t protoinfo)
293 {
294         switch (protoinfo) {
295         case OP_PCL_WIFI:
296                 return 0;
297         }
298
299         return -EINVAL;
300 }
301
302 static inline int
303 __rta_wimax_proto(uint16_t protoinfo)
304 {
305         switch (protoinfo) {
306         case OP_PCL_WIMAX_OFDM:
307         case OP_PCL_WIMAX_OFDMA:
308                 return 0;
309         }
310
311         return -EINVAL;
312 }
313
314 /* Allowed blob proto flags for each SEC Era */
315 static const uint32_t proto_blob_flags[] = {
316         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK,
317         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
318                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK,
319         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
320                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK,
321         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
322                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
323         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
324                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
325         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
326                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
327         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
328                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
329         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
330                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
331         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
332                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM,
333         OP_PCL_BLOB_FORMAT_MASK | OP_PCL_BLOB_BLACK | OP_PCL_BLOB_TKEK |
334                 OP_PCL_BLOB_EKT | OP_PCL_BLOB_REG_MASK | OP_PCL_BLOB_SEC_MEM
335 };
336
337 static inline int
338 __rta_blob_proto(uint16_t protoinfo)
339 {
340         if (protoinfo & ~proto_blob_flags[rta_sec_era])
341                 return -EINVAL;
342
343         switch (protoinfo & OP_PCL_BLOB_FORMAT_MASK) {
344         case OP_PCL_BLOB_FORMAT_NORMAL:
345         case OP_PCL_BLOB_FORMAT_MASTER_VER:
346         case OP_PCL_BLOB_FORMAT_TEST:
347                 break;
348         default:
349                 return -EINVAL;
350         }
351
352         switch (protoinfo & OP_PCL_BLOB_REG_MASK) {
353         case OP_PCL_BLOB_AFHA_SBOX:
354                 if (rta_sec_era < RTA_SEC_ERA_3)
355                         return -EINVAL;
356                 /* no break */
357         case OP_PCL_BLOB_REG_MEMORY:
358         case OP_PCL_BLOB_REG_KEY1:
359         case OP_PCL_BLOB_REG_KEY2:
360         case OP_PCL_BLOB_REG_SPLIT:
361         case OP_PCL_BLOB_REG_PKE:
362                 return 0;
363         }
364
365         return -EINVAL;
366 }
367
368 static inline int
369 __rta_dlc_proto(uint16_t protoinfo)
370 {
371         if ((rta_sec_era < RTA_SEC_ERA_2) &&
372             (protoinfo & (OP_PCL_PKPROT_DSA_MSG | OP_PCL_PKPROT_HASH_MASK |
373              OP_PCL_PKPROT_EKT_Z | OP_PCL_PKPROT_DECRYPT_Z |
374              OP_PCL_PKPROT_DECRYPT_PRI)))
375                 return -EINVAL;
376
377         switch (protoinfo & OP_PCL_PKPROT_HASH_MASK) {
378         case OP_PCL_PKPROT_HASH_MD5:
379         case OP_PCL_PKPROT_HASH_SHA1:
380         case OP_PCL_PKPROT_HASH_SHA224:
381         case OP_PCL_PKPROT_HASH_SHA256:
382         case OP_PCL_PKPROT_HASH_SHA384:
383         case OP_PCL_PKPROT_HASH_SHA512:
384                 break;
385         default:
386                 return -EINVAL;
387         }
388
389         return 0;
390 }
391
392 static inline int
393 __rta_rsa_enc_proto(uint16_t protoinfo)
394 {
395         switch (protoinfo & OP_PCL_RSAPROT_OP_MASK) {
396         case OP_PCL_RSAPROT_OP_ENC_F_IN:
397                 if ((protoinfo & OP_PCL_RSAPROT_FFF_MASK) !=
398                     OP_PCL_RSAPROT_FFF_RED)
399                         return -EINVAL;
400                 break;
401         case OP_PCL_RSAPROT_OP_ENC_F_OUT:
402                 switch (protoinfo & OP_PCL_RSAPROT_FFF_MASK) {
403                 case OP_PCL_RSAPROT_FFF_RED:
404                 case OP_PCL_RSAPROT_FFF_ENC:
405                 case OP_PCL_RSAPROT_FFF_EKT:
406                 case OP_PCL_RSAPROT_FFF_TK_ENC:
407                 case OP_PCL_RSAPROT_FFF_TK_EKT:
408                         break;
409                 default:
410                         return -EINVAL;
411                 }
412                 break;
413         default:
414                 return -EINVAL;
415         }
416
417         return 0;
418 }
419
420 static inline int
421 __rta_rsa_dec_proto(uint16_t protoinfo)
422 {
423         switch (protoinfo & OP_PCL_RSAPROT_OP_MASK) {
424         case OP_PCL_RSAPROT_OP_DEC_ND:
425         case OP_PCL_RSAPROT_OP_DEC_PQD:
426         case OP_PCL_RSAPROT_OP_DEC_PQDPDQC:
427                 break;
428         default:
429                 return -EINVAL;
430         }
431
432         switch (protoinfo & OP_PCL_RSAPROT_PPP_MASK) {
433         case OP_PCL_RSAPROT_PPP_RED:
434         case OP_PCL_RSAPROT_PPP_ENC:
435         case OP_PCL_RSAPROT_PPP_EKT:
436         case OP_PCL_RSAPROT_PPP_TK_ENC:
437         case OP_PCL_RSAPROT_PPP_TK_EKT:
438                 break;
439         default:
440                 return -EINVAL;
441         }
442
443         if (protoinfo & OP_PCL_RSAPROT_FMT_PKCSV15)
444                 switch (protoinfo & OP_PCL_RSAPROT_FFF_MASK) {
445                 case OP_PCL_RSAPROT_FFF_RED:
446                 case OP_PCL_RSAPROT_FFF_ENC:
447                 case OP_PCL_RSAPROT_FFF_EKT:
448                 case OP_PCL_RSAPROT_FFF_TK_ENC:
449                 case OP_PCL_RSAPROT_FFF_TK_EKT:
450                         break;
451                 default:
452                         return -EINVAL;
453                 }
454
455         return 0;
456 }
457
458 /*
459  * DKP Protocol - Restrictions on key (SRC,DST) combinations
460  * For e.g. key_in_out[0][0] = 1 means (SRC=IMM,DST=IMM) combination is allowed
461  */
462 static const uint8_t key_in_out[4][4] = { {1, 0, 0, 0},
463                                           {1, 1, 1, 1},
464                                           {1, 0, 1, 0},
465                                           {1, 0, 0, 1} };
466
467 static inline int
468 __rta_dkp_proto(uint16_t protoinfo)
469 {
470         int key_src = (protoinfo & OP_PCL_DKP_SRC_MASK) >> OP_PCL_DKP_SRC_SHIFT;
471         int key_dst = (protoinfo & OP_PCL_DKP_DST_MASK) >> OP_PCL_DKP_DST_SHIFT;
472
473         if (!key_in_out[key_src][key_dst]) {
474                 pr_err("PROTO_DESC: Invalid DKP key (SRC,DST)\n");
475                 return -EINVAL;
476         }
477
478         return 0;
479 }
480
481
482 static inline int
483 __rta_3g_dcrc_proto(uint16_t protoinfo)
484 {
485         if (rta_sec_era == RTA_SEC_ERA_7)
486                 return -EINVAL;
487
488         switch (protoinfo) {
489         case OP_PCL_3G_DCRC_CRC7:
490         case OP_PCL_3G_DCRC_CRC11:
491                 return 0;
492         }
493
494         return -EINVAL;
495 }
496
497 static inline int
498 __rta_3g_rlc_proto(uint16_t protoinfo)
499 {
500         if (rta_sec_era == RTA_SEC_ERA_7)
501                 return -EINVAL;
502
503         switch (protoinfo) {
504         case OP_PCL_3G_RLC_NULL:
505         case OP_PCL_3G_RLC_KASUMI:
506         case OP_PCL_3G_RLC_SNOW:
507                 return 0;
508         }
509
510         return -EINVAL;
511 }
512
513 static inline int
514 __rta_lte_pdcp_proto(uint16_t protoinfo)
515 {
516         if (rta_sec_era == RTA_SEC_ERA_7)
517                 return -EINVAL;
518
519         switch (protoinfo) {
520         case OP_PCL_LTE_ZUC:
521                 if (rta_sec_era < RTA_SEC_ERA_5)
522                         break;
523         case OP_PCL_LTE_NULL:
524         case OP_PCL_LTE_SNOW:
525         case OP_PCL_LTE_AES:
526                 return 0;
527         }
528
529         return -EINVAL;
530 }
531
532 static inline int
533 __rta_lte_pdcp_mixed_proto(uint16_t protoinfo)
534 {
535         switch (protoinfo & OP_PCL_LTE_MIXED_AUTH_MASK) {
536         case OP_PCL_LTE_MIXED_AUTH_NULL:
537         case OP_PCL_LTE_MIXED_AUTH_SNOW:
538         case OP_PCL_LTE_MIXED_AUTH_AES:
539         case OP_PCL_LTE_MIXED_AUTH_ZUC:
540                 break;
541         default:
542                 return -EINVAL;
543         }
544
545         switch (protoinfo & OP_PCL_LTE_MIXED_ENC_MASK) {
546         case OP_PCL_LTE_MIXED_ENC_NULL:
547         case OP_PCL_LTE_MIXED_ENC_SNOW:
548         case OP_PCL_LTE_MIXED_ENC_AES:
549         case OP_PCL_LTE_MIXED_ENC_ZUC:
550                 return 0;
551         }
552
553         return -EINVAL;
554 }
555
556 struct proto_map {
557         uint32_t optype;
558         uint32_t protid;
559         int (*protoinfo_func)(uint16_t);
560 };
561
562 static const struct proto_map proto_table[] = {
563 /*1*/   {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_SSL30_PRF,     __rta_ssl_proto},
564         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_TLS10_PRF,     __rta_ssl_proto},
565         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_TLS11_PRF,     __rta_ssl_proto},
566         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_TLS12_PRF,     __rta_ssl_proto},
567         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DTLS_PRF,      __rta_ssl_proto},
568         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_IKEV1_PRF,     __rta_ike_proto},
569         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_IKEV2_PRF,     __rta_ike_proto},
570         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_PUBLICKEYPAIR, __rta_dlc_proto},
571         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DSASIGN,       __rta_dlc_proto},
572         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DSAVERIFY,     __rta_dlc_proto},
573         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_IPSEC,         __rta_ipsec_proto},
574         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_SRTP,          __rta_srtp_proto},
575         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_SSL30,         __rta_ssl_proto},
576         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_TLS10,         __rta_ssl_proto},
577         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_TLS11,         __rta_ssl_proto},
578         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_TLS12,         __rta_ssl_proto},
579         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_DTLS,          __rta_ssl_proto},
580         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_MACSEC,        __rta_macsec_proto},
581         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_WIFI,          __rta_wifi_proto},
582         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_WIMAX,         __rta_wimax_proto},
583 /*21*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_BLOB,          __rta_blob_proto},
584         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DIFFIEHELLMAN, __rta_dlc_proto},
585         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_RSAENCRYPT,    __rta_rsa_enc_proto},
586         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_RSADECRYPT,    __rta_rsa_dec_proto},
587         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_3G_DCRC,       __rta_3g_dcrc_proto},
588         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_3G_RLC_PDU,    __rta_3g_rlc_proto},
589         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_3G_RLC_SDU,    __rta_3g_rlc_proto},
590         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_USER, __rta_lte_pdcp_proto},
591 /*29*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_CTRL, __rta_lte_pdcp_proto},
592         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_MD5,       __rta_dkp_proto},
593         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA1,      __rta_dkp_proto},
594         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA224,    __rta_dkp_proto},
595         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA256,    __rta_dkp_proto},
596         {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA384,    __rta_dkp_proto},
597 /*35*/  {OP_TYPE_UNI_PROTOCOL,   OP_PCLID_DKP_SHA512,    __rta_dkp_proto},
598         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_PUBLICKEYPAIR, __rta_dlc_proto},
599 /*37*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_DSASIGN,       __rta_dlc_proto},
600 /*38*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_CTRL_MIXED,
601          __rta_lte_pdcp_mixed_proto},
602         {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_IPSEC_NEW,     __rta_ipsec_proto},
603 /*40*/  {OP_TYPE_DECAP_PROTOCOL, OP_PCLID_LTE_PDCP_USER_RN,
604         __rta_lte_pdcp_mixed_proto},
605 };
606
607 /*
608  * Allowed OPERATION protocols for each SEC Era.
609  * Values represent the number of entries from proto_table[] that are supported.
610  */
611 static const unsigned int proto_table_sz[] = {21, 29, 29, 29, 29, 35, 37,
612                                                 40, 40, 40};
613
614 static inline int
615 rta_proto_operation(struct program *program, uint32_t optype,
616                                       uint32_t protid, uint16_t protoinfo)
617 {
618         uint32_t opcode = CMD_OPERATION;
619         unsigned int i, found = 0;
620         uint32_t optype_tmp = optype;
621         unsigned int start_pc = program->current_pc;
622         int ret = -EINVAL;
623
624         for (i = 0; i < proto_table_sz[rta_sec_era]; i++) {
625                 /* clear last bit in optype to match also decap proto */
626                 optype_tmp &= (uint32_t)~(1 << OP_TYPE_SHIFT);
627                 if (optype_tmp == proto_table[i].optype) {
628                         if (proto_table[i].protid == protid) {
629                                 /* nothing else to verify */
630                                 if (proto_table[i].protoinfo_func == NULL) {
631                                         found = 1;
632                                         break;
633                                 }
634                                 /* check protoinfo */
635                                 ret = (*proto_table[i].protoinfo_func)
636                                                 (protoinfo);
637                                 if (ret < 0) {
638                                         pr_err("PROTO_DESC: Bad PROTO Type. SEC Program Line: %d\n",
639                                                program->current_pc);
640                                         goto err;
641                                 }
642                                 found = 1;
643                                 break;
644                         }
645                 }
646         }
647         if (!found) {
648                 pr_err("PROTO_DESC: Operation Type Mismatch. SEC Program Line: %d\n",
649                        program->current_pc);
650                 goto err;
651         }
652
653         __rta_out32(program, opcode | optype | protid | protoinfo);
654         program->current_instruction++;
655         return (int)start_pc;
656
657  err:
658         program->first_error_pc = start_pc;
659         program->current_instruction++;
660         return ret;
661 }
662
663 static inline int
664 rta_dkp_proto(struct program *program, uint32_t protid,
665                                 uint16_t key_src, uint16_t key_dst,
666                                 uint16_t keylen, uint64_t key,
667                                 enum rta_data_type key_type)
668 {
669         unsigned int start_pc = program->current_pc;
670         unsigned int in_words = 0, out_words = 0;
671         int ret;
672
673         key_src &= OP_PCL_DKP_SRC_MASK;
674         key_dst &= OP_PCL_DKP_DST_MASK;
675         keylen &= OP_PCL_DKP_KEY_MASK;
676
677         ret = rta_proto_operation(program, OP_TYPE_UNI_PROTOCOL, protid,
678                                   key_src | key_dst | keylen);
679         if (ret < 0)
680                 return ret;
681
682         if ((key_src == OP_PCL_DKP_SRC_PTR) ||
683             (key_src == OP_PCL_DKP_SRC_SGF)) {
684                 __rta_out64(program, program->ps, key);
685                 in_words = program->ps ? 2 : 1;
686         } else if (key_src == OP_PCL_DKP_SRC_IMM) {
687                 __rta_inline_data(program, key, inline_flags(key_type), keylen);
688                 in_words = (unsigned int)((keylen + 3) / 4);
689         }
690
691         if ((key_dst == OP_PCL_DKP_DST_PTR) ||
692             (key_dst == OP_PCL_DKP_DST_SGF)) {
693                 out_words = in_words;
694         } else  if (key_dst == OP_PCL_DKP_DST_IMM) {
695                 out_words = split_key_len(protid) / 4;
696         }
697
698         if (out_words < in_words) {
699                 pr_err("PROTO_DESC: DKP doesn't currently support a smaller descriptor\n");
700                 program->first_error_pc = start_pc;
701                 return -EINVAL;
702         }
703
704         /* If needed, reserve space in resulting descriptor for derived key */
705         program->current_pc += (out_words - in_words);
706
707         return (int)start_pc;
708 }
709
710 #endif /* __RTA_PROTOCOL_CMD_H__ */