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