s390/comments: unify copyright messages and remove file names
[pandora-kernel.git] / drivers / s390 / crypto / zcrypt_pcicc.c
1 /*
2  *  zcrypt 2.1.0
3  *
4  *  Copyright IBM Corp. 2001, 2006
5  *  Author(s): Robert Burroughs
6  *             Eric Rossman (edrossma@us.ibm.com)
7  *
8  *  Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com)
9  *  Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com>
10  *                                Ralph Wuerthner <rwuerthn@de.ibm.com>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2, or (at your option)
15  * any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25  */
26
27 #include <linux/module.h>
28 #include <linux/init.h>
29 #include <linux/gfp.h>
30 #include <linux/err.h>
31 #include <linux/atomic.h>
32 #include <asm/uaccess.h>
33
34 #include "ap_bus.h"
35 #include "zcrypt_api.h"
36 #include "zcrypt_error.h"
37 #include "zcrypt_pcicc.h"
38 #include "zcrypt_cca_key.h"
39
40 #define PCICC_MIN_MOD_SIZE       64     /*  512 bits */
41 #define PCICC_MAX_MOD_SIZE_OLD  128     /* 1024 bits */
42 #define PCICC_MAX_MOD_SIZE      256     /* 2048 bits */
43
44 /*
45  * PCICC cards need a speed rating of 0. This keeps them at the end of
46  * the zcrypt device list (see zcrypt_api.c). PCICC cards are only
47  * used if no other cards are present because they are slow and can only
48  * cope with PKCS12 padded requests. The logic is queer. PKCS11 padded
49  * requests are rejected. The modexpo function encrypts PKCS12 padded data
50  * and decrypts any non-PKCS12 padded data (except PKCS11) in the assumption
51  * that it's encrypted PKCS12 data. The modexpo_crt function always decrypts
52  * the data in the assumption that its PKCS12 encrypted data.
53  */
54 #define PCICC_SPEED_RATING      0
55
56 #define PCICC_MAX_MESSAGE_SIZE 0x710    /* max size type6 v1 crt message */
57 #define PCICC_MAX_RESPONSE_SIZE 0x710   /* max size type86 v1 reply      */
58
59 #define PCICC_CLEANUP_TIME      (15*HZ)
60
61 static struct ap_device_id zcrypt_pcicc_ids[] = {
62         { AP_DEVICE(AP_DEVICE_TYPE_PCICC) },
63         { /* end of list */ },
64 };
65
66 MODULE_DEVICE_TABLE(ap, zcrypt_pcicc_ids);
67 MODULE_AUTHOR("IBM Corporation");
68 MODULE_DESCRIPTION("PCICC Cryptographic Coprocessor device driver, "
69                    "Copyright IBM Corp. 2001, 2006");
70 MODULE_LICENSE("GPL");
71
72 static int zcrypt_pcicc_probe(struct ap_device *ap_dev);
73 static void zcrypt_pcicc_remove(struct ap_device *ap_dev);
74 static void zcrypt_pcicc_receive(struct ap_device *, struct ap_message *,
75                                  struct ap_message *);
76
77 static struct ap_driver zcrypt_pcicc_driver = {
78         .probe = zcrypt_pcicc_probe,
79         .remove = zcrypt_pcicc_remove,
80         .ids = zcrypt_pcicc_ids,
81         .request_timeout = PCICC_CLEANUP_TIME,
82 };
83
84 /**
85  * The following is used to initialize the CPRB passed to the PCICC card
86  * in a type6 message. The 3 fields that must be filled in at execution
87  * time are  req_parml, rpl_parml and usage_domain. Note that all three
88  * fields are *little*-endian. Actually, everything about this interface
89  * is ascii/little-endian, since the device has 'Intel inside'.
90  *
91  * The CPRB is followed immediately by the parm block.
92  * The parm block contains:
93  * - function code ('PD' 0x5044 or 'PK' 0x504B)
94  * - rule block (0x0A00 'PKCS-1.2' or 0x0A00 'ZERO-PAD')
95  * - VUD block
96  */
97 static struct CPRB static_cprb = {
98         .cprb_len       = __constant_cpu_to_le16(0x0070),
99         .cprb_ver_id    =  0x41,
100         .func_id        = {0x54,0x32},
101         .checkpoint_flag=  0x01,
102         .svr_namel      = __constant_cpu_to_le16(0x0008),
103         .svr_name       = {'I','C','S','F',' ',' ',' ',' '}
104 };
105
106 /**
107  * Check the message for PKCS11 padding.
108  */
109 static inline int is_PKCS11_padded(unsigned char *buffer, int length)
110 {
111         int i;
112         if ((buffer[0] != 0x00) || (buffer[1] != 0x01))
113                 return 0;
114         for (i = 2; i < length; i++)
115                 if (buffer[i] != 0xFF)
116                         break;
117         if (i < 10 || i == length)
118                 return 0;
119         if (buffer[i] != 0x00)
120                 return 0;
121         return 1;
122 }
123
124 /**
125  * Check the message for PKCS12 padding.
126  */
127 static inline int is_PKCS12_padded(unsigned char *buffer, int length)
128 {
129         int i;
130         if ((buffer[0] != 0x00) || (buffer[1] != 0x02))
131                 return 0;
132         for (i = 2; i < length; i++)
133                 if (buffer[i] == 0x00)
134                         break;
135         if ((i < 10) || (i == length))
136                 return 0;
137         if (buffer[i] != 0x00)
138                 return 0;
139         return 1;
140 }
141
142 /**
143  * Convert a ICAMEX message to a type6 MEX message.
144  *
145  * @zdev: crypto device pointer
146  * @zreq: crypto request pointer
147  * @mex: pointer to user input data
148  *
149  * Returns 0 on success or -EFAULT.
150  */
151 static int ICAMEX_msg_to_type6MEX_msg(struct zcrypt_device *zdev,
152                                       struct ap_message *ap_msg,
153                                       struct ica_rsa_modexpo *mex)
154 {
155         static struct type6_hdr static_type6_hdr = {
156                 .type           =  0x06,
157                 .offset1        =  0x00000058,
158                 .agent_id       = {0x01,0x00,0x43,0x43,0x41,0x2D,0x41,0x50,
159                                    0x50,0x4C,0x20,0x20,0x20,0x01,0x01,0x01},
160                 .function_code  = {'P','K'},
161         };
162         static struct function_and_rules_block static_pke_function_and_rules ={
163                 .function_code  = {'P','K'},
164                 .ulen           = __constant_cpu_to_le16(10),
165                 .only_rule      = {'P','K','C','S','-','1','.','2'}
166         };
167         struct {
168                 struct type6_hdr hdr;
169                 struct CPRB cprb;
170                 struct function_and_rules_block fr;
171                 unsigned short length;
172                 char text[0];
173         } __attribute__((packed)) *msg = ap_msg->message;
174         int vud_len, pad_len, size;
175
176         /* VUD.ciphertext */
177         if (copy_from_user(msg->text, mex->inputdata, mex->inputdatalength))
178                 return -EFAULT;
179
180         if (is_PKCS11_padded(msg->text, mex->inputdatalength))
181                 return -EINVAL;
182
183         /* static message header and f&r */
184         msg->hdr = static_type6_hdr;
185         msg->fr = static_pke_function_and_rules;
186
187         if (is_PKCS12_padded(msg->text, mex->inputdatalength)) {
188                 /* strip the padding and adjust the data length */
189                 pad_len = strnlen(msg->text + 2, mex->inputdatalength - 2) + 3;
190                 if (pad_len <= 9 || pad_len >= mex->inputdatalength)
191                         return -ENODEV;
192                 vud_len = mex->inputdatalength - pad_len;
193                 memmove(msg->text, msg->text + pad_len, vud_len);
194                 msg->length = cpu_to_le16(vud_len + 2);
195
196                 /* Set up key after the variable length text. */
197                 size = zcrypt_type6_mex_key_en(mex, msg->text + vud_len, 0);
198                 if (size < 0)
199                         return size;
200                 size += sizeof(*msg) + vud_len; /* total size of msg */
201         } else {
202                 vud_len = mex->inputdatalength;
203                 msg->length = cpu_to_le16(2 + vud_len);
204
205                 msg->hdr.function_code[1] = 'D';
206                 msg->fr.function_code[1] = 'D';
207
208                 /* Set up key after the variable length text. */
209                 size = zcrypt_type6_mex_key_de(mex, msg->text + vud_len, 0);
210                 if (size < 0)
211                         return size;
212                 size += sizeof(*msg) + vud_len; /* total size of msg */
213         }
214
215         /* message header, cprb and f&r */
216         msg->hdr.ToCardLen1 = (size - sizeof(msg->hdr) + 3) & -4;
217         msg->hdr.FromCardLen1 = PCICC_MAX_RESPONSE_SIZE - sizeof(msg->hdr);
218
219         msg->cprb = static_cprb;
220         msg->cprb.usage_domain[0]= AP_QID_QUEUE(zdev->ap_dev->qid);
221         msg->cprb.req_parml = cpu_to_le16(size - sizeof(msg->hdr) -
222                                            sizeof(msg->cprb));
223         msg->cprb.rpl_parml = cpu_to_le16(msg->hdr.FromCardLen1);
224
225         ap_msg->length = (size + 3) & -4;
226         return 0;
227 }
228
229 /**
230  * Convert a ICACRT message to a type6 CRT message.
231  *
232  * @zdev: crypto device pointer
233  * @zreq: crypto request pointer
234  * @crt: pointer to user input data
235  *
236  * Returns 0 on success or -EFAULT.
237  */
238 static int ICACRT_msg_to_type6CRT_msg(struct zcrypt_device *zdev,
239                                       struct ap_message *ap_msg,
240                                       struct ica_rsa_modexpo_crt *crt)
241 {
242         static struct type6_hdr static_type6_hdr = {
243                 .type           =  0x06,
244                 .offset1        =  0x00000058,
245                 .agent_id       = {0x01,0x00,0x43,0x43,0x41,0x2D,0x41,0x50,
246                                    0x50,0x4C,0x20,0x20,0x20,0x01,0x01,0x01},
247                 .function_code  = {'P','D'},
248         };
249         static struct function_and_rules_block static_pkd_function_and_rules ={
250                 .function_code  = {'P','D'},
251                 .ulen           = __constant_cpu_to_le16(10),
252                 .only_rule      = {'P','K','C','S','-','1','.','2'}
253         };
254         struct {
255                 struct type6_hdr hdr;
256                 struct CPRB cprb;
257                 struct function_and_rules_block fr;
258                 unsigned short length;
259                 char text[0];
260         } __attribute__((packed)) *msg = ap_msg->message;
261         int size;
262
263         /* VUD.ciphertext */
264         msg->length = cpu_to_le16(2 + crt->inputdatalength);
265         if (copy_from_user(msg->text, crt->inputdata, crt->inputdatalength))
266                 return -EFAULT;
267
268         if (is_PKCS11_padded(msg->text, crt->inputdatalength))
269                 return -EINVAL;
270
271         /* Set up key after the variable length text. */
272         size = zcrypt_type6_crt_key(crt, msg->text + crt->inputdatalength, 0);
273         if (size < 0)
274                 return size;
275         size += sizeof(*msg) + crt->inputdatalength;    /* total size of msg */
276
277         /* message header, cprb and f&r */
278         msg->hdr = static_type6_hdr;
279         msg->hdr.ToCardLen1 = (size -  sizeof(msg->hdr) + 3) & -4;
280         msg->hdr.FromCardLen1 = PCICC_MAX_RESPONSE_SIZE - sizeof(msg->hdr);
281
282         msg->cprb = static_cprb;
283         msg->cprb.usage_domain[0] = AP_QID_QUEUE(zdev->ap_dev->qid);
284         msg->cprb.req_parml = msg->cprb.rpl_parml =
285                 cpu_to_le16(size - sizeof(msg->hdr) - sizeof(msg->cprb));
286
287         msg->fr = static_pkd_function_and_rules;
288
289         ap_msg->length = (size + 3) & -4;
290         return 0;
291 }
292
293 /**
294  * Copy results from a type 86 reply message back to user space.
295  *
296  * @zdev: crypto device pointer
297  * @reply: reply AP message.
298  * @data: pointer to user output data
299  * @length: size of user output data
300  *
301  * Returns 0 on success or -EINVAL, -EFAULT, -EAGAIN in case of an error.
302  */
303 struct type86_reply {
304         struct type86_hdr hdr;
305         struct type86_fmt2_ext fmt2;
306         struct CPRB cprb;
307         unsigned char pad[4];   /* 4 byte function code/rules block ? */
308         unsigned short length;
309         char text[0];
310 } __attribute__((packed));
311
312 static int convert_type86(struct zcrypt_device *zdev,
313                           struct ap_message *reply,
314                           char __user *outputdata,
315                           unsigned int outputdatalength)
316 {
317         static unsigned char static_pad[] = {
318                 0x00,0x02,
319                 0x1B,0x7B,0x5D,0xB5,0x75,0x01,0x3D,0xFD,
320                 0x8D,0xD1,0xC7,0x03,0x2D,0x09,0x23,0x57,
321                 0x89,0x49,0xB9,0x3F,0xBB,0x99,0x41,0x5B,
322                 0x75,0x21,0x7B,0x9D,0x3B,0x6B,0x51,0x39,
323                 0xBB,0x0D,0x35,0xB9,0x89,0x0F,0x93,0xA5,
324                 0x0B,0x47,0xF1,0xD3,0xBB,0xCB,0xF1,0x9D,
325                 0x23,0x73,0x71,0xFF,0xF3,0xF5,0x45,0xFB,
326                 0x61,0x29,0x23,0xFD,0xF1,0x29,0x3F,0x7F,
327                 0x17,0xB7,0x1B,0xA9,0x19,0xBD,0x57,0xA9,
328                 0xD7,0x95,0xA3,0xCB,0xED,0x1D,0xDB,0x45,
329                 0x7D,0x11,0xD1,0x51,0x1B,0xED,0x71,0xE9,
330                 0xB1,0xD1,0xAB,0xAB,0x21,0x2B,0x1B,0x9F,
331                 0x3B,0x9F,0xF7,0xF7,0xBD,0x63,0xEB,0xAD,
332                 0xDF,0xB3,0x6F,0x5B,0xDB,0x8D,0xA9,0x5D,
333                 0xE3,0x7D,0x77,0x49,0x47,0xF5,0xA7,0xFD,
334                 0xAB,0x2F,0x27,0x35,0x77,0xD3,0x49,0xC9,
335                 0x09,0xEB,0xB1,0xF9,0xBF,0x4B,0xCB,0x2B,
336                 0xEB,0xEB,0x05,0xFF,0x7D,0xC7,0x91,0x8B,
337                 0x09,0x83,0xB9,0xB9,0x69,0x33,0x39,0x6B,
338                 0x79,0x75,0x19,0xBF,0xBB,0x07,0x1D,0xBD,
339                 0x29,0xBF,0x39,0x95,0x93,0x1D,0x35,0xC7,
340                 0xC9,0x4D,0xE5,0x97,0x0B,0x43,0x9B,0xF1,
341                 0x16,0x93,0x03,0x1F,0xA5,0xFB,0xDB,0xF3,
342                 0x27,0x4F,0x27,0x61,0x05,0x1F,0xB9,0x23,
343                 0x2F,0xC3,0x81,0xA9,0x23,0x71,0x55,0x55,
344                 0xEB,0xED,0x41,0xE5,0xF3,0x11,0xF1,0x43,
345                 0x69,0x03,0xBD,0x0B,0x37,0x0F,0x51,0x8F,
346                 0x0B,0xB5,0x89,0x5B,0x67,0xA9,0xD9,0x4F,
347                 0x01,0xF9,0x21,0x77,0x37,0x73,0x79,0xC5,
348                 0x7F,0x51,0xC1,0xCF,0x97,0xA1,0x75,0xAD,
349                 0x35,0x9D,0xD3,0xD3,0xA7,0x9D,0x5D,0x41,
350                 0x6F,0x65,0x1B,0xCF,0xA9,0x87,0x91,0x09
351         };
352         struct type86_reply *msg = reply->message;
353         unsigned short service_rc, service_rs;
354         unsigned int reply_len, pad_len;
355         char *data;
356
357         service_rc = le16_to_cpu(msg->cprb.ccp_rtcode);
358         if (unlikely(service_rc != 0)) {
359                 service_rs = le16_to_cpu(msg->cprb.ccp_rscode);
360                 if (service_rc == 8 && service_rs == 66)
361                         return -EINVAL;
362                 if (service_rc == 8 && service_rs == 65)
363                         return -EINVAL;
364                 if (service_rc == 8 && service_rs == 770) {
365                         zdev->max_mod_size = PCICC_MAX_MOD_SIZE_OLD;
366                         return -EAGAIN;
367                 }
368                 if (service_rc == 8 && service_rs == 783) {
369                         zdev->max_mod_size = PCICC_MAX_MOD_SIZE_OLD;
370                         return -EAGAIN;
371                 }
372                 if (service_rc == 8 && service_rs == 72)
373                         return -EINVAL;
374                 zdev->online = 0;
375                 return -EAGAIN; /* repeat the request on a different device. */
376         }
377         data = msg->text;
378         reply_len = le16_to_cpu(msg->length) - 2;
379         if (reply_len > outputdatalength)
380                 return -EINVAL;
381         /*
382          * For all encipher requests, the length of the ciphertext (reply_len)
383          * will always equal the modulus length. For MEX decipher requests
384          * the output needs to get padded. Minimum pad size is 10.
385          *
386          * Currently, the cases where padding will be added is for:
387          * - PCIXCC_MCL2 using a CRT form token (since PKD didn't support
388          *   ZERO-PAD and CRT is only supported for PKD requests)
389          * - PCICC, always
390          */
391         pad_len = outputdatalength - reply_len;
392         if (pad_len > 0) {
393                 if (pad_len < 10)
394                         return -EINVAL;
395                 /* 'restore' padding left in the PCICC/PCIXCC card. */
396                 if (copy_to_user(outputdata, static_pad, pad_len - 1))
397                         return -EFAULT;
398                 if (put_user(0, outputdata + pad_len - 1))
399                         return -EFAULT;
400         }
401         /* Copy the crypto response to user space. */
402         if (copy_to_user(outputdata + pad_len, data, reply_len))
403                 return -EFAULT;
404         return 0;
405 }
406
407 static int convert_response(struct zcrypt_device *zdev,
408                             struct ap_message *reply,
409                             char __user *outputdata,
410                             unsigned int outputdatalength)
411 {
412         struct type86_reply *msg = reply->message;
413
414         /* Response type byte is the second byte in the response. */
415         switch (msg->hdr.type) {
416         case TYPE82_RSP_CODE:
417         case TYPE88_RSP_CODE:
418                 return convert_error(zdev, reply);
419         case TYPE86_RSP_CODE:
420                 if (msg->hdr.reply_code)
421                         return convert_error(zdev, reply);
422                 if (msg->cprb.cprb_ver_id == 0x01)
423                         return convert_type86(zdev, reply,
424                                               outputdata, outputdatalength);
425                 /* no break, incorrect cprb version is an unknown response */
426         default: /* Unknown response type, this should NEVER EVER happen */
427                 zdev->online = 0;
428                 return -EAGAIN; /* repeat the request on a different device. */
429         }
430 }
431
432 /**
433  * This function is called from the AP bus code after a crypto request
434  * "msg" has finished with the reply message "reply".
435  * It is called from tasklet context.
436  * @ap_dev: pointer to the AP device
437  * @msg: pointer to the AP message
438  * @reply: pointer to the AP reply message
439  */
440 static void zcrypt_pcicc_receive(struct ap_device *ap_dev,
441                                  struct ap_message *msg,
442                                  struct ap_message *reply)
443 {
444         static struct error_hdr error_reply = {
445                 .type = TYPE82_RSP_CODE,
446                 .reply_code = REP82_ERROR_MACHINE_FAILURE,
447         };
448         struct type86_reply *t86r;
449         int length;
450
451         /* Copy the reply message to the request message buffer. */
452         if (IS_ERR(reply)) {
453                 memcpy(msg->message, &error_reply, sizeof(error_reply));
454                 goto out;
455         }
456         t86r = reply->message;
457         if (t86r->hdr.type == TYPE86_RSP_CODE &&
458                  t86r->cprb.cprb_ver_id == 0x01) {
459                 length = sizeof(struct type86_reply) + t86r->length - 2;
460                 length = min(PCICC_MAX_RESPONSE_SIZE, length);
461                 memcpy(msg->message, reply->message, length);
462         } else
463                 memcpy(msg->message, reply->message, sizeof error_reply);
464 out:
465         complete((struct completion *) msg->private);
466 }
467
468 static atomic_t zcrypt_step = ATOMIC_INIT(0);
469
470 /**
471  * The request distributor calls this function if it picked the PCICC
472  * device to handle a modexpo request.
473  * @zdev: pointer to zcrypt_device structure that identifies the
474  *        PCICC device to the request distributor
475  * @mex: pointer to the modexpo request buffer
476  */
477 static long zcrypt_pcicc_modexpo(struct zcrypt_device *zdev,
478                                  struct ica_rsa_modexpo *mex)
479 {
480         struct ap_message ap_msg;
481         struct completion work;
482         int rc;
483
484         ap_init_message(&ap_msg);
485         ap_msg.message = (void *) get_zeroed_page(GFP_KERNEL);
486         if (!ap_msg.message)
487                 return -ENOMEM;
488         ap_msg.receive = zcrypt_pcicc_receive;
489         ap_msg.length = PAGE_SIZE;
490         ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
491                                 atomic_inc_return(&zcrypt_step);
492         ap_msg.private = &work;
493         rc = ICAMEX_msg_to_type6MEX_msg(zdev, &ap_msg, mex);
494         if (rc)
495                 goto out_free;
496         init_completion(&work);
497         ap_queue_message(zdev->ap_dev, &ap_msg);
498         rc = wait_for_completion_interruptible(&work);
499         if (rc == 0)
500                 rc = convert_response(zdev, &ap_msg, mex->outputdata,
501                                       mex->outputdatalength);
502         else
503                 /* Signal pending. */
504                 ap_cancel_message(zdev->ap_dev, &ap_msg);
505 out_free:
506         free_page((unsigned long) ap_msg.message);
507         return rc;
508 }
509
510 /**
511  * The request distributor calls this function if it picked the PCICC
512  * device to handle a modexpo_crt request.
513  * @zdev: pointer to zcrypt_device structure that identifies the
514  *        PCICC device to the request distributor
515  * @crt: pointer to the modexpoc_crt request buffer
516  */
517 static long zcrypt_pcicc_modexpo_crt(struct zcrypt_device *zdev,
518                                      struct ica_rsa_modexpo_crt *crt)
519 {
520         struct ap_message ap_msg;
521         struct completion work;
522         int rc;
523
524         ap_init_message(&ap_msg);
525         ap_msg.message = (void *) get_zeroed_page(GFP_KERNEL);
526         if (!ap_msg.message)
527                 return -ENOMEM;
528         ap_msg.receive = zcrypt_pcicc_receive;
529         ap_msg.length = PAGE_SIZE;
530         ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
531                                 atomic_inc_return(&zcrypt_step);
532         ap_msg.private = &work;
533         rc = ICACRT_msg_to_type6CRT_msg(zdev, &ap_msg, crt);
534         if (rc)
535                 goto out_free;
536         init_completion(&work);
537         ap_queue_message(zdev->ap_dev, &ap_msg);
538         rc = wait_for_completion_interruptible(&work);
539         if (rc == 0)
540                 rc = convert_response(zdev, &ap_msg, crt->outputdata,
541                                       crt->outputdatalength);
542         else
543                 /* Signal pending. */
544                 ap_cancel_message(zdev->ap_dev, &ap_msg);
545 out_free:
546         free_page((unsigned long) ap_msg.message);
547         return rc;
548 }
549
550 /**
551  * The crypto operations for a PCICC card.
552  */
553 static struct zcrypt_ops zcrypt_pcicc_ops = {
554         .rsa_modexpo = zcrypt_pcicc_modexpo,
555         .rsa_modexpo_crt = zcrypt_pcicc_modexpo_crt,
556 };
557
558 /**
559  * Probe function for PCICC cards. It always accepts the AP device
560  * since the bus_match already checked the hardware type.
561  * @ap_dev: pointer to the AP device.
562  */
563 static int zcrypt_pcicc_probe(struct ap_device *ap_dev)
564 {
565         struct zcrypt_device *zdev;
566         int rc;
567
568         zdev = zcrypt_device_alloc(PCICC_MAX_RESPONSE_SIZE);
569         if (!zdev)
570                 return -ENOMEM;
571         zdev->ap_dev = ap_dev;
572         zdev->ops = &zcrypt_pcicc_ops;
573         zdev->online = 1;
574         zdev->user_space_type = ZCRYPT_PCICC;
575         zdev->type_string = "PCICC";
576         zdev->min_mod_size = PCICC_MIN_MOD_SIZE;
577         zdev->max_mod_size = PCICC_MAX_MOD_SIZE;
578         zdev->speed_rating = PCICC_SPEED_RATING;
579         zdev->max_exp_bit_length = PCICC_MAX_MOD_SIZE;
580         ap_dev->reply = &zdev->reply;
581         ap_dev->private = zdev;
582         rc = zcrypt_device_register(zdev);
583         if (rc)
584                 goto out_free;
585         return 0;
586
587  out_free:
588         ap_dev->private = NULL;
589         zcrypt_device_free(zdev);
590         return rc;
591 }
592
593 /**
594  * This is called to remove the extended PCICC driver information
595  * if an AP device is removed.
596  */
597 static void zcrypt_pcicc_remove(struct ap_device *ap_dev)
598 {
599         struct zcrypt_device *zdev = ap_dev->private;
600
601         zcrypt_device_unregister(zdev);
602 }
603
604 int __init zcrypt_pcicc_init(void)
605 {
606         return ap_driver_register(&zcrypt_pcicc_driver, THIS_MODULE, "pcicc");
607 }
608
609 void zcrypt_pcicc_exit(void)
610 {
611         ap_driver_unregister(&zcrypt_pcicc_driver);
612 }
613
614 module_init(zcrypt_pcicc_init);
615 module_exit(zcrypt_pcicc_exit);