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