root/drivers/s390/crypto/zcrypt_ccamisc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cca_check_secaeskeytoken
  2. cca_check_secaescipherkey
  3. alloc_and_prep_cprbmem
  4. free_cprbmem
  5. prep_xcrb
  6. _zcrypt_send_cprb
  7. cca_genseckey
  8. cca_clr2seckey
  9. cca_sec2protkey
  10. cca_gencipherkey
  11. _ip_cprb_helper
  12. cca_clr2cipherkey
  13. cca_cipher2protkey
  14. cca_query_crypto_facility
  15. cca_info_cache_fetch
  16. cca_info_cache_update
  17. cca_info_cache_scrub
  18. mkvp_cache_free
  19. fetch_cca_info
  20. cca_get_info
  21. findcard
  22. cca_findcard
  23. cca_findcard2
  24. zcrypt_ccamisc_exit

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  *  Copyright IBM Corp. 2019
   4  *  Author(s): Harald Freudenberger <freude@linux.ibm.com>
   5  *             Ingo Franzki <ifranzki@linux.ibm.com>
   6  *
   7  *  Collection of CCA misc functions used by zcrypt and pkey
   8  */
   9 
  10 #define KMSG_COMPONENT "zcrypt"
  11 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  12 
  13 #include <linux/init.h>
  14 #include <linux/module.h>
  15 #include <linux/slab.h>
  16 #include <linux/random.h>
  17 #include <asm/zcrypt.h>
  18 #include <asm/pkey.h>
  19 
  20 #include "ap_bus.h"
  21 #include "zcrypt_api.h"
  22 #include "zcrypt_debug.h"
  23 #include "zcrypt_msgtype6.h"
  24 #include "zcrypt_ccamisc.h"
  25 
  26 #define DEBUG_DBG(...)  ZCRYPT_DBF(DBF_DEBUG, ##__VA_ARGS__)
  27 #define DEBUG_INFO(...) ZCRYPT_DBF(DBF_INFO, ##__VA_ARGS__)
  28 #define DEBUG_WARN(...) ZCRYPT_DBF(DBF_WARN, ##__VA_ARGS__)
  29 #define DEBUG_ERR(...)  ZCRYPT_DBF(DBF_ERR, ##__VA_ARGS__)
  30 
  31 /* Size of parameter block used for all cca requests/replies */
  32 #define PARMBSIZE 512
  33 
  34 /* Size of vardata block used for some of the cca requests/replies */
  35 #define VARDATASIZE 4096
  36 
  37 struct cca_info_list_entry {
  38         struct list_head list;
  39         u16 cardnr;
  40         u16 domain;
  41         struct cca_info info;
  42 };
  43 
  44 /* a list with cca_info_list_entry entries */
  45 static LIST_HEAD(cca_info_list);
  46 static DEFINE_SPINLOCK(cca_info_list_lock);
  47 
  48 /*
  49  * Simple check if the token is a valid CCA secure AES data key
  50  * token. If keybitsize is given, the bitsize of the key is
  51  * also checked. Returns 0 on success or errno value on failure.
  52  */
  53 int cca_check_secaeskeytoken(debug_info_t *dbg, int dbflvl,
  54                              const u8 *token, int keybitsize)
  55 {
  56         struct secaeskeytoken *t = (struct secaeskeytoken *) token;
  57 
  58 #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
  59 
  60         if (t->type != TOKTYPE_CCA_INTERNAL) {
  61                 if (dbg)
  62                         DBF("%s token check failed, type 0x%02x != 0x%02x\n",
  63                             __func__, (int) t->type, TOKTYPE_CCA_INTERNAL);
  64                 return -EINVAL;
  65         }
  66         if (t->version != TOKVER_CCA_AES) {
  67                 if (dbg)
  68                         DBF("%s token check failed, version 0x%02x != 0x%02x\n",
  69                             __func__, (int) t->version, TOKVER_CCA_AES);
  70                 return -EINVAL;
  71         }
  72         if (keybitsize > 0 && t->bitsize != keybitsize) {
  73                 if (dbg)
  74                         DBF("%s token check failed, bitsize %d != %d\n",
  75                             __func__, (int) t->bitsize, keybitsize);
  76                 return -EINVAL;
  77         }
  78 
  79 #undef DBF
  80 
  81         return 0;
  82 }
  83 EXPORT_SYMBOL(cca_check_secaeskeytoken);
  84 
  85 /*
  86  * Simple check if the token is a valid CCA secure AES cipher key
  87  * token. If keybitsize is given, the bitsize of the key is
  88  * also checked. If checkcpacfexport is enabled, the key is also
  89  * checked for the export flag to allow CPACF export.
  90  * Returns 0 on success or errno value on failure.
  91  */
  92 int cca_check_secaescipherkey(debug_info_t *dbg, int dbflvl,
  93                               const u8 *token, int keybitsize,
  94                               int checkcpacfexport)
  95 {
  96         struct cipherkeytoken *t = (struct cipherkeytoken *) token;
  97         bool keybitsizeok = true;
  98 
  99 #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
 100 
 101         if (t->type != TOKTYPE_CCA_INTERNAL) {
 102                 if (dbg)
 103                         DBF("%s token check failed, type 0x%02x != 0x%02x\n",
 104                             __func__, (int) t->type, TOKTYPE_CCA_INTERNAL);
 105                 return -EINVAL;
 106         }
 107         if (t->version != TOKVER_CCA_VLSC) {
 108                 if (dbg)
 109                         DBF("%s token check failed, version 0x%02x != 0x%02x\n",
 110                             __func__, (int) t->version, TOKVER_CCA_VLSC);
 111                 return -EINVAL;
 112         }
 113         if (t->algtype != 0x02) {
 114                 if (dbg)
 115                         DBF("%s token check failed, algtype 0x%02x != 0x02\n",
 116                             __func__, (int) t->algtype);
 117                 return -EINVAL;
 118         }
 119         if (t->keytype != 0x0001) {
 120                 if (dbg)
 121                         DBF("%s token check failed, keytype 0x%04x != 0x0001\n",
 122                             __func__, (int) t->keytype);
 123                 return -EINVAL;
 124         }
 125         if (t->plfver != 0x00 && t->plfver != 0x01) {
 126                 if (dbg)
 127                         DBF("%s token check failed, unknown plfver 0x%02x\n",
 128                             __func__, (int) t->plfver);
 129                 return -EINVAL;
 130         }
 131         if (t->wpllen != 512 && t->wpllen != 576 && t->wpllen != 640) {
 132                 if (dbg)
 133                         DBF("%s token check failed, unknown wpllen %d\n",
 134                             __func__, (int) t->wpllen);
 135                 return -EINVAL;
 136         }
 137         if (keybitsize > 0) {
 138                 switch (keybitsize) {
 139                 case 128:
 140                         if (t->wpllen != (t->plfver ? 640 : 512))
 141                                 keybitsizeok = false;
 142                         break;
 143                 case 192:
 144                         if (t->wpllen != (t->plfver ? 640 : 576))
 145                                 keybitsizeok = false;
 146                         break;
 147                 case 256:
 148                         if (t->wpllen != 640)
 149                                 keybitsizeok = false;
 150                         break;
 151                 default:
 152                         keybitsizeok = false;
 153                         break;
 154                 }
 155                 if (!keybitsizeok) {
 156                         if (dbg)
 157                                 DBF("%s token check failed, bitsize %d\n",
 158                                     __func__, keybitsize);
 159                         return -EINVAL;
 160                 }
 161         }
 162         if (checkcpacfexport && !(t->kmf1 & KMF1_XPRT_CPAC)) {
 163                 if (dbg)
 164                         DBF("%s token check failed, XPRT_CPAC bit is 0\n",
 165                             __func__);
 166                 return -EINVAL;
 167         }
 168 
 169 #undef DBF
 170 
 171         return 0;
 172 }
 173 EXPORT_SYMBOL(cca_check_secaescipherkey);
 174 
 175 /*
 176  * Allocate consecutive memory for request CPRB, request param
 177  * block, reply CPRB and reply param block and fill in values
 178  * for the common fields. Returns 0 on success or errno value
 179  * on failure.
 180  */
 181 static int alloc_and_prep_cprbmem(size_t paramblen,
 182                                   u8 **pcprbmem,
 183                                   struct CPRBX **preqCPRB,
 184                                   struct CPRBX **prepCPRB)
 185 {
 186         u8 *cprbmem;
 187         size_t cprbplusparamblen = sizeof(struct CPRBX) + paramblen;
 188         struct CPRBX *preqcblk, *prepcblk;
 189 
 190         /*
 191          * allocate consecutive memory for request CPRB, request param
 192          * block, reply CPRB and reply param block
 193          */
 194         cprbmem = kcalloc(2, cprbplusparamblen, GFP_KERNEL);
 195         if (!cprbmem)
 196                 return -ENOMEM;
 197 
 198         preqcblk = (struct CPRBX *) cprbmem;
 199         prepcblk = (struct CPRBX *) (cprbmem + cprbplusparamblen);
 200 
 201         /* fill request cprb struct */
 202         preqcblk->cprb_len = sizeof(struct CPRBX);
 203         preqcblk->cprb_ver_id = 0x02;
 204         memcpy(preqcblk->func_id, "T2", 2);
 205         preqcblk->rpl_msgbl = cprbplusparamblen;
 206         if (paramblen) {
 207                 preqcblk->req_parmb =
 208                         ((u8 *) preqcblk) + sizeof(struct CPRBX);
 209                 preqcblk->rpl_parmb =
 210                         ((u8 *) prepcblk) + sizeof(struct CPRBX);
 211         }
 212 
 213         *pcprbmem = cprbmem;
 214         *preqCPRB = preqcblk;
 215         *prepCPRB = prepcblk;
 216 
 217         return 0;
 218 }
 219 
 220 /*
 221  * Free the cprb memory allocated with the function above.
 222  * If the scrub value is not zero, the memory is filled
 223  * with zeros before freeing (useful if there was some
 224  * clear key material in there).
 225  */
 226 static void free_cprbmem(void *mem, size_t paramblen, int scrub)
 227 {
 228         if (scrub)
 229                 memzero_explicit(mem, 2 * (sizeof(struct CPRBX) + paramblen));
 230         kfree(mem);
 231 }
 232 
 233 /*
 234  * Helper function to prepare the xcrb struct
 235  */
 236 static inline void prep_xcrb(struct ica_xcRB *pxcrb,
 237                              u16 cardnr,
 238                              struct CPRBX *preqcblk,
 239                              struct CPRBX *prepcblk)
 240 {
 241         memset(pxcrb, 0, sizeof(*pxcrb));
 242         pxcrb->agent_ID = 0x4341; /* 'CA' */
 243         pxcrb->user_defined = (cardnr == 0xFFFF ? AUTOSELECT : cardnr);
 244         pxcrb->request_control_blk_length =
 245                 preqcblk->cprb_len + preqcblk->req_parml;
 246         pxcrb->request_control_blk_addr = (void __user *) preqcblk;
 247         pxcrb->reply_control_blk_length = preqcblk->rpl_msgbl;
 248         pxcrb->reply_control_blk_addr = (void __user *) prepcblk;
 249 }
 250 
 251 /*
 252  * Helper function which calls zcrypt_send_cprb with
 253  * memory management segment adjusted to kernel space
 254  * so that the copy_from_user called within this
 255  * function do in fact copy from kernel space.
 256  */
 257 static inline int _zcrypt_send_cprb(struct ica_xcRB *xcrb)
 258 {
 259         int rc;
 260         mm_segment_t old_fs = get_fs();
 261 
 262         set_fs(KERNEL_DS);
 263         rc = zcrypt_send_cprb(xcrb);
 264         set_fs(old_fs);
 265 
 266         return rc;
 267 }
 268 
 269 /*
 270  * Generate (random) CCA AES DATA secure key.
 271  */
 272 int cca_genseckey(u16 cardnr, u16 domain,
 273                   u32 keybitsize, u8 seckey[SECKEYBLOBSIZE])
 274 {
 275         int i, rc, keysize;
 276         int seckeysize;
 277         u8 *mem;
 278         struct CPRBX *preqcblk, *prepcblk;
 279         struct ica_xcRB xcrb;
 280         struct kgreqparm {
 281                 u8  subfunc_code[2];
 282                 u16 rule_array_len;
 283                 struct lv1 {
 284                         u16 len;
 285                         char  key_form[8];
 286                         char  key_length[8];
 287                         char  key_type1[8];
 288                         char  key_type2[8];
 289                 } lv1;
 290                 struct lv2 {
 291                         u16 len;
 292                         struct keyid {
 293                                 u16 len;
 294                                 u16 attr;
 295                                 u8  data[SECKEYBLOBSIZE];
 296                         } keyid[6];
 297                 } lv2;
 298         } __packed * preqparm;
 299         struct kgrepparm {
 300                 u8  subfunc_code[2];
 301                 u16 rule_array_len;
 302                 struct lv3 {
 303                         u16 len;
 304                         u16 keyblocklen;
 305                         struct {
 306                                 u16 toklen;
 307                                 u16 tokattr;
 308                                 u8  tok[0];
 309                                 /* ... some more data ... */
 310                         } keyblock;
 311                 } lv3;
 312         } __packed * prepparm;
 313 
 314         /* get already prepared memory for 2 cprbs with param block each */
 315         rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
 316         if (rc)
 317                 return rc;
 318 
 319         /* fill request cprb struct */
 320         preqcblk->domain = domain;
 321 
 322         /* fill request cprb param block with KG request */
 323         preqparm = (struct kgreqparm *) preqcblk->req_parmb;
 324         memcpy(preqparm->subfunc_code, "KG", 2);
 325         preqparm->rule_array_len = sizeof(preqparm->rule_array_len);
 326         preqparm->lv1.len = sizeof(struct lv1);
 327         memcpy(preqparm->lv1.key_form,   "OP      ", 8);
 328         switch (keybitsize) {
 329         case PKEY_SIZE_AES_128:
 330         case PKEY_KEYTYPE_AES_128: /* older ioctls used this */
 331                 keysize = 16;
 332                 memcpy(preqparm->lv1.key_length, "KEYLN16 ", 8);
 333                 break;
 334         case PKEY_SIZE_AES_192:
 335         case PKEY_KEYTYPE_AES_192: /* older ioctls used this */
 336                 keysize = 24;
 337                 memcpy(preqparm->lv1.key_length, "KEYLN24 ", 8);
 338                 break;
 339         case PKEY_SIZE_AES_256:
 340         case PKEY_KEYTYPE_AES_256: /* older ioctls used this */
 341                 keysize = 32;
 342                 memcpy(preqparm->lv1.key_length, "KEYLN32 ", 8);
 343                 break;
 344         default:
 345                 DEBUG_ERR("%s unknown/unsupported keybitsize %d\n",
 346                           __func__, keybitsize);
 347                 rc = -EINVAL;
 348                 goto out;
 349         }
 350         memcpy(preqparm->lv1.key_type1,  "AESDATA ", 8);
 351         preqparm->lv2.len = sizeof(struct lv2);
 352         for (i = 0; i < 6; i++) {
 353                 preqparm->lv2.keyid[i].len = sizeof(struct keyid);
 354                 preqparm->lv2.keyid[i].attr = (i == 2 ? 0x30 : 0x10);
 355         }
 356         preqcblk->req_parml = sizeof(struct kgreqparm);
 357 
 358         /* fill xcrb struct */
 359         prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
 360 
 361         /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
 362         rc = _zcrypt_send_cprb(&xcrb);
 363         if (rc) {
 364                 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, errno %d\n",
 365                           __func__, (int) cardnr, (int) domain, rc);
 366                 goto out;
 367         }
 368 
 369         /* check response returncode and reasoncode */
 370         if (prepcblk->ccp_rtcode != 0) {
 371                 DEBUG_ERR("%s secure key generate failure, card response %d/%d\n",
 372                           __func__,
 373                           (int) prepcblk->ccp_rtcode,
 374                           (int) prepcblk->ccp_rscode);
 375                 rc = -EIO;
 376                 goto out;
 377         }
 378 
 379         /* process response cprb param block */
 380         prepcblk->rpl_parmb = ((u8 *) prepcblk) + sizeof(struct CPRBX);
 381         prepparm = (struct kgrepparm *) prepcblk->rpl_parmb;
 382 
 383         /* check length of the returned secure key token */
 384         seckeysize = prepparm->lv3.keyblock.toklen
 385                 - sizeof(prepparm->lv3.keyblock.toklen)
 386                 - sizeof(prepparm->lv3.keyblock.tokattr);
 387         if (seckeysize != SECKEYBLOBSIZE) {
 388                 DEBUG_ERR("%s secure token size mismatch %d != %d bytes\n",
 389                           __func__, seckeysize, SECKEYBLOBSIZE);
 390                 rc = -EIO;
 391                 goto out;
 392         }
 393 
 394         /* check secure key token */
 395         rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
 396                                       prepparm->lv3.keyblock.tok, 8*keysize);
 397         if (rc) {
 398                 rc = -EIO;
 399                 goto out;
 400         }
 401 
 402         /* copy the generated secure key token */
 403         memcpy(seckey, prepparm->lv3.keyblock.tok, SECKEYBLOBSIZE);
 404 
 405 out:
 406         free_cprbmem(mem, PARMBSIZE, 0);
 407         return rc;
 408 }
 409 EXPORT_SYMBOL(cca_genseckey);
 410 
 411 /*
 412  * Generate an CCA AES DATA secure key with given key value.
 413  */
 414 int cca_clr2seckey(u16 cardnr, u16 domain, u32 keybitsize,
 415                    const u8 *clrkey, u8 seckey[SECKEYBLOBSIZE])
 416 {
 417         int rc, keysize, seckeysize;
 418         u8 *mem;
 419         struct CPRBX *preqcblk, *prepcblk;
 420         struct ica_xcRB xcrb;
 421         struct cmreqparm {
 422                 u8  subfunc_code[2];
 423                 u16 rule_array_len;
 424                 char  rule_array[8];
 425                 struct lv1 {
 426                         u16 len;
 427                         u8  clrkey[0];
 428                 } lv1;
 429                 struct lv2 {
 430                         u16 len;
 431                         struct keyid {
 432                                 u16 len;
 433                                 u16 attr;
 434                                 u8  data[SECKEYBLOBSIZE];
 435                         } keyid;
 436                 } lv2;
 437         } __packed * preqparm;
 438         struct lv2 *plv2;
 439         struct cmrepparm {
 440                 u8  subfunc_code[2];
 441                 u16 rule_array_len;
 442                 struct lv3 {
 443                         u16 len;
 444                         u16 keyblocklen;
 445                         struct {
 446                                 u16 toklen;
 447                                 u16 tokattr;
 448                                 u8  tok[0];
 449                                 /* ... some more data ... */
 450                         } keyblock;
 451                 } lv3;
 452         } __packed * prepparm;
 453 
 454         /* get already prepared memory for 2 cprbs with param block each */
 455         rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
 456         if (rc)
 457                 return rc;
 458 
 459         /* fill request cprb struct */
 460         preqcblk->domain = domain;
 461 
 462         /* fill request cprb param block with CM request */
 463         preqparm = (struct cmreqparm *) preqcblk->req_parmb;
 464         memcpy(preqparm->subfunc_code, "CM", 2);
 465         memcpy(preqparm->rule_array, "AES     ", 8);
 466         preqparm->rule_array_len =
 467                 sizeof(preqparm->rule_array_len) + sizeof(preqparm->rule_array);
 468         switch (keybitsize) {
 469         case PKEY_SIZE_AES_128:
 470         case PKEY_KEYTYPE_AES_128: /* older ioctls used this */
 471                 keysize = 16;
 472                 break;
 473         case PKEY_SIZE_AES_192:
 474         case PKEY_KEYTYPE_AES_192: /* older ioctls used this */
 475                 keysize = 24;
 476                 break;
 477         case PKEY_SIZE_AES_256:
 478         case PKEY_KEYTYPE_AES_256: /* older ioctls used this */
 479                 keysize = 32;
 480                 break;
 481         default:
 482                 DEBUG_ERR("%s unknown/unsupported keybitsize %d\n",
 483                           __func__, keybitsize);
 484                 rc = -EINVAL;
 485                 goto out;
 486         }
 487         preqparm->lv1.len = sizeof(struct lv1) + keysize;
 488         memcpy(preqparm->lv1.clrkey, clrkey, keysize);
 489         plv2 = (struct lv2 *) (((u8 *) &preqparm->lv2) + keysize);
 490         plv2->len = sizeof(struct lv2);
 491         plv2->keyid.len = sizeof(struct keyid);
 492         plv2->keyid.attr = 0x30;
 493         preqcblk->req_parml = sizeof(struct cmreqparm) + keysize;
 494 
 495         /* fill xcrb struct */
 496         prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
 497 
 498         /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
 499         rc = _zcrypt_send_cprb(&xcrb);
 500         if (rc) {
 501                 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
 502                           __func__, (int) cardnr, (int) domain, rc);
 503                 goto out;
 504         }
 505 
 506         /* check response returncode and reasoncode */
 507         if (prepcblk->ccp_rtcode != 0) {
 508                 DEBUG_ERR("%s clear key import failure, card response %d/%d\n",
 509                           __func__,
 510                           (int) prepcblk->ccp_rtcode,
 511                           (int) prepcblk->ccp_rscode);
 512                 rc = -EIO;
 513                 goto out;
 514         }
 515 
 516         /* process response cprb param block */
 517         prepcblk->rpl_parmb = ((u8 *) prepcblk) + sizeof(struct CPRBX);
 518         prepparm = (struct cmrepparm *) prepcblk->rpl_parmb;
 519 
 520         /* check length of the returned secure key token */
 521         seckeysize = prepparm->lv3.keyblock.toklen
 522                 - sizeof(prepparm->lv3.keyblock.toklen)
 523                 - sizeof(prepparm->lv3.keyblock.tokattr);
 524         if (seckeysize != SECKEYBLOBSIZE) {
 525                 DEBUG_ERR("%s secure token size mismatch %d != %d bytes\n",
 526                           __func__, seckeysize, SECKEYBLOBSIZE);
 527                 rc = -EIO;
 528                 goto out;
 529         }
 530 
 531         /* check secure key token */
 532         rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
 533                                       prepparm->lv3.keyblock.tok, 8*keysize);
 534         if (rc) {
 535                 rc = -EIO;
 536                 goto out;
 537         }
 538 
 539         /* copy the generated secure key token */
 540         if (seckey)
 541                 memcpy(seckey, prepparm->lv3.keyblock.tok, SECKEYBLOBSIZE);
 542 
 543 out:
 544         free_cprbmem(mem, PARMBSIZE, 1);
 545         return rc;
 546 }
 547 EXPORT_SYMBOL(cca_clr2seckey);
 548 
 549 /*
 550  * Derive proteced key from an CCA AES DATA secure key.
 551  */
 552 int cca_sec2protkey(u16 cardnr, u16 domain,
 553                     const u8 seckey[SECKEYBLOBSIZE],
 554                     u8 *protkey, u32 *protkeylen, u32 *protkeytype)
 555 {
 556         int rc;
 557         u8 *mem;
 558         struct CPRBX *preqcblk, *prepcblk;
 559         struct ica_xcRB xcrb;
 560         struct uskreqparm {
 561                 u8  subfunc_code[2];
 562                 u16 rule_array_len;
 563                 struct lv1 {
 564                         u16 len;
 565                         u16 attr_len;
 566                         u16 attr_flags;
 567                 } lv1;
 568                 struct lv2 {
 569                         u16 len;
 570                         u16 attr_len;
 571                         u16 attr_flags;
 572                         u8  token[0];         /* cca secure key token */
 573                 } lv2;
 574         } __packed * preqparm;
 575         struct uskrepparm {
 576                 u8  subfunc_code[2];
 577                 u16 rule_array_len;
 578                 struct lv3 {
 579                         u16 len;
 580                         u16 attr_len;
 581                         u16 attr_flags;
 582                         struct cpacfkeyblock {
 583                                 u8  version;  /* version of this struct */
 584                                 u8  flags[2];
 585                                 u8  algo;
 586                                 u8  form;
 587                                 u8  pad1[3];
 588                                 u16 len;
 589                                 u8  key[64];  /* the key (len bytes) */
 590                                 u16 keyattrlen;
 591                                 u8  keyattr[32];
 592                                 u8  pad2[1];
 593                                 u8  vptype;
 594                                 u8  vp[32];  /* verification pattern */
 595                         } keyblock;
 596                 } lv3;
 597         } __packed * prepparm;
 598 
 599         /* get already prepared memory for 2 cprbs with param block each */
 600         rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
 601         if (rc)
 602                 return rc;
 603 
 604         /* fill request cprb struct */
 605         preqcblk->domain = domain;
 606 
 607         /* fill request cprb param block with USK request */
 608         preqparm = (struct uskreqparm *) preqcblk->req_parmb;
 609         memcpy(preqparm->subfunc_code, "US", 2);
 610         preqparm->rule_array_len = sizeof(preqparm->rule_array_len);
 611         preqparm->lv1.len = sizeof(struct lv1);
 612         preqparm->lv1.attr_len = sizeof(struct lv1) - sizeof(preqparm->lv1.len);
 613         preqparm->lv1.attr_flags = 0x0001;
 614         preqparm->lv2.len = sizeof(struct lv2) + SECKEYBLOBSIZE;
 615         preqparm->lv2.attr_len = sizeof(struct lv2)
 616                 - sizeof(preqparm->lv2.len) + SECKEYBLOBSIZE;
 617         preqparm->lv2.attr_flags = 0x0000;
 618         memcpy(preqparm->lv2.token, seckey, SECKEYBLOBSIZE);
 619         preqcblk->req_parml = sizeof(struct uskreqparm) + SECKEYBLOBSIZE;
 620 
 621         /* fill xcrb struct */
 622         prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
 623 
 624         /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
 625         rc = _zcrypt_send_cprb(&xcrb);
 626         if (rc) {
 627                 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
 628                           __func__, (int) cardnr, (int) domain, rc);
 629                 goto out;
 630         }
 631 
 632         /* check response returncode and reasoncode */
 633         if (prepcblk->ccp_rtcode != 0) {
 634                 DEBUG_ERR("%s unwrap secure key failure, card response %d/%d\n",
 635                           __func__,
 636                           (int) prepcblk->ccp_rtcode,
 637                           (int) prepcblk->ccp_rscode);
 638                 rc = -EIO;
 639                 goto out;
 640         }
 641         if (prepcblk->ccp_rscode != 0) {
 642                 DEBUG_WARN("%s unwrap secure key warning, card response %d/%d\n",
 643                            __func__,
 644                            (int) prepcblk->ccp_rtcode,
 645                            (int) prepcblk->ccp_rscode);
 646         }
 647 
 648         /* process response cprb param block */
 649         prepcblk->rpl_parmb = ((u8 *) prepcblk) + sizeof(struct CPRBX);
 650         prepparm = (struct uskrepparm *) prepcblk->rpl_parmb;
 651 
 652         /* check the returned keyblock */
 653         if (prepparm->lv3.keyblock.version != 0x01) {
 654                 DEBUG_ERR("%s reply param keyblock version mismatch 0x%02x != 0x01\n",
 655                           __func__, (int) prepparm->lv3.keyblock.version);
 656                 rc = -EIO;
 657                 goto out;
 658         }
 659 
 660         /* copy the tanslated protected key */
 661         switch (prepparm->lv3.keyblock.len) {
 662         case 16+32:
 663                 /* AES 128 protected key */
 664                 if (protkeytype)
 665                         *protkeytype = PKEY_KEYTYPE_AES_128;
 666                 break;
 667         case 24+32:
 668                 /* AES 192 protected key */
 669                 if (protkeytype)
 670                         *protkeytype = PKEY_KEYTYPE_AES_192;
 671                 break;
 672         case 32+32:
 673                 /* AES 256 protected key */
 674                 if (protkeytype)
 675                         *protkeytype = PKEY_KEYTYPE_AES_256;
 676                 break;
 677         default:
 678                 DEBUG_ERR("%s unknown/unsupported keylen %d\n",
 679                           __func__, prepparm->lv3.keyblock.len);
 680                 rc = -EIO;
 681                 goto out;
 682         }
 683         memcpy(protkey, prepparm->lv3.keyblock.key, prepparm->lv3.keyblock.len);
 684         if (protkeylen)
 685                 *protkeylen = prepparm->lv3.keyblock.len;
 686 
 687 out:
 688         free_cprbmem(mem, PARMBSIZE, 0);
 689         return rc;
 690 }
 691 EXPORT_SYMBOL(cca_sec2protkey);
 692 
 693 /*
 694  * AES cipher key skeleton created with CSNBKTB2 with these flags:
 695  * INTERNAL, NO-KEY, AES, CIPHER, ANY-MODE, NOEX-SYM, NOEXAASY,
 696  * NOEXUASY, XPRTCPAC, NOEX-RAW, NOEX-DES, NOEX-AES, NOEX-RSA
 697  * used by cca_gencipherkey() and cca_clr2cipherkey().
 698  */
 699 static const u8 aes_cipher_key_skeleton[] = {
 700         0x01, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x00,
 701         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 702         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 703         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
 704         0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 705         0x00, 0x02, 0x00, 0x01, 0x02, 0xc0, 0x00, 0xff,
 706         0x00, 0x03, 0x08, 0xc8, 0x00, 0x00, 0x00, 0x00 };
 707 #define SIZEOF_SKELETON (sizeof(aes_cipher_key_skeleton))
 708 
 709 /*
 710  * Generate (random) CCA AES CIPHER secure key.
 711  */
 712 int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
 713                      u8 *keybuf, size_t *keybufsize)
 714 {
 715         int rc;
 716         u8 *mem;
 717         struct CPRBX *preqcblk, *prepcblk;
 718         struct ica_xcRB xcrb;
 719         struct gkreqparm {
 720                 u8  subfunc_code[2];
 721                 u16 rule_array_len;
 722                 char rule_array[2*8];
 723                 struct {
 724                         u16 len;
 725                         u8  key_type_1[8];
 726                         u8  key_type_2[8];
 727                         u16 clear_key_bit_len;
 728                         u16 key_name_1_len;
 729                         u16 key_name_2_len;
 730                         u16 user_data_1_len;
 731                         u16 user_data_2_len;
 732                         u8  key_name_1[0];
 733                         u8  key_name_2[0];
 734                         u8  user_data_1[0];
 735                         u8  user_data_2[0];
 736                 } vud;
 737                 struct {
 738                         u16 len;
 739                         struct {
 740                                 u16 len;
 741                                 u16 flag;
 742                                 u8  kek_id_1[0];
 743                         } tlv1;
 744                         struct {
 745                                 u16 len;
 746                                 u16 flag;
 747                                 u8  kek_id_2[0];
 748                         } tlv2;
 749                         struct {
 750                                 u16 len;
 751                                 u16 flag;
 752                                 u8  gen_key_id_1[SIZEOF_SKELETON];
 753                         } tlv3;
 754                         struct {
 755                                 u16 len;
 756                                 u16 flag;
 757                                 u8  gen_key_id_1_label[0];
 758                         } tlv4;
 759                         struct {
 760                                 u16 len;
 761                                 u16 flag;
 762                                 u8  gen_key_id_2[0];
 763                         } tlv5;
 764                         struct {
 765                                 u16 len;
 766                                 u16 flag;
 767                                 u8  gen_key_id_2_label[0];
 768                         } tlv6;
 769                 } kb;
 770         } __packed * preqparm;
 771         struct gkrepparm {
 772                 u8  subfunc_code[2];
 773                 u16 rule_array_len;
 774                 struct {
 775                         u16 len;
 776                 } vud;
 777                 struct {
 778                         u16 len;
 779                         struct {
 780                                 u16 len;
 781                                 u16 flag;
 782                                 u8  gen_key[0]; /* 120-136 bytes */
 783                         } tlv1;
 784                 } kb;
 785         } __packed * prepparm;
 786         struct cipherkeytoken *t;
 787 
 788         /* get already prepared memory for 2 cprbs with param block each */
 789         rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
 790         if (rc)
 791                 return rc;
 792 
 793         /* fill request cprb struct */
 794         preqcblk->domain = domain;
 795         preqcblk->req_parml = sizeof(struct gkreqparm);
 796 
 797         /* prepare request param block with GK request */
 798         preqparm = (struct gkreqparm *) preqcblk->req_parmb;
 799         memcpy(preqparm->subfunc_code, "GK", 2);
 800         preqparm->rule_array_len =  sizeof(uint16_t) + 2 * 8;
 801         memcpy(preqparm->rule_array, "AES     OP      ", 2*8);
 802 
 803         /* prepare vud block */
 804         preqparm->vud.len = sizeof(preqparm->vud);
 805         switch (keybitsize) {
 806         case 128:
 807         case 192:
 808         case 256:
 809                 break;
 810         default:
 811                 DEBUG_ERR(
 812                         "%s unknown/unsupported keybitsize %d\n",
 813                         __func__, keybitsize);
 814                 rc = -EINVAL;
 815                 goto out;
 816         }
 817         preqparm->vud.clear_key_bit_len = keybitsize;
 818         memcpy(preqparm->vud.key_type_1, "TOKEN   ", 8);
 819         memset(preqparm->vud.key_type_2, ' ', sizeof(preqparm->vud.key_type_2));
 820 
 821         /* prepare kb block */
 822         preqparm->kb.len = sizeof(preqparm->kb);
 823         preqparm->kb.tlv1.len = sizeof(preqparm->kb.tlv1);
 824         preqparm->kb.tlv1.flag = 0x0030;
 825         preqparm->kb.tlv2.len = sizeof(preqparm->kb.tlv2);
 826         preqparm->kb.tlv2.flag = 0x0030;
 827         preqparm->kb.tlv3.len = sizeof(preqparm->kb.tlv3);
 828         preqparm->kb.tlv3.flag = 0x0030;
 829         memcpy(preqparm->kb.tlv3.gen_key_id_1,
 830                aes_cipher_key_skeleton, SIZEOF_SKELETON);
 831         preqparm->kb.tlv4.len = sizeof(preqparm->kb.tlv4);
 832         preqparm->kb.tlv4.flag = 0x0030;
 833         preqparm->kb.tlv5.len = sizeof(preqparm->kb.tlv5);
 834         preqparm->kb.tlv5.flag = 0x0030;
 835         preqparm->kb.tlv6.len = sizeof(preqparm->kb.tlv6);
 836         preqparm->kb.tlv6.flag = 0x0030;
 837 
 838         /* patch the skeleton key token export flags inside the kb block */
 839         if (keygenflags) {
 840                 t = (struct cipherkeytoken *) preqparm->kb.tlv3.gen_key_id_1;
 841                 t->kmf1 |= (u16) (keygenflags & 0x0000FF00);
 842                 t->kmf1 &= (u16) ~(keygenflags & 0x000000FF);
 843         }
 844 
 845         /* prepare xcrb struct */
 846         prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
 847 
 848         /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
 849         rc = _zcrypt_send_cprb(&xcrb);
 850         if (rc) {
 851                 DEBUG_ERR(
 852                         "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
 853                         __func__, (int) cardnr, (int) domain, rc);
 854                 goto out;
 855         }
 856 
 857         /* check response returncode and reasoncode */
 858         if (prepcblk->ccp_rtcode != 0) {
 859                 DEBUG_ERR(
 860                         "%s cipher key generate failure, card response %d/%d\n",
 861                         __func__,
 862                         (int) prepcblk->ccp_rtcode,
 863                         (int) prepcblk->ccp_rscode);
 864                 rc = -EIO;
 865                 goto out;
 866         }
 867 
 868         /* process response cprb param block */
 869         prepcblk->rpl_parmb = ((u8 *) prepcblk) + sizeof(struct CPRBX);
 870         prepparm = (struct gkrepparm *) prepcblk->rpl_parmb;
 871 
 872         /* do some plausibility checks on the key block */
 873         if (prepparm->kb.len < 120 + 5 * sizeof(uint16_t) ||
 874             prepparm->kb.len > 136 + 5 * sizeof(uint16_t)) {
 875                 DEBUG_ERR("%s reply with invalid or unknown key block\n",
 876                           __func__);
 877                 rc = -EIO;
 878                 goto out;
 879         }
 880 
 881         /* and some checks on the generated key */
 882         rc = cca_check_secaescipherkey(zcrypt_dbf_info, DBF_ERR,
 883                                        prepparm->kb.tlv1.gen_key,
 884                                        keybitsize, 1);
 885         if (rc) {
 886                 rc = -EIO;
 887                 goto out;
 888         }
 889 
 890         /* copy the generated vlsc key token */
 891         t = (struct cipherkeytoken *) prepparm->kb.tlv1.gen_key;
 892         if (keybuf) {
 893                 if (*keybufsize >= t->len)
 894                         memcpy(keybuf, t, t->len);
 895                 else
 896                         rc = -EINVAL;
 897         }
 898         *keybufsize = t->len;
 899 
 900 out:
 901         free_cprbmem(mem, PARMBSIZE, 0);
 902         return rc;
 903 }
 904 EXPORT_SYMBOL(cca_gencipherkey);
 905 
 906 /*
 907  * Helper function, does a the CSNBKPI2 CPRB.
 908  */
 909 static int _ip_cprb_helper(u16 cardnr, u16 domain,
 910                            const char *rule_array_1,
 911                            const char *rule_array_2,
 912                            const char *rule_array_3,
 913                            const u8 *clr_key_value,
 914                            int clr_key_bit_size,
 915                            u8 *key_token,
 916                            int *key_token_size)
 917 {
 918         int rc, n;
 919         u8 *mem;
 920         struct CPRBX *preqcblk, *prepcblk;
 921         struct ica_xcRB xcrb;
 922         struct rule_array_block {
 923                 u8  subfunc_code[2];
 924                 u16 rule_array_len;
 925                 char rule_array[0];
 926         } __packed * preq_ra_block;
 927         struct vud_block {
 928                 u16 len;
 929                 struct {
 930                         u16 len;
 931                         u16 flag;            /* 0x0064 */
 932                         u16 clr_key_bit_len;
 933                 } tlv1;
 934                 struct {
 935                         u16 len;
 936                         u16 flag;       /* 0x0063 */
 937                         u8  clr_key[0]; /* clear key value bytes */
 938                 } tlv2;
 939         } __packed * preq_vud_block;
 940         struct key_block {
 941                 u16 len;
 942                 struct {
 943                         u16 len;
 944                         u16 flag;         /* 0x0030 */
 945                         u8  key_token[0]; /* key skeleton */
 946                 } tlv1;
 947         } __packed * preq_key_block;
 948         struct iprepparm {
 949                 u8  subfunc_code[2];
 950                 u16 rule_array_len;
 951                 struct {
 952                         u16 len;
 953                 } vud;
 954                 struct {
 955                         u16 len;
 956                         struct {
 957                                 u16 len;
 958                                 u16 flag;         /* 0x0030 */
 959                                 u8  key_token[0]; /* key token */
 960                         } tlv1;
 961                 } kb;
 962         } __packed * prepparm;
 963         struct cipherkeytoken *t;
 964         int complete = strncmp(rule_array_2, "COMPLETE", 8) ? 0 : 1;
 965 
 966         /* get already prepared memory for 2 cprbs with param block each */
 967         rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
 968         if (rc)
 969                 return rc;
 970 
 971         /* fill request cprb struct */
 972         preqcblk->domain = domain;
 973         preqcblk->req_parml = 0;
 974 
 975         /* prepare request param block with IP request */
 976         preq_ra_block = (struct rule_array_block *) preqcblk->req_parmb;
 977         memcpy(preq_ra_block->subfunc_code, "IP", 2);
 978         preq_ra_block->rule_array_len =  sizeof(uint16_t) + 2 * 8;
 979         memcpy(preq_ra_block->rule_array, rule_array_1, 8);
 980         memcpy(preq_ra_block->rule_array + 8, rule_array_2, 8);
 981         preqcblk->req_parml = sizeof(struct rule_array_block) + 2 * 8;
 982         if (rule_array_3) {
 983                 preq_ra_block->rule_array_len += 8;
 984                 memcpy(preq_ra_block->rule_array + 16, rule_array_3, 8);
 985                 preqcblk->req_parml += 8;
 986         }
 987 
 988         /* prepare vud block */
 989         preq_vud_block = (struct vud_block *)
 990                 (preqcblk->req_parmb + preqcblk->req_parml);
 991         n = complete ? 0 : (clr_key_bit_size + 7) / 8;
 992         preq_vud_block->len = sizeof(struct vud_block) + n;
 993         preq_vud_block->tlv1.len = sizeof(preq_vud_block->tlv1);
 994         preq_vud_block->tlv1.flag = 0x0064;
 995         preq_vud_block->tlv1.clr_key_bit_len = complete ? 0 : clr_key_bit_size;
 996         preq_vud_block->tlv2.len = sizeof(preq_vud_block->tlv2) + n;
 997         preq_vud_block->tlv2.flag = 0x0063;
 998         if (!complete)
 999                 memcpy(preq_vud_block->tlv2.clr_key, clr_key_value, n);
1000         preqcblk->req_parml += preq_vud_block->len;
1001 
1002         /* prepare key block */
1003         preq_key_block = (struct key_block *)
1004                 (preqcblk->req_parmb + preqcblk->req_parml);
1005         n = *key_token_size;
1006         preq_key_block->len = sizeof(struct key_block) + n;
1007         preq_key_block->tlv1.len = sizeof(preq_key_block->tlv1) + n;
1008         preq_key_block->tlv1.flag = 0x0030;
1009         memcpy(preq_key_block->tlv1.key_token, key_token, *key_token_size);
1010         preqcblk->req_parml += preq_key_block->len;
1011 
1012         /* prepare xcrb struct */
1013         prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
1014 
1015         /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
1016         rc = _zcrypt_send_cprb(&xcrb);
1017         if (rc) {
1018                 DEBUG_ERR(
1019                         "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
1020                         __func__, (int) cardnr, (int) domain, rc);
1021                 goto out;
1022         }
1023 
1024         /* check response returncode and reasoncode */
1025         if (prepcblk->ccp_rtcode != 0) {
1026                 DEBUG_ERR(
1027                         "%s CSNBKPI2 failure, card response %d/%d\n",
1028                         __func__,
1029                         (int) prepcblk->ccp_rtcode,
1030                         (int) prepcblk->ccp_rscode);
1031                 rc = -EIO;
1032                 goto out;
1033         }
1034 
1035         /* process response cprb param block */
1036         prepcblk->rpl_parmb = ((u8 *) prepcblk) + sizeof(struct CPRBX);
1037         prepparm = (struct iprepparm *) prepcblk->rpl_parmb;
1038 
1039         /* do some plausibility checks on the key block */
1040         if (prepparm->kb.len < 120 + 3 * sizeof(uint16_t) ||
1041             prepparm->kb.len > 136 + 3 * sizeof(uint16_t)) {
1042                 DEBUG_ERR("%s reply with invalid or unknown key block\n",
1043                           __func__);
1044                 rc = -EIO;
1045                 goto out;
1046         }
1047 
1048         /* do not check the key here, it may be incomplete */
1049 
1050         /* copy the vlsc key token back */
1051         t = (struct cipherkeytoken *) prepparm->kb.tlv1.key_token;
1052         memcpy(key_token, t, t->len);
1053         *key_token_size = t->len;
1054 
1055 out:
1056         free_cprbmem(mem, PARMBSIZE, 0);
1057         return rc;
1058 }
1059 
1060 /*
1061  * Build CCA AES CIPHER secure key with a given clear key value.
1062  */
1063 int cca_clr2cipherkey(u16 card, u16 dom, u32 keybitsize, u32 keygenflags,
1064                       const u8 *clrkey, u8 *keybuf, size_t *keybufsize)
1065 {
1066         int rc;
1067         u8 *token;
1068         int tokensize;
1069         u8 exorbuf[32];
1070         struct cipherkeytoken *t;
1071 
1072         /* fill exorbuf with random data */
1073         get_random_bytes(exorbuf, sizeof(exorbuf));
1074 
1075         /* allocate space for the key token to build */
1076         token = kmalloc(MAXCCAVLSCTOKENSIZE, GFP_KERNEL);
1077         if (!token)
1078                 return -ENOMEM;
1079 
1080         /* prepare the token with the key skeleton */
1081         tokensize = SIZEOF_SKELETON;
1082         memcpy(token, aes_cipher_key_skeleton, tokensize);
1083 
1084         /* patch the skeleton key token export flags */
1085         if (keygenflags) {
1086                 t = (struct cipherkeytoken *) token;
1087                 t->kmf1 |= (u16) (keygenflags & 0x0000FF00);
1088                 t->kmf1 &= (u16) ~(keygenflags & 0x000000FF);
1089         }
1090 
1091         /*
1092          * Do the key import with the clear key value in 4 steps:
1093          * 1/4 FIRST import with only random data
1094          * 2/4 EXOR the clear key
1095          * 3/4 EXOR the very same random data again
1096          * 4/4 COMPLETE the secure cipher key import
1097          */
1098         rc = _ip_cprb_helper(card, dom, "AES     ", "FIRST   ", "MIN3PART",
1099                              exorbuf, keybitsize, token, &tokensize);
1100         if (rc) {
1101                 DEBUG_ERR(
1102                         "%s clear key import 1/4 with CSNBKPI2 failed, rc=%d\n",
1103                         __func__, rc);
1104                 goto out;
1105         }
1106         rc = _ip_cprb_helper(card, dom, "AES     ", "ADD-PART", NULL,
1107                              clrkey, keybitsize, token, &tokensize);
1108         if (rc) {
1109                 DEBUG_ERR(
1110                         "%s clear key import 2/4 with CSNBKPI2 failed, rc=%d\n",
1111                         __func__, rc);
1112                 goto out;
1113         }
1114         rc = _ip_cprb_helper(card, dom, "AES     ", "ADD-PART", NULL,
1115                              exorbuf, keybitsize, token, &tokensize);
1116         if (rc) {
1117                 DEBUG_ERR(
1118                         "%s clear key import 3/4 with CSNBKPI2 failed, rc=%d\n",
1119                         __func__, rc);
1120                 goto out;
1121         }
1122         rc = _ip_cprb_helper(card, dom, "AES     ", "COMPLETE", NULL,
1123                              NULL, keybitsize, token, &tokensize);
1124         if (rc) {
1125                 DEBUG_ERR(
1126                         "%s clear key import 4/4 with CSNBKPI2 failed, rc=%d\n",
1127                         __func__, rc);
1128                 goto out;
1129         }
1130 
1131         /* copy the generated key token */
1132         if (keybuf) {
1133                 if (tokensize > *keybufsize)
1134                         rc = -EINVAL;
1135                 else
1136                         memcpy(keybuf, token, tokensize);
1137         }
1138         *keybufsize = tokensize;
1139 
1140 out:
1141         kfree(token);
1142         return rc;
1143 }
1144 EXPORT_SYMBOL(cca_clr2cipherkey);
1145 
1146 /*
1147  * Derive proteced key from CCA AES cipher secure key.
1148  */
1149 int cca_cipher2protkey(u16 cardnr, u16 domain, const u8 *ckey,
1150                        u8 *protkey, u32 *protkeylen, u32 *protkeytype)
1151 {
1152         int rc;
1153         u8 *mem;
1154         struct CPRBX *preqcblk, *prepcblk;
1155         struct ica_xcRB xcrb;
1156         struct aureqparm {
1157                 u8  subfunc_code[2];
1158                 u16 rule_array_len;
1159                 u8  rule_array[8];
1160                 struct {
1161                         u16 len;
1162                         u16 tk_blob_len;
1163                         u16 tk_blob_tag;
1164                         u8  tk_blob[66];
1165                 } vud;
1166                 struct {
1167                         u16 len;
1168                         u16 cca_key_token_len;
1169                         u16 cca_key_token_flags;
1170                         u8  cca_key_token[0]; // 64 or more
1171                 } kb;
1172         } __packed * preqparm;
1173         struct aurepparm {
1174                 u8  subfunc_code[2];
1175                 u16 rule_array_len;
1176                 struct {
1177                         u16 len;
1178                         u16 sublen;
1179                         u16 tag;
1180                         struct cpacfkeyblock {
1181                                 u8  version;  /* version of this struct */
1182                                 u8  flags[2];
1183                                 u8  algo;
1184                                 u8  form;
1185                                 u8  pad1[3];
1186                                 u16 keylen;
1187                                 u8  key[64];  /* the key (keylen bytes) */
1188                                 u16 keyattrlen;
1189                                 u8  keyattr[32];
1190                                 u8  pad2[1];
1191                                 u8  vptype;
1192                                 u8  vp[32];  /* verification pattern */
1193                         } ckb;
1194                 } vud;
1195                 struct {
1196                         u16 len;
1197                 } kb;
1198         } __packed * prepparm;
1199         int keytoklen = ((struct cipherkeytoken *)ckey)->len;
1200 
1201         /* get already prepared memory for 2 cprbs with param block each */
1202         rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
1203         if (rc)
1204                 return rc;
1205 
1206         /* fill request cprb struct */
1207         preqcblk->domain = domain;
1208 
1209         /* fill request cprb param block with AU request */
1210         preqparm = (struct aureqparm *) preqcblk->req_parmb;
1211         memcpy(preqparm->subfunc_code, "AU", 2);
1212         preqparm->rule_array_len =
1213                 sizeof(preqparm->rule_array_len)
1214                 + sizeof(preqparm->rule_array);
1215         memcpy(preqparm->rule_array, "EXPT-SK ", 8);
1216         /* vud, tk blob */
1217         preqparm->vud.len = sizeof(preqparm->vud);
1218         preqparm->vud.tk_blob_len = sizeof(preqparm->vud.tk_blob)
1219                 + 2 * sizeof(uint16_t);
1220         preqparm->vud.tk_blob_tag = 0x00C2;
1221         /* kb, cca token */
1222         preqparm->kb.len = keytoklen + 3 * sizeof(uint16_t);
1223         preqparm->kb.cca_key_token_len = keytoklen + 2 * sizeof(uint16_t);
1224         memcpy(preqparm->kb.cca_key_token, ckey, keytoklen);
1225         /* now fill length of param block into cprb */
1226         preqcblk->req_parml = sizeof(struct aureqparm) + keytoklen;
1227 
1228         /* fill xcrb struct */
1229         prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
1230 
1231         /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
1232         rc = _zcrypt_send_cprb(&xcrb);
1233         if (rc) {
1234                 DEBUG_ERR(
1235                         "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
1236                         __func__, (int) cardnr, (int) domain, rc);
1237                 goto out;
1238         }
1239 
1240         /* check response returncode and reasoncode */
1241         if (prepcblk->ccp_rtcode != 0) {
1242                 DEBUG_ERR(
1243                         "%s unwrap secure key failure, card response %d/%d\n",
1244                         __func__,
1245                         (int) prepcblk->ccp_rtcode,
1246                         (int) prepcblk->ccp_rscode);
1247                 rc = -EIO;
1248                 goto out;
1249         }
1250         if (prepcblk->ccp_rscode != 0) {
1251                 DEBUG_WARN(
1252                         "%s unwrap secure key warning, card response %d/%d\n",
1253                         __func__,
1254                         (int) prepcblk->ccp_rtcode,
1255                         (int) prepcblk->ccp_rscode);
1256         }
1257 
1258         /* process response cprb param block */
1259         prepcblk->rpl_parmb = ((u8 *) prepcblk) + sizeof(struct CPRBX);
1260         prepparm = (struct aurepparm *) prepcblk->rpl_parmb;
1261 
1262         /* check the returned keyblock */
1263         if (prepparm->vud.ckb.version != 0x01) {
1264                 DEBUG_ERR(
1265                         "%s reply param keyblock version mismatch 0x%02x != 0x01\n",
1266                         __func__, (int) prepparm->vud.ckb.version);
1267                 rc = -EIO;
1268                 goto out;
1269         }
1270         if (prepparm->vud.ckb.algo != 0x02) {
1271                 DEBUG_ERR(
1272                         "%s reply param keyblock algo mismatch 0x%02x != 0x02\n",
1273                         __func__, (int) prepparm->vud.ckb.algo);
1274                 rc = -EIO;
1275                 goto out;
1276         }
1277 
1278         /* copy the translated protected key */
1279         switch (prepparm->vud.ckb.keylen) {
1280         case 16+32:
1281                 /* AES 128 protected key */
1282                 if (protkeytype)
1283                         *protkeytype = PKEY_KEYTYPE_AES_128;
1284                 break;
1285         case 24+32:
1286                 /* AES 192 protected key */
1287                 if (protkeytype)
1288                         *protkeytype = PKEY_KEYTYPE_AES_192;
1289                 break;
1290         case 32+32:
1291                 /* AES 256 protected key */
1292                 if (protkeytype)
1293                         *protkeytype = PKEY_KEYTYPE_AES_256;
1294                 break;
1295         default:
1296                 DEBUG_ERR("%s unknown/unsupported keylen %d\n",
1297                           __func__, prepparm->vud.ckb.keylen);
1298                 rc = -EIO;
1299                 goto out;
1300         }
1301         memcpy(protkey, prepparm->vud.ckb.key, prepparm->vud.ckb.keylen);
1302         if (protkeylen)
1303                 *protkeylen = prepparm->vud.ckb.keylen;
1304 
1305 out:
1306         free_cprbmem(mem, PARMBSIZE, 0);
1307         return rc;
1308 }
1309 EXPORT_SYMBOL(cca_cipher2protkey);
1310 
1311 /*
1312  * query cryptographic facility from CCA adapter
1313  */
1314 int cca_query_crypto_facility(u16 cardnr, u16 domain,
1315                               const char *keyword,
1316                               u8 *rarray, size_t *rarraylen,
1317                               u8 *varray, size_t *varraylen)
1318 {
1319         int rc;
1320         u16 len;
1321         u8 *mem, *ptr;
1322         struct CPRBX *preqcblk, *prepcblk;
1323         struct ica_xcRB xcrb;
1324         struct fqreqparm {
1325                 u8  subfunc_code[2];
1326                 u16 rule_array_len;
1327                 char  rule_array[8];
1328                 struct lv1 {
1329                         u16 len;
1330                         u8  data[VARDATASIZE];
1331                 } lv1;
1332                 u16 dummylen;
1333         } __packed * preqparm;
1334         size_t parmbsize = sizeof(struct fqreqparm);
1335         struct fqrepparm {
1336                 u8  subfunc_code[2];
1337                 u8  lvdata[0];
1338         } __packed * prepparm;
1339 
1340         /* get already prepared memory for 2 cprbs with param block each */
1341         rc = alloc_and_prep_cprbmem(parmbsize, &mem, &preqcblk, &prepcblk);
1342         if (rc)
1343                 return rc;
1344 
1345         /* fill request cprb struct */
1346         preqcblk->domain = domain;
1347 
1348         /* fill request cprb param block with FQ request */
1349         preqparm = (struct fqreqparm *) preqcblk->req_parmb;
1350         memcpy(preqparm->subfunc_code, "FQ", 2);
1351         memcpy(preqparm->rule_array, keyword, sizeof(preqparm->rule_array));
1352         preqparm->rule_array_len =
1353                 sizeof(preqparm->rule_array_len) + sizeof(preqparm->rule_array);
1354         preqparm->lv1.len = sizeof(preqparm->lv1);
1355         preqparm->dummylen = sizeof(preqparm->dummylen);
1356         preqcblk->req_parml = parmbsize;
1357 
1358         /* fill xcrb struct */
1359         prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
1360 
1361         /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
1362         rc = _zcrypt_send_cprb(&xcrb);
1363         if (rc) {
1364                 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
1365                           __func__, (int) cardnr, (int) domain, rc);
1366                 goto out;
1367         }
1368 
1369         /* check response returncode and reasoncode */
1370         if (prepcblk->ccp_rtcode != 0) {
1371                 DEBUG_ERR("%s unwrap secure key failure, card response %d/%d\n",
1372                           __func__,
1373                           (int) prepcblk->ccp_rtcode,
1374                           (int) prepcblk->ccp_rscode);
1375                 rc = -EIO;
1376                 goto out;
1377         }
1378 
1379         /* process response cprb param block */
1380         prepcblk->rpl_parmb = ((u8 *) prepcblk) + sizeof(struct CPRBX);
1381         prepparm = (struct fqrepparm *) prepcblk->rpl_parmb;
1382         ptr = prepparm->lvdata;
1383 
1384         /* check and possibly copy reply rule array */
1385         len = *((u16 *) ptr);
1386         if (len > sizeof(u16)) {
1387                 ptr += sizeof(u16);
1388                 len -= sizeof(u16);
1389                 if (rarray && rarraylen && *rarraylen > 0) {
1390                         *rarraylen = (len > *rarraylen ? *rarraylen : len);
1391                         memcpy(rarray, ptr, *rarraylen);
1392                 }
1393                 ptr += len;
1394         }
1395         /* check and possible copy reply var array */
1396         len = *((u16 *) ptr);
1397         if (len > sizeof(u16)) {
1398                 ptr += sizeof(u16);
1399                 len -= sizeof(u16);
1400                 if (varray && varraylen && *varraylen > 0) {
1401                         *varraylen = (len > *varraylen ? *varraylen : len);
1402                         memcpy(varray, ptr, *varraylen);
1403                 }
1404                 ptr += len;
1405         }
1406 
1407 out:
1408         free_cprbmem(mem, parmbsize, 0);
1409         return rc;
1410 }
1411 EXPORT_SYMBOL(cca_query_crypto_facility);
1412 
1413 static int cca_info_cache_fetch(u16 cardnr, u16 domain, struct cca_info *ci)
1414 {
1415         int rc = -ENOENT;
1416         struct cca_info_list_entry *ptr;
1417 
1418         spin_lock_bh(&cca_info_list_lock);
1419         list_for_each_entry(ptr, &cca_info_list, list) {
1420                 if (ptr->cardnr == cardnr && ptr->domain == domain) {
1421                         memcpy(ci, &ptr->info, sizeof(*ci));
1422                         rc = 0;
1423                         break;
1424                 }
1425         }
1426         spin_unlock_bh(&cca_info_list_lock);
1427 
1428         return rc;
1429 }
1430 
1431 static void cca_info_cache_update(u16 cardnr, u16 domain,
1432                                   const struct cca_info *ci)
1433 {
1434         int found = 0;
1435         struct cca_info_list_entry *ptr;
1436 
1437         spin_lock_bh(&cca_info_list_lock);
1438         list_for_each_entry(ptr, &cca_info_list, list) {
1439                 if (ptr->cardnr == cardnr &&
1440                     ptr->domain == domain) {
1441                         memcpy(&ptr->info, ci, sizeof(*ci));
1442                         found = 1;
1443                         break;
1444                 }
1445         }
1446         if (!found) {
1447                 ptr = kmalloc(sizeof(*ptr), GFP_ATOMIC);
1448                 if (!ptr) {
1449                         spin_unlock_bh(&cca_info_list_lock);
1450                         return;
1451                 }
1452                 ptr->cardnr = cardnr;
1453                 ptr->domain = domain;
1454                 memcpy(&ptr->info, ci, sizeof(*ci));
1455                 list_add(&ptr->list, &cca_info_list);
1456         }
1457         spin_unlock_bh(&cca_info_list_lock);
1458 }
1459 
1460 static void cca_info_cache_scrub(u16 cardnr, u16 domain)
1461 {
1462         struct cca_info_list_entry *ptr;
1463 
1464         spin_lock_bh(&cca_info_list_lock);
1465         list_for_each_entry(ptr, &cca_info_list, list) {
1466                 if (ptr->cardnr == cardnr &&
1467                     ptr->domain == domain) {
1468                         list_del(&ptr->list);
1469                         kfree(ptr);
1470                         break;
1471                 }
1472         }
1473         spin_unlock_bh(&cca_info_list_lock);
1474 }
1475 
1476 static void __exit mkvp_cache_free(void)
1477 {
1478         struct cca_info_list_entry *ptr, *pnext;
1479 
1480         spin_lock_bh(&cca_info_list_lock);
1481         list_for_each_entry_safe(ptr, pnext, &cca_info_list, list) {
1482                 list_del(&ptr->list);
1483                 kfree(ptr);
1484         }
1485         spin_unlock_bh(&cca_info_list_lock);
1486 }
1487 
1488 /*
1489  * Fetch cca_info values via query_crypto_facility from adapter.
1490  */
1491 static int fetch_cca_info(u16 cardnr, u16 domain, struct cca_info *ci)
1492 {
1493         int rc, found = 0;
1494         size_t rlen, vlen;
1495         u8 *rarray, *varray, *pg;
1496         struct zcrypt_device_status_ext devstat;
1497 
1498         memset(ci, 0, sizeof(*ci));
1499 
1500         /* get first info from zcrypt device driver about this apqn */
1501         rc = zcrypt_device_status_ext(cardnr, domain, &devstat);
1502         if (rc)
1503                 return rc;
1504         ci->hwtype = devstat.hwtype;
1505 
1506         /* prep page for rule array and var array use */
1507         pg = (u8 *) __get_free_page(GFP_KERNEL);
1508         if (!pg)
1509                 return -ENOMEM;
1510         rarray = pg;
1511         varray = pg + PAGE_SIZE/2;
1512         rlen = vlen = PAGE_SIZE/2;
1513 
1514         /* QF for this card/domain */
1515         rc = cca_query_crypto_facility(cardnr, domain, "STATICSA",
1516                                        rarray, &rlen, varray, &vlen);
1517         if (rc == 0 && rlen >= 10*8 && vlen >= 204) {
1518                 memcpy(ci->serial, rarray, 8);
1519                 ci->new_mk_state = (char) rarray[7*8];
1520                 ci->cur_mk_state = (char) rarray[8*8];
1521                 ci->old_mk_state = (char) rarray[9*8];
1522                 if (ci->old_mk_state == '2')
1523                         memcpy(&ci->old_mkvp, varray + 172, 8);
1524                 if (ci->cur_mk_state == '2')
1525                         memcpy(&ci->cur_mkvp, varray + 184, 8);
1526                 if (ci->new_mk_state == '3')
1527                         memcpy(&ci->new_mkvp, varray + 196, 8);
1528                 found = 1;
1529         }
1530 
1531         free_page((unsigned long) pg);
1532 
1533         return found ? 0 : -ENOENT;
1534 }
1535 
1536 /*
1537  * Fetch cca information about a CCA queue.
1538  */
1539 int cca_get_info(u16 card, u16 dom, struct cca_info *ci, int verify)
1540 {
1541         int rc;
1542 
1543         rc = cca_info_cache_fetch(card, dom, ci);
1544         if (rc || verify) {
1545                 rc = fetch_cca_info(card, dom, ci);
1546                 if (rc == 0)
1547                         cca_info_cache_update(card, dom, ci);
1548         }
1549 
1550         return rc;
1551 }
1552 EXPORT_SYMBOL(cca_get_info);
1553 
1554 /*
1555  * Search for a matching crypto card based on the
1556  * Master Key Verification Pattern given.
1557  */
1558 static int findcard(u64 mkvp, u16 *pcardnr, u16 *pdomain,
1559                     int verify, int minhwtype)
1560 {
1561         struct zcrypt_device_status_ext *device_status;
1562         u16 card, dom;
1563         struct cca_info ci;
1564         int i, rc, oi = -1;
1565 
1566         /* mkvp must not be zero, minhwtype needs to be >= 0 */
1567         if (mkvp == 0 || minhwtype < 0)
1568                 return -EINVAL;
1569 
1570         /* fetch status of all crypto cards */
1571         device_status = kmalloc_array(MAX_ZDEV_ENTRIES_EXT,
1572                                       sizeof(struct zcrypt_device_status_ext),
1573                                       GFP_KERNEL);
1574         if (!device_status)
1575                 return -ENOMEM;
1576         zcrypt_device_status_mask_ext(device_status);
1577 
1578         /* walk through all crypto cards */
1579         for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
1580                 card = AP_QID_CARD(device_status[i].qid);
1581                 dom = AP_QID_QUEUE(device_status[i].qid);
1582                 if (device_status[i].online &&
1583                     device_status[i].functions & 0x04) {
1584                         /* enabled CCA card, check current mkvp from cache */
1585                         if (cca_info_cache_fetch(card, dom, &ci) == 0 &&
1586                             ci.hwtype >= minhwtype &&
1587                             ci.cur_mk_state == '2' &&
1588                             ci.cur_mkvp == mkvp) {
1589                                 if (!verify)
1590                                         break;
1591                                 /* verify: refresh card info */
1592                                 if (fetch_cca_info(card, dom, &ci) == 0) {
1593                                         cca_info_cache_update(card, dom, &ci);
1594                                         if (ci.hwtype >= minhwtype &&
1595                                             ci.cur_mk_state == '2' &&
1596                                             ci.cur_mkvp == mkvp)
1597                                                 break;
1598                                 }
1599                         }
1600                 } else {
1601                         /* Card is offline and/or not a CCA card. */
1602                         /* del mkvp entry from cache if it exists */
1603                         cca_info_cache_scrub(card, dom);
1604                 }
1605         }
1606         if (i >= MAX_ZDEV_ENTRIES_EXT) {
1607                 /* nothing found, so this time without cache */
1608                 for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
1609                         if (!(device_status[i].online &&
1610                               device_status[i].functions & 0x04))
1611                                 continue;
1612                         card = AP_QID_CARD(device_status[i].qid);
1613                         dom = AP_QID_QUEUE(device_status[i].qid);
1614                         /* fresh fetch mkvp from adapter */
1615                         if (fetch_cca_info(card, dom, &ci) == 0) {
1616                                 cca_info_cache_update(card, dom, &ci);
1617                                 if (ci.hwtype >= minhwtype &&
1618                                     ci.cur_mk_state == '2' &&
1619                                     ci.cur_mkvp == mkvp)
1620                                         break;
1621                                 if (ci.hwtype >= minhwtype &&
1622                                     ci.old_mk_state == '2' &&
1623                                     ci.old_mkvp == mkvp &&
1624                                     oi < 0)
1625                                         oi = i;
1626                         }
1627                 }
1628                 if (i >= MAX_ZDEV_ENTRIES_EXT && oi >= 0) {
1629                         /* old mkvp matched, use this card then */
1630                         card = AP_QID_CARD(device_status[oi].qid);
1631                         dom = AP_QID_QUEUE(device_status[oi].qid);
1632                 }
1633         }
1634         if (i < MAX_ZDEV_ENTRIES_EXT || oi >= 0) {
1635                 if (pcardnr)
1636                         *pcardnr = card;
1637                 if (pdomain)
1638                         *pdomain = dom;
1639                 rc = (i < MAX_ZDEV_ENTRIES_EXT ? 0 : 1);
1640         } else
1641                 rc = -ENODEV;
1642 
1643         kfree(device_status);
1644         return rc;
1645 }
1646 
1647 /*
1648  * Search for a matching crypto card based on the Master Key
1649  * Verification Pattern provided inside a secure key token.
1650  */
1651 int cca_findcard(const u8 *key, u16 *pcardnr, u16 *pdomain, int verify)
1652 {
1653         u64 mkvp;
1654         int minhwtype = 0;
1655         const struct keytoken_header *hdr = (struct keytoken_header *) key;
1656 
1657         if (hdr->type != TOKTYPE_CCA_INTERNAL)
1658                 return -EINVAL;
1659 
1660         switch (hdr->version) {
1661         case TOKVER_CCA_AES:
1662                 mkvp = ((struct secaeskeytoken *)key)->mkvp;
1663                 break;
1664         case TOKVER_CCA_VLSC:
1665                 mkvp = ((struct cipherkeytoken *)key)->mkvp0;
1666                 minhwtype = AP_DEVICE_TYPE_CEX6;
1667                 break;
1668         default:
1669                 return -EINVAL;
1670         }
1671 
1672         return findcard(mkvp, pcardnr, pdomain, verify, minhwtype);
1673 }
1674 EXPORT_SYMBOL(cca_findcard);
1675 
1676 int cca_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
1677                   int minhwtype, u64 cur_mkvp, u64 old_mkvp, int verify)
1678 {
1679         struct zcrypt_device_status_ext *device_status;
1680         int i, n, card, dom, curmatch, oldmatch, rc = 0;
1681         struct cca_info ci;
1682 
1683         *apqns = NULL;
1684         *nr_apqns = 0;
1685 
1686         /* fetch status of all crypto cards */
1687         device_status = kmalloc_array(MAX_ZDEV_ENTRIES_EXT,
1688                                       sizeof(struct zcrypt_device_status_ext),
1689                                       GFP_KERNEL);
1690         if (!device_status)
1691                 return -ENOMEM;
1692         zcrypt_device_status_mask_ext(device_status);
1693 
1694         /* loop two times: first gather eligible apqns, then store them */
1695         while (1) {
1696                 n = 0;
1697                 /* walk through all the crypto cards */
1698                 for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
1699                         card = AP_QID_CARD(device_status[i].qid);
1700                         dom = AP_QID_QUEUE(device_status[i].qid);
1701                         /* check online state */
1702                         if (!device_status[i].online)
1703                                 continue;
1704                         /* check for cca functions */
1705                         if (!(device_status[i].functions & 0x04))
1706                                 continue;
1707                         /* check cardnr */
1708                         if (cardnr != 0xFFFF && card != cardnr)
1709                                 continue;
1710                         /* check domain */
1711                         if (domain != 0xFFFF && dom != domain)
1712                                 continue;
1713                         /* get cca info on this apqn */
1714                         if (cca_get_info(card, dom, &ci, verify))
1715                                 continue;
1716                         /* current master key needs to be valid */
1717                         if (ci.cur_mk_state != '2')
1718                                 continue;
1719                         /* check min hardware type */
1720                         if (minhwtype > 0 && minhwtype > ci.hwtype)
1721                                 continue;
1722                         if (cur_mkvp || old_mkvp) {
1723                                 /* check mkvps */
1724                                 curmatch = oldmatch = 0;
1725                                 if (cur_mkvp && cur_mkvp == ci.cur_mkvp)
1726                                         curmatch = 1;
1727                                 if (old_mkvp && ci.old_mk_state == '2' &&
1728                                     old_mkvp == ci.old_mkvp)
1729                                         oldmatch = 1;
1730                                 if ((cur_mkvp || old_mkvp) &&
1731                                     (curmatch + oldmatch < 1))
1732                                         continue;
1733                         }
1734                         /* apqn passed all filtering criterons */
1735                         if (*apqns && n < *nr_apqns)
1736                                 (*apqns)[n] = (((u16)card) << 16) | ((u16) dom);
1737                         n++;
1738                 }
1739                 /* loop 2nd time: array has been filled */
1740                 if (*apqns)
1741                         break;
1742                 /* loop 1st time: have # of eligible apqns in n */
1743                 if (!n) {
1744                         rc = -ENODEV; /* no eligible apqns found */
1745                         break;
1746                 }
1747                 *nr_apqns = n;
1748                 /* allocate array to store n apqns into */
1749                 *apqns = kmalloc_array(n, sizeof(u32), GFP_KERNEL);
1750                 if (!*apqns) {
1751                         rc = -ENOMEM;
1752                         break;
1753                 }
1754                 verify = 0;
1755         }
1756 
1757         kfree(device_status);
1758         return rc;
1759 }
1760 EXPORT_SYMBOL(cca_findcard2);
1761 
1762 void __exit zcrypt_ccamisc_exit(void)
1763 {
1764         mkvp_cache_free();
1765 }

/* [<][>][^][v][top][bottom][index][help] */