zcrypt_msgtype6.c (40991B)
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 34struct 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 43MODULE_AUTHOR("IBM Corporation"); 44MODULE_DESCRIPTION("Cryptographic Coprocessor (message type 6), " \ 45 "Copyright IBM Corp. 2001, 2012"); 46MODULE_LICENSE("GPL"); 47 48struct 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 */ 71static const struct CPRBX static_cprbx = { 72 .cprb_len = 0x00DC, 73 .cprb_ver_id = 0x02, 74 .func_id = {0x54, 0x32}, 75}; 76 77int 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 152int 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 */ 191static 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 */ 260static 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 */ 329struct type86_fmt2_msg { 330 struct type86_hdr hdr; 331 struct type86_fmt2_ext fmt2; 332} __packed; 333 334static 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 455static 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 */ 555struct 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 564struct type86_ep11_reply { 565 struct type86_hdr hdr; 566 struct type86_fmt2_ext fmt2; 567 struct ep11_cprb cprbx; 568} __packed; 569 570static 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 */ 680static 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 */ 725static 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 747static 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 764static 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 808static 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 843static 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 873static 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 */ 912static 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 } 956out: 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 */ 968static 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 } 1003out: 1004 complete(&resp_type->work); 1005} 1006 1007static 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 */ 1016static 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 1052out_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 */ 1066static 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 1102out_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 */ 1118int 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 */ 1146static 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 1182out: 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 */ 1199int 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 */ 1228static 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 1302out: 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 1310int 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 */ 1341static 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 } 1371out: 1372 return rc; 1373} 1374 1375/* 1376 * The crypto operations for a CEXxC card. 1377 */ 1378static 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 1387static 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 1397static 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 1406void __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 1413void __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}