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