GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / s390 / crypto / zcrypt_msgtype6.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  *  Copyright IBM Corp. 2001, 2022
4  *  Author(s): Robert Burroughs
5  *             Eric Rossman (edrossma@us.ibm.com)
6  *
7  *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
8  *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
9  *                                Ralph Wuerthner <rwuerthn@de.ibm.com>
10  *  MSGTYPE restruct:             Holger Dengler <hd@linux.vnet.ibm.com>
11  */
12
13 #define KMSG_COMPONENT "zcrypt"
14 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
15
16 #include <linux/module.h>
17 #include <linux/init.h>
18 #include <linux/err.h>
19 #include <linux/delay.h>
20 #include <linux/slab.h>
21 #include <linux/atomic.h>
22 #include <linux/uaccess.h>
23
24 #include "ap_bus.h"
25 #include "zcrypt_api.h"
26 #include "zcrypt_error.h"
27 #include "zcrypt_msgtype6.h"
28 #include "zcrypt_cca_key.h"
29
30 #define CEXXC_MAX_ICA_RESPONSE_SIZE 0x77c /* max size type86 v2 reply       */
31
32 #define CEIL4(x) ((((x) + 3) / 4) * 4)
33
34 struct response_type {
35         struct completion work;
36         int type;
37 };
38
39 #define CEXXC_RESPONSE_TYPE_ICA  0
40 #define CEXXC_RESPONSE_TYPE_XCRB 1
41 #define CEXXC_RESPONSE_TYPE_EP11 2
42
43 MODULE_AUTHOR("IBM Corporation");
44 MODULE_DESCRIPTION("Cryptographic Coprocessor (message type 6), " \
45                    "Copyright IBM Corp. 2001, 2012");
46 MODULE_LICENSE("GPL");
47
48 struct function_and_rules_block {
49         unsigned char function_code[2];
50         unsigned short ulen;
51         unsigned char only_rule[8];
52 } __packed;
53
54 /*
55  * The following is used to initialize the CPRBX passed to the CEXxC/CEXxP
56  * card in a type6 message. The 3 fields that must be filled in at execution
57  * time are  req_parml, rpl_parml and usage_domain.
58  * Everything about this interface is ascii/big-endian, since the
59  * device does *not* have 'Intel inside'.
60  *
61  * The CPRBX is followed immediately by the parm block.
62  * The parm block contains:
63  * - function code ('PD' 0x5044 or 'PK' 0x504B)
64  * - rule block (one of:)
65  *   + 0x000A 'PKCS-1.2' (MCL2 'PD')
66  *   + 0x000A 'ZERO-PAD' (MCL2 'PK')
67  *   + 0x000A 'ZERO-PAD' (MCL3 'PD' or CEX2C 'PD')
68  *   + 0x000A 'MRP     ' (MCL3 'PK' or CEX2C 'PK')
69  * - VUD block
70  */
71 static const struct CPRBX static_cprbx = {
72         .cprb_len       =  0x00DC,
73         .cprb_ver_id    =  0x02,
74         .func_id        = {0x54, 0x32},
75 };
76
77 int speed_idx_cca(int req_type)
78 {
79         switch (req_type) {
80         case 0x4142:
81         case 0x4149:
82         case 0x414D:
83         case 0x4341:
84         case 0x4344:
85         case 0x4354:
86         case 0x4358:
87         case 0x444B:
88         case 0x4558:
89         case 0x4643:
90         case 0x4651:
91         case 0x4C47:
92         case 0x4C4B:
93         case 0x4C51:
94         case 0x4F48:
95         case 0x504F:
96         case 0x5053:
97         case 0x5058:
98         case 0x5343:
99         case 0x5344:
100         case 0x5345:
101         case 0x5350:
102                 return LOW;
103         case 0x414B:
104         case 0x4345:
105         case 0x4349:
106         case 0x434D:
107         case 0x4847:
108         case 0x4849:
109         case 0x484D:
110         case 0x4850:
111         case 0x4851:
112         case 0x4954:
113         case 0x4958:
114         case 0x4B43:
115         case 0x4B44:
116         case 0x4B45:
117         case 0x4B47:
118         case 0x4B48:
119         case 0x4B49:
120         case 0x4B4E:
121         case 0x4B50:
122         case 0x4B52:
123         case 0x4B54:
124         case 0x4B58:
125         case 0x4D50:
126         case 0x4D53:
127         case 0x4D56:
128         case 0x4D58:
129         case 0x5044:
130         case 0x5045:
131         case 0x5046:
132         case 0x5047:
133         case 0x5049:
134         case 0x504B:
135         case 0x504D:
136         case 0x5254:
137         case 0x5347:
138         case 0x5349:
139         case 0x534B:
140         case 0x534D:
141         case 0x5356:
142         case 0x5358:
143         case 0x5443:
144         case 0x544B:
145         case 0x5647:
146                 return HIGH;
147         default:
148                 return MEDIUM;
149         }
150 }
151
152 int speed_idx_ep11(int req_type)
153 {
154         switch (req_type) {
155         case  1:
156         case  2:
157         case 36:
158         case 37:
159         case 38:
160         case 39:
161         case 40:
162                 return LOW;
163         case 17:
164         case 18:
165         case 19:
166         case 20:
167         case 21:
168         case 22:
169         case 26:
170         case 30:
171         case 31:
172         case 32:
173         case 33:
174         case 34:
175         case 35:
176                 return HIGH;
177         default:
178                 return MEDIUM;
179         }
180 }
181
182 /*
183  * Convert a ICAMEX message to a type6 MEX message.
184  *
185  * @zq: crypto device pointer
186  * @ap_msg: pointer to AP message
187  * @mex: pointer to user input data
188  *
189  * Returns 0 on success or negative errno value.
190  */
191 static int icamex_msg_to_type6mex_msgx(struct zcrypt_queue *zq,
192                                        struct ap_message *ap_msg,
193                                        struct ica_rsa_modexpo *mex)
194 {
195         static struct type6_hdr static_type6_hdrX = {
196                 .type           =  0x06,
197                 .offset1        =  0x00000058,
198                 .agent_id       = {'C', 'A',},
199                 .function_code  = {'P', 'K'},
200         };
201         static struct function_and_rules_block static_pke_fnr = {
202                 .function_code  = {'P', 'K'},
203                 .ulen           = 10,
204                 .only_rule      = {'M', 'R', 'P', ' ', ' ', ' ', ' ', ' '}
205         };
206         struct {
207                 struct type6_hdr hdr;
208                 struct CPRBX cprbx;
209                 struct function_and_rules_block fr;
210                 unsigned short length;
211                 char text[0];
212         } __packed * msg = ap_msg->msg;
213         int size;
214
215         /*
216          * The inputdatalength was a selection criteria in the dispatching
217          * function zcrypt_rsa_modexpo(). However, make sure the following
218          * copy_from_user() never exceeds the allocated buffer space.
219          */
220         if (WARN_ON_ONCE(mex->inputdatalength > PAGE_SIZE))
221                 return -EINVAL;
222
223         /* VUD.ciphertext */
224         msg->length = mex->inputdatalength + 2;
225         if (copy_from_user(msg->text, mex->inputdata, mex->inputdatalength))
226                 return -EFAULT;
227
228         /* Set up key which is located after the variable length text. */
229         size = zcrypt_type6_mex_key_en(mex, msg->text + mex->inputdatalength);
230         if (size < 0)
231                 return size;
232         size += sizeof(*msg) + mex->inputdatalength;
233
234         /* message header, cprbx and f&r */
235         msg->hdr = static_type6_hdrX;
236         msg->hdr.tocardlen1 = size - sizeof(msg->hdr);
237         msg->hdr.fromcardlen1 = CEXXC_MAX_ICA_RESPONSE_SIZE - sizeof(msg->hdr);
238
239         msg->cprbx = static_cprbx;
240         msg->cprbx.domain = AP_QID_QUEUE(zq->queue->qid);
241         msg->cprbx.rpl_msgbl = msg->hdr.fromcardlen1;
242
243         msg->fr = static_pke_fnr;
244
245         msg->cprbx.req_parml = size - sizeof(msg->hdr) - sizeof(msg->cprbx);
246
247         ap_msg->len = size;
248         return 0;
249 }
250
251 /*
252  * Convert a ICACRT message to a type6 CRT message.
253  *
254  * @zq: crypto device pointer
255  * @ap_msg: pointer to AP message
256  * @crt: pointer to user input data
257  *
258  * Returns 0 on success or negative errno value.
259  */
260 static int icacrt_msg_to_type6crt_msgx(struct zcrypt_queue *zq,
261                                        struct ap_message *ap_msg,
262                                        struct ica_rsa_modexpo_crt *crt)
263 {
264         static struct type6_hdr static_type6_hdrX = {
265                 .type           =  0x06,
266                 .offset1        =  0x00000058,
267                 .agent_id       = {'C', 'A',},
268                 .function_code  = {'P', 'D'},
269         };
270         static struct function_and_rules_block static_pkd_fnr = {
271                 .function_code  = {'P', 'D'},
272                 .ulen           = 10,
273                 .only_rule      = {'Z', 'E', 'R', 'O', '-', 'P', 'A', 'D'}
274         };
275
276         struct {
277                 struct type6_hdr hdr;
278                 struct CPRBX cprbx;
279                 struct function_and_rules_block fr;
280                 unsigned short length;
281                 char text[0];
282         } __packed * msg = ap_msg->msg;
283         int size;
284
285         /*
286          * The inputdatalength was a selection criteria in the dispatching
287          * function zcrypt_rsa_crt(). However, make sure the following
288          * copy_from_user() never exceeds the allocated buffer space.
289          */
290         if (WARN_ON_ONCE(crt->inputdatalength > PAGE_SIZE))
291                 return -EINVAL;
292
293         /* VUD.ciphertext */
294         msg->length = crt->inputdatalength + 2;
295         if (copy_from_user(msg->text, crt->inputdata, crt->inputdatalength))
296                 return -EFAULT;
297
298         /* Set up key which is located after the variable length text. */
299         size = zcrypt_type6_crt_key(crt, msg->text + crt->inputdatalength);
300         if (size < 0)
301                 return size;
302         size += sizeof(*msg) + crt->inputdatalength;    /* total size of msg */
303
304         /* message header, cprbx and f&r */
305         msg->hdr = static_type6_hdrX;
306         msg->hdr.tocardlen1 = size -  sizeof(msg->hdr);
307         msg->hdr.fromcardlen1 = CEXXC_MAX_ICA_RESPONSE_SIZE - sizeof(msg->hdr);
308
309         msg->cprbx = static_cprbx;
310         msg->cprbx.domain = AP_QID_QUEUE(zq->queue->qid);
311         msg->cprbx.req_parml = msg->cprbx.rpl_msgbl =
312                 size - sizeof(msg->hdr) - sizeof(msg->cprbx);
313
314         msg->fr = static_pkd_fnr;
315
316         ap_msg->len = size;
317         return 0;
318 }
319
320 /*
321  * Convert a XCRB message to a type6 CPRB message.
322  *
323  * @zq: crypto device pointer
324  * @ap_msg: pointer to AP message
325  * @xcRB: pointer to user input data
326  *
327  * Returns 0 on success or -EFAULT, -EINVAL.
328  */
329 struct type86_fmt2_msg {
330         struct type86_hdr hdr;
331         struct type86_fmt2_ext fmt2;
332 } __packed;
333
334 static int xcrb_msg_to_type6cprb_msgx(bool userspace, struct ap_message *ap_msg,
335                                       struct ica_xcRB *xcrb,
336                                       unsigned int *fcode,
337                                       unsigned short **dom)
338 {
339         static struct type6_hdr static_type6_hdrX = {
340                 .type           =  0x06,
341                 .offset1        =  0x00000058,
342         };
343         struct {
344                 struct type6_hdr hdr;
345                 struct CPRBX cprbx;
346         } __packed * msg = ap_msg->msg;
347
348         int rcblen = CEIL4(xcrb->request_control_blk_length);
349         int req_sumlen, resp_sumlen;
350         char *req_data = ap_msg->msg + sizeof(struct type6_hdr) + rcblen;
351         char *function_code;
352
353         if (CEIL4(xcrb->request_control_blk_length) <
354                         xcrb->request_control_blk_length)
355                 return -EINVAL; /* overflow after alignment*/
356
357         /* length checks */
358         ap_msg->len = sizeof(struct type6_hdr) +
359                 CEIL4(xcrb->request_control_blk_length) +
360                 xcrb->request_data_length;
361         if (ap_msg->len > ap_msg->bufsize)
362                 return -EINVAL;
363
364         /*
365          * Overflow check
366          * sum must be greater (or equal) than the largest operand
367          */
368         req_sumlen = CEIL4(xcrb->request_control_blk_length) +
369                         xcrb->request_data_length;
370         if ((CEIL4(xcrb->request_control_blk_length) <=
371              xcrb->request_data_length) ?
372             req_sumlen < xcrb->request_data_length :
373             req_sumlen < CEIL4(xcrb->request_control_blk_length)) {
374                 return -EINVAL;
375         }
376
377         if (CEIL4(xcrb->reply_control_blk_length) <
378                         xcrb->reply_control_blk_length)
379                 return -EINVAL; /* overflow after alignment*/
380
381         /*
382          * Overflow check
383          * sum must be greater (or equal) than the largest operand
384          */
385         resp_sumlen = CEIL4(xcrb->reply_control_blk_length) +
386                         xcrb->reply_data_length;
387         if ((CEIL4(xcrb->reply_control_blk_length) <=
388              xcrb->reply_data_length) ?
389             resp_sumlen < xcrb->reply_data_length :
390             resp_sumlen < CEIL4(xcrb->reply_control_blk_length)) {
391                 return -EINVAL;
392         }
393
394         /* prepare type6 header */
395         msg->hdr = static_type6_hdrX;
396         memcpy(msg->hdr.agent_id, &xcrb->agent_ID, sizeof(xcrb->agent_ID));
397         msg->hdr.tocardlen1 = xcrb->request_control_blk_length;
398         if (xcrb->request_data_length) {
399                 msg->hdr.offset2 = msg->hdr.offset1 + rcblen;
400                 msg->hdr.tocardlen2 = xcrb->request_data_length;
401         }
402         msg->hdr.fromcardlen1 = xcrb->reply_control_blk_length;
403         msg->hdr.fromcardlen2 = xcrb->reply_data_length;
404
405         /* prepare CPRB */
406         if (z_copy_from_user(userspace, &msg->cprbx, xcrb->request_control_blk_addr,
407                              xcrb->request_control_blk_length))
408                 return -EFAULT;
409         if (msg->cprbx.cprb_len + sizeof(msg->hdr.function_code) >
410             xcrb->request_control_blk_length)
411                 return -EINVAL;
412         function_code = ((unsigned char *)&msg->cprbx) + msg->cprbx.cprb_len;
413         memcpy(msg->hdr.function_code, function_code,
414                sizeof(msg->hdr.function_code));
415
416         *fcode = (msg->hdr.function_code[0] << 8) | msg->hdr.function_code[1];
417         *dom = (unsigned short *)&msg->cprbx.domain;
418
419         /* check subfunction, US and AU need special flag with NQAP */
420         if (memcmp(function_code, "US", 2) == 0 ||
421             memcmp(function_code, "AU", 2) == 0)
422                 ap_msg->flags |= AP_MSG_FLAG_SPECIAL;
423
424 #ifdef CONFIG_ZCRYPT_DEBUG
425         if (ap_msg->fi.flags & AP_FI_FLAG_TOGGLE_SPECIAL)
426                 ap_msg->flags ^= AP_MSG_FLAG_SPECIAL;
427 #endif
428
429         /* check CPRB minor version, set info bits in ap_message flag field */
430         switch (*(unsigned short *)(&msg->cprbx.func_id[0])) {
431         case 0x5432: /* "T2" */
432                 ap_msg->flags |= AP_MSG_FLAG_USAGE;
433                 break;
434         case 0x5433: /* "T3" */
435         case 0x5435: /* "T5" */
436         case 0x5436: /* "T6" */
437         case 0x5437: /* "T7" */
438                 ap_msg->flags |= AP_MSG_FLAG_ADMIN;
439                 break;
440         default:
441                 ZCRYPT_DBF_DBG("%s unknown CPRB minor version '%c%c'\n",
442                                __func__, msg->cprbx.func_id[0],
443                                msg->cprbx.func_id[1]);
444         }
445
446         /* copy data block */
447         if (xcrb->request_data_length &&
448             z_copy_from_user(userspace, req_data, xcrb->request_data_address,
449                              xcrb->request_data_length))
450                 return -EFAULT;
451
452         return 0;
453 }
454
455 static int xcrb_msg_to_type6_ep11cprb_msgx(bool userspace, struct ap_message *ap_msg,
456                                            struct ep11_urb *xcrb,
457                                            unsigned int *fcode,
458                                            unsigned int *domain)
459 {
460         unsigned int lfmt;
461         static struct type6_hdr static_type6_ep11_hdr = {
462                 .type           =  0x06,
463                 .rqid           = {0x00, 0x01},
464                 .function_code  = {0x00, 0x00},
465                 .agent_id[0]    =  0x58,        /* {'X'} */
466                 .agent_id[1]    =  0x43,        /* {'C'} */
467                 .offset1        =  0x00000058,
468         };
469
470         struct {
471                 struct type6_hdr hdr;
472                 struct ep11_cprb cprbx;
473                 unsigned char   pld_tag;        /* fixed value 0x30 */
474                 unsigned char   pld_lenfmt;     /* payload length format */
475         } __packed * msg = ap_msg->msg;
476
477         struct pld_hdr {
478                 unsigned char   func_tag;       /* fixed value 0x4 */
479                 unsigned char   func_len;       /* fixed value 0x4 */
480                 unsigned int    func_val;       /* function ID     */
481                 unsigned char   dom_tag;        /* fixed value 0x4 */
482                 unsigned char   dom_len;        /* fixed value 0x4 */
483                 unsigned int    dom_val;        /* domain id       */
484         } __packed * payload_hdr = NULL;
485
486         if (CEIL4(xcrb->req_len) < xcrb->req_len)
487                 return -EINVAL; /* overflow after alignment*/
488
489         /* length checks */
490         ap_msg->len = sizeof(struct type6_hdr) + CEIL4(xcrb->req_len);
491         if (ap_msg->len > ap_msg->bufsize)
492                 return -EINVAL;
493
494         if (CEIL4(xcrb->resp_len) < xcrb->resp_len)
495                 return -EINVAL; /* overflow after alignment*/
496
497         /* prepare type6 header */
498         msg->hdr = static_type6_ep11_hdr;
499         msg->hdr.tocardlen1   = xcrb->req_len;
500         msg->hdr.fromcardlen1 = xcrb->resp_len;
501
502         /* Import CPRB data from the ioctl input parameter */
503         if (z_copy_from_user(userspace, &msg->cprbx.cprb_len,
504                              (char __force __user *)xcrb->req, xcrb->req_len)) {
505                 return -EFAULT;
506         }
507
508         if ((msg->pld_lenfmt & 0x80) == 0x80) { /*ext.len.fmt 2 or 3*/
509                 switch (msg->pld_lenfmt & 0x03) {
510                 case 1:
511                         lfmt = 2;
512                         break;
513                 case 2:
514                         lfmt = 3;
515                         break;
516                 default:
517                         return -EINVAL;
518                 }
519         } else {
520                 lfmt = 1; /* length format #1 */
521         }
522         payload_hdr = (struct pld_hdr *)((&msg->pld_lenfmt) + lfmt);
523         *fcode = payload_hdr->func_val & 0xFFFF;
524
525         /* enable special processing based on the cprbs flags special bit */
526         if (msg->cprbx.flags & 0x20)
527                 ap_msg->flags |= AP_MSG_FLAG_SPECIAL;
528
529 #ifdef CONFIG_ZCRYPT_DEBUG
530         if (ap_msg->fi.flags & AP_FI_FLAG_TOGGLE_SPECIAL)
531                 ap_msg->flags ^= AP_MSG_FLAG_SPECIAL;
532 #endif
533
534         /* set info bits in ap_message flag field */
535         if (msg->cprbx.flags & 0x80)
536                 ap_msg->flags |= AP_MSG_FLAG_ADMIN;
537         else
538                 ap_msg->flags |= AP_MSG_FLAG_USAGE;
539
540         *domain = msg->cprbx.target_id;
541
542         return 0;
543 }
544
545 /*
546  * Copy results from a type 86 ICA reply message back to user space.
547  *
548  * @zq: crypto device pointer
549  * @reply: reply AP message.
550  * @data: pointer to user output data
551  * @length: size of user output data
552  *
553  * Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error.
554  */
555 struct type86x_reply {
556         struct type86_hdr hdr;
557         struct type86_fmt2_ext fmt2;
558         struct CPRBX cprbx;
559         unsigned char pad[4];   /* 4 byte function code/rules block ? */
560         unsigned short length;
561         char text[];
562 } __packed;
563
564 struct type86_ep11_reply {
565         struct type86_hdr hdr;
566         struct type86_fmt2_ext fmt2;
567         struct ep11_cprb cprbx;
568 } __packed;
569
570 static int convert_type86_ica(struct zcrypt_queue *zq,
571                               struct ap_message *reply,
572                               char __user *outputdata,
573                               unsigned int outputdatalength)
574 {
575         static unsigned char static_pad[] = {
576                 0x00, 0x02,
577                 0x1B, 0x7B, 0x5D, 0xB5, 0x75, 0x01, 0x3D, 0xFD,
578                 0x8D, 0xD1, 0xC7, 0x03, 0x2D, 0x09, 0x23, 0x57,
579                 0x89, 0x49, 0xB9, 0x3F, 0xBB, 0x99, 0x41, 0x5B,
580                 0x75, 0x21, 0x7B, 0x9D, 0x3B, 0x6B, 0x51, 0x39,
581                 0xBB, 0x0D, 0x35, 0xB9, 0x89, 0x0F, 0x93, 0xA5,
582                 0x0B, 0x47, 0xF1, 0xD3, 0xBB, 0xCB, 0xF1, 0x9D,
583                 0x23, 0x73, 0x71, 0xFF, 0xF3, 0xF5, 0x45, 0xFB,
584                 0x61, 0x29, 0x23, 0xFD, 0xF1, 0x29, 0x3F, 0x7F,
585                 0x17, 0xB7, 0x1B, 0xA9, 0x19, 0xBD, 0x57, 0xA9,
586                 0xD7, 0x95, 0xA3, 0xCB, 0xED, 0x1D, 0xDB, 0x45,
587                 0x7D, 0x11, 0xD1, 0x51, 0x1B, 0xED, 0x71, 0xE9,
588                 0xB1, 0xD1, 0xAB, 0xAB, 0x21, 0x2B, 0x1B, 0x9F,
589                 0x3B, 0x9F, 0xF7, 0xF7, 0xBD, 0x63, 0xEB, 0xAD,
590                 0xDF, 0xB3, 0x6F, 0x5B, 0xDB, 0x8D, 0xA9, 0x5D,
591                 0xE3, 0x7D, 0x77, 0x49, 0x47, 0xF5, 0xA7, 0xFD,
592                 0xAB, 0x2F, 0x27, 0x35, 0x77, 0xD3, 0x49, 0xC9,
593                 0x09, 0xEB, 0xB1, 0xF9, 0xBF, 0x4B, 0xCB, 0x2B,
594                 0xEB, 0xEB, 0x05, 0xFF, 0x7D, 0xC7, 0x91, 0x8B,
595                 0x09, 0x83, 0xB9, 0xB9, 0x69, 0x33, 0x39, 0x6B,
596                 0x79, 0x75, 0x19, 0xBF, 0xBB, 0x07, 0x1D, 0xBD,
597                 0x29, 0xBF, 0x39, 0x95, 0x93, 0x1D, 0x35, 0xC7,
598                 0xC9, 0x4D, 0xE5, 0x97, 0x0B, 0x43, 0x9B, 0xF1,
599                 0x16, 0x93, 0x03, 0x1F, 0xA5, 0xFB, 0xDB, 0xF3,
600                 0x27, 0x4F, 0x27, 0x61, 0x05, 0x1F, 0xB9, 0x23,
601                 0x2F, 0xC3, 0x81, 0xA9, 0x23, 0x71, 0x55, 0x55,
602                 0xEB, 0xED, 0x41, 0xE5, 0xF3, 0x11, 0xF1, 0x43,
603                 0x69, 0x03, 0xBD, 0x0B, 0x37, 0x0F, 0x51, 0x8F,
604                 0x0B, 0xB5, 0x89, 0x5B, 0x67, 0xA9, 0xD9, 0x4F,
605                 0x01, 0xF9, 0x21, 0x77, 0x37, 0x73, 0x79, 0xC5,
606                 0x7F, 0x51, 0xC1, 0xCF, 0x97, 0xA1, 0x75, 0xAD,
607                 0x35, 0x9D, 0xD3, 0xD3, 0xA7, 0x9D, 0x5D, 0x41,
608                 0x6F, 0x65, 0x1B, 0xCF, 0xA9, 0x87, 0x91, 0x09
609         };
610         struct type86x_reply *msg = reply->msg;
611         unsigned short service_rc, service_rs;
612         unsigned int reply_len, pad_len;
613         char *data;
614
615         service_rc = msg->cprbx.ccp_rtcode;
616         if (unlikely(service_rc != 0)) {
617                 service_rs = msg->cprbx.ccp_rscode;
618                 if ((service_rc == 8 && service_rs == 66) ||
619                     (service_rc == 8 && service_rs == 65) ||
620                     (service_rc == 8 && service_rs == 72) ||
621                     (service_rc == 8 && service_rs == 770) ||
622                     (service_rc == 12 && service_rs == 769)) {
623                         ZCRYPT_DBF_WARN("%s dev=%02x.%04x rc/rs=%d/%d => rc=EINVAL\n",
624                                         __func__, AP_QID_CARD(zq->queue->qid),
625                                         AP_QID_QUEUE(zq->queue->qid),
626                                         (int)service_rc, (int)service_rs);
627                         return -EINVAL;
628                 }
629                 zq->online = 0;
630                 pr_err("Crypto dev=%02x.%04x rc/rs=%d/%d online=0 rc=EAGAIN\n",
631                        AP_QID_CARD(zq->queue->qid),
632                        AP_QID_QUEUE(zq->queue->qid),
633                        (int)service_rc, (int)service_rs);
634                 ZCRYPT_DBF_ERR("%s dev=%02x.%04x rc/rs=%d/%d => online=0 rc=EAGAIN\n",
635                                __func__, AP_QID_CARD(zq->queue->qid),
636                                AP_QID_QUEUE(zq->queue->qid),
637                                (int)service_rc, (int)service_rs);
638                 ap_send_online_uevent(&zq->queue->ap_dev, zq->online);
639                 return -EAGAIN;
640         }
641         data = msg->text;
642         reply_len = msg->length - 2;
643         if (reply_len > outputdatalength)
644                 return -EINVAL;
645         /*
646          * For all encipher requests, the length of the ciphertext (reply_len)
647          * will always equal the modulus length. For MEX decipher requests
648          * the output needs to get padded. Minimum pad size is 10.
649          *
650          * Currently, the cases where padding will be added is for:
651          * - PCIXCC_MCL2 using a CRT form token (since PKD didn't support
652          *   ZERO-PAD and CRT is only supported for PKD requests)
653          * - PCICC, always
654          */
655         pad_len = outputdatalength - reply_len;
656         if (pad_len > 0) {
657                 if (pad_len < 10)
658                         return -EINVAL;
659                 /* 'restore' padding left in the CEXXC card. */
660                 if (copy_to_user(outputdata, static_pad, pad_len - 1))
661                         return -EFAULT;
662                 if (put_user(0, outputdata + pad_len - 1))
663                         return -EFAULT;
664         }
665         /* Copy the crypto response to user space. */
666         if (copy_to_user(outputdata + pad_len, data, reply_len))
667                 return -EFAULT;
668         return 0;
669 }
670
671 /*
672  * Copy results from a type 86 XCRB reply message back to user space.
673  *
674  * @zq: crypto device pointer
675  * @reply: reply AP message.
676  * @xcrb: pointer to XCRB
677  *
678  * Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error.
679  */
680 static int convert_type86_xcrb(bool userspace, struct zcrypt_queue *zq,
681                                struct ap_message *reply,
682                                struct ica_xcRB *xcrb)
683 {
684         struct type86_fmt2_msg *msg = reply->msg;
685         char *data = reply->msg;
686
687         /* Copy CPRB to user */
688         if (xcrb->reply_control_blk_length < msg->fmt2.count1) {
689                 ZCRYPT_DBF_DBG("%s reply_control_blk_length %u < required %u => EMSGSIZE\n",
690                                __func__, xcrb->reply_control_blk_length,
691                                msg->fmt2.count1);
692                 return -EMSGSIZE;
693         }
694         if (z_copy_to_user(userspace, xcrb->reply_control_blk_addr,
695                            data + msg->fmt2.offset1, msg->fmt2.count1))
696                 return -EFAULT;
697         xcrb->reply_control_blk_length = msg->fmt2.count1;
698
699         /* Copy data buffer to user */
700         if (msg->fmt2.count2) {
701                 if (xcrb->reply_data_length < msg->fmt2.count2) {
702                         ZCRYPT_DBF_DBG("%s reply_data_length %u < required %u => EMSGSIZE\n",
703                                        __func__, xcrb->reply_data_length,
704                                        msg->fmt2.count2);
705                         return -EMSGSIZE;
706                 }
707                 if (z_copy_to_user(userspace, xcrb->reply_data_addr,
708                                    data + msg->fmt2.offset2, msg->fmt2.count2))
709                         return -EFAULT;
710         }
711         xcrb->reply_data_length = msg->fmt2.count2;
712
713         return 0;
714 }
715
716 /*
717  * Copy results from a type 86 EP11 XCRB reply message back to user space.
718  *
719  * @zq: crypto device pointer
720  * @reply: reply AP message.
721  * @xcrb: pointer to EP11 user request block
722  *
723  * Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error.
724  */
725 static int convert_type86_ep11_xcrb(bool userspace, struct zcrypt_queue *zq,
726                                     struct ap_message *reply,
727                                     struct ep11_urb *xcrb)
728 {
729         struct type86_fmt2_msg *msg = reply->msg;
730         char *data = reply->msg;
731
732         if (xcrb->resp_len < msg->fmt2.count1) {
733                 ZCRYPT_DBF_DBG("%s resp_len %u < required %u => EMSGSIZE\n",
734                                __func__, (unsigned int)xcrb->resp_len,
735                                msg->fmt2.count1);
736                 return -EMSGSIZE;
737         }
738
739         /* Copy response CPRB to user */
740         if (z_copy_to_user(userspace, (char __force __user *)xcrb->resp,
741                            data + msg->fmt2.offset1, msg->fmt2.count1))
742                 return -EFAULT;
743         xcrb->resp_len = msg->fmt2.count1;
744         return 0;
745 }
746
747 static int convert_type86_rng(struct zcrypt_queue *zq,
748                               struct ap_message *reply,
749                               char *buffer)
750 {
751         struct {
752                 struct type86_hdr hdr;
753                 struct type86_fmt2_ext fmt2;
754                 struct CPRBX cprbx;
755         } __packed * msg = reply->msg;
756         char *data = reply->msg;
757
758         if (msg->cprbx.ccp_rtcode != 0 || msg->cprbx.ccp_rscode != 0)
759                 return -EINVAL;
760         memcpy(buffer, data + msg->fmt2.offset2, msg->fmt2.count2);
761         return msg->fmt2.count2;
762 }
763
764 static int convert_response_ica(struct zcrypt_queue *zq,
765                                 struct ap_message *reply,
766                                 char __user *outputdata,
767                                 unsigned int outputdatalength)
768 {
769         struct type86x_reply *msg = reply->msg;
770
771         switch (msg->hdr.type) {
772         case TYPE82_RSP_CODE:
773         case TYPE88_RSP_CODE:
774                 return convert_error(zq, reply);
775         case TYPE86_RSP_CODE:
776                 if (msg->cprbx.ccp_rtcode &&
777                     msg->cprbx.ccp_rscode == 0x14f &&
778                     outputdatalength > 256) {
779                         if (zq->zcard->max_exp_bit_length <= 17) {
780                                 zq->zcard->max_exp_bit_length = 17;
781                                 return -EAGAIN;
782                         } else {
783                                 return -EINVAL;
784                         }
785                 }
786                 if (msg->hdr.reply_code)
787                         return convert_error(zq, reply);
788                 if (msg->cprbx.cprb_ver_id == 0x02)
789                         return convert_type86_ica(zq, reply,
790                                                   outputdata, outputdatalength);
791                 fallthrough;    /* wrong cprb version is an unknown response */
792         default:
793                 /* Unknown response type, this should NEVER EVER happen */
794                 zq->online = 0;
795                 pr_err("Crypto dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
796                        AP_QID_CARD(zq->queue->qid),
797                        AP_QID_QUEUE(zq->queue->qid),
798                        (int)msg->hdr.type);
799                 ZCRYPT_DBF_ERR(
800                         "%s dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
801                         __func__, AP_QID_CARD(zq->queue->qid),
802                         AP_QID_QUEUE(zq->queue->qid), (int)msg->hdr.type);
803                 ap_send_online_uevent(&zq->queue->ap_dev, zq->online);
804                 return -EAGAIN;
805         }
806 }
807
808 static int convert_response_xcrb(bool userspace, struct zcrypt_queue *zq,
809                                  struct ap_message *reply,
810                                  struct ica_xcRB *xcrb)
811 {
812         struct type86x_reply *msg = reply->msg;
813
814         switch (msg->hdr.type) {
815         case TYPE82_RSP_CODE:
816         case TYPE88_RSP_CODE:
817                 xcrb->status = 0x0008044DL; /* HDD_InvalidParm */
818                 return convert_error(zq, reply);
819         case TYPE86_RSP_CODE:
820                 if (msg->hdr.reply_code) {
821                         memcpy(&xcrb->status, msg->fmt2.apfs, sizeof(u32));
822                         return convert_error(zq, reply);
823                 }
824                 if (msg->cprbx.cprb_ver_id == 0x02)
825                         return convert_type86_xcrb(userspace, zq, reply, xcrb);
826                 fallthrough;    /* wrong cprb version is an unknown response */
827         default: /* Unknown response type, this should NEVER EVER happen */
828                 xcrb->status = 0x0008044DL; /* HDD_InvalidParm */
829                 zq->online = 0;
830                 pr_err("Crypto dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
831                        AP_QID_CARD(zq->queue->qid),
832                        AP_QID_QUEUE(zq->queue->qid),
833                        (int)msg->hdr.type);
834                 ZCRYPT_DBF_ERR(
835                         "%s dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
836                         __func__, AP_QID_CARD(zq->queue->qid),
837                         AP_QID_QUEUE(zq->queue->qid), (int)msg->hdr.type);
838                 ap_send_online_uevent(&zq->queue->ap_dev, zq->online);
839                 return -EAGAIN;
840         }
841 }
842
843 static int convert_response_ep11_xcrb(bool userspace, struct zcrypt_queue *zq,
844                                       struct ap_message *reply, struct ep11_urb *xcrb)
845 {
846         struct type86_ep11_reply *msg = reply->msg;
847
848         switch (msg->hdr.type) {
849         case TYPE82_RSP_CODE:
850         case TYPE87_RSP_CODE:
851                 return convert_error(zq, reply);
852         case TYPE86_RSP_CODE:
853                 if (msg->hdr.reply_code)
854                         return convert_error(zq, reply);
855                 if (msg->cprbx.cprb_ver_id == 0x04)
856                         return convert_type86_ep11_xcrb(userspace, zq, reply, xcrb);
857                 fallthrough;    /* wrong cprb version is an unknown resp */
858         default: /* Unknown response type, this should NEVER EVER happen */
859                 zq->online = 0;
860                 pr_err("Crypto dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
861                        AP_QID_CARD(zq->queue->qid),
862                        AP_QID_QUEUE(zq->queue->qid),
863                        (int)msg->hdr.type);
864                 ZCRYPT_DBF_ERR(
865                         "%s dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
866                         __func__, AP_QID_CARD(zq->queue->qid),
867                         AP_QID_QUEUE(zq->queue->qid), (int)msg->hdr.type);
868                 ap_send_online_uevent(&zq->queue->ap_dev, zq->online);
869                 return -EAGAIN;
870         }
871 }
872
873 static int convert_response_rng(struct zcrypt_queue *zq,
874                                 struct ap_message *reply,
875                                 char *data)
876 {
877         struct type86x_reply *msg = reply->msg;
878
879         switch (msg->hdr.type) {
880         case TYPE82_RSP_CODE:
881         case TYPE88_RSP_CODE:
882                 return -EINVAL;
883         case TYPE86_RSP_CODE:
884                 if (msg->hdr.reply_code)
885                         return -EINVAL;
886                 if (msg->cprbx.cprb_ver_id == 0x02)
887                         return convert_type86_rng(zq, reply, data);
888                 fallthrough;    /* wrong cprb version is an unknown response */
889         default: /* Unknown response type, this should NEVER EVER happen */
890                 zq->online = 0;
891                 pr_err("Crypto dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
892                        AP_QID_CARD(zq->queue->qid),
893                        AP_QID_QUEUE(zq->queue->qid),
894                        (int)msg->hdr.type);
895                 ZCRYPT_DBF_ERR(
896                         "%s dev=%02x.%04x unknown response type 0x%02x => online=0 rc=EAGAIN\n",
897                         __func__, AP_QID_CARD(zq->queue->qid),
898                         AP_QID_QUEUE(zq->queue->qid), (int)msg->hdr.type);
899                 ap_send_online_uevent(&zq->queue->ap_dev, zq->online);
900                 return -EAGAIN;
901         }
902 }
903
904 /*
905  * This function is called from the AP bus code after a crypto request
906  * "msg" has finished with the reply message "reply".
907  * It is called from tasklet context.
908  * @aq: pointer to the AP queue
909  * @msg: pointer to the AP message
910  * @reply: pointer to the AP reply message
911  */
912 static void zcrypt_msgtype6_receive(struct ap_queue *aq,
913                                     struct ap_message *msg,
914                                     struct ap_message *reply)
915 {
916         static struct error_hdr error_reply = {
917                 .type = TYPE82_RSP_CODE,
918                 .reply_code = REP82_ERROR_MACHINE_FAILURE,
919         };
920         struct response_type *resp_type =
921                 (struct response_type *)msg->private;
922         struct type86x_reply *t86r;
923         int len;
924
925         /* Copy the reply message to the request message buffer. */
926         if (!reply)
927                 goto out;       /* ap_msg->rc indicates the error */
928         t86r = reply->msg;
929         if (t86r->hdr.type == TYPE86_RSP_CODE &&
930             t86r->cprbx.cprb_ver_id == 0x02) {
931                 switch (resp_type->type) {
932                 case CEXXC_RESPONSE_TYPE_ICA:
933                         len = sizeof(struct type86x_reply) + t86r->length - 2;
934                         if (len > reply->bufsize || len > msg->bufsize) {
935                                 msg->rc = -EMSGSIZE;
936                         } else {
937                                 memcpy(msg->msg, reply->msg, len);
938                                 msg->len = len;
939                         }
940                         break;
941                 case CEXXC_RESPONSE_TYPE_XCRB:
942                         len = t86r->fmt2.offset2 + t86r->fmt2.count2;
943                         if (len > reply->bufsize || len > msg->bufsize) {
944                                 msg->rc = -EMSGSIZE;
945                         } else {
946                                 memcpy(msg->msg, reply->msg, len);
947                                 msg->len = len;
948                         }
949                         break;
950                 default:
951                         memcpy(msg->msg, &error_reply, sizeof(error_reply));
952                 }
953         } else {
954                 memcpy(msg->msg, reply->msg, sizeof(error_reply));
955         }
956 out:
957         complete(&resp_type->work);
958 }
959
960 /*
961  * This function is called from the AP bus code after a crypto request
962  * "msg" has finished with the reply message "reply".
963  * It is called from tasklet context.
964  * @aq: pointer to the AP queue
965  * @msg: pointer to the AP message
966  * @reply: pointer to the AP reply message
967  */
968 static void zcrypt_msgtype6_receive_ep11(struct ap_queue *aq,
969                                          struct ap_message *msg,
970                                          struct ap_message *reply)
971 {
972         static struct error_hdr error_reply = {
973                 .type = TYPE82_RSP_CODE,
974                 .reply_code = REP82_ERROR_MACHINE_FAILURE,
975         };
976         struct response_type *resp_type =
977                 (struct response_type *)msg->private;
978         struct type86_ep11_reply *t86r;
979         int len;
980
981         /* Copy the reply message to the request message buffer. */
982         if (!reply)
983                 goto out;       /* ap_msg->rc indicates the error */
984         t86r = reply->msg;
985         if (t86r->hdr.type == TYPE86_RSP_CODE &&
986             t86r->cprbx.cprb_ver_id == 0x04) {
987                 switch (resp_type->type) {
988                 case CEXXC_RESPONSE_TYPE_EP11:
989                         len = t86r->fmt2.offset1 + t86r->fmt2.count1;
990                         if (len > reply->bufsize || len > msg->bufsize) {
991                                 msg->rc = -EMSGSIZE;
992                         } else {
993                                 memcpy(msg->msg, reply->msg, len);
994                                 msg->len = len;
995                         }
996                         break;
997                 default:
998                         memcpy(msg->msg, &error_reply, sizeof(error_reply));
999                 }
1000         } else {
1001                 memcpy(msg->msg, reply->msg, sizeof(error_reply));
1002         }
1003 out:
1004         complete(&resp_type->work);
1005 }
1006
1007 static atomic_t zcrypt_step = ATOMIC_INIT(0);
1008
1009 /*
1010  * The request distributor calls this function if it picked the CEXxC
1011  * device to handle a modexpo request.
1012  * @zq: pointer to zcrypt_queue structure that identifies the
1013  *      CEXxC device to the request distributor
1014  * @mex: pointer to the modexpo request buffer
1015  */
1016 static long zcrypt_msgtype6_modexpo(struct zcrypt_queue *zq,
1017                                     struct ica_rsa_modexpo *mex,
1018                                     struct ap_message *ap_msg)
1019 {
1020         struct response_type resp_type = {
1021                 .type = CEXXC_RESPONSE_TYPE_ICA,
1022         };
1023         int rc;
1024
1025         ap_msg->msg = (void *)get_zeroed_page(GFP_KERNEL);
1026         if (!ap_msg->msg)
1027                 return -ENOMEM;
1028         ap_msg->bufsize = PAGE_SIZE;
1029         ap_msg->receive = zcrypt_msgtype6_receive;
1030         ap_msg->psmid = (((unsigned long long)current->pid) << 32) +
1031                 atomic_inc_return(&zcrypt_step);
1032         ap_msg->private = &resp_type;
1033         rc = icamex_msg_to_type6mex_msgx(zq, ap_msg, mex);
1034         if (rc)
1035                 goto out_free;
1036         init_completion(&resp_type.work);
1037         rc = ap_queue_message(zq->queue, ap_msg);
1038         if (rc)
1039                 goto out_free;
1040         rc = wait_for_completion_interruptible(&resp_type.work);
1041         if (rc == 0) {
1042                 rc = ap_msg->rc;
1043                 if (rc == 0)
1044                         rc = convert_response_ica(zq, ap_msg,
1045                                                   mex->outputdata,
1046                                                   mex->outputdatalength);
1047         } else {
1048                 /* Signal pending. */
1049                 ap_cancel_message(zq->queue, ap_msg);
1050         }
1051
1052 out_free:
1053         free_page((unsigned long)ap_msg->msg);
1054         ap_msg->private = NULL;
1055         ap_msg->msg = NULL;
1056         return rc;
1057 }
1058
1059 /*
1060  * The request distributor calls this function if it picked the CEXxC
1061  * device to handle a modexpo_crt request.
1062  * @zq: pointer to zcrypt_queue structure that identifies the
1063  *      CEXxC device to the request distributor
1064  * @crt: pointer to the modexpoc_crt request buffer
1065  */
1066 static long zcrypt_msgtype6_modexpo_crt(struct zcrypt_queue *zq,
1067                                         struct ica_rsa_modexpo_crt *crt,
1068                                         struct ap_message *ap_msg)
1069 {
1070         struct response_type resp_type = {
1071                 .type = CEXXC_RESPONSE_TYPE_ICA,
1072         };
1073         int rc;
1074
1075         ap_msg->msg = (void *)get_zeroed_page(GFP_KERNEL);
1076         if (!ap_msg->msg)
1077                 return -ENOMEM;
1078         ap_msg->bufsize = PAGE_SIZE;
1079         ap_msg->receive = zcrypt_msgtype6_receive;
1080         ap_msg->psmid = (((unsigned long long)current->pid) << 32) +
1081                 atomic_inc_return(&zcrypt_step);
1082         ap_msg->private = &resp_type;
1083         rc = icacrt_msg_to_type6crt_msgx(zq, ap_msg, crt);
1084         if (rc)
1085                 goto out_free;
1086         init_completion(&resp_type.work);
1087         rc = ap_queue_message(zq->queue, ap_msg);
1088         if (rc)
1089                 goto out_free;
1090         rc = wait_for_completion_interruptible(&resp_type.work);
1091         if (rc == 0) {
1092                 rc = ap_msg->rc;
1093                 if (rc == 0)
1094                         rc = convert_response_ica(zq, ap_msg,
1095                                                   crt->outputdata,
1096                                                   crt->outputdatalength);
1097         } else {
1098                 /* Signal pending. */
1099                 ap_cancel_message(zq->queue, ap_msg);
1100         }
1101
1102 out_free:
1103         free_page((unsigned long)ap_msg->msg);
1104         ap_msg->private = NULL;
1105         ap_msg->msg = NULL;
1106         return rc;
1107 }
1108
1109 /*
1110  * Prepare a CCA AP msg request.
1111  * Prepare a CCA AP msg: fetch the required data from userspace,
1112  * prepare the AP msg, fill some info into the ap_message struct,
1113  * extract some data from the CPRB and give back to the caller.
1114  * This function allocates memory and needs an ap_msg prepared
1115  * by the caller with ap_init_message(). Also the caller has to
1116  * make sure ap_release_message() is always called even on failure.
1117  */
1118 int prep_cca_ap_msg(bool userspace, struct ica_xcRB *xcrb,
1119                     struct ap_message *ap_msg,
1120                     unsigned int *func_code, unsigned short **dom)
1121 {
1122         struct response_type resp_type = {
1123                 .type = CEXXC_RESPONSE_TYPE_XCRB,
1124         };
1125
1126         ap_msg->bufsize = atomic_read(&ap_max_msg_size);
1127         ap_msg->msg = kmalloc(ap_msg->bufsize, GFP_KERNEL);
1128         if (!ap_msg->msg)
1129                 return -ENOMEM;
1130         ap_msg->receive = zcrypt_msgtype6_receive;
1131         ap_msg->psmid = (((unsigned long long)current->pid) << 32) +
1132                                 atomic_inc_return(&zcrypt_step);
1133         ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
1134         if (!ap_msg->private)
1135                 return -ENOMEM;
1136         return xcrb_msg_to_type6cprb_msgx(userspace, ap_msg, xcrb, func_code, dom);
1137 }
1138
1139 /*
1140  * The request distributor calls this function if it picked the CEXxC
1141  * device to handle a send_cprb request.
1142  * @zq: pointer to zcrypt_queue structure that identifies the
1143  *      CEXxC device to the request distributor
1144  * @xcrb: pointer to the send_cprb request buffer
1145  */
1146 static long zcrypt_msgtype6_send_cprb(bool userspace, struct zcrypt_queue *zq,
1147                                       struct ica_xcRB *xcrb,
1148                                       struct ap_message *ap_msg)
1149 {
1150         int rc;
1151         struct response_type *rtype = (struct response_type *)(ap_msg->private);
1152         struct {
1153                 struct type6_hdr hdr;
1154                 struct CPRBX cprbx;
1155                 /* ... more data blocks ... */
1156         } __packed * msg = ap_msg->msg;
1157
1158         /*
1159          * Set the queue's reply buffer length minus 128 byte padding
1160          * as reply limit for the card firmware.
1161          */
1162         msg->hdr.fromcardlen1 = min_t(unsigned int, msg->hdr.fromcardlen1,
1163                                       zq->reply.bufsize - 128);
1164         if (msg->hdr.fromcardlen2)
1165                 msg->hdr.fromcardlen2 =
1166                         zq->reply.bufsize - msg->hdr.fromcardlen1 - 128;
1167
1168         init_completion(&rtype->work);
1169         rc = ap_queue_message(zq->queue, ap_msg);
1170         if (rc)
1171                 goto out;
1172         rc = wait_for_completion_interruptible(&rtype->work);
1173         if (rc == 0) {
1174                 rc = ap_msg->rc;
1175                 if (rc == 0)
1176                         rc = convert_response_xcrb(userspace, zq, ap_msg, xcrb);
1177         } else {
1178                 /* Signal pending. */
1179                 ap_cancel_message(zq->queue, ap_msg);
1180         }
1181
1182 out:
1183         if (rc)
1184                 ZCRYPT_DBF_DBG("%s send cprb at dev=%02x.%04x rc=%d\n",
1185                                __func__, AP_QID_CARD(zq->queue->qid),
1186                                AP_QID_QUEUE(zq->queue->qid), rc);
1187         return rc;
1188 }
1189
1190 /*
1191  * Prepare an EP11 AP msg request.
1192  * Prepare an EP11 AP msg: fetch the required data from userspace,
1193  * prepare the AP msg, fill some info into the ap_message struct,
1194  * extract some data from the CPRB and give back to the caller.
1195  * This function allocates memory and needs an ap_msg prepared
1196  * by the caller with ap_init_message(). Also the caller has to
1197  * make sure ap_release_message() is always called even on failure.
1198  */
1199 int prep_ep11_ap_msg(bool userspace, struct ep11_urb *xcrb,
1200                      struct ap_message *ap_msg,
1201                      unsigned int *func_code, unsigned int *domain)
1202 {
1203         struct response_type resp_type = {
1204                 .type = CEXXC_RESPONSE_TYPE_EP11,
1205         };
1206
1207         ap_msg->bufsize = atomic_read(&ap_max_msg_size);
1208         ap_msg->msg = kmalloc(ap_msg->bufsize, GFP_KERNEL);
1209         if (!ap_msg->msg)
1210                 return -ENOMEM;
1211         ap_msg->receive = zcrypt_msgtype6_receive_ep11;
1212         ap_msg->psmid = (((unsigned long long)current->pid) << 32) +
1213                                 atomic_inc_return(&zcrypt_step);
1214         ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
1215         if (!ap_msg->private)
1216                 return -ENOMEM;
1217         return xcrb_msg_to_type6_ep11cprb_msgx(userspace, ap_msg, xcrb,
1218                                                func_code, domain);
1219 }
1220
1221 /*
1222  * The request distributor calls this function if it picked the CEX4P
1223  * device to handle a send_ep11_cprb request.
1224  * @zq: pointer to zcrypt_queue structure that identifies the
1225  *        CEX4P device to the request distributor
1226  * @xcrb: pointer to the ep11 user request block
1227  */
1228 static long zcrypt_msgtype6_send_ep11_cprb(bool userspace, struct zcrypt_queue *zq,
1229                                            struct ep11_urb *xcrb,
1230                                            struct ap_message *ap_msg)
1231 {
1232         int rc;
1233         unsigned int lfmt;
1234         struct response_type *rtype = (struct response_type *)(ap_msg->private);
1235         struct {
1236                 struct type6_hdr hdr;
1237                 struct ep11_cprb cprbx;
1238                 unsigned char   pld_tag;        /* fixed value 0x30 */
1239                 unsigned char   pld_lenfmt;     /* payload length format */
1240         } __packed * msg = ap_msg->msg;
1241         struct pld_hdr {
1242                 unsigned char   func_tag;       /* fixed value 0x4 */
1243                 unsigned char   func_len;       /* fixed value 0x4 */
1244                 unsigned int    func_val;       /* function ID     */
1245                 unsigned char   dom_tag;        /* fixed value 0x4 */
1246                 unsigned char   dom_len;        /* fixed value 0x4 */
1247                 unsigned int    dom_val;        /* domain id       */
1248         } __packed * payload_hdr = NULL;
1249
1250         /*
1251          * The target domain field within the cprb body/payload block will be
1252          * replaced by the usage domain for non-management commands only.
1253          * Therefore we check the first bit of the 'flags' parameter for
1254          * management command indication.
1255          *   0 - non management command
1256          *   1 - management command
1257          */
1258         if (!((msg->cprbx.flags & 0x80) == 0x80)) {
1259                 msg->cprbx.target_id = (unsigned int)
1260                                         AP_QID_QUEUE(zq->queue->qid);
1261
1262                 if ((msg->pld_lenfmt & 0x80) == 0x80) { /*ext.len.fmt 2 or 3*/
1263                         switch (msg->pld_lenfmt & 0x03) {
1264                         case 1:
1265                                 lfmt = 2;
1266                                 break;
1267                         case 2:
1268                                 lfmt = 3;
1269                                 break;
1270                         default:
1271                                 return -EINVAL;
1272                         }
1273                 } else {
1274                         lfmt = 1; /* length format #1 */
1275                 }
1276                 payload_hdr = (struct pld_hdr *)((&msg->pld_lenfmt) + lfmt);
1277                 payload_hdr->dom_val = (unsigned int)
1278                                         AP_QID_QUEUE(zq->queue->qid);
1279         }
1280
1281         /*
1282          * Set the queue's reply buffer length minus the two prepend headers
1283          * as reply limit for the card firmware.
1284          */
1285         msg->hdr.fromcardlen1 = zq->reply.bufsize -
1286                 sizeof(struct type86_hdr) - sizeof(struct type86_fmt2_ext);
1287
1288         init_completion(&rtype->work);
1289         rc = ap_queue_message(zq->queue, ap_msg);
1290         if (rc)
1291                 goto out;
1292         rc = wait_for_completion_interruptible(&rtype->work);
1293         if (rc == 0) {
1294                 rc = ap_msg->rc;
1295                 if (rc == 0)
1296                         rc = convert_response_ep11_xcrb(userspace, zq, ap_msg, xcrb);
1297         } else {
1298                 /* Signal pending. */
1299                 ap_cancel_message(zq->queue, ap_msg);
1300         }
1301
1302 out:
1303         if (rc)
1304                 ZCRYPT_DBF_DBG("%s send cprb at dev=%02x.%04x rc=%d\n",
1305                                __func__, AP_QID_CARD(zq->queue->qid),
1306                                AP_QID_QUEUE(zq->queue->qid), rc);
1307         return rc;
1308 }
1309
1310 int prep_rng_ap_msg(struct ap_message *ap_msg, int *func_code,
1311                     unsigned int *domain)
1312 {
1313         struct response_type resp_type = {
1314                 .type = CEXXC_RESPONSE_TYPE_XCRB,
1315         };
1316
1317         ap_msg->bufsize = AP_DEFAULT_MAX_MSG_SIZE;
1318         ap_msg->msg = kmalloc(ap_msg->bufsize, GFP_KERNEL);
1319         if (!ap_msg->msg)
1320                 return -ENOMEM;
1321         ap_msg->receive = zcrypt_msgtype6_receive;
1322         ap_msg->psmid = (((unsigned long long)current->pid) << 32) +
1323                                 atomic_inc_return(&zcrypt_step);
1324         ap_msg->private = kmemdup(&resp_type, sizeof(resp_type), GFP_KERNEL);
1325         if (!ap_msg->private)
1326                 return -ENOMEM;
1327
1328         rng_type6cprb_msgx(ap_msg, ZCRYPT_RNG_BUFFER_SIZE, domain);
1329
1330         *func_code = HWRNG;
1331         return 0;
1332 }
1333
1334 /*
1335  * The request distributor calls this function if it picked the CEXxC
1336  * device to generate random data.
1337  * @zq: pointer to zcrypt_queue structure that identifies the
1338  *      CEXxC device to the request distributor
1339  * @buffer: pointer to a memory page to return random data
1340  */
1341 static long zcrypt_msgtype6_rng(struct zcrypt_queue *zq,
1342                                 char *buffer, struct ap_message *ap_msg)
1343 {
1344         struct {
1345                 struct type6_hdr hdr;
1346                 struct CPRBX cprbx;
1347                 char function_code[2];
1348                 short int rule_length;
1349                 char rule[8];
1350                 short int verb_length;
1351                 short int key_length;
1352         } __packed * msg = ap_msg->msg;
1353         struct response_type *rtype = (struct response_type *)(ap_msg->private);
1354         int rc;
1355
1356         msg->cprbx.domain = AP_QID_QUEUE(zq->queue->qid);
1357
1358         init_completion(&rtype->work);
1359         rc = ap_queue_message(zq->queue, ap_msg);
1360         if (rc)
1361                 goto out;
1362         rc = wait_for_completion_interruptible(&rtype->work);
1363         if (rc == 0) {
1364                 rc = ap_msg->rc;
1365                 if (rc == 0)
1366                         rc = convert_response_rng(zq, ap_msg, buffer);
1367         } else {
1368                 /* Signal pending. */
1369                 ap_cancel_message(zq->queue, ap_msg);
1370         }
1371 out:
1372         return rc;
1373 }
1374
1375 /*
1376  * The crypto operations for a CEXxC card.
1377  */
1378 static struct zcrypt_ops zcrypt_msgtype6_norng_ops = {
1379         .owner = THIS_MODULE,
1380         .name = MSGTYPE06_NAME,
1381         .variant = MSGTYPE06_VARIANT_NORNG,
1382         .rsa_modexpo = zcrypt_msgtype6_modexpo,
1383         .rsa_modexpo_crt = zcrypt_msgtype6_modexpo_crt,
1384         .send_cprb = zcrypt_msgtype6_send_cprb,
1385 };
1386
1387 static struct zcrypt_ops zcrypt_msgtype6_ops = {
1388         .owner = THIS_MODULE,
1389         .name = MSGTYPE06_NAME,
1390         .variant = MSGTYPE06_VARIANT_DEFAULT,
1391         .rsa_modexpo = zcrypt_msgtype6_modexpo,
1392         .rsa_modexpo_crt = zcrypt_msgtype6_modexpo_crt,
1393         .send_cprb = zcrypt_msgtype6_send_cprb,
1394         .rng = zcrypt_msgtype6_rng,
1395 };
1396
1397 static struct zcrypt_ops zcrypt_msgtype6_ep11_ops = {
1398         .owner = THIS_MODULE,
1399         .name = MSGTYPE06_NAME,
1400         .variant = MSGTYPE06_VARIANT_EP11,
1401         .rsa_modexpo = NULL,
1402         .rsa_modexpo_crt = NULL,
1403         .send_ep11_cprb = zcrypt_msgtype6_send_ep11_cprb,
1404 };
1405
1406 void __init zcrypt_msgtype6_init(void)
1407 {
1408         zcrypt_msgtype_register(&zcrypt_msgtype6_norng_ops);
1409         zcrypt_msgtype_register(&zcrypt_msgtype6_ops);
1410         zcrypt_msgtype_register(&zcrypt_msgtype6_ep11_ops);
1411 }
1412
1413 void __exit zcrypt_msgtype6_exit(void)
1414 {
1415         zcrypt_msgtype_unregister(&zcrypt_msgtype6_norng_ops);
1416         zcrypt_msgtype_unregister(&zcrypt_msgtype6_ops);
1417         zcrypt_msgtype_unregister(&zcrypt_msgtype6_ep11_ops);
1418 }