0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #define KMSG_COMPONENT "zcrypt"
0011 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
0012
0013 #include <linux/init.h>
0014 #include <linux/module.h>
0015 #include <linux/slab.h>
0016 #include <linux/random.h>
0017 #include <asm/zcrypt.h>
0018 #include <asm/pkey.h>
0019
0020 #include "ap_bus.h"
0021 #include "zcrypt_api.h"
0022 #include "zcrypt_debug.h"
0023 #include "zcrypt_msgtype6.h"
0024 #include "zcrypt_ccamisc.h"
0025
0026 #define DEBUG_DBG(...) ZCRYPT_DBF(DBF_DEBUG, ##__VA_ARGS__)
0027 #define DEBUG_INFO(...) ZCRYPT_DBF(DBF_INFO, ##__VA_ARGS__)
0028 #define DEBUG_WARN(...) ZCRYPT_DBF(DBF_WARN, ##__VA_ARGS__)
0029 #define DEBUG_ERR(...) ZCRYPT_DBF(DBF_ERR, ##__VA_ARGS__)
0030
0031
0032 #define PARMBSIZE 512
0033
0034
0035 #define VARDATASIZE 4096
0036
0037 struct cca_info_list_entry {
0038 struct list_head list;
0039 u16 cardnr;
0040 u16 domain;
0041 struct cca_info info;
0042 };
0043
0044
0045 static LIST_HEAD(cca_info_list);
0046 static DEFINE_SPINLOCK(cca_info_list_lock);
0047
0048
0049
0050
0051
0052
0053 int cca_check_secaeskeytoken(debug_info_t *dbg, int dbflvl,
0054 const u8 *token, int keybitsize)
0055 {
0056 struct secaeskeytoken *t = (struct secaeskeytoken *)token;
0057
0058 #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
0059
0060 if (t->type != TOKTYPE_CCA_INTERNAL) {
0061 if (dbg)
0062 DBF("%s token check failed, type 0x%02x != 0x%02x\n",
0063 __func__, (int)t->type, TOKTYPE_CCA_INTERNAL);
0064 return -EINVAL;
0065 }
0066 if (t->version != TOKVER_CCA_AES) {
0067 if (dbg)
0068 DBF("%s token check failed, version 0x%02x != 0x%02x\n",
0069 __func__, (int)t->version, TOKVER_CCA_AES);
0070 return -EINVAL;
0071 }
0072 if (keybitsize > 0 && t->bitsize != keybitsize) {
0073 if (dbg)
0074 DBF("%s token check failed, bitsize %d != %d\n",
0075 __func__, (int)t->bitsize, keybitsize);
0076 return -EINVAL;
0077 }
0078
0079 #undef DBF
0080
0081 return 0;
0082 }
0083 EXPORT_SYMBOL(cca_check_secaeskeytoken);
0084
0085
0086
0087
0088
0089
0090
0091
0092 int cca_check_secaescipherkey(debug_info_t *dbg, int dbflvl,
0093 const u8 *token, int keybitsize,
0094 int checkcpacfexport)
0095 {
0096 struct cipherkeytoken *t = (struct cipherkeytoken *)token;
0097 bool keybitsizeok = true;
0098
0099 #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
0100
0101 if (t->type != TOKTYPE_CCA_INTERNAL) {
0102 if (dbg)
0103 DBF("%s token check failed, type 0x%02x != 0x%02x\n",
0104 __func__, (int)t->type, TOKTYPE_CCA_INTERNAL);
0105 return -EINVAL;
0106 }
0107 if (t->version != TOKVER_CCA_VLSC) {
0108 if (dbg)
0109 DBF("%s token check failed, version 0x%02x != 0x%02x\n",
0110 __func__, (int)t->version, TOKVER_CCA_VLSC);
0111 return -EINVAL;
0112 }
0113 if (t->algtype != 0x02) {
0114 if (dbg)
0115 DBF("%s token check failed, algtype 0x%02x != 0x02\n",
0116 __func__, (int)t->algtype);
0117 return -EINVAL;
0118 }
0119 if (t->keytype != 0x0001) {
0120 if (dbg)
0121 DBF("%s token check failed, keytype 0x%04x != 0x0001\n",
0122 __func__, (int)t->keytype);
0123 return -EINVAL;
0124 }
0125 if (t->plfver != 0x00 && t->plfver != 0x01) {
0126 if (dbg)
0127 DBF("%s token check failed, unknown plfver 0x%02x\n",
0128 __func__, (int)t->plfver);
0129 return -EINVAL;
0130 }
0131 if (t->wpllen != 512 && t->wpllen != 576 && t->wpllen != 640) {
0132 if (dbg)
0133 DBF("%s token check failed, unknown wpllen %d\n",
0134 __func__, (int)t->wpllen);
0135 return -EINVAL;
0136 }
0137 if (keybitsize > 0) {
0138 switch (keybitsize) {
0139 case 128:
0140 if (t->wpllen != (t->plfver ? 640 : 512))
0141 keybitsizeok = false;
0142 break;
0143 case 192:
0144 if (t->wpllen != (t->plfver ? 640 : 576))
0145 keybitsizeok = false;
0146 break;
0147 case 256:
0148 if (t->wpllen != 640)
0149 keybitsizeok = false;
0150 break;
0151 default:
0152 keybitsizeok = false;
0153 break;
0154 }
0155 if (!keybitsizeok) {
0156 if (dbg)
0157 DBF("%s token check failed, bitsize %d\n",
0158 __func__, keybitsize);
0159 return -EINVAL;
0160 }
0161 }
0162 if (checkcpacfexport && !(t->kmf1 & KMF1_XPRT_CPAC)) {
0163 if (dbg)
0164 DBF("%s token check failed, XPRT_CPAC bit is 0\n",
0165 __func__);
0166 return -EINVAL;
0167 }
0168
0169 #undef DBF
0170
0171 return 0;
0172 }
0173 EXPORT_SYMBOL(cca_check_secaescipherkey);
0174
0175
0176
0177
0178
0179 int cca_check_sececckeytoken(debug_info_t *dbg, int dbflvl,
0180 const u8 *token, size_t keysize,
0181 int checkcpacfexport)
0182 {
0183 struct eccprivkeytoken *t = (struct eccprivkeytoken *)token;
0184
0185 #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
0186
0187 if (t->type != TOKTYPE_CCA_INTERNAL_PKA) {
0188 if (dbg)
0189 DBF("%s token check failed, type 0x%02x != 0x%02x\n",
0190 __func__, (int)t->type, TOKTYPE_CCA_INTERNAL_PKA);
0191 return -EINVAL;
0192 }
0193 if (t->len > keysize) {
0194 if (dbg)
0195 DBF("%s token check failed, len %d > keysize %zu\n",
0196 __func__, (int)t->len, keysize);
0197 return -EINVAL;
0198 }
0199 if (t->secid != 0x20) {
0200 if (dbg)
0201 DBF("%s token check failed, secid 0x%02x != 0x20\n",
0202 __func__, (int)t->secid);
0203 return -EINVAL;
0204 }
0205 if (checkcpacfexport && !(t->kutc & 0x01)) {
0206 if (dbg)
0207 DBF("%s token check failed, XPRTCPAC bit is 0\n",
0208 __func__);
0209 return -EINVAL;
0210 }
0211
0212 #undef DBF
0213
0214 return 0;
0215 }
0216 EXPORT_SYMBOL(cca_check_sececckeytoken);
0217
0218
0219
0220
0221
0222
0223
0224 static int alloc_and_prep_cprbmem(size_t paramblen,
0225 u8 **p_cprb_mem,
0226 struct CPRBX **p_req_cprb,
0227 struct CPRBX **p_rep_cprb)
0228 {
0229 u8 *cprbmem;
0230 size_t cprbplusparamblen = sizeof(struct CPRBX) + paramblen;
0231 struct CPRBX *preqcblk, *prepcblk;
0232
0233
0234
0235
0236
0237 cprbmem = kcalloc(2, cprbplusparamblen, GFP_KERNEL);
0238 if (!cprbmem)
0239 return -ENOMEM;
0240
0241 preqcblk = (struct CPRBX *)cprbmem;
0242 prepcblk = (struct CPRBX *)(cprbmem + cprbplusparamblen);
0243
0244
0245 preqcblk->cprb_len = sizeof(struct CPRBX);
0246 preqcblk->cprb_ver_id = 0x02;
0247 memcpy(preqcblk->func_id, "T2", 2);
0248 preqcblk->rpl_msgbl = cprbplusparamblen;
0249 if (paramblen) {
0250 preqcblk->req_parmb =
0251 ((u8 __user *)preqcblk) + sizeof(struct CPRBX);
0252 preqcblk->rpl_parmb =
0253 ((u8 __user *)prepcblk) + sizeof(struct CPRBX);
0254 }
0255
0256 *p_cprb_mem = cprbmem;
0257 *p_req_cprb = preqcblk;
0258 *p_rep_cprb = prepcblk;
0259
0260 return 0;
0261 }
0262
0263
0264
0265
0266
0267
0268
0269 static void free_cprbmem(void *mem, size_t paramblen, int scrub)
0270 {
0271 if (scrub)
0272 memzero_explicit(mem, 2 * (sizeof(struct CPRBX) + paramblen));
0273 kfree(mem);
0274 }
0275
0276
0277
0278
0279 static inline void prep_xcrb(struct ica_xcRB *pxcrb,
0280 u16 cardnr,
0281 struct CPRBX *preqcblk,
0282 struct CPRBX *prepcblk)
0283 {
0284 memset(pxcrb, 0, sizeof(*pxcrb));
0285 pxcrb->agent_ID = 0x4341;
0286 pxcrb->user_defined = (cardnr == 0xFFFF ? AUTOSELECT : cardnr);
0287 pxcrb->request_control_blk_length =
0288 preqcblk->cprb_len + preqcblk->req_parml;
0289 pxcrb->request_control_blk_addr = (void __user *)preqcblk;
0290 pxcrb->reply_control_blk_length = preqcblk->rpl_msgbl;
0291 pxcrb->reply_control_blk_addr = (void __user *)prepcblk;
0292 }
0293
0294
0295
0296
0297 int cca_genseckey(u16 cardnr, u16 domain,
0298 u32 keybitsize, u8 *seckey)
0299 {
0300 int i, rc, keysize;
0301 int seckeysize;
0302 u8 *mem, *ptr;
0303 struct CPRBX *preqcblk, *prepcblk;
0304 struct ica_xcRB xcrb;
0305 struct kgreqparm {
0306 u8 subfunc_code[2];
0307 u16 rule_array_len;
0308 struct lv1 {
0309 u16 len;
0310 char key_form[8];
0311 char key_length[8];
0312 char key_type1[8];
0313 char key_type2[8];
0314 } lv1;
0315 struct lv2 {
0316 u16 len;
0317 struct keyid {
0318 u16 len;
0319 u16 attr;
0320 u8 data[SECKEYBLOBSIZE];
0321 } keyid[6];
0322 } lv2;
0323 } __packed * preqparm;
0324 struct kgrepparm {
0325 u8 subfunc_code[2];
0326 u16 rule_array_len;
0327 struct lv3 {
0328 u16 len;
0329 u16 keyblocklen;
0330 struct {
0331 u16 toklen;
0332 u16 tokattr;
0333 u8 tok[];
0334
0335 } keyblock;
0336 } lv3;
0337 } __packed * prepparm;
0338
0339
0340 rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
0341 if (rc)
0342 return rc;
0343
0344
0345 preqcblk->domain = domain;
0346
0347
0348 preqparm = (struct kgreqparm __force *)preqcblk->req_parmb;
0349 memcpy(preqparm->subfunc_code, "KG", 2);
0350 preqparm->rule_array_len = sizeof(preqparm->rule_array_len);
0351 preqparm->lv1.len = sizeof(struct lv1);
0352 memcpy(preqparm->lv1.key_form, "OP ", 8);
0353 switch (keybitsize) {
0354 case PKEY_SIZE_AES_128:
0355 case PKEY_KEYTYPE_AES_128:
0356 keysize = 16;
0357 memcpy(preqparm->lv1.key_length, "KEYLN16 ", 8);
0358 break;
0359 case PKEY_SIZE_AES_192:
0360 case PKEY_KEYTYPE_AES_192:
0361 keysize = 24;
0362 memcpy(preqparm->lv1.key_length, "KEYLN24 ", 8);
0363 break;
0364 case PKEY_SIZE_AES_256:
0365 case PKEY_KEYTYPE_AES_256:
0366 keysize = 32;
0367 memcpy(preqparm->lv1.key_length, "KEYLN32 ", 8);
0368 break;
0369 default:
0370 DEBUG_ERR("%s unknown/unsupported keybitsize %d\n",
0371 __func__, keybitsize);
0372 rc = -EINVAL;
0373 goto out;
0374 }
0375 memcpy(preqparm->lv1.key_type1, "AESDATA ", 8);
0376 preqparm->lv2.len = sizeof(struct lv2);
0377 for (i = 0; i < 6; i++) {
0378 preqparm->lv2.keyid[i].len = sizeof(struct keyid);
0379 preqparm->lv2.keyid[i].attr = (i == 2 ? 0x30 : 0x10);
0380 }
0381 preqcblk->req_parml = sizeof(struct kgreqparm);
0382
0383
0384 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
0385
0386
0387 rc = zcrypt_send_cprb(&xcrb);
0388 if (rc) {
0389 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, errno %d\n",
0390 __func__, (int)cardnr, (int)domain, rc);
0391 goto out;
0392 }
0393
0394
0395 if (prepcblk->ccp_rtcode != 0) {
0396 DEBUG_ERR("%s secure key generate failure, card response %d/%d\n",
0397 __func__,
0398 (int)prepcblk->ccp_rtcode,
0399 (int)prepcblk->ccp_rscode);
0400 rc = -EIO;
0401 goto out;
0402 }
0403
0404
0405 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
0406 prepcblk->rpl_parmb = (u8 __user *)ptr;
0407 prepparm = (struct kgrepparm *)ptr;
0408
0409
0410 seckeysize = prepparm->lv3.keyblock.toklen
0411 - sizeof(prepparm->lv3.keyblock.toklen)
0412 - sizeof(prepparm->lv3.keyblock.tokattr);
0413 if (seckeysize != SECKEYBLOBSIZE) {
0414 DEBUG_ERR("%s secure token size mismatch %d != %d bytes\n",
0415 __func__, seckeysize, SECKEYBLOBSIZE);
0416 rc = -EIO;
0417 goto out;
0418 }
0419
0420
0421 rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
0422 prepparm->lv3.keyblock.tok, 8 * keysize);
0423 if (rc) {
0424 rc = -EIO;
0425 goto out;
0426 }
0427
0428
0429 memcpy(seckey, prepparm->lv3.keyblock.tok, SECKEYBLOBSIZE);
0430
0431 out:
0432 free_cprbmem(mem, PARMBSIZE, 0);
0433 return rc;
0434 }
0435 EXPORT_SYMBOL(cca_genseckey);
0436
0437
0438
0439
0440 int cca_clr2seckey(u16 cardnr, u16 domain, u32 keybitsize,
0441 const u8 *clrkey, u8 *seckey)
0442 {
0443 int rc, keysize, seckeysize;
0444 u8 *mem, *ptr;
0445 struct CPRBX *preqcblk, *prepcblk;
0446 struct ica_xcRB xcrb;
0447 struct cmreqparm {
0448 u8 subfunc_code[2];
0449 u16 rule_array_len;
0450 char rule_array[8];
0451 struct lv1 {
0452 u16 len;
0453 u8 clrkey[0];
0454 } lv1;
0455 struct lv2 {
0456 u16 len;
0457 struct keyid {
0458 u16 len;
0459 u16 attr;
0460 u8 data[SECKEYBLOBSIZE];
0461 } keyid;
0462 } lv2;
0463 } __packed * preqparm;
0464 struct lv2 *plv2;
0465 struct cmrepparm {
0466 u8 subfunc_code[2];
0467 u16 rule_array_len;
0468 struct lv3 {
0469 u16 len;
0470 u16 keyblocklen;
0471 struct {
0472 u16 toklen;
0473 u16 tokattr;
0474 u8 tok[];
0475
0476 } keyblock;
0477 } lv3;
0478 } __packed * prepparm;
0479
0480
0481 rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
0482 if (rc)
0483 return rc;
0484
0485
0486 preqcblk->domain = domain;
0487
0488
0489 preqparm = (struct cmreqparm __force *)preqcblk->req_parmb;
0490 memcpy(preqparm->subfunc_code, "CM", 2);
0491 memcpy(preqparm->rule_array, "AES ", 8);
0492 preqparm->rule_array_len =
0493 sizeof(preqparm->rule_array_len) + sizeof(preqparm->rule_array);
0494 switch (keybitsize) {
0495 case PKEY_SIZE_AES_128:
0496 case PKEY_KEYTYPE_AES_128:
0497 keysize = 16;
0498 break;
0499 case PKEY_SIZE_AES_192:
0500 case PKEY_KEYTYPE_AES_192:
0501 keysize = 24;
0502 break;
0503 case PKEY_SIZE_AES_256:
0504 case PKEY_KEYTYPE_AES_256:
0505 keysize = 32;
0506 break;
0507 default:
0508 DEBUG_ERR("%s unknown/unsupported keybitsize %d\n",
0509 __func__, keybitsize);
0510 rc = -EINVAL;
0511 goto out;
0512 }
0513 preqparm->lv1.len = sizeof(struct lv1) + keysize;
0514 memcpy(preqparm->lv1.clrkey, clrkey, keysize);
0515 plv2 = (struct lv2 *)(((u8 *)&preqparm->lv2) + keysize);
0516 plv2->len = sizeof(struct lv2);
0517 plv2->keyid.len = sizeof(struct keyid);
0518 plv2->keyid.attr = 0x30;
0519 preqcblk->req_parml = sizeof(struct cmreqparm) + keysize;
0520
0521
0522 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
0523
0524
0525 rc = zcrypt_send_cprb(&xcrb);
0526 if (rc) {
0527 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
0528 __func__, (int)cardnr, (int)domain, rc);
0529 goto out;
0530 }
0531
0532
0533 if (prepcblk->ccp_rtcode != 0) {
0534 DEBUG_ERR("%s clear key import failure, card response %d/%d\n",
0535 __func__,
0536 (int)prepcblk->ccp_rtcode,
0537 (int)prepcblk->ccp_rscode);
0538 rc = -EIO;
0539 goto out;
0540 }
0541
0542
0543 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
0544 prepcblk->rpl_parmb = (u8 __user *)ptr;
0545 prepparm = (struct cmrepparm *)ptr;
0546
0547
0548 seckeysize = prepparm->lv3.keyblock.toklen
0549 - sizeof(prepparm->lv3.keyblock.toklen)
0550 - sizeof(prepparm->lv3.keyblock.tokattr);
0551 if (seckeysize != SECKEYBLOBSIZE) {
0552 DEBUG_ERR("%s secure token size mismatch %d != %d bytes\n",
0553 __func__, seckeysize, SECKEYBLOBSIZE);
0554 rc = -EIO;
0555 goto out;
0556 }
0557
0558
0559 rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
0560 prepparm->lv3.keyblock.tok, 8 * keysize);
0561 if (rc) {
0562 rc = -EIO;
0563 goto out;
0564 }
0565
0566
0567 if (seckey)
0568 memcpy(seckey, prepparm->lv3.keyblock.tok, SECKEYBLOBSIZE);
0569
0570 out:
0571 free_cprbmem(mem, PARMBSIZE, 1);
0572 return rc;
0573 }
0574 EXPORT_SYMBOL(cca_clr2seckey);
0575
0576
0577
0578
0579 int cca_sec2protkey(u16 cardnr, u16 domain,
0580 const u8 *seckey, u8 *protkey, u32 *protkeylen,
0581 u32 *protkeytype)
0582 {
0583 int rc;
0584 u8 *mem, *ptr;
0585 struct CPRBX *preqcblk, *prepcblk;
0586 struct ica_xcRB xcrb;
0587 struct uskreqparm {
0588 u8 subfunc_code[2];
0589 u16 rule_array_len;
0590 struct lv1 {
0591 u16 len;
0592 u16 attr_len;
0593 u16 attr_flags;
0594 } lv1;
0595 struct lv2 {
0596 u16 len;
0597 u16 attr_len;
0598 u16 attr_flags;
0599 u8 token[];
0600 } lv2;
0601 } __packed * preqparm;
0602 struct uskrepparm {
0603 u8 subfunc_code[2];
0604 u16 rule_array_len;
0605 struct lv3 {
0606 u16 len;
0607 u16 attr_len;
0608 u16 attr_flags;
0609 struct cpacfkeyblock {
0610 u8 version;
0611 u8 flags[2];
0612 u8 algo;
0613 u8 form;
0614 u8 pad1[3];
0615 u16 len;
0616 u8 key[64];
0617 u16 keyattrlen;
0618 u8 keyattr[32];
0619 u8 pad2[1];
0620 u8 vptype;
0621 u8 vp[32];
0622 } ckb;
0623 } lv3;
0624 } __packed * prepparm;
0625
0626
0627 rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
0628 if (rc)
0629 return rc;
0630
0631
0632 preqcblk->domain = domain;
0633
0634
0635 preqparm = (struct uskreqparm __force *)preqcblk->req_parmb;
0636 memcpy(preqparm->subfunc_code, "US", 2);
0637 preqparm->rule_array_len = sizeof(preqparm->rule_array_len);
0638 preqparm->lv1.len = sizeof(struct lv1);
0639 preqparm->lv1.attr_len = sizeof(struct lv1) - sizeof(preqparm->lv1.len);
0640 preqparm->lv1.attr_flags = 0x0001;
0641 preqparm->lv2.len = sizeof(struct lv2) + SECKEYBLOBSIZE;
0642 preqparm->lv2.attr_len = sizeof(struct lv2)
0643 - sizeof(preqparm->lv2.len) + SECKEYBLOBSIZE;
0644 preqparm->lv2.attr_flags = 0x0000;
0645 memcpy(preqparm->lv2.token, seckey, SECKEYBLOBSIZE);
0646 preqcblk->req_parml = sizeof(struct uskreqparm) + SECKEYBLOBSIZE;
0647
0648
0649 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
0650
0651
0652 rc = zcrypt_send_cprb(&xcrb);
0653 if (rc) {
0654 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
0655 __func__, (int)cardnr, (int)domain, rc);
0656 goto out;
0657 }
0658
0659
0660 if (prepcblk->ccp_rtcode != 0) {
0661 DEBUG_ERR("%s unwrap secure key failure, card response %d/%d\n",
0662 __func__,
0663 (int)prepcblk->ccp_rtcode,
0664 (int)prepcblk->ccp_rscode);
0665 if (prepcblk->ccp_rtcode == 8 && prepcblk->ccp_rscode == 2290)
0666 rc = -EAGAIN;
0667 else
0668 rc = -EIO;
0669 goto out;
0670 }
0671 if (prepcblk->ccp_rscode != 0) {
0672 DEBUG_WARN("%s unwrap secure key warning, card response %d/%d\n",
0673 __func__,
0674 (int)prepcblk->ccp_rtcode,
0675 (int)prepcblk->ccp_rscode);
0676 }
0677
0678
0679 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
0680 prepcblk->rpl_parmb = (u8 __user *)ptr;
0681 prepparm = (struct uskrepparm *)ptr;
0682
0683
0684 if (prepparm->lv3.ckb.version != 0x01 &&
0685 prepparm->lv3.ckb.version != 0x02) {
0686 DEBUG_ERR("%s reply param keyblock version mismatch 0x%02x\n",
0687 __func__, (int)prepparm->lv3.ckb.version);
0688 rc = -EIO;
0689 goto out;
0690 }
0691
0692
0693 switch (prepparm->lv3.ckb.len) {
0694 case 16 + 32:
0695
0696 if (protkeytype)
0697 *protkeytype = PKEY_KEYTYPE_AES_128;
0698 break;
0699 case 24 + 32:
0700
0701 if (protkeytype)
0702 *protkeytype = PKEY_KEYTYPE_AES_192;
0703 break;
0704 case 32 + 32:
0705
0706 if (protkeytype)
0707 *protkeytype = PKEY_KEYTYPE_AES_256;
0708 break;
0709 default:
0710 DEBUG_ERR("%s unknown/unsupported keylen %d\n",
0711 __func__, prepparm->lv3.ckb.len);
0712 rc = -EIO;
0713 goto out;
0714 }
0715 memcpy(protkey, prepparm->lv3.ckb.key, prepparm->lv3.ckb.len);
0716 if (protkeylen)
0717 *protkeylen = prepparm->lv3.ckb.len;
0718
0719 out:
0720 free_cprbmem(mem, PARMBSIZE, 0);
0721 return rc;
0722 }
0723 EXPORT_SYMBOL(cca_sec2protkey);
0724
0725
0726
0727
0728
0729
0730
0731 static const u8 aes_cipher_key_skeleton[] = {
0732 0x01, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x00,
0733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0735 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
0736 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0737 0x00, 0x02, 0x00, 0x01, 0x02, 0xc0, 0x00, 0xff,
0738 0x00, 0x03, 0x08, 0xc8, 0x00, 0x00, 0x00, 0x00 };
0739 #define SIZEOF_SKELETON (sizeof(aes_cipher_key_skeleton))
0740
0741
0742
0743
0744 int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
0745 u8 *keybuf, size_t *keybufsize)
0746 {
0747 int rc;
0748 u8 *mem, *ptr;
0749 struct CPRBX *preqcblk, *prepcblk;
0750 struct ica_xcRB xcrb;
0751 struct gkreqparm {
0752 u8 subfunc_code[2];
0753 u16 rule_array_len;
0754 char rule_array[2 * 8];
0755 struct {
0756 u16 len;
0757 u8 key_type_1[8];
0758 u8 key_type_2[8];
0759 u16 clear_key_bit_len;
0760 u16 key_name_1_len;
0761 u16 key_name_2_len;
0762 u16 user_data_1_len;
0763 u16 user_data_2_len;
0764 u8 key_name_1[0];
0765 u8 key_name_2[0];
0766 u8 user_data_1[0];
0767 u8 user_data_2[0];
0768 } vud;
0769 struct {
0770 u16 len;
0771 struct {
0772 u16 len;
0773 u16 flag;
0774 u8 kek_id_1[0];
0775 } tlv1;
0776 struct {
0777 u16 len;
0778 u16 flag;
0779 u8 kek_id_2[0];
0780 } tlv2;
0781 struct {
0782 u16 len;
0783 u16 flag;
0784 u8 gen_key_id_1[SIZEOF_SKELETON];
0785 } tlv3;
0786 struct {
0787 u16 len;
0788 u16 flag;
0789 u8 gen_key_id_1_label[0];
0790 } tlv4;
0791 struct {
0792 u16 len;
0793 u16 flag;
0794 u8 gen_key_id_2[0];
0795 } tlv5;
0796 struct {
0797 u16 len;
0798 u16 flag;
0799 u8 gen_key_id_2_label[0];
0800 } tlv6;
0801 } kb;
0802 } __packed * preqparm;
0803 struct gkrepparm {
0804 u8 subfunc_code[2];
0805 u16 rule_array_len;
0806 struct {
0807 u16 len;
0808 } vud;
0809 struct {
0810 u16 len;
0811 struct {
0812 u16 len;
0813 u16 flag;
0814 u8 gen_key[0];
0815 } tlv1;
0816 } kb;
0817 } __packed * prepparm;
0818 struct cipherkeytoken *t;
0819
0820
0821 rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
0822 if (rc)
0823 return rc;
0824
0825
0826 preqcblk->domain = domain;
0827 preqcblk->req_parml = sizeof(struct gkreqparm);
0828
0829
0830 preqparm = (struct gkreqparm __force *)preqcblk->req_parmb;
0831 memcpy(preqparm->subfunc_code, "GK", 2);
0832 preqparm->rule_array_len = sizeof(uint16_t) + 2 * 8;
0833 memcpy(preqparm->rule_array, "AES OP ", 2 * 8);
0834
0835
0836 preqparm->vud.len = sizeof(preqparm->vud);
0837 switch (keybitsize) {
0838 case 128:
0839 case 192:
0840 case 256:
0841 break;
0842 default:
0843 DEBUG_ERR(
0844 "%s unknown/unsupported keybitsize %d\n",
0845 __func__, keybitsize);
0846 rc = -EINVAL;
0847 goto out;
0848 }
0849 preqparm->vud.clear_key_bit_len = keybitsize;
0850 memcpy(preqparm->vud.key_type_1, "TOKEN ", 8);
0851 memset(preqparm->vud.key_type_2, ' ', sizeof(preqparm->vud.key_type_2));
0852
0853
0854 preqparm->kb.len = sizeof(preqparm->kb);
0855 preqparm->kb.tlv1.len = sizeof(preqparm->kb.tlv1);
0856 preqparm->kb.tlv1.flag = 0x0030;
0857 preqparm->kb.tlv2.len = sizeof(preqparm->kb.tlv2);
0858 preqparm->kb.tlv2.flag = 0x0030;
0859 preqparm->kb.tlv3.len = sizeof(preqparm->kb.tlv3);
0860 preqparm->kb.tlv3.flag = 0x0030;
0861 memcpy(preqparm->kb.tlv3.gen_key_id_1,
0862 aes_cipher_key_skeleton, SIZEOF_SKELETON);
0863 preqparm->kb.tlv4.len = sizeof(preqparm->kb.tlv4);
0864 preqparm->kb.tlv4.flag = 0x0030;
0865 preqparm->kb.tlv5.len = sizeof(preqparm->kb.tlv5);
0866 preqparm->kb.tlv5.flag = 0x0030;
0867 preqparm->kb.tlv6.len = sizeof(preqparm->kb.tlv6);
0868 preqparm->kb.tlv6.flag = 0x0030;
0869
0870
0871 if (keygenflags) {
0872 t = (struct cipherkeytoken *)preqparm->kb.tlv3.gen_key_id_1;
0873 t->kmf1 |= (u16)(keygenflags & 0x0000FF00);
0874 t->kmf1 &= (u16)~(keygenflags & 0x000000FF);
0875 }
0876
0877
0878 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
0879
0880
0881 rc = zcrypt_send_cprb(&xcrb);
0882 if (rc) {
0883 DEBUG_ERR(
0884 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
0885 __func__, (int)cardnr, (int)domain, rc);
0886 goto out;
0887 }
0888
0889
0890 if (prepcblk->ccp_rtcode != 0) {
0891 DEBUG_ERR(
0892 "%s cipher key generate failure, card response %d/%d\n",
0893 __func__,
0894 (int)prepcblk->ccp_rtcode,
0895 (int)prepcblk->ccp_rscode);
0896 rc = -EIO;
0897 goto out;
0898 }
0899
0900
0901 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
0902 prepcblk->rpl_parmb = (u8 __user *)ptr;
0903 prepparm = (struct gkrepparm *)ptr;
0904
0905
0906 if (prepparm->kb.len < 120 + 5 * sizeof(uint16_t) ||
0907 prepparm->kb.len > 136 + 5 * sizeof(uint16_t)) {
0908 DEBUG_ERR("%s reply with invalid or unknown key block\n",
0909 __func__);
0910 rc = -EIO;
0911 goto out;
0912 }
0913
0914
0915 rc = cca_check_secaescipherkey(zcrypt_dbf_info, DBF_ERR,
0916 prepparm->kb.tlv1.gen_key,
0917 keybitsize, 1);
0918 if (rc) {
0919 rc = -EIO;
0920 goto out;
0921 }
0922
0923
0924 t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
0925 if (keybuf) {
0926 if (*keybufsize >= t->len)
0927 memcpy(keybuf, t, t->len);
0928 else
0929 rc = -EINVAL;
0930 }
0931 *keybufsize = t->len;
0932
0933 out:
0934 free_cprbmem(mem, PARMBSIZE, 0);
0935 return rc;
0936 }
0937 EXPORT_SYMBOL(cca_gencipherkey);
0938
0939
0940
0941
0942 static int _ip_cprb_helper(u16 cardnr, u16 domain,
0943 const char *rule_array_1,
0944 const char *rule_array_2,
0945 const char *rule_array_3,
0946 const u8 *clr_key_value,
0947 int clr_key_bit_size,
0948 u8 *key_token,
0949 int *key_token_size)
0950 {
0951 int rc, n;
0952 u8 *mem, *ptr;
0953 struct CPRBX *preqcblk, *prepcblk;
0954 struct ica_xcRB xcrb;
0955 struct rule_array_block {
0956 u8 subfunc_code[2];
0957 u16 rule_array_len;
0958 char rule_array[0];
0959 } __packed * preq_ra_block;
0960 struct vud_block {
0961 u16 len;
0962 struct {
0963 u16 len;
0964 u16 flag;
0965 u16 clr_key_bit_len;
0966 } tlv1;
0967 struct {
0968 u16 len;
0969 u16 flag;
0970 u8 clr_key[0];
0971 } tlv2;
0972 } __packed * preq_vud_block;
0973 struct key_block {
0974 u16 len;
0975 struct {
0976 u16 len;
0977 u16 flag;
0978 u8 key_token[0];
0979 } tlv1;
0980 } __packed * preq_key_block;
0981 struct iprepparm {
0982 u8 subfunc_code[2];
0983 u16 rule_array_len;
0984 struct {
0985 u16 len;
0986 } vud;
0987 struct {
0988 u16 len;
0989 struct {
0990 u16 len;
0991 u16 flag;
0992 u8 key_token[0];
0993 } tlv1;
0994 } kb;
0995 } __packed * prepparm;
0996 struct cipherkeytoken *t;
0997 int complete = strncmp(rule_array_2, "COMPLETE", 8) ? 0 : 1;
0998
0999
1000 rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
1001 if (rc)
1002 return rc;
1003
1004
1005 preqcblk->domain = domain;
1006 preqcblk->req_parml = 0;
1007
1008
1009 preq_ra_block = (struct rule_array_block __force *)preqcblk->req_parmb;
1010 memcpy(preq_ra_block->subfunc_code, "IP", 2);
1011 preq_ra_block->rule_array_len = sizeof(uint16_t) + 2 * 8;
1012 memcpy(preq_ra_block->rule_array, rule_array_1, 8);
1013 memcpy(preq_ra_block->rule_array + 8, rule_array_2, 8);
1014 preqcblk->req_parml = sizeof(struct rule_array_block) + 2 * 8;
1015 if (rule_array_3) {
1016 preq_ra_block->rule_array_len += 8;
1017 memcpy(preq_ra_block->rule_array + 16, rule_array_3, 8);
1018 preqcblk->req_parml += 8;
1019 }
1020
1021
1022 preq_vud_block = (struct vud_block __force *)
1023 (preqcblk->req_parmb + preqcblk->req_parml);
1024 n = complete ? 0 : (clr_key_bit_size + 7) / 8;
1025 preq_vud_block->len = sizeof(struct vud_block) + n;
1026 preq_vud_block->tlv1.len = sizeof(preq_vud_block->tlv1);
1027 preq_vud_block->tlv1.flag = 0x0064;
1028 preq_vud_block->tlv1.clr_key_bit_len = complete ? 0 : clr_key_bit_size;
1029 preq_vud_block->tlv2.len = sizeof(preq_vud_block->tlv2) + n;
1030 preq_vud_block->tlv2.flag = 0x0063;
1031 if (!complete)
1032 memcpy(preq_vud_block->tlv2.clr_key, clr_key_value, n);
1033 preqcblk->req_parml += preq_vud_block->len;
1034
1035
1036 preq_key_block = (struct key_block __force *)
1037 (preqcblk->req_parmb + preqcblk->req_parml);
1038 n = *key_token_size;
1039 preq_key_block->len = sizeof(struct key_block) + n;
1040 preq_key_block->tlv1.len = sizeof(preq_key_block->tlv1) + n;
1041 preq_key_block->tlv1.flag = 0x0030;
1042 memcpy(preq_key_block->tlv1.key_token, key_token, *key_token_size);
1043 preqcblk->req_parml += preq_key_block->len;
1044
1045
1046 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
1047
1048
1049 rc = zcrypt_send_cprb(&xcrb);
1050 if (rc) {
1051 DEBUG_ERR(
1052 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
1053 __func__, (int)cardnr, (int)domain, rc);
1054 goto out;
1055 }
1056
1057
1058 if (prepcblk->ccp_rtcode != 0) {
1059 DEBUG_ERR(
1060 "%s CSNBKPI2 failure, card response %d/%d\n",
1061 __func__,
1062 (int)prepcblk->ccp_rtcode,
1063 (int)prepcblk->ccp_rscode);
1064 rc = -EIO;
1065 goto out;
1066 }
1067
1068
1069 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
1070 prepcblk->rpl_parmb = (u8 __user *)ptr;
1071 prepparm = (struct iprepparm *)ptr;
1072
1073
1074 if (prepparm->kb.len < 120 + 3 * sizeof(uint16_t) ||
1075 prepparm->kb.len > 136 + 3 * sizeof(uint16_t)) {
1076 DEBUG_ERR("%s reply with invalid or unknown key block\n",
1077 __func__);
1078 rc = -EIO;
1079 goto out;
1080 }
1081
1082
1083
1084
1085 t = (struct cipherkeytoken *)prepparm->kb.tlv1.key_token;
1086 memcpy(key_token, t, t->len);
1087 *key_token_size = t->len;
1088
1089 out:
1090 free_cprbmem(mem, PARMBSIZE, 0);
1091 return rc;
1092 }
1093
1094
1095
1096
1097 int cca_clr2cipherkey(u16 card, u16 dom, u32 keybitsize, u32 keygenflags,
1098 const u8 *clrkey, u8 *keybuf, size_t *keybufsize)
1099 {
1100 int rc;
1101 u8 *token;
1102 int tokensize;
1103 u8 exorbuf[32];
1104 struct cipherkeytoken *t;
1105
1106
1107 get_random_bytes(exorbuf, sizeof(exorbuf));
1108
1109
1110 token = kmalloc(MAXCCAVLSCTOKENSIZE, GFP_KERNEL);
1111 if (!token)
1112 return -ENOMEM;
1113
1114
1115 tokensize = SIZEOF_SKELETON;
1116 memcpy(token, aes_cipher_key_skeleton, tokensize);
1117
1118
1119 if (keygenflags) {
1120 t = (struct cipherkeytoken *)token;
1121 t->kmf1 |= (u16)(keygenflags & 0x0000FF00);
1122 t->kmf1 &= (u16)~(keygenflags & 0x000000FF);
1123 }
1124
1125
1126
1127
1128
1129
1130
1131
1132 rc = _ip_cprb_helper(card, dom, "AES ", "FIRST ", "MIN3PART",
1133 exorbuf, keybitsize, token, &tokensize);
1134 if (rc) {
1135 DEBUG_ERR(
1136 "%s clear key import 1/4 with CSNBKPI2 failed, rc=%d\n",
1137 __func__, rc);
1138 goto out;
1139 }
1140 rc = _ip_cprb_helper(card, dom, "AES ", "ADD-PART", NULL,
1141 clrkey, keybitsize, token, &tokensize);
1142 if (rc) {
1143 DEBUG_ERR(
1144 "%s clear key import 2/4 with CSNBKPI2 failed, rc=%d\n",
1145 __func__, rc);
1146 goto out;
1147 }
1148 rc = _ip_cprb_helper(card, dom, "AES ", "ADD-PART", NULL,
1149 exorbuf, keybitsize, token, &tokensize);
1150 if (rc) {
1151 DEBUG_ERR(
1152 "%s clear key import 3/4 with CSNBKPI2 failed, rc=%d\n",
1153 __func__, rc);
1154 goto out;
1155 }
1156 rc = _ip_cprb_helper(card, dom, "AES ", "COMPLETE", NULL,
1157 NULL, keybitsize, token, &tokensize);
1158 if (rc) {
1159 DEBUG_ERR(
1160 "%s clear key import 4/4 with CSNBKPI2 failed, rc=%d\n",
1161 __func__, rc);
1162 goto out;
1163 }
1164
1165
1166 if (keybuf) {
1167 if (tokensize > *keybufsize)
1168 rc = -EINVAL;
1169 else
1170 memcpy(keybuf, token, tokensize);
1171 }
1172 *keybufsize = tokensize;
1173
1174 out:
1175 kfree(token);
1176 return rc;
1177 }
1178 EXPORT_SYMBOL(cca_clr2cipherkey);
1179
1180
1181
1182
1183 int cca_cipher2protkey(u16 cardnr, u16 domain, const u8 *ckey,
1184 u8 *protkey, u32 *protkeylen, u32 *protkeytype)
1185 {
1186 int rc;
1187 u8 *mem, *ptr;
1188 struct CPRBX *preqcblk, *prepcblk;
1189 struct ica_xcRB xcrb;
1190 struct aureqparm {
1191 u8 subfunc_code[2];
1192 u16 rule_array_len;
1193 u8 rule_array[8];
1194 struct {
1195 u16 len;
1196 u16 tk_blob_len;
1197 u16 tk_blob_tag;
1198 u8 tk_blob[66];
1199 } vud;
1200 struct {
1201 u16 len;
1202 u16 cca_key_token_len;
1203 u16 cca_key_token_flags;
1204 u8 cca_key_token[0];
1205 } kb;
1206 } __packed * preqparm;
1207 struct aurepparm {
1208 u8 subfunc_code[2];
1209 u16 rule_array_len;
1210 struct {
1211 u16 len;
1212 u16 sublen;
1213 u16 tag;
1214 struct cpacfkeyblock {
1215 u8 version;
1216 u8 flags[2];
1217 u8 algo;
1218 u8 form;
1219 u8 pad1[3];
1220 u16 keylen;
1221 u8 key[64];
1222 u16 keyattrlen;
1223 u8 keyattr[32];
1224 u8 pad2[1];
1225 u8 vptype;
1226 u8 vp[32];
1227 } ckb;
1228 } vud;
1229 struct {
1230 u16 len;
1231 } kb;
1232 } __packed * prepparm;
1233 int keytoklen = ((struct cipherkeytoken *)ckey)->len;
1234
1235
1236 rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
1237 if (rc)
1238 return rc;
1239
1240
1241 preqcblk->domain = domain;
1242
1243
1244 preqparm = (struct aureqparm __force *)preqcblk->req_parmb;
1245 memcpy(preqparm->subfunc_code, "AU", 2);
1246 preqparm->rule_array_len =
1247 sizeof(preqparm->rule_array_len)
1248 + sizeof(preqparm->rule_array);
1249 memcpy(preqparm->rule_array, "EXPT-SK ", 8);
1250
1251 preqparm->vud.len = sizeof(preqparm->vud);
1252 preqparm->vud.tk_blob_len = sizeof(preqparm->vud.tk_blob)
1253 + 2 * sizeof(uint16_t);
1254 preqparm->vud.tk_blob_tag = 0x00C2;
1255
1256 preqparm->kb.len = keytoklen + 3 * sizeof(uint16_t);
1257 preqparm->kb.cca_key_token_len = keytoklen + 2 * sizeof(uint16_t);
1258 memcpy(preqparm->kb.cca_key_token, ckey, keytoklen);
1259
1260 preqcblk->req_parml = sizeof(struct aureqparm) + keytoklen;
1261
1262
1263 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
1264
1265
1266 rc = zcrypt_send_cprb(&xcrb);
1267 if (rc) {
1268 DEBUG_ERR(
1269 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
1270 __func__, (int)cardnr, (int)domain, rc);
1271 goto out;
1272 }
1273
1274
1275 if (prepcblk->ccp_rtcode != 0) {
1276 DEBUG_ERR(
1277 "%s unwrap secure key failure, card response %d/%d\n",
1278 __func__,
1279 (int)prepcblk->ccp_rtcode,
1280 (int)prepcblk->ccp_rscode);
1281 if (prepcblk->ccp_rtcode == 8 && prepcblk->ccp_rscode == 2290)
1282 rc = -EAGAIN;
1283 else
1284 rc = -EIO;
1285 goto out;
1286 }
1287 if (prepcblk->ccp_rscode != 0) {
1288 DEBUG_WARN(
1289 "%s unwrap secure key warning, card response %d/%d\n",
1290 __func__,
1291 (int)prepcblk->ccp_rtcode,
1292 (int)prepcblk->ccp_rscode);
1293 }
1294
1295
1296 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
1297 prepcblk->rpl_parmb = (u8 __user *)ptr;
1298 prepparm = (struct aurepparm *)ptr;
1299
1300
1301 if (prepparm->vud.ckb.version != 0x01 &&
1302 prepparm->vud.ckb.version != 0x02) {
1303 DEBUG_ERR("%s reply param keyblock version mismatch 0x%02x\n",
1304 __func__, (int)prepparm->vud.ckb.version);
1305 rc = -EIO;
1306 goto out;
1307 }
1308 if (prepparm->vud.ckb.algo != 0x02) {
1309 DEBUG_ERR(
1310 "%s reply param keyblock algo mismatch 0x%02x != 0x02\n",
1311 __func__, (int)prepparm->vud.ckb.algo);
1312 rc = -EIO;
1313 goto out;
1314 }
1315
1316
1317 switch (prepparm->vud.ckb.keylen) {
1318 case 16 + 32:
1319
1320 if (protkeytype)
1321 *protkeytype = PKEY_KEYTYPE_AES_128;
1322 break;
1323 case 24 + 32:
1324
1325 if (protkeytype)
1326 *protkeytype = PKEY_KEYTYPE_AES_192;
1327 break;
1328 case 32 + 32:
1329
1330 if (protkeytype)
1331 *protkeytype = PKEY_KEYTYPE_AES_256;
1332 break;
1333 default:
1334 DEBUG_ERR("%s unknown/unsupported keylen %d\n",
1335 __func__, prepparm->vud.ckb.keylen);
1336 rc = -EIO;
1337 goto out;
1338 }
1339 memcpy(protkey, prepparm->vud.ckb.key, prepparm->vud.ckb.keylen);
1340 if (protkeylen)
1341 *protkeylen = prepparm->vud.ckb.keylen;
1342
1343 out:
1344 free_cprbmem(mem, PARMBSIZE, 0);
1345 return rc;
1346 }
1347 EXPORT_SYMBOL(cca_cipher2protkey);
1348
1349
1350
1351
1352 int cca_ecc2protkey(u16 cardnr, u16 domain, const u8 *key,
1353 u8 *protkey, u32 *protkeylen, u32 *protkeytype)
1354 {
1355 int rc;
1356 u8 *mem, *ptr;
1357 struct CPRBX *preqcblk, *prepcblk;
1358 struct ica_xcRB xcrb;
1359 struct aureqparm {
1360 u8 subfunc_code[2];
1361 u16 rule_array_len;
1362 u8 rule_array[8];
1363 struct {
1364 u16 len;
1365 u16 tk_blob_len;
1366 u16 tk_blob_tag;
1367 u8 tk_blob[66];
1368 } vud;
1369 struct {
1370 u16 len;
1371 u16 cca_key_token_len;
1372 u16 cca_key_token_flags;
1373 u8 cca_key_token[0];
1374 } kb;
1375 } __packed * preqparm;
1376 struct aurepparm {
1377 u8 subfunc_code[2];
1378 u16 rule_array_len;
1379 struct {
1380 u16 len;
1381 u16 sublen;
1382 u16 tag;
1383 struct cpacfkeyblock {
1384 u8 version;
1385 u8 flags[2];
1386 u8 algo;
1387 u8 form;
1388 u8 pad1[3];
1389 u16 keylen;
1390 u8 key[0];
1391 u16 keyattrlen;
1392 u8 keyattr[32];
1393 u8 pad2[1];
1394 u8 vptype;
1395 u8 vp[32];
1396 } ckb;
1397 } vud;
1398 struct {
1399 u16 len;
1400 } kb;
1401 } __packed * prepparm;
1402 int keylen = ((struct eccprivkeytoken *)key)->len;
1403
1404
1405 rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
1406 if (rc)
1407 return rc;
1408
1409
1410 preqcblk->domain = domain;
1411
1412
1413 preqparm = (struct aureqparm __force *)preqcblk->req_parmb;
1414 memcpy(preqparm->subfunc_code, "AU", 2);
1415 preqparm->rule_array_len =
1416 sizeof(preqparm->rule_array_len)
1417 + sizeof(preqparm->rule_array);
1418 memcpy(preqparm->rule_array, "EXPT-SK ", 8);
1419
1420 preqparm->vud.len = sizeof(preqparm->vud);
1421 preqparm->vud.tk_blob_len = sizeof(preqparm->vud.tk_blob)
1422 + 2 * sizeof(uint16_t);
1423 preqparm->vud.tk_blob_tag = 0x00C2;
1424
1425 preqparm->kb.len = keylen + 3 * sizeof(uint16_t);
1426 preqparm->kb.cca_key_token_len = keylen + 2 * sizeof(uint16_t);
1427 memcpy(preqparm->kb.cca_key_token, key, keylen);
1428
1429 preqcblk->req_parml = sizeof(struct aureqparm) + keylen;
1430
1431
1432 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
1433
1434
1435 rc = zcrypt_send_cprb(&xcrb);
1436 if (rc) {
1437 DEBUG_ERR(
1438 "%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
1439 __func__, (int)cardnr, (int)domain, rc);
1440 goto out;
1441 }
1442
1443
1444 if (prepcblk->ccp_rtcode != 0) {
1445 DEBUG_ERR(
1446 "%s unwrap secure key failure, card response %d/%d\n",
1447 __func__,
1448 (int)prepcblk->ccp_rtcode,
1449 (int)prepcblk->ccp_rscode);
1450 if (prepcblk->ccp_rtcode == 8 && prepcblk->ccp_rscode == 2290)
1451 rc = -EAGAIN;
1452 else
1453 rc = -EIO;
1454 goto out;
1455 }
1456 if (prepcblk->ccp_rscode != 0) {
1457 DEBUG_WARN(
1458 "%s unwrap secure key warning, card response %d/%d\n",
1459 __func__,
1460 (int)prepcblk->ccp_rtcode,
1461 (int)prepcblk->ccp_rscode);
1462 }
1463
1464
1465 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
1466 prepcblk->rpl_parmb = (u8 __user *)ptr;
1467 prepparm = (struct aurepparm *)ptr;
1468
1469
1470 if (prepparm->vud.ckb.version != 0x02) {
1471 DEBUG_ERR("%s reply param keyblock version mismatch 0x%02x != 0x02\n",
1472 __func__, (int)prepparm->vud.ckb.version);
1473 rc = -EIO;
1474 goto out;
1475 }
1476 if (prepparm->vud.ckb.algo != 0x81) {
1477 DEBUG_ERR(
1478 "%s reply param keyblock algo mismatch 0x%02x != 0x81\n",
1479 __func__, (int)prepparm->vud.ckb.algo);
1480 rc = -EIO;
1481 goto out;
1482 }
1483
1484
1485 if (prepparm->vud.ckb.keylen > *protkeylen) {
1486 DEBUG_ERR("%s prot keylen mismatch %d > buffersize %u\n",
1487 __func__, prepparm->vud.ckb.keylen, *protkeylen);
1488 rc = -EIO;
1489 goto out;
1490 }
1491 memcpy(protkey, prepparm->vud.ckb.key, prepparm->vud.ckb.keylen);
1492 *protkeylen = prepparm->vud.ckb.keylen;
1493 if (protkeytype)
1494 *protkeytype = PKEY_KEYTYPE_ECC;
1495
1496 out:
1497 free_cprbmem(mem, PARMBSIZE, 0);
1498 return rc;
1499 }
1500 EXPORT_SYMBOL(cca_ecc2protkey);
1501
1502
1503
1504
1505 int cca_query_crypto_facility(u16 cardnr, u16 domain,
1506 const char *keyword,
1507 u8 *rarray, size_t *rarraylen,
1508 u8 *varray, size_t *varraylen)
1509 {
1510 int rc;
1511 u16 len;
1512 u8 *mem, *ptr;
1513 struct CPRBX *preqcblk, *prepcblk;
1514 struct ica_xcRB xcrb;
1515 struct fqreqparm {
1516 u8 subfunc_code[2];
1517 u16 rule_array_len;
1518 char rule_array[8];
1519 struct lv1 {
1520 u16 len;
1521 u8 data[VARDATASIZE];
1522 } lv1;
1523 u16 dummylen;
1524 } __packed * preqparm;
1525 size_t parmbsize = sizeof(struct fqreqparm);
1526 struct fqrepparm {
1527 u8 subfunc_code[2];
1528 u8 lvdata[0];
1529 } __packed * prepparm;
1530
1531
1532 rc = alloc_and_prep_cprbmem(parmbsize, &mem, &preqcblk, &prepcblk);
1533 if (rc)
1534 return rc;
1535
1536
1537 preqcblk->domain = domain;
1538
1539
1540 preqparm = (struct fqreqparm __force *)preqcblk->req_parmb;
1541 memcpy(preqparm->subfunc_code, "FQ", 2);
1542 memcpy(preqparm->rule_array, keyword, sizeof(preqparm->rule_array));
1543 preqparm->rule_array_len =
1544 sizeof(preqparm->rule_array_len) + sizeof(preqparm->rule_array);
1545 preqparm->lv1.len = sizeof(preqparm->lv1);
1546 preqparm->dummylen = sizeof(preqparm->dummylen);
1547 preqcblk->req_parml = parmbsize;
1548
1549
1550 prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
1551
1552
1553 rc = zcrypt_send_cprb(&xcrb);
1554 if (rc) {
1555 DEBUG_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
1556 __func__, (int)cardnr, (int)domain, rc);
1557 goto out;
1558 }
1559
1560
1561 if (prepcblk->ccp_rtcode != 0) {
1562 DEBUG_ERR("%s unwrap secure key failure, card response %d/%d\n",
1563 __func__,
1564 (int)prepcblk->ccp_rtcode,
1565 (int)prepcblk->ccp_rscode);
1566 rc = -EIO;
1567 goto out;
1568 }
1569
1570
1571 ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
1572 prepcblk->rpl_parmb = (u8 __user *)ptr;
1573 prepparm = (struct fqrepparm *)ptr;
1574 ptr = prepparm->lvdata;
1575
1576
1577 len = *((u16 *)ptr);
1578 if (len > sizeof(u16)) {
1579 ptr += sizeof(u16);
1580 len -= sizeof(u16);
1581 if (rarray && rarraylen && *rarraylen > 0) {
1582 *rarraylen = (len > *rarraylen ? *rarraylen : len);
1583 memcpy(rarray, ptr, *rarraylen);
1584 }
1585 ptr += len;
1586 }
1587
1588 len = *((u16 *)ptr);
1589 if (len > sizeof(u16)) {
1590 ptr += sizeof(u16);
1591 len -= sizeof(u16);
1592 if (varray && varraylen && *varraylen > 0) {
1593 *varraylen = (len > *varraylen ? *varraylen : len);
1594 memcpy(varray, ptr, *varraylen);
1595 }
1596 ptr += len;
1597 }
1598
1599 out:
1600 free_cprbmem(mem, parmbsize, 0);
1601 return rc;
1602 }
1603 EXPORT_SYMBOL(cca_query_crypto_facility);
1604
1605 static int cca_info_cache_fetch(u16 cardnr, u16 domain, struct cca_info *ci)
1606 {
1607 int rc = -ENOENT;
1608 struct cca_info_list_entry *ptr;
1609
1610 spin_lock_bh(&cca_info_list_lock);
1611 list_for_each_entry(ptr, &cca_info_list, list) {
1612 if (ptr->cardnr == cardnr && ptr->domain == domain) {
1613 memcpy(ci, &ptr->info, sizeof(*ci));
1614 rc = 0;
1615 break;
1616 }
1617 }
1618 spin_unlock_bh(&cca_info_list_lock);
1619
1620 return rc;
1621 }
1622
1623 static void cca_info_cache_update(u16 cardnr, u16 domain,
1624 const struct cca_info *ci)
1625 {
1626 int found = 0;
1627 struct cca_info_list_entry *ptr;
1628
1629 spin_lock_bh(&cca_info_list_lock);
1630 list_for_each_entry(ptr, &cca_info_list, list) {
1631 if (ptr->cardnr == cardnr &&
1632 ptr->domain == domain) {
1633 memcpy(&ptr->info, ci, sizeof(*ci));
1634 found = 1;
1635 break;
1636 }
1637 }
1638 if (!found) {
1639 ptr = kmalloc(sizeof(*ptr), GFP_ATOMIC);
1640 if (!ptr) {
1641 spin_unlock_bh(&cca_info_list_lock);
1642 return;
1643 }
1644 ptr->cardnr = cardnr;
1645 ptr->domain = domain;
1646 memcpy(&ptr->info, ci, sizeof(*ci));
1647 list_add(&ptr->list, &cca_info_list);
1648 }
1649 spin_unlock_bh(&cca_info_list_lock);
1650 }
1651
1652 static void cca_info_cache_scrub(u16 cardnr, u16 domain)
1653 {
1654 struct cca_info_list_entry *ptr;
1655
1656 spin_lock_bh(&cca_info_list_lock);
1657 list_for_each_entry(ptr, &cca_info_list, list) {
1658 if (ptr->cardnr == cardnr &&
1659 ptr->domain == domain) {
1660 list_del(&ptr->list);
1661 kfree(ptr);
1662 break;
1663 }
1664 }
1665 spin_unlock_bh(&cca_info_list_lock);
1666 }
1667
1668 static void __exit mkvp_cache_free(void)
1669 {
1670 struct cca_info_list_entry *ptr, *pnext;
1671
1672 spin_lock_bh(&cca_info_list_lock);
1673 list_for_each_entry_safe(ptr, pnext, &cca_info_list, list) {
1674 list_del(&ptr->list);
1675 kfree(ptr);
1676 }
1677 spin_unlock_bh(&cca_info_list_lock);
1678 }
1679
1680
1681
1682
1683 static int fetch_cca_info(u16 cardnr, u16 domain, struct cca_info *ci)
1684 {
1685 int rc, found = 0;
1686 size_t rlen, vlen;
1687 u8 *rarray, *varray, *pg;
1688 struct zcrypt_device_status_ext devstat;
1689
1690 memset(ci, 0, sizeof(*ci));
1691
1692
1693 rc = zcrypt_device_status_ext(cardnr, domain, &devstat);
1694 if (rc)
1695 return rc;
1696 ci->hwtype = devstat.hwtype;
1697
1698
1699 pg = (u8 *)__get_free_page(GFP_KERNEL);
1700 if (!pg)
1701 return -ENOMEM;
1702 rarray = pg;
1703 varray = pg + PAGE_SIZE / 2;
1704 rlen = vlen = PAGE_SIZE / 2;
1705
1706
1707 rc = cca_query_crypto_facility(cardnr, domain, "STATICSA",
1708 rarray, &rlen, varray, &vlen);
1709 if (rc == 0 && rlen >= 10 * 8 && vlen >= 204) {
1710 memcpy(ci->serial, rarray, 8);
1711 ci->new_asym_mk_state = (char)rarray[4 * 8];
1712 ci->cur_asym_mk_state = (char)rarray[5 * 8];
1713 ci->old_asym_mk_state = (char)rarray[6 * 8];
1714 if (ci->old_asym_mk_state == '2')
1715 memcpy(ci->old_asym_mkvp, varray + 64, 16);
1716 if (ci->cur_asym_mk_state == '2')
1717 memcpy(ci->cur_asym_mkvp, varray + 84, 16);
1718 if (ci->new_asym_mk_state == '3')
1719 memcpy(ci->new_asym_mkvp, varray + 104, 16);
1720 ci->new_aes_mk_state = (char)rarray[7 * 8];
1721 ci->cur_aes_mk_state = (char)rarray[8 * 8];
1722 ci->old_aes_mk_state = (char)rarray[9 * 8];
1723 if (ci->old_aes_mk_state == '2')
1724 memcpy(&ci->old_aes_mkvp, varray + 172, 8);
1725 if (ci->cur_aes_mk_state == '2')
1726 memcpy(&ci->cur_aes_mkvp, varray + 184, 8);
1727 if (ci->new_aes_mk_state == '3')
1728 memcpy(&ci->new_aes_mkvp, varray + 196, 8);
1729 found++;
1730 }
1731 if (!found)
1732 goto out;
1733 rlen = vlen = PAGE_SIZE / 2;
1734 rc = cca_query_crypto_facility(cardnr, domain, "STATICSB",
1735 rarray, &rlen, varray, &vlen);
1736 if (rc == 0 && rlen >= 13 * 8 && vlen >= 240) {
1737 ci->new_apka_mk_state = (char)rarray[10 * 8];
1738 ci->cur_apka_mk_state = (char)rarray[11 * 8];
1739 ci->old_apka_mk_state = (char)rarray[12 * 8];
1740 if (ci->old_apka_mk_state == '2')
1741 memcpy(&ci->old_apka_mkvp, varray + 208, 8);
1742 if (ci->cur_apka_mk_state == '2')
1743 memcpy(&ci->cur_apka_mkvp, varray + 220, 8);
1744 if (ci->new_apka_mk_state == '3')
1745 memcpy(&ci->new_apka_mkvp, varray + 232, 8);
1746 found++;
1747 }
1748
1749 out:
1750 free_page((unsigned long)pg);
1751 return found == 2 ? 0 : -ENOENT;
1752 }
1753
1754
1755
1756
1757 int cca_get_info(u16 card, u16 dom, struct cca_info *ci, int verify)
1758 {
1759 int rc;
1760
1761 rc = cca_info_cache_fetch(card, dom, ci);
1762 if (rc || verify) {
1763 rc = fetch_cca_info(card, dom, ci);
1764 if (rc == 0)
1765 cca_info_cache_update(card, dom, ci);
1766 }
1767
1768 return rc;
1769 }
1770 EXPORT_SYMBOL(cca_get_info);
1771
1772
1773
1774
1775
1776 static int findcard(u64 mkvp, u16 *pcardnr, u16 *pdomain,
1777 int verify, int minhwtype)
1778 {
1779 struct zcrypt_device_status_ext *device_status;
1780 u16 card, dom;
1781 struct cca_info ci;
1782 int i, rc, oi = -1;
1783
1784
1785 if (mkvp == 0 || minhwtype < 0)
1786 return -EINVAL;
1787
1788
1789 device_status = kvmalloc_array(MAX_ZDEV_ENTRIES_EXT,
1790 sizeof(struct zcrypt_device_status_ext),
1791 GFP_KERNEL);
1792 if (!device_status)
1793 return -ENOMEM;
1794 zcrypt_device_status_mask_ext(device_status);
1795
1796
1797 for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
1798 card = AP_QID_CARD(device_status[i].qid);
1799 dom = AP_QID_QUEUE(device_status[i].qid);
1800 if (device_status[i].online &&
1801 device_status[i].functions & 0x04) {
1802
1803 if (cca_info_cache_fetch(card, dom, &ci) == 0 &&
1804 ci.hwtype >= minhwtype &&
1805 ci.cur_aes_mk_state == '2' &&
1806 ci.cur_aes_mkvp == mkvp) {
1807 if (!verify)
1808 break;
1809
1810 if (fetch_cca_info(card, dom, &ci) == 0) {
1811 cca_info_cache_update(card, dom, &ci);
1812 if (ci.hwtype >= minhwtype &&
1813 ci.cur_aes_mk_state == '2' &&
1814 ci.cur_aes_mkvp == mkvp)
1815 break;
1816 }
1817 }
1818 } else {
1819
1820
1821 cca_info_cache_scrub(card, dom);
1822 }
1823 }
1824 if (i >= MAX_ZDEV_ENTRIES_EXT) {
1825
1826 for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
1827 if (!(device_status[i].online &&
1828 device_status[i].functions & 0x04))
1829 continue;
1830 card = AP_QID_CARD(device_status[i].qid);
1831 dom = AP_QID_QUEUE(device_status[i].qid);
1832
1833 if (fetch_cca_info(card, dom, &ci) == 0) {
1834 cca_info_cache_update(card, dom, &ci);
1835 if (ci.hwtype >= minhwtype &&
1836 ci.cur_aes_mk_state == '2' &&
1837 ci.cur_aes_mkvp == mkvp)
1838 break;
1839 if (ci.hwtype >= minhwtype &&
1840 ci.old_aes_mk_state == '2' &&
1841 ci.old_aes_mkvp == mkvp &&
1842 oi < 0)
1843 oi = i;
1844 }
1845 }
1846 if (i >= MAX_ZDEV_ENTRIES_EXT && oi >= 0) {
1847
1848 card = AP_QID_CARD(device_status[oi].qid);
1849 dom = AP_QID_QUEUE(device_status[oi].qid);
1850 }
1851 }
1852 if (i < MAX_ZDEV_ENTRIES_EXT || oi >= 0) {
1853 if (pcardnr)
1854 *pcardnr = card;
1855 if (pdomain)
1856 *pdomain = dom;
1857 rc = (i < MAX_ZDEV_ENTRIES_EXT ? 0 : 1);
1858 } else {
1859 rc = -ENODEV;
1860 }
1861
1862 kvfree(device_status);
1863 return rc;
1864 }
1865
1866
1867
1868
1869
1870 int cca_findcard(const u8 *key, u16 *pcardnr, u16 *pdomain, int verify)
1871 {
1872 u64 mkvp;
1873 int minhwtype = 0;
1874 const struct keytoken_header *hdr = (struct keytoken_header *)key;
1875
1876 if (hdr->type != TOKTYPE_CCA_INTERNAL)
1877 return -EINVAL;
1878
1879 switch (hdr->version) {
1880 case TOKVER_CCA_AES:
1881 mkvp = ((struct secaeskeytoken *)key)->mkvp;
1882 break;
1883 case TOKVER_CCA_VLSC:
1884 mkvp = ((struct cipherkeytoken *)key)->mkvp0;
1885 minhwtype = AP_DEVICE_TYPE_CEX6;
1886 break;
1887 default:
1888 return -EINVAL;
1889 }
1890
1891 return findcard(mkvp, pcardnr, pdomain, verify, minhwtype);
1892 }
1893 EXPORT_SYMBOL(cca_findcard);
1894
1895 int cca_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
1896 int minhwtype, int mktype, u64 cur_mkvp, u64 old_mkvp,
1897 int verify)
1898 {
1899 struct zcrypt_device_status_ext *device_status;
1900 u32 *_apqns = NULL, _nr_apqns = 0;
1901 int i, card, dom, curmatch, oldmatch, rc = 0;
1902 struct cca_info ci;
1903
1904
1905 device_status = kvmalloc_array(MAX_ZDEV_ENTRIES_EXT,
1906 sizeof(struct zcrypt_device_status_ext),
1907 GFP_KERNEL);
1908 if (!device_status)
1909 return -ENOMEM;
1910 zcrypt_device_status_mask_ext(device_status);
1911
1912
1913 _apqns = kmalloc_array(256, sizeof(u32), GFP_KERNEL);
1914 if (!_apqns) {
1915 kvfree(device_status);
1916 return -ENOMEM;
1917 }
1918
1919
1920 for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
1921 card = AP_QID_CARD(device_status[i].qid);
1922 dom = AP_QID_QUEUE(device_status[i].qid);
1923
1924 if (!device_status[i].online)
1925 continue;
1926
1927 if (!(device_status[i].functions & 0x04))
1928 continue;
1929
1930 if (cardnr != 0xFFFF && card != cardnr)
1931 continue;
1932
1933 if (domain != 0xFFFF && dom != domain)
1934 continue;
1935
1936 if (cca_get_info(card, dom, &ci, verify))
1937 continue;
1938
1939 if (mktype == AES_MK_SET && ci.cur_aes_mk_state != '2')
1940 continue;
1941 if (mktype == APKA_MK_SET && ci.cur_apka_mk_state != '2')
1942 continue;
1943
1944 if (minhwtype > 0 && minhwtype > ci.hwtype)
1945 continue;
1946 if (cur_mkvp || old_mkvp) {
1947
1948 curmatch = oldmatch = 0;
1949 if (mktype == AES_MK_SET) {
1950 if (cur_mkvp && cur_mkvp == ci.cur_aes_mkvp)
1951 curmatch = 1;
1952 if (old_mkvp && ci.old_aes_mk_state == '2' &&
1953 old_mkvp == ci.old_aes_mkvp)
1954 oldmatch = 1;
1955 } else {
1956 if (cur_mkvp && cur_mkvp == ci.cur_apka_mkvp)
1957 curmatch = 1;
1958 if (old_mkvp && ci.old_apka_mk_state == '2' &&
1959 old_mkvp == ci.old_apka_mkvp)
1960 oldmatch = 1;
1961 }
1962 if (curmatch + oldmatch < 1)
1963 continue;
1964 }
1965
1966 if (_nr_apqns < 256)
1967 _apqns[_nr_apqns++] = (((u16)card) << 16) | ((u16)dom);
1968 }
1969
1970
1971 if (!_nr_apqns) {
1972 kfree(_apqns);
1973 rc = -ENODEV;
1974 } else {
1975
1976 *apqns = _apqns;
1977 *nr_apqns = _nr_apqns;
1978 rc = 0;
1979 }
1980
1981 kvfree(device_status);
1982 return rc;
1983 }
1984 EXPORT_SYMBOL(cca_findcard2);
1985
1986 void __exit zcrypt_ccamisc_exit(void)
1987 {
1988 mkvp_cache_free();
1989 }